diff options
author | Dario <dariosamo@gmail.com> | 2023-12-19 14:57:56 -0300 |
---|---|---|
committer | Dario <dariosamo@gmail.com> | 2024-02-12 10:02:18 -0300 |
commit | 73eff10c76c201a083193c044de1836217b4d72b (patch) | |
tree | 30c75b2d6c8c3bd9adaefb7b3c615ab13dfbe4db /platform/windows | |
parent | f317cc713aa4dbcee2efa10db764473a56680be7 (diff) | |
download | redot-engine-73eff10c76c201a083193c044de1836217b4d72b.tar.gz |
Finish splitting functionality of the Vulkan and D3D12 backends into RenderingDeviceDriver.
Diffstat (limited to 'platform/windows')
-rw-r--r-- | platform/windows/SCsub | 2 | ||||
-rw-r--r-- | platform/windows/display_server_windows.cpp | 84 | ||||
-rw-r--r-- | platform/windows/display_server_windows.h | 9 | ||||
-rw-r--r-- | platform/windows/os_windows.h | 7 | ||||
-rw-r--r-- | platform/windows/rendering_context_driver_vulkan_windows.cpp (renamed from platform/windows/vulkan_context_win.cpp) | 44 | ||||
-rw-r--r-- | platform/windows/rendering_context_driver_vulkan_windows.h (renamed from platform/windows/vulkan_context_win.h) | 23 |
6 files changed, 93 insertions, 76 deletions
diff --git a/platform/windows/SCsub b/platform/windows/SCsub index 6010d4ba76..37b6fa439c 100644 --- a/platform/windows/SCsub +++ b/platform/windows/SCsub @@ -18,10 +18,10 @@ common_win = [ "joypad_windows.cpp", "tts_windows.cpp", "windows_terminal_logger.cpp", - "vulkan_context_win.cpp", "gl_manager_windows_native.cpp", "gl_manager_windows_angle.cpp", "wgl_detect_version.cpp", + "rendering_context_driver_vulkan_windows.cpp", ] common_win_wrap = [ diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index e455055324..80863441ce 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -39,6 +39,12 @@ #include "main/main.h" #include "scene/resources/atlas_texture.h" +#if defined(VULKAN_ENABLED) +#include "rendering_context_driver_vulkan_windows.h" +#endif +#if defined(D3D12_ENABLED) +#include "drivers/d3d12/rendering_context_driver_d3d12.h" +#endif #if defined(GLES3_ENABLED) #include "drivers/gles3/rasterizer_gles3.h" #endif @@ -1290,6 +1296,11 @@ DisplayServer::WindowID DisplayServerWindows::create_sub_window(WindowMode p_mod if (mainwindow_icon) { SendMessage(windows[window_id].hWnd, WM_SETICON, ICON_BIG, (LPARAM)mainwindow_icon); } +#ifdef RD_ENABLED + if (rendering_device) { + rendering_device->screen_create(window_id); + } +#endif return window_id; } @@ -1344,8 +1355,12 @@ void DisplayServerWindows::delete_sub_window(WindowID p_window) { } #ifdef RD_ENABLED - if (context_rd) { - context_rd->window_destroy(p_window); + if (rendering_device) { + rendering_device->screen_free(p_window); + } + + if (rendering_context) { + rendering_context->window_destroy(p_window); } #endif #ifdef GLES3_ENABLED @@ -1776,8 +1791,8 @@ void DisplayServerWindows::window_set_size(const Size2i p_size, WindowID p_windo wd.height = h; #if defined(RD_ENABLED) - if (context_rd) { - context_rd->window_resize(p_window, w, h); + if (rendering_context) { + rendering_context->window_set_size(p_window, w, h); } #endif #if defined(GLES3_ENABLED) @@ -2830,8 +2845,8 @@ void DisplayServerWindows::set_icon(const Ref<Image> &p_icon) { void DisplayServerWindows::window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window) { _THREAD_SAFE_METHOD_ #if defined(RD_ENABLED) - if (context_rd) { - context_rd->set_vsync_mode(p_window, p_vsync_mode); + if (rendering_context) { + rendering_context->window_set_vsync_mode(p_window, p_vsync_mode); } #endif @@ -2848,8 +2863,8 @@ void DisplayServerWindows::window_set_vsync_mode(DisplayServer::VSyncMode p_vsyn DisplayServer::VSyncMode DisplayServerWindows::window_get_vsync_mode(WindowID p_window) const { _THREAD_SAFE_METHOD_ #if defined(RD_ENABLED) - if (context_rd) { - return context_rd->get_vsync_mode(p_window); + if (rendering_context) { + return rendering_context->window_get_vsync_mode(p_window); } #endif @@ -4054,9 +4069,9 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA rect_changed = true; } #if defined(RD_ENABLED) - if (context_rd && window.context_created) { + if (rendering_context && window.context_created) { // Note: Trigger resize event to update swapchains when window is minimized/restored, even if size is not changed. - context_rd->window_resize(window_id, window.width, window.height); + rendering_context->window_set_size(window_id, window.width, window.height); } #endif } @@ -4612,13 +4627,13 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, } #ifdef RD_ENABLED - if (context_rd) { + if (rendering_context) { union { #ifdef VULKAN_ENABLED - VulkanContextWindows::WindowPlatformData vulkan; + RenderingContextDriverVulkanWindows::WindowPlatformData vulkan; #endif #ifdef D3D12_ENABLED - D3D12Context::WindowPlatformData d3d12; + RenderingContextDriverD3D12::WindowPlatformData d3d12; #endif } wpd; #ifdef VULKAN_ENABLED @@ -4632,13 +4647,16 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, wpd.d3d12.window = wd.hWnd; } #endif - if (context_rd->window_create(id, p_vsync_mode, WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top, &wpd) != OK) { - ERR_PRINT(vformat("Failed to create %s Window.", context_rd->get_api_name())); - memdelete(context_rd); - context_rd = nullptr; + if (rendering_context->window_create(id, &wpd) != OK) { + ERR_PRINT(vformat("Failed to create %s window.", rendering_driver)); + memdelete(rendering_context); + rendering_context = nullptr; windows.erase(id); return INVALID_WINDOW_ID; } + + rendering_context->window_set_size(id, WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top); + rendering_context->window_set_vsync_mode(id, p_vsync_mode); wd.context_created = true; } #endif @@ -4949,19 +4967,19 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win #if defined(RD_ENABLED) #if defined(VULKAN_ENABLED) if (rendering_driver == "vulkan") { - context_rd = memnew(VulkanContextWindows); + rendering_context = memnew(RenderingContextDriverVulkanWindows); } #endif #if defined(D3D12_ENABLED) if (rendering_driver == "d3d12") { - context_rd = memnew(D3D12Context); + rendering_context = memnew(RenderingContextDriverD3D12); } #endif - if (context_rd) { - if (context_rd->initialize() != OK) { - memdelete(context_rd); - context_rd = nullptr; + if (rendering_context) { + if (rendering_context->initialize() != OK) { + memdelete(rendering_context); + rendering_context = nullptr; r_error = ERR_UNAVAILABLE; return; } @@ -5051,9 +5069,10 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win show_window(MAIN_WINDOW_ID); #if defined(RD_ENABLED) - if (context_rd) { + if (rendering_context) { rendering_device = memnew(RenderingDevice); - rendering_device->initialize(context_rd); + rendering_device->initialize(rendering_context, MAIN_WINDOW_ID); + rendering_device->screen_create(MAIN_WINDOW_ID); RendererCompositorRD::make_current(); } @@ -5165,8 +5184,12 @@ DisplayServerWindows::~DisplayServerWindows() { if (windows.has(MAIN_WINDOW_ID)) { #ifdef RD_ENABLED - if (context_rd) { - context_rd->window_destroy(MAIN_WINDOW_ID); + if (rendering_device) { + rendering_device->screen_free(MAIN_WINDOW_ID); + } + + if (rendering_context) { + rendering_context->window_destroy(MAIN_WINDOW_ID); } #endif if (wintab_available && windows[MAIN_WINDOW_ID].wtctx) { @@ -5178,14 +5201,13 @@ DisplayServerWindows::~DisplayServerWindows() { #ifdef RD_ENABLED if (rendering_device) { - rendering_device->finalize(); memdelete(rendering_device); rendering_device = nullptr; } - if (context_rd) { - memdelete(context_rd); - context_rd = nullptr; + if (rendering_context) { + memdelete(rendering_context); + rendering_context = nullptr; } #endif diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index 4e1d2cf85c..91e7424de9 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -54,13 +54,6 @@ #if defined(RD_ENABLED) #include "servers/rendering/rendering_device.h" - -#if defined(VULKAN_ENABLED) -#include "vulkan_context_win.h" -#endif -#if defined(D3D12_ENABLED) -#include "drivers/d3d12/d3d12_context.h" -#endif #endif #if defined(GLES3_ENABLED) @@ -349,7 +342,7 @@ class DisplayServerWindows : public DisplayServer { #endif #if defined(RD_ENABLED) - ApiContextRD *context_rd = nullptr; + RenderingContextDriver *rendering_context = nullptr; RenderingDevice *rendering_device = nullptr; #endif diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 35b88acd26..056696ae2f 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -48,13 +48,6 @@ #if defined(RD_ENABLED) #include "servers/rendering/rendering_device.h" - -#if defined(VULKAN_ENABLED) -#include "vulkan_context_win.h" -#endif -#if defined(D3D12_ENABLED) -#include "drivers/d3d12/d3d12_context.h" -#endif #endif #include <io.h> diff --git a/platform/windows/vulkan_context_win.cpp b/platform/windows/rendering_context_driver_vulkan_windows.cpp index 69f8dc23fb..f968ffc1d7 100644 --- a/platform/windows/vulkan_context_win.cpp +++ b/platform/windows/rendering_context_driver_vulkan_windows.cpp @@ -1,5 +1,5 @@ /**************************************************************************/ -/* vulkan_context_win.cpp */ +/* rendering_context_driver_vulkan_windows.cpp */ /**************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -30,7 +30,9 @@ #if defined(WINDOWS_ENABLED) && defined(VULKAN_ENABLED) -#include "vulkan_context_win.h" +#include "core/os/os.h" + +#include "rendering_context_driver_vulkan_windows.h" #ifdef USE_VOLK #include <volk.h> @@ -38,32 +40,36 @@ #include <vulkan/vulkan.h> #endif -const char *VulkanContextWindows::_get_platform_surface_extension() const { +const char *RenderingContextDriverVulkanWindows::_get_platform_surface_extension() const { return VK_KHR_WIN32_SURFACE_EXTENSION_NAME; } -Error VulkanContextWindows::window_create(DisplayServer::WindowID p_window_id, DisplayServer::VSyncMode p_vsync_mode, int p_width, int p_height, const void *p_platform_data) { - const WindowPlatformData *wpd = (const WindowPlatformData *)p_platform_data; - - VkWin32SurfaceCreateInfoKHR createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; - createInfo.hinstance = wpd->instance; - createInfo.hwnd = wpd->window; - - VkSurfaceKHR surface = VK_NULL_HANDLE; - VkResult err = vkCreateWin32SurfaceKHR(get_instance(), &createInfo, nullptr, &surface); - ERR_FAIL_COND_V(err, ERR_CANT_CREATE); - return _window_create(p_window_id, p_vsync_mode, surface, p_width, p_height); -} - -VulkanContextWindows::VulkanContextWindows() { +RenderingContextDriverVulkanWindows::RenderingContextDriverVulkanWindows() { // Workaround for Vulkan not working on setups with AMD integrated graphics + NVIDIA dedicated GPU (GH-57708). // This prevents using AMD integrated graphics with Vulkan entirely, but it allows the engine to start // even on outdated/broken driver setups. OS::get_singleton()->set_environment("DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1", "1"); } -VulkanContextWindows::~VulkanContextWindows() { +RenderingContextDriverVulkanWindows::~RenderingContextDriverVulkanWindows() { + // Does nothing. +} + +RenderingContextDriver::SurfaceID RenderingContextDriverVulkanWindows::surface_create(const void *p_platform_data) { + const WindowPlatformData *wpd = (const WindowPlatformData *)(p_platform_data); + + VkWin32SurfaceCreateInfoKHR create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; + create_info.hinstance = wpd->instance; + create_info.hwnd = wpd->window; + + VkSurfaceKHR vk_surface = VK_NULL_HANDLE; + VkResult err = vkCreateWin32SurfaceKHR(instance_get(), &create_info, nullptr, &vk_surface); + ERR_FAIL_COND_V(err != VK_SUCCESS, SurfaceID()); + + Surface *surface = memnew(Surface); + surface->vk_surface = vk_surface; + return SurfaceID(surface); } #endif // WINDOWS_ENABLED && VULKAN_ENABLED diff --git a/platform/windows/vulkan_context_win.h b/platform/windows/rendering_context_driver_vulkan_windows.h index 770a59de9e..34546c9ea6 100644 --- a/platform/windows/vulkan_context_win.h +++ b/platform/windows/rendering_context_driver_vulkan_windows.h @@ -1,5 +1,5 @@ /**************************************************************************/ -/* vulkan_context_win.h */ +/* rendering_context_driver_vulkan_windows.h */ /**************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,30 +28,33 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**************************************************************************/ -#ifndef VULKAN_CONTEXT_WIN_H -#define VULKAN_CONTEXT_WIN_H +#ifndef RENDERING_CONTEXT_DRIVER_VULKAN_WINDOWS_H +#define RENDERING_CONTEXT_DRIVER_VULKAN_WINDOWS_H #ifdef VULKAN_ENABLED -#include "drivers/vulkan/vulkan_context.h" +#include "drivers/vulkan/rendering_context_driver_vulkan.h" #define WIN32_LEAN_AND_MEAN #include <windows.h> -class VulkanContextWindows : public VulkanContext { - virtual const char *_get_platform_surface_extension() const override final; +class RenderingContextDriverVulkanWindows : public RenderingContextDriverVulkan { +private: + const char *_get_platform_surface_extension() const override final; + +protected: + SurfaceID surface_create(const void *p_platform_data) override final; public: struct WindowPlatformData { HWND window; HINSTANCE instance; }; - virtual Error window_create(DisplayServer::WindowID p_window_id, DisplayServer::VSyncMode p_vsync_mode, int p_width, int p_height, const void *p_platform_data) override final; - VulkanContextWindows(); - ~VulkanContextWindows(); + RenderingContextDriverVulkanWindows(); + ~RenderingContextDriverVulkanWindows() override final; }; #endif // VULKAN_ENABLED -#endif // VULKAN_CONTEXT_WIN_H +#endif // RENDERING_CONTEXT_DRIVER_VULKAN_WINDOWS_H |