From bd89f97686cb6d0ae8c4c494413fc0725b7c479f Mon Sep 17 00:00:00 2001 From: "K. S. Ernest (iFire) Lee" Date: Tue, 15 Oct 2024 00:46:57 -0700 Subject: [PATCH] Compile for windows. --- drivers/vulkan/rendering_native_surface_vulkan.h | 2 +- .../linuxbsd/wayland/display_server_wayland.cpp | 2 +- platform/windows/display_server_windows.cpp | 10 ++++++---- .../rendering_context_driver_vulkan_windows.cpp | 10 +++++++++- .../windows/rendering_native_surface_windows.cpp | 15 +++++++++++---- .../windows/rendering_native_surface_windows.h | 7 +++++++ 6 files changed, 35 insertions(+), 11 deletions(-) diff --git a/drivers/vulkan/rendering_native_surface_vulkan.h b/drivers/vulkan/rendering_native_surface_vulkan.h index a09ff613c2e8..7b375a31e894 100644 --- a/drivers/vulkan/rendering_native_surface_vulkan.h +++ b/drivers/vulkan/rendering_native_surface_vulkan.h @@ -46,9 +46,9 @@ class RenderingNativeSurfaceVulkan : public RenderingNativeSurface { #endif public: +#ifdef VULKAN_ENABLED static Ref create_api(GDExtensionConstPtr vulkan_surface); -#ifdef VULKAN_ENABLED static Ref create(VkSurfaceKHR vulkan_surface); VkSurfaceKHR get_vulkan_surface() const { diff --git a/platform/linuxbsd/wayland/display_server_wayland.cpp b/platform/linuxbsd/wayland/display_server_wayland.cpp index 1c0782eb1eeb..c8b9002f46d4 100644 --- a/platform/linuxbsd/wayland/display_server_wayland.cpp +++ b/platform/linuxbsd/wayland/display_server_wayland.cpp @@ -187,7 +187,7 @@ bool DisplayServerWayland::_show_window() { struct wl_surface *wl_surface = wayland_thread.window_get_wl_surface(wd.id); wd.wl_egl_window = wl_egl_window_create(wl_surface, wd.rect.size.width, wd.rect.size.height); - Error err = egl_manager->window_create(MAIN_WINDOW_ID, wayland_thread.get_wl_display(), wd.wl_egl_window, wd.rect.size.width, wd.rect.size.height); + err = egl_manager->window_create(MAIN_WINDOW_ID, wayland_thread.get_wl_display(), wd.wl_egl_window, wd.rect.size.width, wd.rect.size.height); ERR_FAIL_COND_V_MSG(err == ERR_CANT_CREATE, false, "Can't show a GLES3 window."); window_set_vsync_mode(wd.vsync_mode, MAIN_WINDOW_ID); diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index db4bd7d189ba..c41e6a1295e6 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -50,6 +50,8 @@ #include "drivers/gles3/rasterizer_gles3.h" #endif +#include "platform/windows/rendering_native_surface_windows.h" + #include #include #include @@ -5654,8 +5656,8 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, GetClientRect(wd.hWnd, &real_client_rect); #ifdef RD_ENABLED - Ref windows_surface = nullptr; -#ifdef VULKAN_ENABLED || D3D12_ENABLED + Ref windows_surface; +#if defined(VULKAN_ENABLED) || defined(D3D12_ENABLED) if (rendering_driver == "vulkan" || rendering_driver == "d3d12") { windows_surface = RenderingNativeSurfaceWindows::create(wd.hWnd, hInstance); } @@ -5679,7 +5681,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, if (rendering_context->window_create(id, windows_surface) != OK) { ERR_PRINT(vformat("Failed to create %s window.", rendering_driver)); memdelete(rendering_context); - memdelete(windows_surface); + windows_surface.unref(); rendering_context = nullptr; windows.erase(id); return INVALID_WINDOW_ID; @@ -5688,7 +5690,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, rendering_context->window_set_size(id, real_client_rect.right - real_client_rect.left, real_client_rect.bottom - real_client_rect.top); rendering_context->window_set_vsync_mode(id, p_vsync_mode); wd.context_created = true; - memdelete(windows_surface); + windows_surface.unref(); } #endif diff --git a/platform/windows/rendering_context_driver_vulkan_windows.cpp b/platform/windows/rendering_context_driver_vulkan_windows.cpp index e5bd7908e258..4565231082b2 100644 --- a/platform/windows/rendering_context_driver_vulkan_windows.cpp +++ b/platform/windows/rendering_context_driver_vulkan_windows.cpp @@ -36,6 +36,14 @@ #include "drivers/vulkan/godot_vulkan.h" +#include "platform/windows/rendering_native_surface_windows.h" + +#include "drivers/vulkan/rendering_native_surface_vulkan.h" + +#include "drivers/vulkan/rendering_context_driver_vulkan.h" + +#include "drivers/vulkan/rendering_native_surface_vulkan.h" + const char *RenderingContextDriverVulkanWindows::_get_platform_surface_extension() const { return VK_KHR_WIN32_SURFACE_EXTENSION_NAME; } @@ -64,7 +72,7 @@ RenderingContextDriver::SurfaceID RenderingContextDriverVulkanWindows::surface_c VkResult err = vkCreateWin32SurfaceKHR(instance_get(), &create_info, get_allocation_callbacks(VK_OBJECT_TYPE_SURFACE_KHR), &vk_surface); ERR_FAIL_COND_V(err != VK_SUCCESS, SurfaceID()); - Ref vulkan_surface = RenderingContextDriverVulkan::create(vk_surface); + Ref vulkan_surface = RenderingNativeSurfaceVulkan::create(vk_surface); RenderingContextDriver::SurfaceID result = RenderingContextDriverVulkan::surface_create(vulkan_surface); return result; } diff --git a/platform/windows/rendering_native_surface_windows.cpp b/platform/windows/rendering_native_surface_windows.cpp index 76ce67cdb801..e9e9defa9b4e 100644 --- a/platform/windows/rendering_native_surface_windows.cpp +++ b/platform/windows/rendering_native_surface_windows.cpp @@ -30,22 +30,29 @@ #include "rendering_native_surface_windows.h" +#if defined(VULKAN_ENABLED) +#include "platform/windows/rendering_context_driver_vulkan_windows.h" +#endif +#if defined(D3D12_ENABLED) +#include "drivers/d3d12/rendering_context_driver_d3d12.h" +#endif + void RenderingNativeSurfaceWindows::_bind_methods() { ClassDB::bind_static_method("RenderingNativeSurfaceWindows", D_METHOD("create", "hwnd", "instance"), &RenderingNativeSurfaceWindows::create_api); } -Ref RenderingNativeSurfaceWindows::create(GDExtensionConstPtr p_window, GDExtensionConstPtr p_instance) { +Ref RenderingNativeSurfaceWindows::create_api(GDExtensionConstPtr p_window, GDExtensionConstPtr p_instance) { return RenderingNativeSurfaceWindows::create((HWND)p_window.operator const void *(), (HINSTANCE)p_instance.operator const void *()); } Ref RenderingNativeSurfaceWindows::create(HWND p_window, HINSTANCE p_instance) { Ref result = memnew(RenderingNativeSurfaceWindows); - result->window(p_window); - result->instance(p_instance); + result->set_window_handle(p_window); + result->set_instance(p_instance); return result; } -RenderingContextDriver *RenderingNativeSurfaceWayland::create_rendering_context(const String &p_driver_name) { +RenderingContextDriver *RenderingNativeSurfaceWindows::create_rendering_context(const String &p_driver_name) { #if defined(VULKAN_ENABLED) if (p_driver_name == "vulkan") { return memnew(RenderingContextDriverVulkanWindows); diff --git a/platform/windows/rendering_native_surface_windows.h b/platform/windows/rendering_native_surface_windows.h index 7f54ec8d9f59..93dddb5c664e 100644 --- a/platform/windows/rendering_native_surface_windows.h +++ b/platform/windows/rendering_native_surface_windows.h @@ -60,6 +60,13 @@ class RenderingNativeSurfaceWindows : public RenderingNativeSurface { return instance; }; + void set_window_handle(HWND p_window) { + window = p_window; + }; + + void set_instance(HINSTANCE p_instance) { + instance = p_instance; + }; RenderingContextDriver *create_rendering_context(const String &p_driver_name) override; RenderingNativeSurfaceWindows();