Add SDL_MEMALIGNED flag for SDL_Surface using aligned memory. If an SDL_Surface has an aligned memory pointers, it should be freed using SDL_SIMDFree() (will be used by SDL_ttf).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
diff --git a/include/SDL_surface.h b/include/SDL_surface.h
index 2175519..457a8eb 100644
--- a/include/SDL_surface.h
+++ b/include/SDL_surface.h
@@ -53,6 +53,7 @@ extern "C" {
#define SDL_PREALLOC 0x00000001 /**< Surface uses preallocated memory */
#define SDL_RLEACCEL 0x00000002 /**< Surface is RLE encoded */
#define SDL_DONTFREE 0x00000004 /**< Surface is referenced internally */
+#define SDL_MEMALIGNED 0x00000008 /**< Surface uses aligned memory */
/* @} *//* Surface flags */
/**
diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c
index 472051d..a95fce6 100644
--- a/src/video/SDL_surface.c
+++ b/src/video/SDL_surface.c
@@ -26,6 +26,7 @@
#include "SDL_RLEaccel_c.h"
#include "SDL_pixels_c.h"
#include "SDL_yuv_c.h"
+#include "../../cpuinfo/SDL_simd.h"
/* Check to make sure we can safely check multiplication of surface w and pitch and it won't overflow size_t */
@@ -289,7 +290,7 @@ SDL_HasColorKey(SDL_Surface * surface)
return SDL_FALSE;
}
- return SDL_TRUE;
+ return SDL_TRUE;
}
int
@@ -1258,7 +1259,13 @@ SDL_FreeSurface(SDL_Surface * surface)
SDL_FreeFormat(surface->format);
surface->format = NULL;
}
- if (!(surface->flags & SDL_PREALLOC)) {
+ if (surface->flags & SDL_PREALLOC) {
+ /* Don't free */
+ } else if (surface->flags & SDL_MEMALIGNED) {
+ /* Free aligned */
+ SDL_SIMDFree(surface->pixels);
+ } else {
+ /* Normal */
SDL_free(surface->pixels);
}
if (surface->map) {