Explorar o código

android: Properly update emulation surface

Previously the emulation surface wasn't being updated during configuration changes and only during specific view events. This would break input and the screen dimensions after each orientation/aspect ratio change. Now a new surface is provided every time and the display dimensions are updated as needed.
Charles Lombardo %!s(int64=2) %!d(string=hai) anos
pai
achega
32d65fc8de

+ 4 - 18
src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt

@@ -15,7 +15,6 @@ import android.net.Uri
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
-import android.util.Rational
 import android.view.*
 import android.widget.TextView
 import androidx.activity.OnBackPressedCallback
@@ -287,6 +286,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 
     override fun onConfigurationChanged(newConfig: Configuration) {
         super.onConfigurationChanged(newConfig)
+        updateScreenLayout()
         if (emulationActivity?.isInPictureInPictureMode == true) {
             if (binding.drawerLayout.isOpen) {
                 binding.drawerLayout.close()
@@ -394,16 +394,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
     }
 
     private fun updateScreenLayout() {
-        binding.surfaceEmulation.setAspectRatio(
-            when (IntSetting.RENDERER_ASPECT_RATIO.int) {
-                0 -> Rational(16, 9)
-                1 -> Rational(4, 3)
-                2 -> Rational(21, 9)
-                3 -> Rational(16, 10)
-                4 -> null // Stretch
-                else -> Rational(16, 9)
-            }
-        )
+        binding.surfaceEmulation.setAspectRatio(null)
         emulationActivity?.buildPictureInPictureParams()
         updateOrientation()
     }
@@ -693,7 +684,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
     private class EmulationState(private val gamePath: String) {
         private var state: State
         private var surface: Surface? = null
-        private var runWhenSurfaceIsValid = false
 
         init {
             // Starting state is stopped.
@@ -751,8 +741,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
             // If the surface is set, run now. Otherwise, wait for it to get set.
             if (surface != null) {
                 runWithValidSurface()
-            } else {
-                runWhenSurfaceIsValid = true
             }
         }
 
@@ -760,7 +748,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
         @Synchronized
         fun newSurface(surface: Surface?) {
             this.surface = surface
-            if (runWhenSurfaceIsValid) {
+            if (this.surface != null) {
                 runWithValidSurface()
             }
         }
@@ -788,10 +776,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
         }
 
         private fun runWithValidSurface() {
-            runWhenSurfaceIsValid = false
+            NativeLibrary.surfaceChanged(surface)
             when (state) {
                 State.STOPPED -> {
-                    NativeLibrary.surfaceChanged(surface)
                     val emulationThread = Thread({
                         Log.debug("[EmulationFragment] Starting emulation thread.")
                         NativeLibrary.run(gamePath)
@@ -801,7 +788,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 
                 State.PAUSED -> {
                     Log.debug("[EmulationFragment] Resuming emulation.")
-                    NativeLibrary.surfaceChanged(surface)
                     NativeLibrary.unpauseEmulation()
                 }
 

+ 7 - 7
src/android/app/src/main/jni/emu_window/emu_window.cpp

@@ -11,6 +11,12 @@
 #include "jni/emu_window/emu_window.h"
 
 void EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) {
+    m_window_width = ANativeWindow_getWidth(surface);
+    m_window_height = ANativeWindow_getHeight(surface);
+
+    // Ensures that we emulate with the correct aspect ratio.
+    UpdateCurrentFramebufferLayout(m_window_width, m_window_height);
+
     window_info.render_surface = reinterpret_cast<void*>(surface);
 }
 
@@ -62,14 +68,8 @@ EmuWindow_Android::EmuWindow_Android(InputCommon::InputSubsystem* input_subsyste
         return;
     }
 
-    m_window_width = ANativeWindow_getWidth(surface);
-    m_window_height = ANativeWindow_getHeight(surface);
-
-    // Ensures that we emulate with the correct aspect ratio.
-    UpdateCurrentFramebufferLayout(m_window_width, m_window_height);
-
+    OnSurfaceChanged(surface);
     window_info.type = Core::Frontend::WindowSystemType::Android;
-    window_info.render_surface = reinterpret_cast<void*>(surface);
 
     m_input_subsystem->Initialize();
 }