SDL: Make D3D math functions static inline to reduce likelihood of linking conflicts (5a905)

From 5a9050aea3be811cf35a2c9a57563db1db79b2d5 Mon Sep 17 00:00:00 2001
From: Peter0x44 <[EMAIL REDACTED]>
Date: Wed, 15 Oct 2025 00:03:04 +0100
Subject: [PATCH] Make D3D math functions static inline to reduce likelihood of
 linking conflicts

Convert SDL_d3dmath.c functions to static inline in SDL_d3dmath.h to make
it less likely to conflict when static linking SDL. raylib's SDL backend
does not work with a "normal" upstream binary static link. It has these
errors:

/usr/bin/ld: /usr/local/lib64/libSDL3.a(SDL_d3dmath.c.o): in function `MatrixIdentity':
SDL/src/render/SDL_d3dmath.c:35: multiple definition of `MatrixIdentity'; CMakeFiles/raylib.dir/rcore.c.o:rcore.c:(.text+0x18470): first defined here
/usr/bin/ld: /usr/local/lib64/libSDL3.a(SDL_d3dmath.c.o): in function `MatrixMultiply':
SDL/src/render/SDL_d3dmath.c:44: multiple definition of `MatrixMultiply'; CMakeFiles/raylib.dir/rcore.c.o:rcore.c:(.text+0x18540): first defined here
collect2: error: ld returned 1 exit status

It works if these functions aren't emitted, (i.e.
!SDL_VIDEO_RENDER_D3D(11|12|GPU|VULKAN)

Or, if SDL is not linked static. Which I know is preferred anyway.

In raylib's case, it doesn't use this code anyway so it's not a problem
to build it yourself with them disabled. But it's a minor hassle to be
incompatible with static linking libraries from upstream.

I can't see any good reason for these functions to not be static inline
already, so I just put them in the header and deleted the .c.

Raylib's conflicting case is a library with a public function exposed to
users. But SDL's case is not.

- Moved all matrix functions from SDL_d3dmath.c to SDL_d3dmath.h as static inline
- Removed SDL_d3dmath.c from all project files (Visual Studio and Xcode)
- Functions affected: MatrixIdentity, MatrixMultiply, MatrixScaling,
  MatrixTranslation, MatrixRotationX, MatrixRotationY, MatrixRotationZ

(cherry picked from commit 705ced8cf5a3ed05ea3e09af8f269daab8ca5346)
---
 VisualC-GDK/SDL/SDL.vcxproj             |   1 -
 VisualC-GDK/SDL/SDL.vcxproj.filters     |   1 -
 VisualC/SDL/SDL.vcxproj                 |   1 -
 VisualC/SDL/SDL.vcxproj.filters         |   1 -
 Xcode/SDL/SDL.xcodeproj/project.pbxproj |   4 -
 src/render/SDL_d3dmath.c                | 135 ------------------------
 src/render/SDL_d3dmath.h                | 109 +++++++++++++++++--
 7 files changed, 102 insertions(+), 150 deletions(-)
 delete mode 100644 src/render/SDL_d3dmath.c

diff --git a/VisualC-GDK/SDL/SDL.vcxproj b/VisualC-GDK/SDL/SDL.vcxproj
index 96ca804c49f4f..e2228b619866c 100644
--- a/VisualC-GDK/SDL/SDL.vcxproj
+++ b/VisualC-GDK/SDL/SDL.vcxproj
@@ -781,7 +781,6 @@
     <ClCompile Include="..\..\src\render\opengl\SDL_shaders_gl.c" />
     <ClCompile Include="..\..\src\render\opengles2\SDL_render_gles2.c" />
     <ClCompile Include="..\..\src\render\opengles2\SDL_shaders_gles2.c" />
-    <ClCompile Include="..\..\src\render\SDL_d3dmath.c" />
     <ClCompile Include="..\..\src\render\SDL_render.c" />
     <ClCompile Include="..\..\src\render\SDL_render_unsupported.c" />
     <ClCompile Include="..\..\src\render\SDL_yuv_sw.c" />
diff --git a/VisualC-GDK/SDL/SDL.vcxproj.filters b/VisualC-GDK/SDL/SDL.vcxproj.filters
index f760877e214e9..6b7c69df7f027 100644
--- a/VisualC-GDK/SDL/SDL.vcxproj.filters
+++ b/VisualC-GDK/SDL/SDL.vcxproj.filters
@@ -108,7 +108,6 @@
     <ClCompile Include="..\..\src\render\opengl\SDL_shaders_gl.c" />
     <ClCompile Include="..\..\src\render\opengles2\SDL_render_gles2.c" />
     <ClCompile Include="..\..\src\render\opengles2\SDL_shaders_gles2.c" />
-    <ClCompile Include="..\..\src\render\SDL_d3dmath.c" />
     <ClCompile Include="..\..\src\render\SDL_render.c" />
     <ClCompile Include="..\..\src\render\SDL_render_unsupported.c" />
     <ClCompile Include="..\..\src\render\SDL_yuv_sw.c" />
diff --git a/VisualC/SDL/SDL.vcxproj b/VisualC/SDL/SDL.vcxproj
index a15978a29cd71..cb076d3aa5784 100644
--- a/VisualC/SDL/SDL.vcxproj
+++ b/VisualC/SDL/SDL.vcxproj
@@ -627,7 +627,6 @@
     <ClCompile Include="..\..\src\render\opengl\SDL_shaders_gl.c" />
     <ClCompile Include="..\..\src\render\opengles2\SDL_render_gles2.c" />
     <ClCompile Include="..\..\src\render\opengles2\SDL_shaders_gles2.c" />
-    <ClCompile Include="..\..\src\render\SDL_d3dmath.c" />
     <ClCompile Include="..\..\src\render\SDL_render.c" />
     <ClCompile Include="..\..\src\render\SDL_render_unsupported.c" />
     <ClCompile Include="..\..\src\render\SDL_yuv_sw.c" />
diff --git a/VisualC/SDL/SDL.vcxproj.filters b/VisualC/SDL/SDL.vcxproj.filters
index d653ee05f1d3d..60d1dd13117e4 100644
--- a/VisualC/SDL/SDL.vcxproj.filters
+++ b/VisualC/SDL/SDL.vcxproj.filters
@@ -1460,7 +1460,6 @@
     <ClCompile Include="..\..\src\sensor\windows\SDL_windowssensor.c">
       <Filter>sensor\windows</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\src\render\SDL_d3dmath.c">
       <Filter>render</Filter>
     </ClCompile>
     <ClCompile Include="..\..\src\render\SDL_render.c">
diff --git a/Xcode/SDL/SDL.xcodeproj/project.pbxproj b/Xcode/SDL/SDL.xcodeproj/project.pbxproj
index e131afb52ba93..b5ec26c57957d 100644
--- a/Xcode/SDL/SDL.xcodeproj/project.pbxproj
+++ b/Xcode/SDL/SDL.xcodeproj/project.pbxproj
@@ -292,7 +292,6 @@
 		A7D8BA2523E2514400DCD162 /* SDL_drawpoint.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A8FC23E2514000DCD162 /* SDL_drawpoint.c */; };
 		A7D8BA2B23E2514400DCD162 /* SDL_blendfillrect.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A8FD23E2514000DCD162 /* SDL_blendfillrect.c */; };
 		A7D8BA3123E2514400DCD162 /* SDL_rotate.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A8FE23E2514000DCD162 /* SDL_rotate.h */; };
-		A7D8BA3723E2514400DCD162 /* SDL_d3dmath.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A8FF23E2514000DCD162 /* SDL_d3dmath.c */; };
 		A7D8BA4923E2514400DCD162 /* SDL_render_gles2.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A90423E2514000DCD162 /* SDL_render_gles2.c */; };
 		A7D8BA4F23E2514400DCD162 /* SDL_shaders_gles2.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A90523E2514000DCD162 /* SDL_shaders_gles2.h */; };
 		A7D8BA5523E2514400DCD162 /* SDL_gles2funcs.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A90623E2514000DCD162 /* SDL_gles2funcs.h */; };
@@ -869,7 +868,6 @@
 		A7D8A8FC23E2514000DCD162 /* SDL_drawpoint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_drawpoint.c; sourceTree = "<group>"; };
 		A7D8A8FD23E2514000DCD162 /* SDL_blendfillrect.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_blendfillrect.c; sourceTree = "<group>"; };
 		A7D8A8FE23E2514000DCD162 /* SDL_rotate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_rotate.h; sourceTree = "<group>"; };
-		A7D8A8FF23E2514000DCD162 /* SDL_d3dmath.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_d3dmath.c; sourceTree = "<group>"; };
 		A7D8A90423E2514000DCD162 /* SDL_render_gles2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_render_gles2.c; sourceTree = "<group>"; };
 		A7D8A90523E2514000DCD162 /* SDL_shaders_gles2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_shaders_gles2.h; sourceTree = "<group>"; };
 		A7D8A90623E2514000DCD162 /* SDL_gles2funcs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_gles2funcs.h; sourceTree = "<group>"; };
@@ -2135,7 +2133,6 @@
 				A7D8A90C23E2514000DCD162 /* opengl */,
 				A7D8A90323E2514000DCD162 /* opengles2 */,
 				A7D8A8EF23E2514000DCD162 /* software */,
-				A7D8A8FF23E2514000DCD162 /* SDL_d3dmath.c */,
 				A7D8A8DC23E2514000DCD162 /* SDL_d3dmath.h */,
 				A7D8A8DB23E2514000DCD162 /* SDL_render.c */,
 				E4F7981D2AD8D86A00669F54 /* SDL_render_unsupported.c */,
@@ -2903,7 +2900,6 @@
 				A7D8BBE723E2574800DCD162 /* SDL_uikitviewcontroller.m in Sources */,
 				A7D8ADF223E2514100DCD162 /* SDL_blit_A.c in Sources */,
 				A7D8BBDD23E2574800DCD162 /* SDL_uikitmodes.m in Sources */,
-				A7D8BA3723E2514400DCD162 /* SDL_d3dmath.c in Sources */,
 				F3A9AE9C2C8A13C100AAC390 /* SDL_pipeline_gpu.c in Sources */,
 				75E0915A241EA924004729E1 /* SDL_virtualjoystick.c in Sources */,
 				F338A11A2D1B37E4007CDFDF /* SDL_tray.c in Sources */,
diff --git a/src/render/SDL_d3dmath.c b/src/render/SDL_d3dmath.c
deleted file mode 100644
index 6a1ab59a87742..0000000000000
--- a/src/render/SDL_d3dmath.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
-  Simple DirectMedia Layer
-  Copyright (C) 1997-2025 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.
-*/
-#include "SDL_internal.h"
-
-#if defined(SDL_VIDEO_RENDER_D3D) || \
-    defined(SDL_VIDEO_RENDER_D3D11) || \
-    defined(SDL_VIDEO_RENDER_D3D12) || \
-    defined(SDL_VIDEO_RENDER_VULKAN)
-
-#include "SDL_d3dmath.h"
-
-// Direct3D matrix math functions
-
-Float4X4 MatrixIdentity(void)
-{
-    Float4X4 m;
-    SDL_zero(m);
-    m.v._11 = 1.0f;
-    m.v._22 = 1.0f;
-    m.v._33 = 1.0f;
-    m.v._44 = 1.0f;
-    return m;
-}
-
-Float4X4 MatrixMultiply(Float4X4 M1, Float4X4 M2)
-{
-    Float4X4 m;
-    m.v._11 = M1.v._11 * M2.v._11 + M1.v._12 * M2.v._21 + M1.v._13 * M2.v._31 + M1.v._14 * M2.v._41;
-    m.v._12 = M1.v._11 * M2.v._12 + M1.v._12 * M2.v._22 + M1.v._13 * M2.v._32 + M1.v._14 * M2.v._42;
-    m.v._13 = M1.v._11 * M2.v._13 + M1.v._12 * M2.v._23 + M1.v._13 * M2.v._33 + M1.v._14 * M2.v._43;
-    m.v._14 = M1.v._11 * M2.v._14 + M1.v._12 * M2.v._24 + M1.v._13 * M2.v._34 + M1.v._14 * M2.v._44;
-    m.v._21 = M1.v._21 * M2.v._11 + M1.v._22 * M2.v._21 + M1.v._23 * M2.v._31 + M1.v._24 * M2.v._41;
-    m.v._22 = M1.v._21 * M2.v._12 + M1.v._22 * M2.v._22 + M1.v._23 * M2.v._32 + M1.v._24 * M2.v._42;
-    m.v._23 = M1.v._21 * M2.v._13 + M1.v._22 * M2.v._23 + M1.v._23 * M2.v._33 + M1.v._24 * M2.v._43;
-    m.v._24 = M1.v._21 * M2.v._14 + M1.v._22 * M2.v._24 + M1.v._23 * M2.v._34 + M1.v._24 * M2.v._44;
-    m.v._31 = M1.v._31 * M2.v._11 + M1.v._32 * M2.v._21 + M1.v._33 * M2.v._31 + M1.v._34 * M2.v._41;
-    m.v._32 = M1.v._31 * M2.v._12 + M1.v._32 * M2.v._22 + M1.v._33 * M2.v._32 + M1.v._34 * M2.v._42;
-    m.v._33 = M1.v._31 * M2.v._13 + M1.v._32 * M2.v._23 + M1.v._33 * M2.v._33 + M1.v._34 * M2.v._43;
-    m.v._34 = M1.v._31 * M2.v._14 + M1.v._32 * M2.v._24 + M1.v._33 * M2.v._34 + M1.v._34 * M2.v._44;
-    m.v._41 = M1.v._41 * M2.v._11 + M1.v._42 * M2.v._21 + M1.v._43 * M2.v._31 + M1.v._44 * M2.v._41;
-    m.v._42 = M1.v._41 * M2.v._12 + M1.v._42 * M2.v._22 + M1.v._43 * M2.v._32 + M1.v._44 * M2.v._42;
-    m.v._43 = M1.v._41 * M2.v._13 + M1.v._42 * M2.v._23 + M1.v._43 * M2.v._33 + M1.v._44 * M2.v._43;
-    m.v._44 = M1.v._41 * M2.v._14 + M1.v._42 * M2.v._24 + M1.v._43 * M2.v._34 + M1.v._44 * M2.v._44;
-    return m;
-}
-
-Float4X4 MatrixScaling(float x, float y, float z)
-{
-    Float4X4 m;
-    SDL_zero(m);
-    m.v._11 = x;
-    m.v._22 = y;
-    m.v._33 = z;
-    m.v._44 = 1.0f;
-    return m;
-}
-
-Float4X4 MatrixTranslation(float x, float y, float z)
-{
-    Float4X4 m;
-    SDL_zero(m);
-    m.v._11 = 1.0f;
-    m.v._22 = 1.0f;
-    m.v._33 = 1.0f;
-    m.v._44 = 1.0f;
-    m.v._41 = x;
-    m.v._42 = y;
-    m.v._43 = z;
-    return m;
-}
-
-Float4X4 MatrixRotationX(float r)
-{
-    float sinR = SDL_sinf(r);
-    float cosR = SDL_cosf(r);
-    Float4X4 m;
-    SDL_zero(m);
-    m.v._11 = 1.0f;
-    m.v._22 = cosR;
-    m.v._23 = sinR;
-    m.v._32 = -sinR;
-    m.v._33 = cosR;
-    m.v._44 = 1.0f;
-    return m;
-}
-
-Float4X4 MatrixRotationY(float r)
-{
-    float sinR = SDL_sinf(r);
-    float cosR = SDL_cosf(r);
-    Float4X4 m;
-    SDL_zero(m);
-    m.v._11 = cosR;
-    m.v._13 = -sinR;
-    m.v._22 = 1.0f;
-    m.v._31 = sinR;
-    m.v._33 = cosR;
-    m.v._44 = 1.0f;
-    return m;
-}
-
-Float4X4 MatrixRotationZ(float r)
-{
-    float sinR = SDL_sinf(r);
-    float cosR = SDL_cosf(r);
-    Float4X4 m;
-    SDL_zero(m);
-    m.v._11 = cosR;
-    m.v._12 = sinR;
-    m.v._21 = -sinR;
-    m.v._22 = cosR;
-    m.v._33 = 1.0f;
-    m.v._44 = 1.0f;
-    return m;
-}
-
-#endif // SDL_VIDEO_RENDER_D3D || SDL_VIDEO_RENDER_D3D11 || SDL_VIDEO_RENDER_D3D12 || SDL_VIDEO_RENDER_VULKAN
diff --git a/src/render/SDL_d3dmath.h b/src/render/SDL_d3dmath.h
index 84cff9e8fad1d..7ac9aec4f2b95 100644
--- a/src/render/SDL_d3dmath.h
+++ b/src/render/SDL_d3dmath.h
@@ -69,13 +69,108 @@ typedef struct
     };
 } Float4X4;
 
-extern Float4X4 MatrixIdentity(void);
-extern Float4X4 MatrixMultiply(Float4X4 M1, Float4X4 M2);
-extern Float4X4 MatrixScaling(float x, float y, float z);
-extern Float4X4 MatrixTranslation(float x, float y, float z);
-extern Float4X4 MatrixRotationX(float r);
-extern Float4X4 MatrixRotationY(float r);
-extern Float4X4 MatrixRotationZ(float r);
+static inline Float4X4 MatrixIdentity(void)
+{
+    Float4X4 m;
+    SDL_zero(m);
+    m.v._11 = 1.0f;
+    m.v._22 = 1.0f;
+    m.v._33 = 1.0f;
+    m.v._44 = 1.0f;
+    return m;
+}
+
+static inline Float4X4 MatrixMultiply(Float4X4 M1, Float4X4 M2)
+{
+    Float4X4 m;
+    m.v._11 = M1.v._11 * M2.v._11 + M1.v._12 * M2.v._21 + M1.v._13 * M2.v._31 + M1.v._14 * M2.v._41;
+    m.v._12 = M1.v._11 * M2.v._12 + M1.v._12 * M2.v._22 + M1.v._13 * M2.v._32 + M1.v._14 * M2.v._42;
+    m.v._13 = M1.v._11 * M2.v._13 + M1.v._12 * M2.v._23 + M1.v._13 * M2.v._33 + M1.v._14 * M2.v._43;
+    m.v._14 = M1.v._11 * M2.v._14 + M1.v._12 * M2.v._24 + M1.v._13 * M2.v._34 + M1.v._14 * M2.v._44;
+    m.v._21 = M1.v._21 * M2.v._11 + M1.v._22 * M2.v._21 + M1.v._23 * M2.v._31 + M1.v._24 * M2.v._41;
+    m.v._22 = M1.v._21 * M2.v._12 + M1.v._22 * M2.v._22 + M1.v._23 * M2.v._32 + M1.v._24 * M2.v._42;
+    m.v._23 = M1.v._21 * M2.v._13 + M1.v._22 * M2.v._23 + M1.v._23 * M2.v._33 + M1.v._24 * M2.v._43;
+    m.v._24 = M1.v._21 * M2.v._14 + M1.v._22 * M2.v._24 + M1.v._23 * M2.v._34 + M1.v._24 * M2.v._44;
+    m.v._31 = M1.v._31 * M2.v._11 + M1.v._32 * M2.v._21 + M1.v._33 * M2.v._31 + M1.v._34 * M2.v._41;
+    m.v._32 = M1.v._31 * M2.v._12 + M1.v._32 * M2.v._22 + M1.v._33 * M2.v._32 + M1.v._34 * M2.v._42;
+    m.v._33 = M1.v._31 * M2.v._13 + M1.v._32 * M2.v._23 + M1.v._33 * M2.v._33 + M1.v._34 * M2.v._43;
+    m.v._34 = M1.v._31 * M2.v._14 + M1.v._32 * M2.v._24 + M1.v._33 * M2.v._34 + M1.v._34 * M2.v._44;
+    m.v._41 = M1.v._41 * M2.v._11 + M1.v._42 * M2.v._21 + M1.v._43 * M2.v._31 + M1.v._44 * M2.v._41;
+    m.v._42 = M1.v._41 * M2.v._12 + M1.v._42 * M2.v._22 + M1.v._43 * M2.v._32 + M1.v._44 * M2.v._42;
+    m.v._43 = M1.v._41 * M2.v._13 + M1.v._42 * M2.v._23 + M1.v._43 * M2.v._33 + M1.v._44 * M2.v._43;
+    m.v._44 = M1.v._41 * M2.v._14 + M1.v._42 * M2.v._24 + M1.v._43 * M2.v._34 + M1.v._44 * M2.v._44;
+    return m;
+}
+
+static inline Float4X4 MatrixScaling(float x, float y, float z)
+{
+    Float4X4 m;
+    SDL_zero(m);
+    m.v._11 = x;
+    m.v._22 = y;
+    m.v._33 = z;
+    m.v._44 = 1.0f;
+    return m;
+}
+
+static inline Float4X4 MatrixTranslation(float x, float y, float z)
+{
+    Float4X4 m;
+    SDL_zero(m);
+    m.v._11 = 1.0f;
+    m.v._22 = 1.0f;
+    m.v._33 = 1.0f;
+    m.v._44 = 1.0f;
+    m.v._41 = x;
+    m.v._42 = y;
+    m.v._43 = z;
+    return m;
+}
+
+static inline Float4X4 MatrixRotationX(float r)
+{
+    float sinR = SDL_sinf(r);
+    float cosR = SDL_cosf(r);
+    Float4X4 m;
+    SDL_zero(m);
+    m.v._11 = 1.0f;
+    m.v._22 = cosR;
+    m.v._23 = sinR;
+    m.v._32 = -sinR;
+    m.v._33 = cosR;
+    m.v._44 = 1.0f;
+    return m;
+}
+
+static inline Float4X4 MatrixRotationY(float r)
+{
+    float sinR = SDL_sinf(r);
+    float cosR = SDL_cosf(r);
+    Float4X4 m;
+    SDL_zero(m);
+    m.v._11 = cosR;
+    m.v._13 = -sinR;
+    m.v._22 = 1.0f;
+    m.v._31 = sinR;
+    m.v._33 = cosR;
+    m.v._44 = 1.0f;
+    return m;
+}
+
+static inline Float4X4 MatrixRotationZ(float r)
+{
+    float sinR = SDL_sinf(r);
+    float cosR = SDL_cosf(r);
+    Float4X4 m;
+    SDL_zero(m);
+    m.v._11 = cosR;
+    m.v._12 = sinR;
+    m.v._21 = -sinR;
+    m.v._22 = cosR;
+    m.v._33 = 1.0f;
+    m.v._44 = 1.0f;
+    return m;
+}
 
 // Ends C function definitions when using C++
 #ifdef __cplusplus