summaryrefslogtreecommitdiffstats
path: root/platform/android
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/android
parentf317cc713aa4dbcee2efa10db764473a56680be7 (diff)
downloadredot-engine-73eff10c76c201a083193c044de1836217b4d72b.tar.gz
Finish splitting functionality of the Vulkan and D3D12 backends into RenderingDeviceDriver.
Diffstat (limited to 'platform/android')
-rw-r--r--platform/android/SCsub2
-rw-r--r--platform/android/display_server_android.cpp76
-rw-r--r--platform/android/display_server_android.h4
-rw-r--r--platform/android/rendering_context_driver_vulkan_android.cpp (renamed from platform/android/vulkan_context_android.cpp)36
-rw-r--r--platform/android/rendering_context_driver_vulkan_android.h (renamed from platform/android/vulkan_context_android.h)25
5 files changed, 78 insertions, 65 deletions
diff --git a/platform/android/SCsub b/platform/android/SCsub
index 97262cf148..31bc7c25b0 100644
--- a/platform/android/SCsub
+++ b/platform/android/SCsub
@@ -23,7 +23,7 @@ android_files = [
"android_keys_utils.cpp",
"display_server_android.cpp",
"plugin/godot_plugin_jni.cpp",
- "vulkan_context_android.cpp",
+ "rendering_context_driver_vulkan_android.cpp",
]
env_android = env.Clone()
diff --git a/platform/android/display_server_android.cpp b/platform/android/display_server_android.cpp
index 4a9915379a..b06164246e 100644
--- a/platform/android/display_server_android.cpp
+++ b/platform/android/display_server_android.cpp
@@ -42,7 +42,7 @@
#include "servers/rendering/rendering_device.h"
#if defined(VULKAN_ENABLED)
-#include "vulkan_context_android.h"
+#include "rendering_context_driver_vulkan_android.h"
#endif
#endif
@@ -518,15 +518,17 @@ void DisplayServerAndroid::register_android_driver() {
void DisplayServerAndroid::reset_window() {
#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);
+ if (rendering_context) {
+ if (rendering_device) {
+ rendering_device->screen_free(MAIN_WINDOW_ID);
+ }
- Size2i display_size = OS_Android::get_singleton()->get_display_size();
+ VSyncMode last_vsync_mode = rendering_context->window_get_vsync_mode(MAIN_WINDOW_ID);
+ rendering_context->window_destroy(MAIN_WINDOW_ID);
union {
#ifdef VULKAN_ENABLED
- VulkanContextAndroid::WindowPlatformData vulkan;
+ RenderingContextDriverVulkanAndroid::WindowPlatformData vulkan;
#endif
} wpd;
#ifdef VULKAN_ENABLED
@@ -537,12 +539,20 @@ void DisplayServerAndroid::reset_window() {
}
#endif
- if (context_rd->window_create(MAIN_WINDOW_ID, last_vsync_mode, display_size.width, display_size.height, &wpd) != OK) {
- ERR_PRINT(vformat("Failed to reset %s window.", context_rd->get_api_name()));
- memdelete(context_rd);
- context_rd = nullptr;
+ if (rendering_context->window_create(MAIN_WINDOW_ID, &wpd) != OK) {
+ ERR_PRINT(vformat("Failed to reset %s window.", rendering_driver));
+ memdelete(rendering_context);
+ rendering_context = nullptr;
return;
}
+
+ Size2i display_size = OS_Android::get_singleton()->get_display_size();
+ rendering_context->window_set_size(MAIN_WINDOW_ID, display_size.width, display_size.height);
+ rendering_context->window_set_vsync_mode(MAIN_WINDOW_ID, last_vsync_mode);
+
+ if (rendering_device) {
+ rendering_device->screen_create(MAIN_WINDOW_ID);
+ }
}
#endif
}
@@ -565,28 +575,26 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
#endif
#if defined(RD_ENABLED)
- context_rd = nullptr;
+ rendering_context = nullptr;
rendering_device = nullptr;
#if defined(VULKAN_ENABLED)
if (rendering_driver == "vulkan") {
- context_rd = memnew(VulkanContextAndroid);
+ rendering_context = memnew(RenderingContextDriverVulkanAndroid);
}
#endif
- if (context_rd) {
- if (context_rd->initialize() != OK) {
- ERR_PRINT(vformat("Failed to initialize %s context", context_rd->get_api_name()));
- memdelete(context_rd);
- context_rd = nullptr;
+ if (rendering_context) {
+ if (rendering_context->initialize() != OK) {
+ ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
+ memdelete(rendering_context);
+ rendering_context = nullptr;
return;
}
- Size2i display_size = OS_Android::get_singleton()->get_display_size();
-
union {
#ifdef VULKAN_ENABLED
- VulkanContextAndroid::WindowPlatformData vulkan;
+ RenderingContextDriverVulkanAndroid::WindowPlatformData vulkan;
#endif
} wpd;
#ifdef VULKAN_ENABLED
@@ -597,15 +605,20 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
}
#endif
- if (context_rd->window_create(MAIN_WINDOW_ID, p_vsync_mode, display_size.width, display_size.height, &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(MAIN_WINDOW_ID, &wpd) != OK) {
+ ERR_PRINT(vformat("Failed to create %s window.", rendering_driver));
+ memdelete(rendering_context);
+ rendering_context = nullptr;
return;
}
+ Size2i display_size = OS_Android::get_singleton()->get_display_size();
+ rendering_context->window_set_size(MAIN_WINDOW_ID, display_size.width, display_size.height);
+ rendering_context->window_set_vsync_mode(MAIN_WINDOW_ID, p_vsync_mode);
+
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();
}
@@ -620,11 +633,10 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
DisplayServerAndroid::~DisplayServerAndroid() {
#if defined(RD_ENABLED)
if (rendering_device) {
- rendering_device->finalize();
memdelete(rendering_device);
}
- if (context_rd) {
- memdelete(context_rd);
+ if (rendering_context) {
+ memdelete(rendering_context);
}
#endif
}
@@ -716,16 +728,16 @@ 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(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
}
DisplayServer::VSyncMode DisplayServerAndroid::window_get_vsync_mode(WindowID p_window) const {
#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
return DisplayServer::VSYNC_ENABLED;
diff --git a/platform/android/display_server_android.h b/platform/android/display_server_android.h
index 80af4f00c1..b425b2d9ae 100644
--- a/platform/android/display_server_android.h
+++ b/platform/android/display_server_android.h
@@ -34,7 +34,7 @@
#include "servers/display_server.h"
#if defined(RD_ENABLED)
-class ApiContextRD;
+class RenderingContextDriver;
class RenderingDevice;
#endif
@@ -73,7 +73,7 @@ class DisplayServerAndroid : public DisplayServer {
CursorShape cursor_shape = CursorShape::CURSOR_ARROW;
#if defined(RD_ENABLED)
- ApiContextRD *context_rd = nullptr;
+ RenderingContextDriver *rendering_context = nullptr;
RenderingDevice *rendering_device = nullptr;
#endif
diff --git a/platform/android/vulkan_context_android.cpp b/platform/android/rendering_context_driver_vulkan_android.cpp
index 4f9140bf3e..9232126b04 100644
--- a/platform/android/vulkan_context_android.cpp
+++ b/platform/android/rendering_context_driver_vulkan_android.cpp
@@ -1,5 +1,5 @@
/**************************************************************************/
-/* vulkan_context_android.cpp */
+/* rendering_context_driver_vulkan_android.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -28,7 +28,7 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
-#include "vulkan_context_android.h"
+#include "rendering_context_driver_vulkan_android.h"
#ifdef VULKAN_ENABLED
@@ -38,32 +38,32 @@
#include <vulkan/vulkan.h>
#endif
-const char *VulkanContextAndroid::_get_platform_surface_extension() const {
+const char *RenderingContextDriverVulkanAndroid::_get_platform_surface_extension() const {
return VK_KHR_ANDROID_SURFACE_EXTENSION_NAME;
}
-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;
+RenderingContextDriver::SurfaceID RenderingContextDriverVulkanAndroid::surface_create(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.window = wpd->window;
+ VkAndroidSurfaceCreateInfoKHR create_info = {};
+ create_info.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
+ create_info.window = wpd->window;
- 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));
- }
+ VkSurfaceKHR vk_surface = VK_NULL_HANDLE;
+ VkResult err = vkCreateAndroidSurfaceKHR(instance_get(), &create_info, nullptr, &vk_surface);
+ ERR_FAIL_COND_V(err != VK_SUCCESS, SurfaceID());
- return _window_create(DisplayServer::MAIN_WINDOW_ID, p_vsync_mode, surface, p_width, p_height);
+ Surface *surface = memnew(Surface);
+ surface->vk_surface = vk_surface;
+ return SurfaceID(surface);
}
-bool VulkanContextAndroid::_use_validation_layers() {
- uint32_t count = 0;
- _get_preferred_validation_layers(&count, nullptr);
+bool RenderingContextDriverVulkanAndroid::_use_validation_layers() const {
+ TightLocalVector<const char *> layer_names;
+ Error err = _find_validation_layers(layer_names);
// On Android, we use validation layers automatically if they were explicitly linked with the app.
- return count > 0;
+ return (err == OK) && !layer_names.is_empty();
}
#endif // VULKAN_ENABLED
diff --git a/platform/android/vulkan_context_android.h b/platform/android/rendering_context_driver_vulkan_android.h
index 3cee3feb86..a2a42eef24 100644
--- a/platform/android/vulkan_context_android.h
+++ b/platform/android/rendering_context_driver_vulkan_android.h
@@ -1,5 +1,5 @@
/**************************************************************************/
-/* vulkan_context_android.h */
+/* rendering_context_driver_vulkan_android.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -28,31 +28,32 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
-#ifndef VULKAN_CONTEXT_ANDROID_H
-#define VULKAN_CONTEXT_ANDROID_H
+#ifndef RENDERING_CONTEXT_DRIVER_VULKAN_ANDROID_H
+#define RENDERING_CONTEXT_DRIVER_VULKAN_ANDROID_H
#ifdef VULKAN_ENABLED
-#include "drivers/vulkan/vulkan_context.h"
+#include "drivers/vulkan/rendering_context_driver_vulkan.h"
struct ANativeWindow;
-class VulkanContextAndroid : public VulkanContext {
+class RenderingContextDriverVulkanAndroid : public RenderingContextDriverVulkan {
+private:
virtual const char *_get_platform_surface_extension() const override final;
+protected:
+ SurfaceID surface_create(const void *p_platform_data) override final;
+ bool _use_validation_layers() const override final;
+
public:
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;
-
-protected:
- bool _use_validation_layers() override;
+ RenderingContextDriverVulkanAndroid() = default;
+ ~RenderingContextDriverVulkanAndroid() override = default;
};
#endif // VULKAN_ENABLED
-#endif // VULKAN_CONTEXT_ANDROID_H
+#endif // RENDERING_CONTEXT_DRIVER_VULKAN_ANDROID_H