1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-22 15:06:45 +00:00

Vulkan rendering for Android

This commit is contained in:
PouleyKetchoupp
2020-03-05 19:00:28 +01:00
parent d9a560d783
commit af424b1c7c
28 changed files with 499 additions and 187 deletions

View File

@@ -35,6 +35,11 @@
#if defined(OPENGL_ENABLED)
#include "drivers/gles2/rasterizer_gles2.h"
#endif
#if defined(VULKAN_ENABLED)
#include "drivers/vulkan/rendering_device_vulkan.h"
#include "platform/android/vulkan/vulkan_context_android.h"
#include "servers/visual/rasterizer_rd/rasterizer_rd.h"
#endif
#include "drivers/unix/dir_access_unix.h"
#include "drivers/unix/file_access_unix.h"
#include "file_access_android.h"
@@ -60,19 +65,6 @@ public:
virtual ~AndroidLogger() {}
};
int OS_Android::get_video_driver_count() const {
return 2;
}
const char *OS_Android::get_video_driver_name(int p_driver) const {
switch (p_driver) {
case VIDEO_DRIVER_GLES2:
return "GLES2";
}
ERR_FAIL_V_MSG(nullptr, "Invalid video driver index: " + itos(p_driver) + ".");
}
int OS_Android::get_audio_driver_count() const {
return 1;
@@ -121,8 +113,7 @@ int OS_Android::get_current_video_driver() const {
}
Error OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
// FIXME: Add Vulkan support. Readd fallback code from Vulkan to GLES2?
video_driver_index = p_video_driver;
#if defined(OPENGL_ENABLED)
if (video_driver_index == VIDEO_DRIVER_GLES2) {
@@ -144,7 +135,31 @@ Error OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int
}
#endif
video_driver_index = p_video_driver;
#if defined(VULKAN_ENABLED)
if (video_driver_index == VIDEO_DRIVER_VULKAN) {
ERR_FAIL_COND_V(!native_window, ERR_UNAVAILABLE);
context_vulkan = memnew(VulkanContextAndroid);
if (context_vulkan->initialize() != OK) {
memdelete(context_vulkan);
context_vulkan = NULL;
ERR_FAIL_V(ERR_UNAVAILABLE);
}
Size2 window_size = get_window_size();
if (context_vulkan->window_create(native_window, window_size.width, window_size.height) == -1) {
memdelete(context_vulkan);
context_vulkan = NULL;
ERR_FAIL_V_MSG(ERR_UNAVAILABLE, "Failed to create Vulkan window.");
}
//temporary
rendering_device_vulkan = memnew(RenderingDeviceVulkan);
rendering_device_vulkan->initialize(context_vulkan);
RasterizerRD::make_current();
}
#endif
rendering_server = memnew(RenderingServerRaster);
if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) {
@@ -175,6 +190,19 @@ void OS_Android::delete_main_loop() {
void OS_Android::finalize() {
memdelete(input);
#if defined(VULKAN_ENABLED)
if (video_driver_index == VIDEO_DRIVER_VULKAN) {
if (rendering_device_vulkan) {
rendering_device_vulkan->finalize();
memdelete(rendering_device_vulkan);
}
if (context_vulkan) {
memdelete(context_vulkan);
}
}
#endif
}
GodotJavaWrapper *OS_Android::get_godot_java() {
@@ -572,9 +600,8 @@ void OS_Android::main_loop_request_go_back() {
}
void OS_Android::set_display_size(Size2 p_size) {
default_videomode.width = p_size.x;
default_videomode.height = p_size.y;
default_videomode.width = p_size.width;
default_videomode.height = p_size.height;
}
Error OS_Android::shell_open(String p_uri) {
@@ -710,6 +737,12 @@ void OS_Android::set_context_is_16_bits(bool p_is_16) {
// rasterizer->set_force_16_bits_fbo(p_is_16);
}
void OS_Android::set_native_window(ANativeWindow *p_native_window) {
#if defined(VULKAN_ENABLED)
native_window = p_native_window;
#endif
}
void OS_Android::joy_connection_changed(int p_device, bool p_connected, String p_name) {
return input->joy_connection_changed(p_device, p_connected, p_name, "");
}
@@ -759,6 +792,12 @@ OS_Android::OS_Android(GodotJavaWrapper *p_godot_java, GodotIOJavaWrapper *p_god
//rasterizer = nullptr;
use_gl2 = false;
#if defined(VULKAN_ENABLED)
context_vulkan = NULL;
rendering_device_vulkan = NULL;
native_window = NULL;
#endif
rendering_server = nullptr;
godot_java = p_godot_java;