|
1 | 1 | #include "SDL_ohosvulkan.h"
|
2 | 2 | #include "SDL_internal.h"
|
3 |
| -#include "../khronos/vulkan/vulkan_ohos.h" |
| 3 | +#include <vulkan/vulkan_core.h> |
4 | 4 |
|
5 | 5 | #ifdef SDL_VIDEO_DRIVER_OHOS
|
| 6 | +#define VK_USE_PLATFORM_OHOS 1 |
| 7 | +#include "vulkan/vulkan.h" |
6 | 8 | #include "../SDL_sysvideo.h"
|
| 9 | +#include "../../core/ohos/SDL_ohos.h" |
| 10 | +#include "vulkan/vulkan_ohos.h" |
| 11 | +#include <native_window/external_window.h> |
7 | 12 |
|
8 | 13 | static int loadedCount = 0;
|
9 | 14 | bool OHOS_Vulkan_LoadLibrary(SDL_VideoDevice *_this, const char *path)
|
@@ -69,12 +74,63 @@ void OHOS_Vulkan_UnloadLibrary(SDL_VideoDevice *_this)
|
69 | 74 | char const* const* OHOS_Vulkan_GetInstanceExtensions(SDL_VideoDevice *_this, Uint32 *count)
|
70 | 75 | {
|
71 | 76 | static const char *const extensionsForOHOS[] = {
|
72 |
| - VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_OHOS_XCOMPONENT_EXTENSION_NAME |
| 77 | + VK_KHR_SURFACE_EXTENSION_NAME, VK_OHOS_SURFACE_EXTENSION_NAME |
73 | 78 | };
|
74 | 79 | if (count) {
|
75 | 80 | *count = SDL_arraysize(extensionsForOHOS);
|
76 | 81 | }
|
77 | 82 | return extensionsForOHOS;
|
78 | 83 | }
|
79 | 84 |
|
| 85 | +bool OHOS_Vulkan_CreateSurface(SDL_VideoDevice *_this, |
| 86 | + SDL_Window *window, |
| 87 | + VkInstance instance, |
| 88 | + const struct VkAllocationCallbacks *allocator, |
| 89 | + VkSurfaceKHR *surface) |
| 90 | +{ |
| 91 | + VkResult result; |
| 92 | + |
| 93 | + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = |
| 94 | + (PFN_vkGetInstanceProcAddr)_this->vulkan_config.vkGetInstanceProcAddr; |
| 95 | + PFN_vkCreateSurfaceOHOS vkCreateSurfaceOHOS = |
| 96 | + (PFN_vkCreateSurfaceOHOS)vkGetInstanceProcAddr(instance, "vkCreateSurfaceOHOS"); |
| 97 | + VkSurfaceCreateInfoOHOS createInfo; |
| 98 | + |
| 99 | + if (!_this->vulkan_config.loader_handle) { |
| 100 | + SDL_SetError("Vulkan is not loaded"); |
| 101 | + return false; |
| 102 | + } |
| 103 | + |
| 104 | + if (!vkCreateSurfaceOHOS) { |
| 105 | + SDL_SetError(VK_OHOS_SURFACE_EXTENSION_NAME |
| 106 | + " extension is not enabled in the Vulkan instance."); |
| 107 | + return false; |
| 108 | + } |
| 109 | + |
| 110 | + SDL_zero(createInfo); |
| 111 | + createInfo.sType = VK_STRUCTURE_TYPE_SURFACE_CREATE_INFO_OHOS; |
| 112 | + createInfo.pNext = NULL; |
| 113 | + createInfo.flags = 0; |
| 114 | + createInfo.window = nativeWindow; |
| 115 | + result = vkCreateSurfaceOHOS(instance, &createInfo, NULL, surface); |
| 116 | + if (result != VK_SUCCESS) { |
| 117 | + SDL_SetError("vkCreateSurfaceOHOS failed: %d", result); |
| 118 | + return false; |
| 119 | + } |
| 120 | + return true; |
| 121 | +} |
| 122 | + |
| 123 | +void OHOS_Vulkan_DestroySurface(SDL_VideoDevice *_this, |
| 124 | + VkInstance instance, |
| 125 | + VkSurfaceKHR surface, |
| 126 | + const struct VkAllocationCallbacks *allocator) |
| 127 | +{ |
| 128 | + if (_this->vulkan_config.loader_handle) { |
| 129 | + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = |
| 130 | + (PFN_vkGetInstanceProcAddr)_this->vulkan_config.vkGetInstanceProcAddr; |
| 131 | + PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR"); |
| 132 | + vkDestroySurfaceKHR(instance, surface, allocator); |
| 133 | + } |
| 134 | +} |
| 135 | + |
80 | 136 | #endif
|
0 commit comments