SDL: VITASDK compatibility

From ca5e5d615435cf0d57f87288f4d6199a31b50b3f Mon Sep 17 00:00:00 2001
From: Ivan Epifanov <[EMAIL REDACTED]>
Date: Fri, 18 Dec 2020 16:34:24 +0300
Subject: [PATCH] VITASDK compatibility

---
 Makefile.vita.dolce                     |  2 +-
 Makefile.vita.vita                      | 59 +++++++++++++++++++++++++
 include/SDL_config_vita.h               |  9 +---
 include/SDL_stdinc.h                    |  2 +-
 src/filesystem/vita/SDL_sysfilesystem.c |  4 ++
 src/sensor/vita/SDL_vitasensor.c        |  6 +++
 src/video/vita/SDL_vitagl.c             |  2 +-
 src/video/vita/SDL_vitavideo.c          | 14 +++++-
 8 files changed, 86 insertions(+), 12 deletions(-)
 create mode 100644 Makefile.vita.vita

diff --git a/Makefile.vita.dolce b/Makefile.vita.dolce
index 4e2a6430b..cea584372 100644
--- a/Makefile.vita.dolce
+++ b/Makefile.vita.dolce
@@ -42,7 +42,7 @@ PREFIX  = arm-dolce-eabi
 CC      = $(PREFIX)-gcc
 AR      = $(PREFIX)-ar
 CFLAGS  = -g -Wl,-q -Wall -O3 -Iinclude \
-                        -D__VITA__ -D__ARM_ARCH=7 -D__ARM_ARCH_7A__ \
+                        -D__VITA__ -DDOLCEVITA -D__ARM_ARCH=7 -D__ARM_ARCH_7A__ \
                         -mfpu=neon -mcpu=cortex-a9 -mfloat-abi=hard
 ASFLAGS = $(CFLAGS)
 
diff --git a/Makefile.vita.vita b/Makefile.vita.vita
new file mode 100644
index 000000000..0d294d076
--- /dev/null
+++ b/Makefile.vita.vita
@@ -0,0 +1,59 @@
+# Based on port by xerpi
+# Makefile to build the SDL library
+
+TARGET_LIB = libSDL2.a
+
+SOURCES = \
+	src/*.c \
+	src/atomic/*.c \
+	src/audio/*.c \
+	src/audio/vita/*.c \
+	src/cpuinfo/*.c \
+	src/events/*.c \
+	src/file/*.c \
+	src/haptic/*.c \
+	src/haptic/dummy/*.c \
+	src/joystick/*.c \
+	src/joystick/vita/*.c \
+	src/loadso/dummy/*.c \
+	src/power/*.c \
+	src/power/vita/*.c \
+	src/filesystem/vita/*.c \
+	src/render/*.c \
+	src/render/software/*.c \
+	src/render/vitagxm/*.c \
+	src/sensor/*.c \
+	src/sensor/vita/*.c \
+	src/stdlib/*.c \
+	src/thread/*.c \
+	src/thread/generic/SDL_systls.c \
+	src/thread/vita/*.c \
+	src/timer/*.c \
+	src/timer/vita/*.c \
+	src/video/*.c \
+	src/video/vita/*.c \
+	src/video/yuv2rgb/*.c \
+	src/video/arm/*.S \
+
+OBJS = $(shell echo $(SOURCES) | sed -e 's,\.c,\.o,g' | sed -e 's,\.S,\.o,g')
+
+PREFIX  = arm-vita-eabi
+CC      = $(PREFIX)-gcc
+AR      = $(PREFIX)-ar
+CFLAGS  = -g -Wl,-q -Wall -O3 -Iinclude \
+                        -D__VITA__ -DSCE_OK=0 -D__ARM_ARCH=7 -D__ARM_ARCH_7A__ \
+                        -mfpu=neon -mcpu=cortex-a9 -mfloat-abi=hard
+ASFLAGS = $(CFLAGS)
+
+$(TARGET_LIB): $(OBJS)
+	$(AR) rcs $@ $^
+
+clean:
+	@rm -f $(TARGET_LIB) $(OBJS)
+
+install: $(TARGET_LIB)
+	@mkdir -p "$(DESTDIR)$(VITASDK)/arm-vita-eabi/lib"
+	@cp  $(TARGET_LIB) $(DESTDIR)$(VITASDK)/arm-vita-eabi/lib
+	@mkdir -p "$(DESTDIR)$(VITASDK)/arm-vita-eabi/include/SDL2"
+	@cp include/*.h "$(DESTDIR)$(VITASDK)/arm-vita-eabi/include/SDL2"
+	@echo "Installed!"
diff --git a/include/SDL_config_vita.h b/include/SDL_config_vita.h
index dee71f5dc..2b9d62484 100644
--- a/include/SDL_config_vita.h
+++ b/include/SDL_config_vita.h
@@ -142,16 +142,11 @@
 #define SDL_FILESYSTEM_VITA   1
 #define SDL_SENSOR_VITA 1
 
-//#if defined(_VITA_GLES2_)
+#if defined(DOLCEVITA)
  #define SDL_VIDEO_RENDER_VITA_GLES2 1
-//#else
- #define SDL_VIDEO_RENDER_VITA_GXM 1
-//#endif
-
-#if defined(SDL_VIDEO_RENDER_VITA_GLES2) || defined(SDL_VIDEO_RENDER_VITA_GXM)
  #define SDL_VIDEO_OPENGL_ES2 1
 #endif
-
+#define SDL_VIDEO_RENDER_VITA_GXM 1
 
 /* VITA doesn't have haptic device (src/haptic/dummy/\*.c) */
 #define SDL_HAPTIC_DISABLED    1
diff --git a/include/SDL_stdinc.h b/include/SDL_stdinc.h
index c3a03b2d3..d286e68a9 100644
--- a/include/SDL_stdinc.h
+++ b/include/SDL_stdinc.h
@@ -366,7 +366,7 @@ SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);
 
 /** \cond */
 #ifndef DOXYGEN_SHOULD_IGNORE_THIS
-#if !defined(__ANDROID__)
+#if !defined(__ANDROID__) && !defined(__VITA__)
    /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */
 typedef enum
 {
diff --git a/src/filesystem/vita/SDL_sysfilesystem.c b/src/filesystem/vita/SDL_sysfilesystem.c
index 3d21604cf..b382bc902 100644
--- a/src/filesystem/vita/SDL_sysfilesystem.c
+++ b/src/filesystem/vita/SDL_sysfilesystem.c
@@ -29,7 +29,11 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
+#if DOLCEVITA
 #include <psp2/kernel/iofilemgr.h>
+#else
+#include <psp2/io/stat.h>
+#endif
 #include <sys/types.h>
 #include <limits.h>
 #include <fcntl.h>
diff --git a/src/sensor/vita/SDL_vitasensor.c b/src/sensor/vita/SDL_vitasensor.c
index 85f941d60..da6555235 100644
--- a/src/sensor/vita/SDL_vitasensor.c
+++ b/src/sensor/vita/SDL_vitasensor.c
@@ -28,7 +28,13 @@
 #include "SDL_vitasensor.h"
 #include "../SDL_syssensor.h"
 #include <psp2/motion.h>
+#if DOLCEVITA
 #include <psp2/error.h>
+#endif
+
+#if !defined(SCE_MOTION_MAX_NUM_STATES)
+#define SCE_MOTION_MAX_NUM_STATES 64
+#endif
 
 typedef struct
 {
diff --git a/src/video/vita/SDL_vitagl.c b/src/video/vita/SDL_vitagl.c
index d8ee86f49..777d18b65 100644
--- a/src/video/vita/SDL_vitagl.c
+++ b/src/video/vita/SDL_vitagl.c
@@ -20,7 +20,7 @@
 */
 #include "../../SDL_internal.h"
 
-#if SDL_VIDEO_DRIVER_VITA
+#if SDL_VIDEO_DRIVER_VITA && SDL_VIDEO_OPENGL_ES2
 
 #include <stdlib.h>
 #include <string.h>
diff --git a/src/video/vita/SDL_vitavideo.c b/src/video/vita/SDL_vitavideo.c
index 8bc1ee752..ca693685e 100644
--- a/src/video/vita/SDL_vitavideo.c
+++ b/src/video/vita/SDL_vitavideo.c
@@ -37,8 +37,9 @@
 #include "SDL_vitatouch.h"
 #include "SDL_vitakeyboard.h"
 #include "SDL_vitamouse_c.h"
+#if SDLVIDEO_OPENGL_ES2
 #include "SDL_vitagl_c.h"
-
+#endif
 #include <psp2/ime_dialog.h>
 
 SDL_Window *Vita_Window;
@@ -66,8 +67,9 @@ VITA_Create()
 {
     SDL_VideoDevice *device;
     SDL_VideoData *phdata;
+#if SDLVIDEO_OPENGL_ES2
     SDL_GLDriverData *gldata;
-
+#endif
     /* Initialize SDL_VideoDevice structure */
     device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
     if (device == NULL) {
@@ -82,6 +84,7 @@ VITA_Create()
         SDL_free(device);
         return NULL;
     }
+#if SDLVIDEO_OPENGL_ES2
 
     gldata = (SDL_GLDriverData *) SDL_calloc(1, sizeof(SDL_GLDriverData));
     if (gldata == NULL) {
@@ -92,6 +95,7 @@ VITA_Create()
     }
     device->gl_data = gldata;
     phdata->egl_initialized = SDL_TRUE;
+#endif
     phdata->ime_active = SDL_FALSE;
 
     device->driverdata = phdata;
@@ -123,6 +127,7 @@ VITA_Create()
     device->DestroyWindow = VITA_DestroyWindow;
     device->GetWindowWMInfo = VITA_GetWindowWMInfo;
 
+#if SDL_VIDEO_OPENGL_ES2
     device->GL_LoadLibrary = VITA_GL_LoadLibrary;
     device->GL_GetProcAddress = VITA_GL_GetProcAddress;
     device->GL_UnloadLibrary = VITA_GL_UnloadLibrary;
@@ -132,6 +137,7 @@ VITA_Create()
     device->GL_GetSwapInterval = VITA_GL_GetSwapInterval;
     device->GL_SwapWindow = VITA_GL_SwapWindow;
     device->GL_DeleteContext = VITA_GL_DeleteContext;
+#endif
 
     device->HasScreenKeyboardSupport = VITA_HasScreenKeyboardSupport;
     device->ShowScreenKeyboard = VITA_ShowScreenKeyboard;
@@ -321,6 +327,10 @@ SDL_bool VITA_HasScreenKeyboardSupport(_THIS)
     return SDL_TRUE;
 }
 
+#if !defined(SCE_IME_LANGUAGE_ENGLISH_US)
+#define SCE_IME_LANGUAGE_ENGLISH_US SCE_IME_LANGUAGE_ENGLISH
+#endif
+
 void VITA_ShowScreenKeyboard(_THIS, SDL_Window *window)
 {
     SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata;