android: Fix waiting for driver install on startup
This commit is contained in:
		@@ -38,7 +38,6 @@ import androidx.window.layout.WindowLayoutInfo
 | 
				
			|||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
 | 
					import com.google.android.material.dialog.MaterialAlertDialogBuilder
 | 
				
			||||||
import com.google.android.material.slider.Slider
 | 
					import com.google.android.material.slider.Slider
 | 
				
			||||||
import kotlinx.coroutines.Dispatchers
 | 
					import kotlinx.coroutines.Dispatchers
 | 
				
			||||||
import kotlinx.coroutines.flow.collect
 | 
					 | 
				
			||||||
import kotlinx.coroutines.flow.collectLatest
 | 
					import kotlinx.coroutines.flow.collectLatest
 | 
				
			||||||
import kotlinx.coroutines.launch
 | 
					import kotlinx.coroutines.launch
 | 
				
			||||||
import org.yuzu.yuzu_emu.HomeNavigationDirections
 | 
					import org.yuzu.yuzu_emu.HomeNavigationDirections
 | 
				
			||||||
@@ -141,7 +140,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // So this fragment doesn't restart on configuration changes; i.e. rotation.
 | 
					        // So this fragment doesn't restart on configuration changes; i.e. rotation.
 | 
				
			||||||
        retainInstance = true
 | 
					        retainInstance = true
 | 
				
			||||||
        emulationState = EmulationState(game.path)
 | 
					        emulationState = EmulationState(game.path) {
 | 
				
			||||||
 | 
					            return@EmulationState driverViewModel.isInteractionAllowed.value
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -370,6 +371,15 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            launch {
 | 
				
			||||||
 | 
					                repeatOnLifecycle(Lifecycle.State.RESUMED) {
 | 
				
			||||||
 | 
					                    driverViewModel.isInteractionAllowed.collect {
 | 
				
			||||||
 | 
					                        if (it) {
 | 
				
			||||||
 | 
					                            startEmulation()
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            launch {
 | 
					            launch {
 | 
				
			||||||
                repeatOnLifecycle(Lifecycle.State.CREATED) {
 | 
					                repeatOnLifecycle(Lifecycle.State.CREATED) {
 | 
				
			||||||
                    emulationViewModel.emulationStarted.collectLatest {
 | 
					                    emulationViewModel.emulationStarted.collectLatest {
 | 
				
			||||||
@@ -398,19 +408,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            launch {
 | 
					 | 
				
			||||||
                repeatOnLifecycle(Lifecycle.State.RESUMED) {
 | 
					 | 
				
			||||||
                    driverViewModel.isInteractionAllowed.collect {
 | 
					 | 
				
			||||||
                        if (it) {
 | 
					 | 
				
			||||||
                            onEmulationStart()
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private fun onEmulationStart() {
 | 
					    private fun startEmulation() {
 | 
				
			||||||
        if (!NativeLibrary.isRunning() && !NativeLibrary.isPaused()) {
 | 
					        if (!NativeLibrary.isRunning() && !NativeLibrary.isPaused()) {
 | 
				
			||||||
            if (!DirectoryInitialization.areDirectoriesReady) {
 | 
					            if (!DirectoryInitialization.areDirectoriesReady) {
 | 
				
			||||||
                DirectoryInitialization.start()
 | 
					                DirectoryInitialization.start()
 | 
				
			||||||
@@ -810,7 +811,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private class EmulationState(private val gamePath: String) {
 | 
					    private class EmulationState(
 | 
				
			||||||
 | 
					        private val gamePath: String,
 | 
				
			||||||
 | 
					        private val emulationCanStart: () -> Boolean
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
        private var state: State
 | 
					        private var state: State
 | 
				
			||||||
        private var surface: Surface? = null
 | 
					        private var surface: Surface? = null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -904,6 +908,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
				
			|||||||
                    State.PAUSED -> Log.warning(
 | 
					                    State.PAUSED -> Log.warning(
 | 
				
			||||||
                        "[EmulationFragment] Surface cleared while emulation paused."
 | 
					                        "[EmulationFragment] Surface cleared while emulation paused."
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    else -> Log.warning(
 | 
					                    else -> Log.warning(
 | 
				
			||||||
                        "[EmulationFragment] Surface cleared while emulation stopped."
 | 
					                        "[EmulationFragment] Surface cleared while emulation stopped."
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
@@ -913,6 +918,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        private fun runWithValidSurface() {
 | 
					        private fun runWithValidSurface() {
 | 
				
			||||||
            NativeLibrary.surfaceChanged(surface)
 | 
					            NativeLibrary.surfaceChanged(surface)
 | 
				
			||||||
 | 
					            if (!emulationCanStart.invoke()) {
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            when (state) {
 | 
					            when (state) {
 | 
				
			||||||
                State.STOPPED -> {
 | 
					                State.STOPPED -> {
 | 
				
			||||||
                    val emulationThread = Thread({
 | 
					                    val emulationThread = Thread({
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -144,6 +144,7 @@ class DriverViewModel : ViewModel() {
 | 
				
			|||||||
        val selectedDriverFile = File(StringSetting.DRIVER_PATH.getString())
 | 
					        val selectedDriverFile = File(StringSetting.DRIVER_PATH.getString())
 | 
				
			||||||
        val selectedDriverMetadata = GpuDriverHelper.customDriverSettingData
 | 
					        val selectedDriverMetadata = GpuDriverHelper.customDriverSettingData
 | 
				
			||||||
        if (GpuDriverHelper.installedCustomDriverData == selectedDriverMetadata) {
 | 
					        if (GpuDriverHelper.installedCustomDriverData == selectedDriverMetadata) {
 | 
				
			||||||
 | 
					            setDriverReady()
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -247,6 +247,7 @@ Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string
 | 
				
			|||||||
    m_system.GetCpuManager().OnGpuReady();
 | 
					    m_system.GetCpuManager().OnGpuReady();
 | 
				
			||||||
    m_system.RegisterExitCallback([&] { HaltEmulation(); });
 | 
					    m_system.RegisterExitCallback([&] { HaltEmulation(); });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    OnEmulationStarted();
 | 
				
			||||||
    return Core::SystemResultStatus::Success;
 | 
					    return Core::SystemResultStatus::Success;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user