Browse Source

SDL3 with Hardware Acceleration for ROCKCHIP platform (mali blob)

avafinger 2 years ago
parent
commit
12e0e6d130

+ 3 - 0
CMakeLists.txt

@@ -430,6 +430,7 @@ dep_option(SDL_WAYLAND_LIBDECOR    "Use client-side window decorations on Waylan
 dep_option(SDL_WAYLAND_LIBDECOR_SHARED     "Dynamically load libdecor support" ON "SDL_WAYLAND_LIBDECOR;SDL_WAYLAND_SHARED" OFF)
 dep_option(SDL_WAYLAND_QT_TOUCH    "QtWayland server support for Wayland video driver" ON "SDL_WAYLAND" OFF)
 set_option(SDL_RPI                 "Use Raspberry Pi video driver" ${UNIX_SYS})
+set_option(SDL_ROCKCHIP            "Use ROCKCHIP Hardware Acceleration video driver" ${UNIX_SYS})
 set_option(SDL_COCOA               "Use Cocoa video driver" ${APPLE})
 set_option(SDL_DIRECTX             "Use DirectX for Windows audio/video" ${WINDOWS})
 set_option(SDL_XINPUT              "Use Xinput for Windows" ${WINDOWS})
@@ -1388,6 +1389,8 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
   if(SDL_VIDEO)
     # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
     CheckRPI()
+    # Need to check for ROCKCHIP platform and get rid of "Can't window GBM/EGL surfaces on window creation."
+    CheckROCKCHIP()
     CheckX11()
     # Need to check for EGL first because KMSDRM and Wayland depends on it.
     CheckEGL()

+ 16 - 1
cmake/sdlchecks.cmake

@@ -675,7 +675,7 @@ macro(CheckGLX)
     check_c_source_compiles("
         #include <GL/glx.h>
         int main(int argc, char** argv) { return 0; }" HAVE_OPENGL_GLX)
-    if(HAVE_OPENGL_GLX)
+    if(HAVE_OPENGL_GLX AND NOT HAVE_ROCKCHIP)
       set(SDL_VIDEO_OPENGL_GLX 1)
     endif()
   endif()
@@ -1115,6 +1115,21 @@ macro(CheckRPI)
   endif()
 endmacro()
 
+# Requires:
+# - n/a
+macro(CheckROCKCHIP)
+  if(SDL_ROCKCHIP)
+    pkg_check_modules(VIDEO_ROCKCHIP mali)
+    if (VIDEO_ROCKCHIP_FOUND)
+      set(HAVE_ROCKCHIP TRUE)
+    endif()
+    if(SDL_VIDEO AND HAVE_ROCKCHIP)
+      set(HAVE_SDL_VIDEO TRUE)
+      set(SDL_VIDEO_DRIVER_ROCKCHIP 1)
+    endif()
+  endif()
+endmacro()
+
 # Requires:
 # - EGL
 # - PkgCheckModules

+ 1 - 0
include/build_config/SDL_build_config.h.cmake

@@ -393,6 +393,7 @@
 #cmakedefine SDL_VIDEO_DRIVER_WINRT @SDL_VIDEO_DRIVER_WINRT@
 #cmakedefine SDL_VIDEO_DRIVER_WAYLAND @SDL_VIDEO_DRIVER_WAYLAND@
 #cmakedefine SDL_VIDEO_DRIVER_RPI @SDL_VIDEO_DRIVER_RPI@
+#cmakedefine SDL_VIDEO_DRIVER_ROCKCHIP @SDL_VIDEO_DRIVER_ROCKCHIP@
 #cmakedefine SDL_VIDEO_DRIVER_VIVANTE @SDL_VIDEO_DRIVER_VIVANTE@
 #cmakedefine SDL_VIDEO_DRIVER_VIVANTE_VDK @SDL_VIDEO_DRIVER_VIVANTE_VDK@
 #cmakedefine SDL_VIDEO_DRIVER_RISCOS @SDL_VIDEO_DRIVER_RISCOS@

+ 3 - 2
src/video/kmsdrm/SDL_kmsdrmopengles.c

@@ -37,8 +37,9 @@
 void KMSDRM_GLES_DefaultProfileConfig(_THIS, int *mask, int *major, int *minor)
 {
     /* if SDL was _also_ built with the Raspberry Pi driver (so we're
-       definitely a Pi device), default to GLES2. */
-#if SDL_VIDEO_DRIVER_RPI
+       definitely a Pi device) or with the ROCKCHIP video driver
+       (it's a ROCKCHIP device),  default to GLES2. */
+#if defined(SDL_VIDEO_DRIVER_RPI) || defined(SDL_VIDEO_DRIVER_ROCKCHIP)
     *mask = SDL_GL_CONTEXT_PROFILE_ES;
     *major = 2;
     *minor = 0;

+ 3 - 1
src/video/kmsdrm/SDL_kmsdrmvideo.c

@@ -302,7 +302,9 @@ static SDL_VideoDevice *KMSDRM_CreateDevice(void)
     return device;
 
 cleanup:
-    SDL_free(device);
+    if (device) {
+    	SDL_free(device);
+    }
 
     if (viddata) {
         SDL_free(viddata);