summaryrefslogtreecommitdiffstats
path: root/platform/windows
diff options
context:
space:
mode:
authorDario <dariosamo@gmail.com>2023-12-19 14:57:56 -0300
committerDario <dariosamo@gmail.com>2024-02-12 10:02:18 -0300
commit73eff10c76c201a083193c044de1836217b4d72b (patch)
tree30c75b2d6c8c3bd9adaefb7b3c615ab13dfbe4db /platform/windows
parentf317cc713aa4dbcee2efa10db764473a56680be7 (diff)
downloadredot-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/SCsub2
-rw-r--r--platform/windows/display_server_windows.cpp84
-rw-r--r--platform/windows/display_server_windows.h9
-rw-r--r--platform/windows/os_windows.h7
-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