From 845ba7d5cee34feec3026abcb4035446e79f1b04 Mon Sep 17 00:00:00 2001 From: Jack253-png Date: Sat, 31 May 2025 14:03:05 +0800 Subject: [PATCH] Harmony port: video vulkan library & disable version test --- .github/workflows/generic.yml | 2 +- CMakeLists.txt | 10 ++++ src/video/SDL_sysvideo.h | 1 + src/video/ohos/SDL_ohosvideo.c | 39 ++++++++++++++++ src/video/ohos/SDL_ohosvulkan.c | 82 +++++++++++++++++++++++++++++++++ src/video/ohos/SDL_ohosvulkan.h | 11 +++++ 6 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 src/video/ohos/SDL_ohosvideo.c create mode 100644 src/video/ohos/SDL_ohosvulkan.c create mode 100644 src/video/ohos/SDL_ohosvulkan.h diff --git a/.github/workflows/generic.yml b/.github/workflows/generic.yml index 1cd6b62411..e50ac9857d 100644 --- a/.github/workflows/generic.yml +++ b/.github/workflows/generic.yml @@ -236,7 +236,7 @@ jobs: ${{ matrix.platform.source-cmd }} cmake --build build --config ${{ matrix.platform.cmake-build-type }} --verbose -- ${{ matrix.platform.cmake-build-arguments }} - name: 'Verify SDL_REVISION' - if: ${{ !matrix.platform.no-cmake }} + if: ${{ !matrix.platform.no-cmake && matrix.platform.platform != 'harmony' }} run: | echo "This should show us the SDL_REVISION" echo "Shared library:" diff --git a/CMakeLists.txt b/CMakeLists.txt index c5e0b3b52b..f5b179d029 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1512,6 +1512,16 @@ elseif(OHOS) sdl_link_dependency(OHOS_LIBS LIBS ace_napi.z hilog_ndk.z ace_ndk.z rawfile.z pixelmap_ndk.z) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/core/ohos/*.c") + if(SDL_VIDEO) + set(SDL_VIDEO_DRIVER_OHOS 1) + sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/ohos/*.c") + set(HAVE_SDL_VIDEO TRUE) + set(SDL_VULKAN ON) + set(HAVE_VULKAN ON) + set(SDL_VIDEO_VULKAN ON) + set(HAVE_RENDER_VULKAN TRUE) + endif() + set(SDL_LOADSO_DLOPEN 1) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/loadso/dlopen/*.c") set(HAVE_SDL_LOADSO TRUE) diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 8396addb00..b53b869f6a 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -542,6 +542,7 @@ extern VideoBootStrap Emscripten_bootstrap; extern VideoBootStrap OFFSCREEN_bootstrap; extern VideoBootStrap QNX_bootstrap; extern VideoBootStrap OPENVR_bootstrap; +extern VideoBootStrap OHOS_bootstrap; extern bool SDL_UninitializedVideo(void); // Use SDL_OnVideoThread() sparingly, to avoid regressions in use cases that currently happen to work diff --git a/src/video/ohos/SDL_ohosvideo.c b/src/video/ohos/SDL_ohosvideo.c new file mode 100644 index 0000000000..effafc4b1c --- /dev/null +++ b/src/video/ohos/SDL_ohosvideo.c @@ -0,0 +1,39 @@ +#include "SDL_internal.h" +#include "../SDL_sysvideo.h" + +#ifdef SDL_VIDEO_DRIVER_OHOS +#include "SDL_ohosvulkan.h" + +bool OHOS_VideoInit(SDL_VideoDevice *_this) +{ + return true; +} +void OHOS_VideoQuit(SDL_VideoDevice *_this) +{ +} +static SDL_VideoDevice *OHOS_CreateDevice(void) +{ + SDL_VideoDevice *device; + + device = (SDL_VideoDevice *)SDL_calloc(1, sizeof(SDL_VideoDevice)); + if (!device) { + return NULL; + } + + device->VideoInit = OHOS_VideoInit; + device->VideoQuit = OHOS_VideoQuit; +#ifdef SDL_VIDEO_VULKAN + device->Vulkan_LoadLibrary = OHOS_Vulkan_LoadLibrary; + device->Vulkan_UnloadLibrary = OHOS_Vulkan_UnloadLibrary; +#endif + + + return device; +} +VideoBootStrap OHOS_bootstrap = { + "ohos", "OpenHarmony video driver", + OHOS_CreateDevice, + NULL, + false +}; +#endif diff --git a/src/video/ohos/SDL_ohosvulkan.c b/src/video/ohos/SDL_ohosvulkan.c new file mode 100644 index 0000000000..f3869b1051 --- /dev/null +++ b/src/video/ohos/SDL_ohosvulkan.c @@ -0,0 +1,82 @@ +#include "SDL_ohosvulkan.h" +#include "SDL_internal.h" +#include "../khronos/vulkan/vulkan.h" + +#ifdef SDL_VIDEO_DRIVER_OHOS + +static int loadedCount = 0; +bool OHOS_Vulkan_LoadLibrary(SDL_VideoDevice *_this, const char *path) +{ + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = NULL; + if (_this->vulkan_config.loader_handle) + { + return SDL_SetError("Vulkan already loaded"); + } + + /* Load the Vulkan loader library */ + if (!path) + { + path = SDL_getenv("SDL_VULKAN_LIBRARY"); + } + if (!path) + { + path = "libvulkan.so"; + } + _this->vulkan_config.loader_handle = SDL_LoadObject(path); + if (!_this->vulkan_config.loader_handle) + { + return false; + } + SDL_strlcpy(_this->vulkan_config.loader_path, path, + SDL_arraysize(_this->vulkan_config.loader_path)); + vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)SDL_LoadFunction( + _this->vulkan_config.loader_handle, "vkGetInstanceProcAddr"); + if (!vkGetInstanceProcAddr) + { + goto fail; + } + _this->vulkan_config.vkGetInstanceProcAddr = (void *)vkGetInstanceProcAddr; + _this->vulkan_config.vkEnumerateInstanceExtensionProperties = + (void *)((PFN_vkGetInstanceProcAddr)_this->vulkan_config.vkGetInstanceProcAddr)( + VK_NULL_HANDLE, "vkEnumerateInstanceExtensionProperties"); + if (!_this->vulkan_config.vkEnumerateInstanceExtensionProperties) + { + goto fail; + } + loadedCount++; + return true; + +fail: + SDL_UnloadObject(_this->vulkan_config.loader_handle); + _this->vulkan_config.loader_handle = NULL; + return false; +} + +void OHOS_Vulkan_UnloadLibrary(SDL_VideoDevice *_this) +{ + if (loadedCount == 0) + { + return; + } + loadedCount--; + if (_this->vulkan_config.loader_handle && loadedCount == 0) { + SDL_UnloadObject(_this->vulkan_config.loader_handle); + _this->vulkan_config.loader_handle = NULL; + } +} + +/*bool OHOS_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, SDL_Window *window, unsigned *count, + const char **names) +{ + static const char *const extensionsForOHOS[] = { + VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_OHOS_XCOMPONENT_EXTENSION_NAME + }; + if (!_this->vulkan_config.loader_handle) { + SDL_SetError("Vulkan is not loaded"); + return false; + } + return SDL_Vulkan_GetInstanceExtensions_Helper( + count, names, SDL_arraysize(extensionsForOHOS), extensionsForOHOS); +}*/ + +#endif diff --git a/src/video/ohos/SDL_ohosvulkan.h b/src/video/ohos/SDL_ohosvulkan.h new file mode 100644 index 0000000000..8a3364e3ca --- /dev/null +++ b/src/video/ohos/SDL_ohosvulkan.h @@ -0,0 +1,11 @@ +#ifndef SDL_OHOSVULKAN_H +#define SDL_OHOSVULKAN_H + +#ifdef SDL_VIDEO_DRIVER_OHOS +#include "../SDL_sysvideo.h" + +bool OHOS_Vulkan_LoadLibrary(SDL_VideoDevice *_this, const char *path); +void OHOS_Vulkan_UnloadLibrary(SDL_VideoDevice *_this); +#endif + +#endif