Merge pull request #12786 from t895/driver-overlay
android: Show driver vendor in FPS overlay
This commit is contained in:
		@@ -303,6 +303,11 @@ object NativeLibrary {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    external fun getCpuBackend(): String
 | 
					    external fun getCpuBackend(): String
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns the current GPU Driver.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    external fun getGpuDriver(): String
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    external fun applySettings()
 | 
					    external fun applySettings()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    external fun logSettings()
 | 
					    external fun logSettings()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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()
 | 
				
			||||||
@@ -485,12 +486,15 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
				
			|||||||
            val FRAMETIME = 2
 | 
					            val FRAMETIME = 2
 | 
				
			||||||
            val SPEED = 3
 | 
					            val SPEED = 3
 | 
				
			||||||
            perfStatsUpdater = {
 | 
					            perfStatsUpdater = {
 | 
				
			||||||
                if (emulationViewModel.emulationStarted.value) {
 | 
					                if (emulationViewModel.emulationStarted.value &&
 | 
				
			||||||
 | 
					                    !emulationViewModel.isEmulationStopping.value
 | 
				
			||||||
 | 
					                ) {
 | 
				
			||||||
                    val perfStats = NativeLibrary.getPerfStats()
 | 
					                    val perfStats = NativeLibrary.getPerfStats()
 | 
				
			||||||
                    val cpuBackend = NativeLibrary.getCpuBackend()
 | 
					                    val cpuBackend = NativeLibrary.getCpuBackend()
 | 
				
			||||||
 | 
					                    val gpuDriver = NativeLibrary.getGpuDriver()
 | 
				
			||||||
                    if (_binding != null) {
 | 
					                    if (_binding != null) {
 | 
				
			||||||
                        binding.showFpsText.text =
 | 
					                        binding.showFpsText.text =
 | 
				
			||||||
                            String.format("FPS: %.1f\n%s", perfStats[FPS], cpuBackend)
 | 
					                            String.format("FPS: %.1f\n%s/%s", perfStats[FPS], cpuBackend, gpuDriver)
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 800)
 | 
					                    perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 800)
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -807,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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -901,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."
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
@@ -910,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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -674,6 +675,11 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass
 | 
				
			|||||||
    return ToJString(env, "JIT");
 | 
					    return ToJString(env, "JIT");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getGpuDriver(JNIEnv* env, jobject jobj) {
 | 
				
			||||||
 | 
					    return ToJString(env,
 | 
				
			||||||
 | 
					                     EmulationSession::GetInstance().System().GPU().Renderer().GetDeviceVendor());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) {
 | 
					void Java_org_yuzu_yuzu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) {
 | 
				
			||||||
    EmulationSession::GetInstance().System().ApplySettings();
 | 
					    EmulationSession::GetInstance().System().ApplySettings();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user