You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-20 14:45:44 +00:00
Finish splitting functionality of the Vulkan and D3D12 backends into RenderingDeviceDriver.
This commit is contained in:
@@ -195,7 +195,7 @@ if env["use_sowrap"]:
|
||||
|
||||
|
||||
if env["vulkan"]:
|
||||
source_files.append("vulkan_context_wayland.cpp")
|
||||
source_files.append("rendering_context_driver_vulkan_wayland.cpp")
|
||||
|
||||
if env["opengl3"]:
|
||||
source_files.append("egl_manager_wayland.cpp")
|
||||
|
||||
@@ -100,8 +100,8 @@ void DisplayServerWayland::_resize_window(const Size2i &p_size) {
|
||||
wd.rect.size = p_size;
|
||||
|
||||
#ifdef RD_ENABLED
|
||||
if (wd.visible && context_rd) {
|
||||
context_rd->window_resize(MAIN_WINDOW_ID, wd.rect.size.width, wd.rect.size.height);
|
||||
if (wd.visible && rendering_context) {
|
||||
rendering_context->window_set_size(MAIN_WINDOW_ID, wd.rect.size.width, wd.rect.size.height);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -140,10 +140,10 @@ void DisplayServerWayland::_show_window() {
|
||||
// the only acceptable way of implementing window showing is to move the
|
||||
// graphics context window creation logic here.
|
||||
#ifdef RD_ENABLED
|
||||
if (context_rd) {
|
||||
if (rendering_context) {
|
||||
union {
|
||||
#ifdef VULKAN_ENABLED
|
||||
VulkanContextWayland::WindowPlatformData vulkan;
|
||||
RenderingContextDriverVulkanWayland::WindowPlatformData vulkan;
|
||||
#endif
|
||||
} wpd;
|
||||
#ifdef VULKAN_ENABLED
|
||||
@@ -152,14 +152,17 @@ void DisplayServerWayland::_show_window() {
|
||||
wpd.vulkan.display = wayland_thread.get_wl_display();
|
||||
}
|
||||
#endif
|
||||
Error err = context_rd->window_create(wd.id, wd.vsync_mode, wd.rect.size.width, wd.rect.size.height, &wpd);
|
||||
ERR_FAIL_COND_MSG(err != OK, vformat("Can't create a %s window", context_rd->get_api_name()));
|
||||
Error err = rendering_context->window_create(wd.id, &wpd);
|
||||
ERR_FAIL_COND_MSG(err != OK, vformat("Can't create a %s window", rendering_driver));
|
||||
|
||||
emulate_vsync = (context_rd->get_vsync_mode(wd.id) == DisplayServer::VSYNC_ENABLED);
|
||||
rendering_context->window_set_size(wd.id, wd.rect.size.width, wd.rect.size.height);
|
||||
rendering_context->window_set_vsync_mode(wd.id, wd.vsync_mode);
|
||||
|
||||
emulate_vsync = (rendering_context->window_get_vsync_mode(wd.id) == DisplayServer::VSYNC_ENABLED);
|
||||
|
||||
if (emulate_vsync) {
|
||||
print_verbose("VSYNC: manually throttling frames using MAILBOX.");
|
||||
context_rd->set_vsync_mode(wd.id, DisplayServer::VSYNC_MAILBOX);
|
||||
rendering_context->window_set_vsync_mode(wd.id, DisplayServer::VSYNC_MAILBOX);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -885,14 +888,14 @@ void DisplayServerWayland::window_set_vsync_mode(DisplayServer::VSyncMode p_vsyn
|
||||
MutexLock mutex_lock(wayland_thread.mutex);
|
||||
|
||||
#ifdef RD_ENABLED
|
||||
if (context_rd) {
|
||||
context_rd->set_vsync_mode(p_window_id, p_vsync_mode);
|
||||
if (rendering_context) {
|
||||
rendering_context->window_set_vsync_mode(p_window_id, p_vsync_mode);
|
||||
|
||||
emulate_vsync = (context_rd->get_vsync_mode(p_window_id) == DisplayServer::VSYNC_ENABLED);
|
||||
emulate_vsync = (rendering_context->window_get_vsync_mode(p_window_id) == DisplayServer::VSYNC_ENABLED);
|
||||
|
||||
if (emulate_vsync) {
|
||||
print_verbose("VSYNC: manually throttling frames using MAILBOX.");
|
||||
context_rd->set_vsync_mode(p_window_id, DisplayServer::VSYNC_MAILBOX);
|
||||
rendering_context->window_set_vsync_mode(p_window_id, DisplayServer::VSYNC_MAILBOX);
|
||||
}
|
||||
}
|
||||
#endif // VULKAN_ENABLED
|
||||
@@ -917,8 +920,8 @@ DisplayServer::VSyncMode DisplayServerWayland::window_get_vsync_mode(DisplayServ
|
||||
}
|
||||
|
||||
#ifdef VULKAN_ENABLED
|
||||
if (context_rd) {
|
||||
return context_rd->get_vsync_mode(p_window_id);
|
||||
if (rendering_context) {
|
||||
return rendering_context->window_get_vsync_mode(p_window_id);
|
||||
}
|
||||
#endif // VULKAN_ENABLED
|
||||
|
||||
@@ -1236,15 +1239,15 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
|
||||
#ifdef RD_ENABLED
|
||||
#ifdef VULKAN_ENABLED
|
||||
if (p_rendering_driver == "vulkan") {
|
||||
context_rd = memnew(VulkanContextWayland);
|
||||
rendering_context = memnew(RenderingContextDriverVulkanWayland);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (context_rd) {
|
||||
if (context_rd->initialize() != OK) {
|
||||
ERR_PRINT(vformat("Could not initialize %s", context_rd->get_api_name()));
|
||||
memdelete(context_rd);
|
||||
context_rd = nullptr;
|
||||
if (rendering_context) {
|
||||
if (rendering_context->initialize() != OK) {
|
||||
ERR_PRINT(vformat("Could not initialize %s", p_rendering_driver));
|
||||
memdelete(rendering_context);
|
||||
rendering_context = nullptr;
|
||||
r_error = ERR_CANT_CREATE;
|
||||
return;
|
||||
}
|
||||
@@ -1329,9 +1332,10 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
|
||||
_show_window();
|
||||
|
||||
#ifdef 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();
|
||||
}
|
||||
@@ -1351,8 +1355,12 @@ DisplayServerWayland::~DisplayServerWayland() {
|
||||
// TODO: Multiwindow support.
|
||||
if (main_window.visible) {
|
||||
#ifdef VULKAN_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
|
||||
|
||||
@@ -1374,12 +1382,11 @@ DisplayServerWayland::~DisplayServerWayland() {
|
||||
// Destroy all drivers.
|
||||
#ifdef RD_ENABLED
|
||||
if (rendering_device) {
|
||||
rendering_device->finalize();
|
||||
memdelete(rendering_device);
|
||||
}
|
||||
|
||||
if (context_rd) {
|
||||
memdelete(context_rd);
|
||||
if (rendering_context) {
|
||||
memdelete(rendering_context);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
#include "servers/rendering/rendering_device.h"
|
||||
|
||||
#ifdef VULKAN_ENABLED
|
||||
#include "wayland/vulkan_context_wayland.h"
|
||||
#include "wayland/rendering_context_driver_vulkan_wayland.h"
|
||||
#endif
|
||||
|
||||
#endif //RD_ENABLED
|
||||
@@ -123,7 +123,7 @@ class DisplayServerWayland : public DisplayServer {
|
||||
String rendering_driver;
|
||||
|
||||
#ifdef RD_ENABLED
|
||||
ApiContextRD *context_rd = nullptr;
|
||||
RenderingContextDriver *rendering_context = nullptr;
|
||||
RenderingDevice *rendering_device = nullptr;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**************************************************************************/
|
||||
/* vulkan_context_wayland.cpp */
|
||||
/* rendering_context_driver_vulkan_wayland.cpp */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
@@ -28,32 +28,43 @@
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#include "vulkan_context_wayland.h"
|
||||
|
||||
#ifdef VULKAN_ENABLED
|
||||
|
||||
#include "rendering_context_driver_vulkan_wayland.h"
|
||||
|
||||
#ifdef USE_VOLK
|
||||
#include <volk.h>
|
||||
#else
|
||||
#include <vulkan/vulkan.h>
|
||||
#endif
|
||||
|
||||
const char *VulkanContextWayland::_get_platform_surface_extension() const {
|
||||
const char *RenderingContextDriverVulkanWayland::_get_platform_surface_extension() const {
|
||||
return VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME;
|
||||
}
|
||||
|
||||
Error VulkanContextWayland::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;
|
||||
RenderingContextDriver::SurfaceID RenderingContextDriverVulkanWayland::surface_create(const void *p_platform_data) {
|
||||
const WindowPlatformData *wpd = (const WindowPlatformData *)(p_platform_data);
|
||||
|
||||
VkWaylandSurfaceCreateInfoKHR createInfo = {};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
|
||||
createInfo.display = wpd->display;
|
||||
createInfo.surface = wpd->surface;
|
||||
VkWaylandSurfaceCreateInfoKHR create_info = {};
|
||||
create_info.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
|
||||
create_info.display = wpd->display;
|
||||
create_info.surface = wpd->surface;
|
||||
|
||||
VkSurfaceKHR surface = VK_NULL_HANDLE;
|
||||
VkResult err = vkCreateWaylandSurfaceKHR(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);
|
||||
VkSurfaceKHR vk_surface = VK_NULL_HANDLE;
|
||||
VkResult err = vkCreateWaylandSurfaceKHR(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);
|
||||
}
|
||||
|
||||
RenderingContextDriverVulkanWayland::RenderingContextDriverVulkanWayland() {
|
||||
// Does nothing.
|
||||
}
|
||||
|
||||
RenderingContextDriverVulkanWayland::~RenderingContextDriverVulkanWayland() {
|
||||
// Does nothing.
|
||||
}
|
||||
|
||||
#endif // VULKAN_ENABLED
|
||||
@@ -1,5 +1,5 @@
|
||||
/**************************************************************************/
|
||||
/* vulkan_context_wayland.h */
|
||||
/* rendering_context_driver_vulkan_wayland.h */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
@@ -28,15 +28,19 @@
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef VULKAN_CONTEXT_WAYLAND_H
|
||||
#define VULKAN_CONTEXT_WAYLAND_H
|
||||
#ifndef RENDERING_CONTEXT_DRIVER_VULKAN_WAYLAND_H
|
||||
#define RENDERING_CONTEXT_DRIVER_VULKAN_WAYLAND_H
|
||||
|
||||
#ifdef VULKAN_ENABLED
|
||||
|
||||
#include "drivers/vulkan/vulkan_context.h"
|
||||
#include "drivers/vulkan/rendering_context_driver_vulkan.h"
|
||||
|
||||
class VulkanContextWayland : public VulkanContext {
|
||||
const char *_get_platform_surface_extension() const override final;
|
||||
class RenderingContextDriverVulkanWayland : public RenderingContextDriverVulkan {
|
||||
private:
|
||||
virtual const char *_get_platform_surface_extension() const override final;
|
||||
|
||||
protected:
|
||||
SurfaceID surface_create(const void *p_platform_data) override final;
|
||||
|
||||
public:
|
||||
struct WindowPlatformData {
|
||||
@@ -44,9 +48,10 @@ public:
|
||||
struct wl_surface *surface;
|
||||
};
|
||||
|
||||
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;
|
||||
RenderingContextDriverVulkanWayland();
|
||||
~RenderingContextDriverVulkanWayland();
|
||||
};
|
||||
|
||||
#endif // VULKAN_ENABLED
|
||||
|
||||
#endif // VULKAN_CONTEXT_WAYLAND_H
|
||||
#endif // RENDERING_CONTEXT_DRIVER_VULKAN_WAYLAND_H
|
||||
@@ -21,7 +21,7 @@ if env["use_sowrap"]:
|
||||
)
|
||||
|
||||
if env["vulkan"]:
|
||||
source_files.append("vulkan_context_x11.cpp")
|
||||
source_files.append("rendering_context_driver_vulkan_x11.cpp")
|
||||
|
||||
if env["opengl3"]:
|
||||
env.Append(CPPDEFINES=["GLAD_GLX_NO_X11"])
|
||||
|
||||
@@ -1670,7 +1670,11 @@ DisplayServer::WindowID DisplayServerX11::create_sub_window(WindowMode p_mode, V
|
||||
window_set_flag(WindowFlags(i), true, id);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef RD_ENABLED
|
||||
if (rendering_device) {
|
||||
rendering_device->screen_create(id);
|
||||
}
|
||||
#endif
|
||||
return id;
|
||||
}
|
||||
|
||||
@@ -1719,8 +1723,12 @@ void DisplayServerX11::delete_sub_window(WindowID p_id) {
|
||||
}
|
||||
|
||||
#if defined(RD_ENABLED)
|
||||
if (context_rd) {
|
||||
context_rd->window_destroy(p_id);
|
||||
if (rendering_device) {
|
||||
rendering_device->screen_free(p_id);
|
||||
}
|
||||
|
||||
if (rendering_context) {
|
||||
rendering_context->window_destroy(p_id);
|
||||
}
|
||||
#endif
|
||||
#ifdef GLES3_ENABLED
|
||||
@@ -2245,8 +2253,8 @@ void DisplayServerX11::window_set_size(const Size2i p_size, WindowID p_window) {
|
||||
|
||||
// Keep rendering context window size in sync
|
||||
#if defined(RD_ENABLED)
|
||||
if (context_rd) {
|
||||
context_rd->window_resize(p_window, xwa.width, xwa.height);
|
||||
if (rendering_context) {
|
||||
rendering_context->window_set_size(p_window, xwa.width, xwa.height);
|
||||
}
|
||||
#endif
|
||||
#if defined(GLES3_ENABLED)
|
||||
@@ -3970,8 +3978,8 @@ void DisplayServerX11::_window_changed(XEvent *event) {
|
||||
wd.size = new_rect.size;
|
||||
|
||||
#if defined(RD_ENABLED)
|
||||
if (context_rd) {
|
||||
context_rd->window_resize(window_id, wd.size.width, wd.size.height);
|
||||
if (rendering_context) {
|
||||
rendering_context->window_set_size(window_id, wd.size.width, wd.size.height);
|
||||
}
|
||||
#endif
|
||||
#if defined(GLES3_ENABLED)
|
||||
@@ -5300,8 +5308,8 @@ void DisplayServerX11::set_icon(const Ref<Image> &p_icon) {
|
||||
void DisplayServerX11::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
|
||||
|
||||
@@ -5318,8 +5326,8 @@ void DisplayServerX11::window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mo
|
||||
DisplayServer::VSyncMode DisplayServerX11::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
|
||||
#if defined(GLES3_ENABLED)
|
||||
@@ -5662,10 +5670,10 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, V
|
||||
_update_size_hints(id);
|
||||
|
||||
#if defined(RD_ENABLED)
|
||||
if (context_rd) {
|
||||
if (rendering_context) {
|
||||
union {
|
||||
#ifdef VULKAN_ENABLED
|
||||
VulkanContextX11::WindowPlatformData vulkan;
|
||||
RenderingContextDriverVulkanX11::WindowPlatformData vulkan;
|
||||
#endif
|
||||
} wpd;
|
||||
#ifdef VULKAN_ENABLED
|
||||
@@ -5674,8 +5682,11 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, V
|
||||
wpd.vulkan.display = x11_display;
|
||||
}
|
||||
#endif
|
||||
Error err = context_rd->window_create(id, p_vsync_mode, win_rect.size.width, win_rect.size.height, &wpd);
|
||||
ERR_FAIL_COND_V_MSG(err != OK, INVALID_WINDOW_ID, vformat("Can't create a %s window", context_rd->get_api_name()));
|
||||
Error err = rendering_context->window_create(id, &wpd);
|
||||
ERR_FAIL_COND_V_MSG(err != OK, INVALID_WINDOW_ID, vformat("Can't create a %s window", rendering_driver));
|
||||
|
||||
rendering_context->window_set_size(id, win_rect.size.width, win_rect.size.height);
|
||||
rendering_context->window_set_vsync_mode(id, p_vsync_mode);
|
||||
}
|
||||
#endif
|
||||
#ifdef GLES3_ENABLED
|
||||
@@ -6077,15 +6088,15 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
|
||||
#if defined(RD_ENABLED)
|
||||
#if defined(VULKAN_ENABLED)
|
||||
if (rendering_driver == "vulkan") {
|
||||
context_rd = memnew(VulkanContextX11);
|
||||
rendering_context = memnew(RenderingContextDriverVulkanX11);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (context_rd) {
|
||||
if (context_rd->initialize() != OK) {
|
||||
ERR_PRINT(vformat("Could not initialize %s", context_rd->get_api_name()));
|
||||
memdelete(context_rd);
|
||||
context_rd = nullptr;
|
||||
if (rendering_context) {
|
||||
if (rendering_context->initialize() != OK) {
|
||||
ERR_PRINT(vformat("Could not initialize %s", rendering_driver));
|
||||
memdelete(rendering_context);
|
||||
rendering_context = nullptr;
|
||||
r_error = ERR_CANT_CREATE;
|
||||
return;
|
||||
}
|
||||
@@ -6197,9 +6208,10 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
|
||||
show_window(main_window);
|
||||
|
||||
#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();
|
||||
}
|
||||
@@ -6374,8 +6386,12 @@ DisplayServerX11::~DisplayServerX11() {
|
||||
//destroy all windows
|
||||
for (KeyValue<WindowID, WindowData> &E : windows) {
|
||||
#if defined(RD_ENABLED)
|
||||
if (context_rd) {
|
||||
context_rd->window_destroy(E.key);
|
||||
if (rendering_device) {
|
||||
rendering_device->screen_free(E.key);
|
||||
}
|
||||
|
||||
if (rendering_context) {
|
||||
rendering_context->window_destroy(E.key);
|
||||
}
|
||||
#endif
|
||||
#ifdef GLES3_ENABLED
|
||||
@@ -6419,14 +6435,13 @@ DisplayServerX11::~DisplayServerX11() {
|
||||
//destroy drivers
|
||||
#if defined(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
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
#include "servers/rendering/rendering_device.h"
|
||||
|
||||
#if defined(VULKAN_ENABLED)
|
||||
#include "x11/vulkan_context_x11.h"
|
||||
#include "x11/rendering_context_driver_vulkan_x11.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -144,7 +144,7 @@ class DisplayServerX11 : public DisplayServer {
|
||||
GLManagerEGL_X11 *gl_manager_egl = nullptr;
|
||||
#endif
|
||||
#if defined(RD_ENABLED)
|
||||
ApiContextRD *context_rd = nullptr;
|
||||
RenderingContextDriver *rendering_context = nullptr;
|
||||
RenderingDevice *rendering_device = nullptr;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**************************************************************************/
|
||||
/* vulkan_context_x11.cpp */
|
||||
/* rendering_context_driver_vulkan_x11.cpp */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
#ifdef VULKAN_ENABLED
|
||||
|
||||
#include "vulkan_context_x11.h"
|
||||
#include "rendering_context_driver_vulkan_x11.h"
|
||||
|
||||
#ifdef USE_VOLK
|
||||
#include <volk.h>
|
||||
@@ -38,28 +38,33 @@
|
||||
#include <vulkan/vulkan.h>
|
||||
#endif
|
||||
|
||||
const char *VulkanContextX11::_get_platform_surface_extension() const {
|
||||
const char *RenderingContextDriverVulkanX11::_get_platform_surface_extension() const {
|
||||
return VK_KHR_XLIB_SURFACE_EXTENSION_NAME;
|
||||
}
|
||||
|
||||
Error VulkanContextX11::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;
|
||||
RenderingContextDriver::SurfaceID RenderingContextDriverVulkanX11::surface_create(const void *p_platform_data) {
|
||||
const WindowPlatformData *wpd = (const WindowPlatformData *)(p_platform_data);
|
||||
|
||||
VkXlibSurfaceCreateInfoKHR createInfo = {};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
|
||||
createInfo.dpy = wpd->display;
|
||||
createInfo.window = wpd->window;
|
||||
VkXlibSurfaceCreateInfoKHR create_info = {};
|
||||
create_info.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
|
||||
create_info.dpy = wpd->display;
|
||||
create_info.window = wpd->window;
|
||||
|
||||
VkSurfaceKHR surface = VK_NULL_HANDLE;
|
||||
VkResult err = vkCreateXlibSurfaceKHR(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);
|
||||
VkSurfaceKHR vk_surface = VK_NULL_HANDLE;
|
||||
VkResult err = vkCreateXlibSurfaceKHR(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);
|
||||
}
|
||||
|
||||
VulkanContextX11::VulkanContextX11() {
|
||||
RenderingContextDriverVulkanX11::RenderingContextDriverVulkanX11() {
|
||||
// Does nothing.
|
||||
}
|
||||
|
||||
VulkanContextX11::~VulkanContextX11() {
|
||||
RenderingContextDriverVulkanX11::~RenderingContextDriverVulkanX11() {
|
||||
// Does nothing.
|
||||
}
|
||||
|
||||
#endif // VULKAN_ENABLED
|
||||
@@ -1,5 +1,5 @@
|
||||
/**************************************************************************/
|
||||
/* vulkan_context_x11.h */
|
||||
/* rendering_context_driver_vulkan_x11.h */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
@@ -28,29 +28,32 @@
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef VULKAN_CONTEXT_X11_H
|
||||
#define VULKAN_CONTEXT_X11_H
|
||||
#ifndef RENDERING_CONTEXT_DRIVER_VULKAN_X11_H
|
||||
#define RENDERING_CONTEXT_DRIVER_VULKAN_X11_H
|
||||
|
||||
#ifdef VULKAN_ENABLED
|
||||
|
||||
#include "drivers/vulkan/vulkan_context.h"
|
||||
#include "drivers/vulkan/rendering_context_driver_vulkan.h"
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
class VulkanContextX11 : public VulkanContext {
|
||||
class RenderingContextDriverVulkanX11 : public RenderingContextDriverVulkan {
|
||||
private:
|
||||
virtual const char *_get_platform_surface_extension() const override final;
|
||||
|
||||
protected:
|
||||
SurfaceID surface_create(const void *p_platform_data) override final;
|
||||
|
||||
public:
|
||||
struct WindowPlatformData {
|
||||
::Window window;
|
||||
Display *display;
|
||||
};
|
||||
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;
|
||||
|
||||
VulkanContextX11();
|
||||
~VulkanContextX11();
|
||||
RenderingContextDriverVulkanX11();
|
||||
~RenderingContextDriverVulkanX11();
|
||||
};
|
||||
|
||||
#endif // VULKAN_ENABLED
|
||||
|
||||
#endif // VULKAN_CONTEXT_X11_H
|
||||
#endif // RENDERING_CONTEXT_DRIVER_VULKAN_X11_H
|
||||
Reference in New Issue
Block a user