summaryrefslogtreecommitdiffstats
path: root/platform/android
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android')
-rw-r--r--platform/android/detect.py2
-rw-r--r--platform/android/display_server_android.cpp124
-rw-r--r--platform/android/display_server_android.h12
-rw-r--r--platform/android/os_android.cpp2
-rw-r--r--platform/android/vulkan_context_android.cpp12
-rw-r--r--platform/android/vulkan_context_android.h7
6 files changed, 93 insertions, 66 deletions
diff --git a/platform/android/detect.py b/platform/android/detect.py
index a417ef454b..b396e5eb2d 100644
--- a/platform/android/detect.py
+++ b/platform/android/detect.py
@@ -200,7 +200,7 @@ def configure(env: "Environment"):
env.Append(LIBS=["OpenSLES", "EGL", "android", "log", "z", "dl"])
if env["vulkan"]:
- env.Append(CPPDEFINES=["VULKAN_ENABLED"])
+ env.Append(CPPDEFINES=["VULKAN_ENABLED", "RD_ENABLED"])
if not env["use_volk"]:
env.Append(LIBS=["vulkan"])
diff --git a/platform/android/display_server_android.cpp b/platform/android/display_server_android.cpp
index 9529e0e683..340823baac 100644
--- a/platform/android/display_server_android.cpp
+++ b/platform/android/display_server_android.cpp
@@ -37,11 +37,13 @@
#include "core/config/project_settings.h"
+#if defined(RD_ENABLED)
+#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
+#include "servers/rendering/rendering_device.h"
+
#if defined(VULKAN_ENABLED)
#include "vulkan_context_android.h"
-
-#include "drivers/vulkan/rendering_device_vulkan.h"
-#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
+#endif
#endif
#ifdef GLES3_ENABLED
@@ -486,9 +488,6 @@ Vector<String> DisplayServerAndroid::get_rendering_drivers_func() {
#ifdef GLES3_ENABLED
drivers.push_back("opengl3");
#endif
-#ifdef D3D12_ENABLED
- drivers.push_back("d3d12");
-#endif
#ifdef VULKAN_ENABLED
drivers.push_back("vulkan");
#endif
@@ -518,20 +517,30 @@ void DisplayServerAndroid::register_android_driver() {
}
void DisplayServerAndroid::reset_window() {
-#if defined(VULKAN_ENABLED)
- if (rendering_driver == "vulkan") {
- ANativeWindow *native_window = OS_Android::get_singleton()->get_native_window();
- ERR_FAIL_NULL(native_window);
-
- ERR_FAIL_NULL(context_vulkan);
- VSyncMode last_vsync_mode = context_vulkan->get_vsync_mode(MAIN_WINDOW_ID);
- context_vulkan->window_destroy(MAIN_WINDOW_ID);
+#if defined(RD_ENABLED)
+ if (context_rd) {
+ VSyncMode last_vsync_mode = context_rd->get_vsync_mode(MAIN_WINDOW_ID);
+ context_rd->window_destroy(MAIN_WINDOW_ID);
Size2i display_size = OS_Android::get_singleton()->get_display_size();
- if (context_vulkan->window_create(native_window, last_vsync_mode, display_size.width, display_size.height) != OK) {
- memdelete(context_vulkan);
- context_vulkan = nullptr;
- ERR_FAIL_MSG("Failed to reset Vulkan window.");
+
+ union {
+#ifdef VULKAN_ENABLED
+ VulkanContextAndroid::WindowPlatformData vulkan;
+#endif
+ } wpd;
+#ifdef VULKAN_ENABLED
+ if (rendering_driver == "vulkan") {
+ ANativeWindow *native_window = OS_Android::get_singleton()->get_native_window();
+ ERR_FAIL_NULL(native_window);
+ wpd.vulkan.window = native_window;
+ }
+#endif
+
+ if (context_rd->window_create(MAIN_WINDOW_ID, last_vsync_mode, display_size.width, display_size.height, &wpd) != OK) {
+ memdelete(context_rd);
+ context_rd = nullptr;
+ ERR_FAIL_MSG(vformat("Failed to reset %s window.", context_rd->get_api_name()));
}
}
#endif
@@ -554,30 +563,46 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
}
#endif
-#if defined(VULKAN_ENABLED)
- context_vulkan = nullptr;
- rendering_device_vulkan = nullptr;
+#if defined(RD_ENABLED)
+ context_rd = nullptr;
+ rendering_device = nullptr;
+#if defined(VULKAN_ENABLED)
if (rendering_driver == "vulkan") {
- ANativeWindow *native_window = OS_Android::get_singleton()->get_native_window();
- ERR_FAIL_NULL(native_window);
-
- context_vulkan = memnew(VulkanContextAndroid);
- if (context_vulkan->initialize() != OK) {
- memdelete(context_vulkan);
- context_vulkan = nullptr;
- ERR_FAIL_MSG("Failed to initialize Vulkan context");
+ context_rd = memnew(VulkanContextAndroid);
+ }
+#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 display_size = OS_Android::get_singleton()->get_display_size();
- if (context_vulkan->window_create(native_window, p_vsync_mode, display_size.width, display_size.height) != OK) {
- memdelete(context_vulkan);
- context_vulkan = nullptr;
- ERR_FAIL_MSG("Failed to create Vulkan window.");
+
+ union {
+#ifdef VULKAN_ENABLED
+ VulkanContextAndroid::WindowPlatformData vulkan;
+#endif
+ } wpd;
+#ifdef VULKAN_ENABLED
+ if (rendering_driver == "vulkan") {
+ ANativeWindow *native_window = OS_Android::get_singleton()->get_native_window();
+ ERR_FAIL_NULL(native_window);
+ wpd.vulkan.window = native_window;
+ }
+#endif
+
+ if (context_rd->window_create(MAIN_WINDOW_ID, p_vsync_mode, display_size.width, display_size.height, &wpd) != OK) {
+ memdelete(context_rd);
+ context_rd = nullptr;
+ 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();
}
@@ -590,16 +615,13 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
}
DisplayServerAndroid::~DisplayServerAndroid() {
-#if defined(VULKAN_ENABLED)
- if (rendering_driver == "vulkan") {
- if (rendering_device_vulkan) {
- rendering_device_vulkan->finalize();
- memdelete(rendering_device_vulkan);
- }
-
- if (context_vulkan) {
- memdelete(context_vulkan);
- }
+#if defined(RD_ENABLED)
+ if (rendering_device) {
+ rendering_device->finalize();
+ memdelete(rendering_device);
+ }
+ if (context_rd) {
+ memdelete(context_rd);
}
#endif
}
@@ -690,17 +712,17 @@ void DisplayServerAndroid::cursor_set_custom_image(const Ref<Resource> &p_cursor
}
void DisplayServerAndroid::window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window) {
-#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 DisplayServerAndroid::window_get_vsync_mode(WindowID p_window) const {
-#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/android/display_server_android.h b/platform/android/display_server_android.h
index 54912212dc..80af4f00c1 100644
--- a/platform/android/display_server_android.h
+++ b/platform/android/display_server_android.h
@@ -33,9 +33,9 @@
#include "servers/display_server.h"
-#if defined(VULKAN_ENABLED)
-class VulkanContextAndroid;
-class RenderingDeviceVulkan;
+#if defined(RD_ENABLED)
+class ApiContextRD;
+class RenderingDevice;
#endif
class DisplayServerAndroid : public DisplayServer {
@@ -72,9 +72,9 @@ class DisplayServerAndroid : public DisplayServer {
CursorShape cursor_shape = CursorShape::CURSOR_ARROW;
-#if defined(VULKAN_ENABLED)
- VulkanContextAndroid *context_vulkan = nullptr;
- RenderingDeviceVulkan *rendering_device_vulkan = nullptr;
+#if defined(RD_ENABLED)
+ ApiContextRD *context_rd = nullptr;
+ RenderingDevice *rendering_device = nullptr;
#endif
ObjectID window_attached_instance_id;
diff --git a/platform/android/os_android.cpp b/platform/android/os_android.cpp
index 0d82bec75d..35d4222152 100644
--- a/platform/android/os_android.cpp
+++ b/platform/android/os_android.cpp
@@ -170,6 +170,8 @@ Error OS_Android::open_dynamic_library(const String p_path, void *&p_library_han
so_file_exists = false;
}
+ ERR_FAIL_COND_V(!FileAccess::exists(path), ERR_FILE_NOT_FOUND);
+
p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW);
if (!p_library_handle && so_file_exists) {
// The library may be on the sdcard and thus inaccessible. Try to copy it to the internal
diff --git a/platform/android/vulkan_context_android.cpp b/platform/android/vulkan_context_android.cpp
index 01e6d14438..4f9140bf3e 100644
--- a/platform/android/vulkan_context_android.cpp
+++ b/platform/android/vulkan_context_android.cpp
@@ -42,14 +42,14 @@ const char *VulkanContextAndroid::_get_platform_surface_extension() const {
return VK_KHR_ANDROID_SURFACE_EXTENSION_NAME;
}
-Error VulkanContextAndroid::window_create(ANativeWindow *p_window, DisplayServer::VSyncMode p_vsync_mode, int p_width, int p_height) {
- VkAndroidSurfaceCreateInfoKHR createInfo;
+Error VulkanContextAndroid::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;
+
+ VkAndroidSurfaceCreateInfoKHR createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
- createInfo.pNext = nullptr;
- createInfo.flags = 0;
- createInfo.window = p_window;
+ createInfo.window = wpd->window;
- VkSurfaceKHR surface;
+ VkSurfaceKHR surface = VK_NULL_HANDLE;
VkResult err = vkCreateAndroidSurfaceKHR(get_instance(), &createInfo, nullptr, &surface);
if (err != VK_SUCCESS) {
ERR_FAIL_V_MSG(ERR_CANT_CREATE, "vkCreateAndroidSurfaceKHR failed with error " + itos(err));
diff --git a/platform/android/vulkan_context_android.h b/platform/android/vulkan_context_android.h
index f253149ef6..3cee3feb86 100644
--- a/platform/android/vulkan_context_android.h
+++ b/platform/android/vulkan_context_android.h
@@ -38,10 +38,13 @@
struct ANativeWindow;
class VulkanContextAndroid : public VulkanContext {
- virtual const char *_get_platform_surface_extension() const override;
+ virtual const char *_get_platform_surface_extension() const override final;
public:
- Error window_create(ANativeWindow *p_window, DisplayServer::VSyncMode p_vsync_mode, int p_width, int p_height);
+ struct WindowPlatformData {
+ ANativeWindow *window;
+ };
+ 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;
VulkanContextAndroid() = default;
~VulkanContextAndroid() override = default;