From 12e0e6d130a037e94ca2693eb54b8a8e9fc389f5 Mon Sep 17 00:00:00 2001
From: avafinger <[EMAIL REDACTED]>
Date: Sun, 25 Dec 2022 21:44:40 -0300
Subject: [PATCH] SDL3 with Hardware Acceleration for ROCKCHIP platform (mali
blob)
---
CMakeLists.txt | 3 +++
cmake/sdlchecks.cmake | 17 ++++++++++++++++-
include/build_config/SDL_build_config.h.cmake | 1 +
src/video/kmsdrm/SDL_kmsdrmopengles.c | 5 +++--
src/video/kmsdrm/SDL_kmsdrmvideo.c | 4 +++-
5 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4705c714e453..6d60cec3d59f 100644
--- a/CMakeLists.txt
+++ b/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()
diff --git a/cmake/sdlchecks.cmake b/cmake/sdlchecks.cmake
index 39e788687f1f..84a104c35e70 100644
--- a/cmake/sdlchecks.cmake
+++ b/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
diff --git a/include/build_config/SDL_build_config.h.cmake b/include/build_config/SDL_build_config.h.cmake
index 6ffea5ae0da2..96eb44e51b9f 100644
--- a/include/build_config/SDL_build_config.h.cmake
+++ b/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@
diff --git a/src/video/kmsdrm/SDL_kmsdrmopengles.c b/src/video/kmsdrm/SDL_kmsdrmopengles.c
index 54873527e016..8d3bb37853b2 100644
--- a/src/video/kmsdrm/SDL_kmsdrmopengles.c
+++ b/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;
diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c
index 33ea8a1f299b..30d0187ab758 100644
--- a/src/video/kmsdrm/SDL_kmsdrmvideo.c
+++ b/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);