From 37f73070a9fc08d0ee3cc322f0b18a90a9d6c89e Mon Sep 17 00:00:00 2001 From: David Griswold Date: Wed, 5 Mar 2025 08:10:50 -0300 Subject: [PATCH] OpenGL is working on surface change, vulkan still no --- src/android/app/src/main/jni/native.cpp | 30 +++++++++++-------- src/video_core/renderer_base.h | 3 +- .../renderer_vulkan/renderer_vulkan.cpp | 6 ++++ .../renderer_vulkan/renderer_vulkan.h | 5 +--- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index f8b915918..5a65877ff 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -317,7 +317,7 @@ void Java_org_citra_citra_1emu_NativeLibrary_surfaceChanged(JNIEnv* env, auto& system = Core::System::GetInstance(); if (notify && system.IsPoweredOn()) { - system.GPU().Renderer().NotifySurfaceChanged(); + system.GPU().Renderer().NotifySurfaceChanged(false); } LOG_INFO(Frontend, "Surface changed"); @@ -325,16 +325,16 @@ void Java_org_citra_citra_1emu_NativeLibrary_surfaceChanged(JNIEnv* env, void Java_org_citra_citra_1emu_NativeLibrary_enableSecondWindow(JNIEnv* env, [[maybe_unused]] jobject obj,jobject surf) { - s_secondary_surface = ANativeWindow_fromSurface(env, surf); - secondary_enabled = true; - bool notify = false; - if (second_window) { - notify = second_window->OnSurfaceChanged(s_secondary_surface); - } - auto& system = Core::System::GetInstance(); - if (notify && system.IsPoweredOn()) { - system.GPU().Renderer().NotifySurfaceChanged(); - } + s_secondary_surface = ANativeWindow_fromSurface(env, surf); + secondary_enabled = true; + bool notify = false; + if (second_window) { + notify = second_window->OnSurfaceChanged(s_secondary_surface); + } + auto& system = Core::System::GetInstance(); + if (notify && system.IsPoweredOn()) { + system.GPU().Renderer().NotifySurfaceChanged(true); + } LOG_INFO(Frontend, "Secondary Surface changed"); } @@ -345,7 +345,13 @@ void Java_org_citra_citra_1emu_NativeLibrary_disableSecondWindow(JNIEnv* env, [[maybe_unused]] jobject obj) { secondary_enabled = false; - // how do I delete the window? TODO + if (s_secondary_surface != nullptr) { + ANativeWindow_release(s_secondary_surface); + s_secondary_surface = nullptr; + if (second_window) { + second_window->OnSurfaceChanged(s_secondary_surface); + } + } LOG_INFO(Frontend, "Secondary Surface Disabled"); } diff --git a/src/video_core/renderer_base.h b/src/video_core/renderer_base.h index 55cb90d0b..526ce51d7 100644 --- a/src/video_core/renderer_base.h +++ b/src/video_core/renderer_base.h @@ -64,7 +64,8 @@ public: virtual void Sync() {} /// This is called to notify the rendering backend of a surface change - virtual void NotifySurfaceChanged() {} + // if second == true then it is the second screen + virtual void NotifySurfaceChanged(bool second) {} /// Returns the resolution scale factor relative to the native 3DS screen resolution u32 GetResolutionScaleFactor(); diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 4e3664aaa..616898d38 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -1129,4 +1129,10 @@ bool RendererVulkan::TryRenderScreenshotWithHostMemory() { return true; } + void RendererVulkan::NotifySurfaceChanged(bool second) { + if (second && second_window) second_window->NotifySurfaceChanged(); + if (!second) main_window.NotifySurfaceChanged(); + + } + } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index cad1cf204..a35fb477b 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h @@ -74,10 +74,7 @@ public: return &rasterizer; } - void NotifySurfaceChanged() override { - main_window.NotifySurfaceChanged(); - if (second_window) second_window->NotifySurfaceChanged(); - } + void NotifySurfaceChanged(bool second) override; void SwapBuffers() override; void TryPresent(int timeout_ms, bool is_secondary) override {}