diff --git a/Makefile.os2 b/Makefile.os2
index 2f8d5ff34..f68755fec 100644
--- a/Makefile.os2
+++ b/Makefile.os2
@@ -67,7 +67,7 @@ CFLAGS_DLL+= -DSDL_BUILD_MAJOR_VERSION=$(MAJOR_VERSION)
CFLAGS_DLL+= -DSDL_BUILD_MINOR_VERSION=$(MINOR_VERSION)
CFLAGS_DLL+= -DSDL_BUILD_MICRO_VERSION=$(MICRO_VERSION)
-SRCS = SDL.c SDL_assert.c SDL_error.c SDL_guid.c SDL_log.c SDL_dataqueue.c SDL_hints.c SDL_list.c
+SRCS = SDL.c SDL_assert.c SDL_error.c SDL_guid.c SDL_log.c SDL_dataqueue.c SDL_hints.c SDL_list.c SDL_utils.c
SRCS+= SDL_getenv.c SDL_iconv.c SDL_malloc.c SDL_memcpy.c SDL_memset.c SDL_qsort.c SDL_stdlib.c SDL_string.c SDL_strtokr.c SDL_crc32.c
SRCS+= SDL_cpuinfo.c SDL_atomic.c SDL_spinlock.c SDL_thread.c SDL_timer.c
SRCS+= SDL_rwops.c SDL_power.c
diff --git a/Makefile.w32 b/Makefile.w32
index 978afab33..feacca898 100644
--- a/Makefile.w32
+++ b/Makefile.w32
@@ -43,7 +43,7 @@ CFLAGS_DLL+= -DSDL_BUILD_MICRO_VERSION=$(MICRO_VERSION)
RCFLAGS = -q -r -bt=nt $(INCPATH)
-SRCS = SDL.c SDL_assert.c SDL_error.c SDL_guid.c SDL_log.c SDL_dataqueue.c SDL_hints.c SDL_list.c
+SRCS = SDL.c SDL_assert.c SDL_error.c SDL_guid.c SDL_log.c SDL_dataqueue.c SDL_hints.c SDL_list.c SDL_utils.c
SRCS+= SDL_getenv.c SDL_iconv.c SDL_malloc.c SDL_memcpy.c SDL_memset.c SDL_qsort.c SDL_stdlib.c SDL_string.c SDL_strtokr.c SDL_crc32.c
SRCS+= SDL_cpuinfo.c SDL_atomic.c SDL_spinlock.c SDL_thread.c SDL_timer.c
SRCS+= SDL_rwops.c SDL_power.c
diff --git a/VisualC-GDK/SDL/SDL.vcxproj b/VisualC-GDK/SDL/SDL.vcxproj
index c511fda62..25478f392 100644
--- a/VisualC-GDK/SDL/SDL.vcxproj
+++ b/VisualC-GDK/SDL/SDL.vcxproj
@@ -689,6 +689,7 @@
+
@@ -756,4 +757,4 @@
-
\ No newline at end of file
+
diff --git a/VisualC-GDK/SDL/SDL.vcxproj.filters b/VisualC-GDK/SDL/SDL.vcxproj.filters
index 59a3d7271..dfbce651a 100644
--- a/VisualC-GDK/SDL/SDL.vcxproj.filters
+++ b/VisualC-GDK/SDL/SDL.vcxproj.filters
@@ -852,6 +852,7 @@
+
audio
@@ -1373,4 +1374,4 @@
-
\ No newline at end of file
+
diff --git a/VisualC-WinRT/SDL-UWP.vcxproj b/VisualC-WinRT/SDL-UWP.vcxproj
index aeaea7f43..9ae693095 100644
--- a/VisualC-WinRT/SDL-UWP.vcxproj
+++ b/VisualC-WinRT/SDL-UWP.vcxproj
@@ -304,6 +304,7 @@
+
diff --git a/VisualC-WinRT/SDL-UWP.vcxproj.filters b/VisualC-WinRT/SDL-UWP.vcxproj.filters
index 98b117d42..879c07c05 100644
--- a/VisualC-WinRT/SDL-UWP.vcxproj.filters
+++ b/VisualC-WinRT/SDL-UWP.vcxproj.filters
@@ -792,6 +792,9 @@
Source Files
+
+ Source Files
+
Source Files
@@ -837,4 +840,4 @@
Source Files
-
\ No newline at end of file
+
diff --git a/VisualC/SDL/SDL.vcxproj b/VisualC/SDL/SDL.vcxproj
index cb386bcf0..07e5042fc 100644
--- a/VisualC/SDL/SDL.vcxproj
+++ b/VisualC/SDL/SDL.vcxproj
@@ -557,6 +557,7 @@
+
@@ -624,4 +625,4 @@
-
\ No newline at end of file
+
diff --git a/VisualC/SDL/SDL.vcxproj.filters b/VisualC/SDL/SDL.vcxproj.filters
index c6efccb59..fc5318a09 100644
--- a/VisualC/SDL/SDL.vcxproj.filters
+++ b/VisualC/SDL/SDL.vcxproj.filters
@@ -845,6 +845,7 @@
+
audio
@@ -1348,4 +1349,4 @@
-
\ No newline at end of file
+
diff --git a/src/SDL_utils.c b/src/SDL_utils.c
new file mode 100644
index 000000000..e375d7443
--- /dev/null
+++ b/src/SDL_utils.c
@@ -0,0 +1,50 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2022 Sam Lantinga
+
+ 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"
+
+#include "SDL_utils_c.h"
+
+/* Common utility functions that aren't in the public API */
+
+int SDL_powerof2(int x)
+{
+ int value;
+
+ /* We could use this trick for 32-bit values:
+ * value = x;
+ * value -= 1;
+ * value |= value >> 1;
+ * value |= value >> 2;
+ * value |= value >> 4;
+ * value |= value >> 8;
+ * value |= value >> 16;
+ * value += 1;
+ *
+ * ... but this is more readable:
+ */
+ value = 1;
+ while (value < x) {
+ value <<= 1;
+ }
+ return value;
+}
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/src/SDL_utils_c.h b/src/SDL_utils_c.h
new file mode 100644
index 000000000..8f405159f
--- /dev/null
+++ b/src/SDL_utils_c.h
@@ -0,0 +1,32 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2022 Sam Lantinga
+
+ 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.
+*/
+
+#ifndef SDL_utils_h_
+#define SDL_utils_h_
+
+/* Common utility functions that aren't in the public API */
+
+/* Return the smallest power of 2 greater than or equal to 2 */
+int SDL_powerof2(int x);
+
+#endif /* SDL_utils_h_ */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c
index b9c38dc13..9c47d40ba 100644
--- a/src/audio/SDL_audio.c
+++ b/src/audio/SDL_audio.c
@@ -27,6 +27,7 @@
#include "SDL_audio_c.h"
#include "SDL_sysaudio.h"
#include "../thread/SDL_systhread.h"
+#include "../SDL_utils_c.h"
#define _THIS SDL_AudioDevice *_this
@@ -1417,13 +1418,7 @@ open_audio_device(const char *devname, int iscapture,
* value we got from 'desired' and round up to the nearest value
*/
if (!current_audio.impl.SupportsNonPow2Samples && device->spec.samples > 0) {
- device->spec.samples -= 1;
- device->spec.samples |= device->spec.samples >> 1;
- device->spec.samples |= device->spec.samples >> 2;
- device->spec.samples |= device->spec.samples >> 4;
- device->spec.samples |= device->spec.samples >> 8;
- device->spec.samples |= device->spec.samples >> 16;
- device->spec.samples += 1;
+ device->spec.samples = SDL_powerof2(device->spec.samples);
}
if (current_audio.impl.OpenDevice(device, devname) < 0) {
diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c
index 73a5694dd..202e17d1a 100644
--- a/src/render/opengl/SDL_render_gl.c
+++ b/src/render/opengl/SDL_render_gl.c
@@ -25,6 +25,7 @@
#include "SDL_opengl.h"
#include "../SDL_sysrender.h"
#include "SDL_shaders_gl.h"
+#include "../../SDL_utils_c.h"
#ifdef __MACOSX__
#include
@@ -411,17 +412,6 @@ GL_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
return SDL_TRUE;
}
-SDL_FORCE_INLINE int
-power_of_2(int input)
-{
- int value = 1;
-
- while (value < input) {
- value <<= 1;
- }
- return value;
-}
-
SDL_FORCE_INLINE SDL_bool
convert_format(GL_RenderData *renderdata, Uint32 pixel_format,
GLint* internalFormat, GLenum* format, GLenum* type)
@@ -540,8 +530,8 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
data->texw = (GLfloat) texture_w;
data->texh = (GLfloat) texture_h;
} else {
- texture_w = power_of_2(texture->w);
- texture_h = power_of_2(texture->h);
+ texture_w = SDL_powerof2(texture->w);
+ texture_h = SDL_powerof2(texture->h);
data->texw = (GLfloat) (texture->w) / texture_w;
data->texh = (GLfloat) texture->h / texture_h;
}
diff --git a/src/render/opengles/SDL_render_gles.c b/src/render/opengles/SDL_render_gles.c
index 9afd8d1af..588644980 100644
--- a/src/render/opengles/SDL_render_gles.c
+++ b/src/render/opengles/SDL_render_gles.c
@@ -25,6 +25,7 @@
#include "SDL_hints.h"
#include "SDL_opengles.h"
#include "../SDL_sysrender.h"
+#include "../../SDL_utils_c.h"
/* To prevent unnecessary window recreation,
* these should match the defaults selected in SDL_GL_ResetAttributes
@@ -303,17 +304,6 @@ GLES_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
return SDL_TRUE;
}
-static SDL_INLINE int
-power_of_2(int input)
-{
- int value = 1;
-
- while (value < input) {
- value <<= 1;
- }
- return value;
-}
-
static int
GLES_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
{
@@ -374,8 +364,8 @@ GLES_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
data->type = GL_TEXTURE_2D;
/* no NPOV textures allowed in OpenGL ES (yet) */
- texture_w = power_of_2(texture->w);
- texture_h = power_of_2(texture->h);
+ texture_w = SDL_powerof2(texture->w);
+ texture_h = SDL_powerof2(texture->h);
data->texw = (GLfloat) texture->w / texture_w;
data->texh = (GLfloat) texture->h / texture_h;