From e339bde5058981cacd1927a551530fff5a6b63cb Mon Sep 17 00:00:00 2001 From: Jack253-png Date: Sat, 31 May 2025 15:13:29 +0800 Subject: [PATCH] Harmony port: video vulkan library --- src/core/ohos/SDL_ohos.h | 1 - src/video/ohos/SDL_ohosvideo.c | 2 ++ src/video/ohos/SDL_ohosvulkan.c | 60 +++++++++++++++++++++++++++++++-- src/video/ohos/SDL_ohosvulkan.h | 9 +++++ 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/src/core/ohos/SDL_ohos.h b/src/core/ohos/SDL_ohos.h index ddea0b43ca..bcc2537d6b 100644 --- a/src/core/ohos/SDL_ohos.h +++ b/src/core/ohos/SDL_ohos.h @@ -6,7 +6,6 @@ #include extern SDL_Mutex *g_ohosPageMutex; -void SDL_OHOS_SetDisplayOrientation(int orientation); extern OHNativeWindow *nativeWindow; #endif diff --git a/src/video/ohos/SDL_ohosvideo.c b/src/video/ohos/SDL_ohosvideo.c index 6816b61ccc..e5e835c5a8 100644 --- a/src/video/ohos/SDL_ohosvideo.c +++ b/src/video/ohos/SDL_ohosvideo.c @@ -26,6 +26,8 @@ static SDL_VideoDevice *OHOS_CreateDevice(void) device->Vulkan_LoadLibrary = OHOS_Vulkan_LoadLibrary; device->Vulkan_UnloadLibrary = OHOS_Vulkan_UnloadLibrary; device->Vulkan_GetInstanceExtensions = OHOS_Vulkan_GetInstanceExtensions; + device->Vulkan_CreateSurface = OHOS_Vulkan_CreateSurface; + device->Vulkan_DestroySurface = OHOS_Vulkan_DestroySurface; #endif diff --git a/src/video/ohos/SDL_ohosvulkan.c b/src/video/ohos/SDL_ohosvulkan.c index 9b90d280da..6742189dbb 100644 --- a/src/video/ohos/SDL_ohosvulkan.c +++ b/src/video/ohos/SDL_ohosvulkan.c @@ -1,9 +1,14 @@ #include "SDL_ohosvulkan.h" #include "SDL_internal.h" -#include "../khronos/vulkan/vulkan_ohos.h" +#include #ifdef SDL_VIDEO_DRIVER_OHOS +#define VK_USE_PLATFORM_OHOS 1 +#include "vulkan/vulkan.h" #include "../SDL_sysvideo.h" +#include "../../core/ohos/SDL_ohos.h" +#include "vulkan/vulkan_ohos.h" +#include static int loadedCount = 0; bool OHOS_Vulkan_LoadLibrary(SDL_VideoDevice *_this, const char *path) @@ -69,7 +74,7 @@ void OHOS_Vulkan_UnloadLibrary(SDL_VideoDevice *_this) char const* const* OHOS_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, Uint32 *count) { static const char *const extensionsForOHOS[] = { - VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_OHOS_XCOMPONENT_EXTENSION_NAME + VK_KHR_SURFACE_EXTENSION_NAME, VK_OHOS_SURFACE_EXTENSION_NAME }; if (count) { *count = SDL_arraysize(extensionsForOHOS); @@ -77,4 +82,55 @@ char const* const* OHOS_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, Uin return extensionsForOHOS; } +bool OHOS_Vulkan_CreateSurface(SDL_VideoDevice *_this, + SDL_Window *window, + VkInstance instance, + const struct VkAllocationCallbacks *allocator, + VkSurfaceKHR *surface) +{ + VkResult result; + + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = + (PFN_vkGetInstanceProcAddr)_this->vulkan_config.vkGetInstanceProcAddr; + PFN_vkCreateSurfaceOHOS vkCreateSurfaceOHOS = + (PFN_vkCreateSurfaceOHOS)vkGetInstanceProcAddr(instance, "vkCreateSurfaceOHOS"); + VkSurfaceCreateInfoOHOS createInfo; + + if (!_this->vulkan_config.loader_handle) { + SDL_SetError("Vulkan is not loaded"); + return false; + } + + if (!vkCreateSurfaceOHOS) { + SDL_SetError(VK_OHOS_SURFACE_EXTENSION_NAME + " extension is not enabled in the Vulkan instance."); + return false; + } + + SDL_zero(createInfo); + createInfo.sType = VK_STRUCTURE_TYPE_SURFACE_CREATE_INFO_OHOS; + createInfo.pNext = NULL; + createInfo.flags = 0; + createInfo.window = nativeWindow; + result = vkCreateSurfaceOHOS(instance, &createInfo, NULL, surface); + if (result != VK_SUCCESS) { + SDL_SetError("vkCreateSurfaceOHOS failed: %d", result); + return false; + } + return true; +} + +void OHOS_Vulkan_DestroySurface(SDL_VideoDevice *_this, + VkInstance instance, + VkSurfaceKHR surface, + const struct VkAllocationCallbacks *allocator) +{ + if (_this->vulkan_config.loader_handle) { + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = + (PFN_vkGetInstanceProcAddr)_this->vulkan_config.vkGetInstanceProcAddr; + PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR"); + vkDestroySurfaceKHR(instance, surface, allocator); + } +} + #endif diff --git a/src/video/ohos/SDL_ohosvulkan.h b/src/video/ohos/SDL_ohosvulkan.h index 6ea21a13d6..5700c29866 100644 --- a/src/video/ohos/SDL_ohosvulkan.h +++ b/src/video/ohos/SDL_ohosvulkan.h @@ -7,6 +7,15 @@ bool OHOS_Vulkan_LoadLibrary(SDL_VideoDevice *_this, const char *path); void OHOS_Vulkan_UnloadLibrary(SDL_VideoDevice *_this); char const* const* OHOS_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, Uint32 *count); +bool OHOS_Vulkan_CreateSurface(SDL_VideoDevice *_this, + SDL_Window *window, + VkInstance instance, + const struct VkAllocationCallbacks *allocator, + VkSurfaceKHR *surface); +void OHOS_Vulkan_DestroySurface(SDL_VideoDevice *_this, + VkInstance instance, + VkSurfaceKHR surface, + const struct VkAllocationCallbacks *allocator); #endif #endif