SDL: Clarify thread-safety information for surface functions

From 6d095575e813801801306a85e4b49b8b6f039673 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Thu, 23 Oct 2025 07:52:48 -0700
Subject: [PATCH] Clarify thread-safety information for surface functions

---
 include/SDL3/SDL_surface.h | 81 +++++++++++++++++++-------------------
 1 file changed, 40 insertions(+), 41 deletions(-)

diff --git a/include/SDL3/SDL_surface.h b/include/SDL3/SDL_surface.h
index 24113ea296bee..5ec439deeee1a 100644
--- a/include/SDL3/SDL_surface.h
+++ b/include/SDL3/SDL_surface.h
@@ -29,13 +29,12 @@
  * 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(). SDL itself does not
- * provide loaders for various other file formats, but there are several
+ * 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)
- * :
+ * [SDL_image](https://wiki.libsdl.org/SDL3_image).
  *
- * https://github.com/libsdl-org/SDL_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.
  */
 
 #ifndef SDL_surface_h_
@@ -267,7 +266,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSurfaceProperties(SDL_Surfac
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -286,7 +285,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorspace(SDL_Surface *surface,
  * \returns the colorspace used by the surface, or SDL_COLORSPACE_UNKNOWN if
  *          the surface is NULL.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -316,7 +315,7 @@ extern SDL_DECLSPEC SDL_Colorspace SDLCALL SDL_GetSurfaceColorspace(SDL_Surface
  *          the surface didn't have an index format); call SDL_GetError() for
  *          more information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -337,7 +336,7 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_CreateSurfacePalette(SDL_Surface *
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -378,7 +377,7 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_GetSurfacePalette(SDL_Surface *sur
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -421,7 +420,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasAlternateImages(SDL_Surface *surf
  *          failure; call SDL_GetError() for more information. This should be
  *          freed with SDL_free() when it is no longer needed.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -439,7 +438,7 @@ extern SDL_DECLSPEC SDL_Surface ** SDLCALL SDL_GetSurfaceImages(SDL_Surface *sur
  *
  * \param surface the SDL_Surface structure to update.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -465,7 +464,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_RemoveSurfaceAlternateImages(SDL_Surface *s
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe. The locking referred to by
+ * \threadsafety 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.
  *
@@ -549,7 +548,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP(const char *file);
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -572,7 +571,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP_IO(SDL_Surface *surface, SDL_IOStre
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -633,7 +632,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadPNG(const char *file);
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.4.0.
  *
@@ -650,7 +649,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SavePNG_IO(SDL_Surface *surface, SDL_IOStre
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.4.0.
  *
@@ -670,7 +669,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SavePNG(SDL_Surface *surface, const char *f
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -712,7 +711,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasRLE(SDL_Surface *surface);
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -777,7 +776,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceColorKey(SDL_Surface *surface, Ui
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -797,7 +796,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorMod(SDL_Surface *surface, Ui
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -819,7 +818,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceColorMod(SDL_Surface *surface, Ui
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -857,7 +856,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface *surface, Ui
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -896,7 +895,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface *surface, S
  * \returns true if the rectangle intersects the surface, otherwise false and
  *          blits will be completely clipped.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -917,7 +916,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceClipRect(SDL_Surface *surface, co
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -933,7 +932,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceClipRect(SDL_Surface *surface, SD
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  */
@@ -953,7 +952,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_FlipM
  * \returns a rotated copy of the surface or NULL on failure; call
  *          SDL_GetError() for more information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.4.0.
  */
@@ -971,7 +970,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RotateSurface(SDL_Surface *surface
  * \returns a copy of the surface or NULL on failure; call SDL_GetError() for
  *          more information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -992,7 +991,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_DuplicateSurface(SDL_Surface *surf
  * \returns a copy of the surface or NULL on failure; call SDL_GetError() for
  *          more information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -1019,7 +1018,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ScaleSurface(SDL_Surface *surface,
  * \returns the new SDL_Surface structure that is created or NULL on failure;
  *          call SDL_GetError() for more information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -1047,7 +1046,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface(SDL_Surface *surfac
  * \returns the new SDL_Surface structure that is created or NULL on failure;
  *          call SDL_GetError() for more information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -1150,7 +1149,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplyAlpha(int width, int height, SDL
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  */
@@ -1172,7 +1171,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplySurfaceAlpha(SDL_Surface *surfac
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  */
@@ -1197,7 +1196,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ClearSurface(SDL_Surface *surface, float r,
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -1224,7 +1223,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FillSurfaceRect(SDL_Surface *dst, const SDL
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -1515,7 +1514,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurface9Grid(SDL_Surface *src, const SD
  * \param b the blue component of the pixel in the range 0-255.
  * \returns a pixel value.
  *
- * \threadsafety It is safe to call this function from any thread.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -1548,7 +1547,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapSurfaceRGB(SDL_Surface *surface, Uint8
  * \param a the alpha component of the pixel in the range 0-255.
  * \returns a pixel value.
  *
- * \threadsafety It is safe to call this function from any thread.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  *
@@ -1579,7 +1578,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapSurfaceRGBA(SDL_Surface *surface, Uint
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  */
@@ -1605,7 +1604,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixel(SDL_Surface *surface, int
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  */
@@ -1630,7 +1629,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixelFloat(SDL_Surface *surface,
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  */
@@ -1652,7 +1651,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteSurfacePixel(SDL_Surface *surface, int
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
- * \threadsafety This function is not thread safe.
+ * \threadsafety This function can be called on different threads with different surfaces.
  *
  * \since This function is available since SDL 3.2.0.
  */