diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanContext.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanContext.cpp index eee1af99..044b8318 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanContext.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanContext.cpp @@ -14,7 +14,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { Shutdown(); } - void VulkanContext::Initialize(ANativeWindow* window, const std::string& appName) { + void VulkanContext::Initialize(NativeWindowType window, const std::string& appName) { if (Initialized) return; CreateInstance(appName); CreateSurface(window); @@ -58,11 +58,20 @@ namespace MobileGL::MG_Backend::DirectVulkan { ThrowIfFailed(vkCreateInstance(&ci, nullptr, &Instance), "vkCreateInstance failed"); } - void VulkanContext::CreateSurface(ANativeWindow* window) { + void VulkanContext::CreateSurface(NativeWindowType window) { +#if __ANDROID__ if (!Instance) throw MobileGL::RuntimeError("Instance not created"); + + auto* nativeWindow = static_cast(window); + if (!nativeWindow) throw MobileGL::RuntimeError("ANativeWindowType is null"); + VkAndroidSurfaceCreateInfoKHR sci{VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR}; - sci.window = window; + sci.window = nativeWindow; ThrowIfFailed(vkCreateAndroidSurfaceKHR(Instance, &sci, nullptr, &Surface), "vkCreateAndroidSurfaceKHR failed"); +#else + MGLOG_W("VulkanRenderer::Initialize called on a platform which is not supported yet"); // TODO: support more + // platforms +#endif } void VulkanContext::PickPhysicalDevice() { @@ -110,4 +119,4 @@ namespace MobileGL::MG_Backend::DirectVulkan { vkGetDeviceQueue(Device, GraphicsQueueFamily, 0, &GraphicsQueue); MGLOG_D("Logical device created"); } -} // namespace MobileGL::MG_Backend::DirectVulkan \ No newline at end of file +} // namespace MobileGL::MG_Backend::DirectVulkan diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanContext.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanContext.h index 4943a36a..afb7d275 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanContext.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanContext.h @@ -22,7 +22,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { VulkanContext() = default; ~VulkanContext(); - void Initialize(ANativeWindow* window, const std::string& appName = "VulkanEngineApp"); + void Initialize(NativeWindowType window, const std::string& appName = "MobileGL-VulkanRenderer"); void Shutdown(); VkInstance GetInstance() const { return Instance; } @@ -34,7 +34,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { private: void CreateInstance(const std::string& appName); - void CreateSurface(ANativeWindow* window); + void CreateSurface(NativeWindowType window); void PickPhysicalDevice(); void CreateLogicalDevice(); @@ -46,4 +46,4 @@ namespace MobileGL::MG_Backend::DirectVulkan { VkSurfaceKHR Surface = VK_NULL_HANDLE; bool Initialized = false; }; -} // namespace MobileGL::MG_Backend::DirectVulkan \ No newline at end of file +} // namespace MobileGL::MG_Backend::DirectVulkan diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index 2c361617..cb3bbe00 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -13,7 +13,7 @@ #include "FrameContext.h" namespace MobileGL::MG_Backend::DirectVulkan { - VulkanRenderer::VulkanRenderer(ANativeWindow* window, const RendererConfig& cfg) : Window(window), Config(cfg) { + VulkanRenderer::VulkanRenderer(NativeWindowType window, const RendererConfig& cfg) : Window(window), Config(cfg) { Ctx = std::make_unique(); } @@ -22,7 +22,6 @@ namespace MobileGL::MG_Backend::DirectVulkan { } void VulkanRenderer::Initialize() { - if (!Window) throw MobileGL::RuntimeError("ANativeWindow is null"); Ctx->Initialize(Window, Config.AppName); Swapchain = std::make_unique(*Ctx); @@ -271,4 +270,4 @@ namespace MobileGL::MG_Backend::DirectVulkan { void VulkanRenderer::WaitIdle() { if (Ctx && Ctx->GetDevice() != VK_NULL_HANDLE) vkDeviceWaitIdle(Ctx->GetDevice()); } -} // namespace MobileGL::MG_Backend::DirectVulkan \ No newline at end of file +} // namespace MobileGL::MG_Backend::DirectVulkan diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h index 37a67c60..5c9cd75d 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h @@ -24,7 +24,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { class VulkanRenderer { public: - VulkanRenderer(ANativeWindow* window, const RendererConfig& cfg = {}); + VulkanRenderer(NativeWindowType window, const RendererConfig& cfg = {}); ~VulkanRenderer(); void Initialize(); @@ -43,7 +43,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { void WaitIdle(); private: - ANativeWindow* Window = nullptr; + NativeWindowType Window = 0; RendererConfig Config; std::unique_ptr Ctx; diff --git a/MobileGL/MG_Impl/EGLImpl/EGLForVulkan/EGLForVulkan.cpp b/MobileGL/MG_Impl/EGLImpl/EGLForVulkan/EGLForVulkan.cpp index c8028426..5e082398 100644 --- a/MobileGL/MG_Impl/EGLImpl/EGLForVulkan/EGLForVulkan.cpp +++ b/MobileGL/MG_Impl/EGLImpl/EGLForVulkan/EGLForVulkan.cpp @@ -86,25 +86,17 @@ namespace MobileGL { }); } -#ifdef __ANDROID__ - void CreateWindowSurfaceForVulkan(ANativeWindow* window) { + void CreateWindowSurfaceForVulkan(NativeWindowType window) { MG_Backend::DirectVulkan::pVulkanRenderer = MakeUnique(window); MG_Backend::DirectVulkan::pVulkanRenderer->Initialize(); PrepareDemoRes(); // for demo use } -#endif EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint* attrib_list) { MGLOG_D("EGLForVulkan::CreateWindowSurface called with window=%p", window); -#ifdef __ANDROID__ - auto* nativeWindow = static_cast(window); - CreateWindowSurfaceForVulkan(nativeWindow); -#else - MGLOG_W("EGLForVulkan::CreateWindowSurface is not implemented for this platform"); // TODO: support more - // platforms -#endif + CreateWindowSurfaceForVulkan(window); return (EGLSurface)1; }