Harmony port: video vulkan library & disable version test

This commit is contained in:
Jack253-png 2025-05-31 14:03:05 +08:00
parent addb748c64
commit 845ba7d5ce
No known key found for this signature in database
GPG Key ID: 51EA61206B02D886
6 changed files with 144 additions and 1 deletions

View File

@ -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:"

View File

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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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