diff options
Diffstat (limited to 'platform/android/os_android.cpp')
-rw-r--r-- | platform/android/os_android.cpp | 77 |
1 files changed, 58 insertions, 19 deletions
diff --git a/platform/android/os_android.cpp b/platform/android/os_android.cpp index 344377d673..f3d123bbbc 100644 --- a/platform/android/os_android.cpp +++ b/platform/android/os_android.cpp @@ -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; |