Commit e5d194e9027bc1daa7ce2b35e46be85ab820a867

Sylvain Becker 2019-01-31T11:45:31

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).

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) {