summaryrefslogtreecommitdiffstats
path: root/platform/ios
diff options
context:
space:
mode:
Diffstat (limited to 'platform/ios')
-rw-r--r--platform/ios/detect.py2
-rw-r--r--platform/ios/display_server_ios.h14
-rw-r--r--platform/ios/display_server_ios.mm82
-rw-r--r--platform/ios/os_ios.h6
-rw-r--r--platform/ios/os_ios.mm8
-rw-r--r--platform/ios/vulkan_context_ios.h7
-rw-r--r--platform/ios/vulkan_context_ios.mm15
7 files changed, 78 insertions, 56 deletions
diff --git a/platform/ios/detect.py b/platform/ios/detect.py
index 26d81c8ed6..23f688501b 100644
--- a/platform/ios/detect.py
+++ b/platform/ios/detect.py
@@ -152,7 +152,7 @@ def configure(env: "Environment"):
env.Append(CPPDEFINES=["IOS_ENABLED", "UNIX_ENABLED", "COREAUDIO_ENABLED"])
if env["vulkan"]:
- env.Append(CPPDEFINES=["VULKAN_ENABLED"])
+ env.Append(CPPDEFINES=["VULKAN_ENABLED", "RD_ENABLED"])
if env["opengl3"]:
env.Append(CPPDEFINES=["GLES3_ENABLED", "GLES_SILENCE_DEPRECATION"])
diff --git a/platform/ios/display_server_ios.h b/platform/ios/display_server_ios.h
index be4ea1e6ab..3d19222fa8 100644
--- a/platform/ios/display_server_ios.h
+++ b/platform/ios/display_server_ios.h
@@ -34,18 +34,20 @@
#include "core/input/input.h"
#include "servers/display_server.h"
+#if defined(RD_ENABLED)
+#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
+#include "servers/rendering/rendering_device.h"
+
#if defined(VULKAN_ENABLED)
#import "vulkan_context_ios.h"
-#include "drivers/vulkan/rendering_device_vulkan.h"
-#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
-
#ifdef USE_VOLK
#include <volk.h>
#else
#include <vulkan/vulkan.h>
#endif
#endif // VULKAN_ENABLED
+#endif // RD_ENABLED
#if defined(GLES3_ENABLED)
#include "drivers/gles3/rasterizer_gles3.h"
@@ -59,9 +61,9 @@ class DisplayServerIOS : public DisplayServer {
_THREAD_SAFE_CLASS_
-#if defined(VULKAN_ENABLED)
- VulkanContextIOS *context_vulkan = nullptr;
- RenderingDeviceVulkan *rendering_device_vulkan = nullptr;
+#if defined(RD_ENABLED)
+ ApiContextRD *context_rd = nullptr;
+ RenderingDevice *rendering_device = nullptr;
#endif
id tts = nullptr;
diff --git a/platform/ios/display_server_ios.mm b/platform/ios/display_server_ios.mm
index 60da16ae8c..c31f503605 100644
--- a/platform/ios/display_server_ios.mm
+++ b/platform/ios/display_server_ios.mm
@@ -62,34 +62,46 @@ DisplayServerIOS::DisplayServerIOS(const String &p_rendering_driver, WindowMode
tts = [[TTS_IOS alloc] init];
}
-#if defined(VULKAN_ENABLED)
- context_vulkan = nullptr;
- rendering_device_vulkan = nullptr;
+#if defined(RD_ENABLED)
+ context_rd = nullptr;
+ rendering_device = nullptr;
- if (rendering_driver == "vulkan") {
- context_vulkan = memnew(VulkanContextIOS);
- if (context_vulkan->initialize() != OK) {
- memdelete(context_vulkan);
- context_vulkan = nullptr;
- ERR_FAIL_MSG("Failed to initialize Vulkan context");
- }
+ CALayer *layer = nullptr;
- CALayer *layer = [AppDelegate.viewController.godotView initializeRenderingForDriver:@"vulkan"];
+ union {
+#ifdef VULKAN_ENABLED
+ VulkanContextIOS::WindowPlatformData vulkan;
+#endif
+ } wpd;
+#if defined(VULKAN_ENABLED)
+ if (rendering_driver == "vulkan") {
+ layer = [AppDelegate.viewController.godotView initializeRenderingForDriver:@"vulkan"];
if (!layer) {
ERR_FAIL_MSG("Failed to create iOS Vulkan rendering layer.");
}
+ wpd.vulkan.layer_ptr = &layer;
+ context_rd = memnew(VulkanContextIOS);
+ }
+#endif
+
+ if (context_rd) {
+ if (context_rd->initialize() != OK) {
+ memdelete(context_rd);
+ context_rd = nullptr;
+ ERR_FAIL_MSG(vformat("Failed to initialize %s context", context_rd->get_api_name()));
+ }
Size2i size = Size2i(layer.bounds.size.width, layer.bounds.size.height) * screen_get_max_scale();
- if (context_vulkan->window_create(MAIN_WINDOW_ID, p_vsync_mode, layer, size.width, size.height) != OK) {
- memdelete(context_vulkan);
- context_vulkan = nullptr;
+ if (context_rd->window_create(MAIN_WINDOW_ID, p_vsync_mode, size.width, size.height, &wpd) != OK) {
+ memdelete(context_rd);
+ context_rd = nullptr;
r_error = ERR_UNAVAILABLE;
- ERR_FAIL_MSG("Failed to create Vulkan window.");
+ ERR_FAIL_MSG(vformat("Failed to create %s window.", context_rd->get_api_name()));
}
- rendering_device_vulkan = memnew(RenderingDeviceVulkan);
- rendering_device_vulkan->initialize(context_vulkan);
+ rendering_device = memnew(RenderingDevice);
+ rendering_device->initialize(context_rd);
RendererCompositorRD::make_current();
}
@@ -116,17 +128,17 @@ DisplayServerIOS::DisplayServerIOS(const String &p_rendering_driver, WindowMode
}
DisplayServerIOS::~DisplayServerIOS() {
-#if defined(VULKAN_ENABLED)
- if (rendering_device_vulkan) {
- rendering_device_vulkan->finalize();
- memdelete(rendering_device_vulkan);
- rendering_device_vulkan = nullptr;
+#if defined(RD_ENABLED)
+ if (rendering_device) {
+ rendering_device->finalize();
+ memdelete(rendering_device);
+ rendering_device = nullptr;
}
- if (context_vulkan) {
- context_vulkan->window_destroy(MAIN_WINDOW_ID);
- memdelete(context_vulkan);
- context_vulkan = nullptr;
+ if (context_rd) {
+ context_rd->window_destroy(MAIN_WINDOW_ID);
+ memdelete(context_rd);
+ context_rd = nullptr;
}
#endif
}
@@ -697,9 +709,9 @@ bool DisplayServerIOS::screen_is_kept_on() const {
void DisplayServerIOS::resize_window(CGSize viewSize) {
Size2i size = Size2i(viewSize.width, viewSize.height) * screen_get_max_scale();
-#if defined(VULKAN_ENABLED)
- if (context_vulkan) {
- context_vulkan->window_resize(MAIN_WINDOW_ID, size.x, size.y);
+#if defined(RD_ENABLED)
+ if (context_rd) {
+ context_rd->window_resize(MAIN_WINDOW_ID, size.x, size.y);
}
#endif
@@ -709,18 +721,18 @@ void DisplayServerIOS::resize_window(CGSize viewSize) {
void DisplayServerIOS::window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window) {
_THREAD_SAFE_METHOD_
-#if defined(VULKAN_ENABLED)
- if (context_vulkan) {
- context_vulkan->set_vsync_mode(p_window, p_vsync_mode);
+#if defined(RD_ENABLED)
+ if (context_rd) {
+ context_rd->set_vsync_mode(p_window, p_vsync_mode);
}
#endif
}
DisplayServer::VSyncMode DisplayServerIOS::window_get_vsync_mode(WindowID p_window) const {
_THREAD_SAFE_METHOD_
-#if defined(VULKAN_ENABLED)
- if (context_vulkan) {
- return context_vulkan->get_vsync_mode(p_window);
+#if defined(RD_ENABLED)
+ if (context_rd) {
+ return context_rd->get_vsync_mode(p_window);
}
#endif
return DisplayServer::VSYNC_ENABLED;
diff --git a/platform/ios/os_ios.h b/platform/ios/os_ios.h
index 9dc5e11497..06724d763f 100644
--- a/platform/ios/os_ios.h
+++ b/platform/ios/os_ios.h
@@ -41,10 +41,12 @@
#include "servers/audio_server.h"
#include "servers/rendering/renderer_compositor.h"
+#if defined(RD_ENABLED)
+#include "servers/rendering/rendering_device.h"
+
#if defined(VULKAN_ENABLED)
#import "vulkan_context_ios.h"
-
-#include "drivers/vulkan/rendering_device_vulkan.h"
+#endif
#endif
class OS_IOS : public OS_Unix {
diff --git a/platform/ios/os_ios.mm b/platform/ios/os_ios.mm
index 16ac3acbec..80f1f4a5c2 100644
--- a/platform/ios/os_ios.mm
+++ b/platform/ios/os_ios.mm
@@ -50,15 +50,17 @@
#import <dlfcn.h>
#include <sys/sysctl.h>
-#if defined(VULKAN_ENABLED)
+#if defined(RD_ENABLED)
#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
-
#import <QuartzCore/CAMetalLayer.h>
+
+#if defined(VULKAN_ENABLED)
#ifdef USE_VOLK
#include <volk.h>
#else
#include <vulkan/vulkan.h>
#endif
+#endif // VULKAN_ENABLED
#endif
// Initialization order between compilation units is not guaranteed,
@@ -255,6 +257,8 @@ Error OS_IOS::open_dynamic_library(const String p_path, void *&p_library_handle,
path = get_framework_executable(get_executable_path().get_base_dir().path_join("Frameworks").path_join(p_path.get_file().get_basename() + ".framework"));
}
+ ERR_FAIL_COND_V(!FileAccess::exists(path), ERR_FILE_NOT_FOUND);
+
p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW);
ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror()));
diff --git a/platform/ios/vulkan_context_ios.h b/platform/ios/vulkan_context_ios.h
index 58dad4aad6..cdc8b618af 100644
--- a/platform/ios/vulkan_context_ios.h
+++ b/platform/ios/vulkan_context_ios.h
@@ -38,10 +38,13 @@
#import <UIKit/UIKit.h>
class VulkanContextIOS : public VulkanContext {
- virtual const char *_get_platform_surface_extension() const;
+ virtual const char *_get_platform_surface_extension() const override final;
public:
- Error window_create(DisplayServer::WindowID p_window_id, DisplayServer::VSyncMode p_vsync_mode, CALayer *p_metal_layer, int p_width, int p_height);
+ struct WindowPlatformData {
+ CALayer *const *layer_ptr;
+ };
+ 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;
VulkanContextIOS();
~VulkanContextIOS();
diff --git a/platform/ios/vulkan_context_ios.mm b/platform/ios/vulkan_context_ios.mm
index 56f1894e06..014e05f2e6 100644
--- a/platform/ios/vulkan_context_ios.mm
+++ b/platform/ios/vulkan_context_ios.mm
@@ -42,16 +42,15 @@ const char *VulkanContextIOS::_get_platform_surface_extension() const {
return VK_MVK_IOS_SURFACE_EXTENSION_NAME;
}
-Error VulkanContextIOS::window_create(DisplayServer::WindowID p_window_id, DisplayServer::VSyncMode p_vsync_mode, CALayer *p_metal_layer, int p_width, int p_height) {
- VkIOSSurfaceCreateInfoMVK createInfo;
+Error VulkanContextIOS::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;
+
+ VkIOSSurfaceCreateInfoMVK createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK;
- createInfo.pNext = nullptr;
- createInfo.flags = 0;
- createInfo.pView = (__bridge const void *)p_metal_layer;
+ createInfo.pView = (__bridge const void *)(*wpd->layer_ptr);
- VkSurfaceKHR surface;
- VkResult err =
- vkCreateIOSSurfaceMVK(get_instance(), &createInfo, nullptr, &surface);
+ VkSurfaceKHR surface = VK_NULL_HANDLE;
+ VkResult err = vkCreateIOSSurfaceMVK(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);