From 1b4a79c7ee8b7a55791dd633f0571e2058fd68f0 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Wed, 8 Apr 2026 23:42:55 +0200 Subject: [PATCH 1/2] [android] QoL changes to Android Phase - 1 (#3832) This pr content and goal is to provide following to Eden's user base issues with settings, adjust default values on settings and refactor some handlings to improve the plug-and-play factor: -> Combo-box for ASTC Recompression Method Removed: The removal of this toggle was due to the redundant process inside Android devices, most drivers do suppot ASTC handling natively and meanwhile this option provided some benefits to some older Mali devices, the specifications from those and the real compatibility doesn't pay the need for this setting, unless something else is provided to be wrong, the default setting will be uncompressed and no longer available in UI to change. Removed some dead code along with it. -> Removal of ASTC Decode Method ifdef block for Android: Since Yuzu's, the handling for this option was strangely set on CPU, having a specific block for Android in settings, possibly due to the constant spikes on GPU usage that wouldn't be good to load GPU with the whole flow of operations; but since then and until today, Eden's constant effort to make operations more accurate and smartly resolved, have marked the difference that now CPU default on Android no longer provides the benefit to relief GPU stress than reducing performance in some heavy draw commands on some games; the default will be set to GPU to keep parity with PC configuration aiming for a global configuration with all platforms. The setting will be kept to user range, unless is proved to no longer be needed, right now low end devices could still have benefit from CPU/Async, but requires testing from community to show real potential. -> Adjusted default value of ExtendedDynamicState: Currently we're facing some issues of logic inside of ExtendedDynamicState implementation, that makes it a bit unstable when it comes to use the disabled mode, right now we jump to ExtendedDynamicState1 for more stability, meanwhile we fix the remaining issues in future updates (currently one fix will be presented - or would be merged along this pr, the 1st Global Vulkan Maintenance which has some fixes for this situation), so stock drivers and other mobile drivers will behave and benefit from this. -> Exposed hidden and defaulted settings to user's UI: Yuzu implemented some settings that were available on PC's UI but weren't presented on Android's UI or wasn't something expected to do, either way there are some strange behaviors due to this default settings and each of them do something different, i'm not gonna dive into a deep explanation, but to make it short, they stablish asynchronous operations for GPU operations, like Async GPU Emulation (to use a CPU thread to boost performance with GPU emulation, currently a performance hack), Asynchronous Vulkan Presentation this does something a like to disperse draw's/ syncing from TimelineSemaphores and set a thread of CPU to help in running some Vulkan operations (another performance Hack), meanwhile most of the Desktop drivers are mostly nice with this setting, Nvidia aren't due to the nature of the hack, so provokes black screen or failing into initialize games. Mostly Asynchronous operations are fast-paths/ hacks to improve performance to the cost of some graphical issues like the pop-in with Asynchronous Shader Building during the shader compilations, sometimes the trade-off could give random crashes and other issues. Android it's not the exception and currently by disabling GPU Async Emulation user's will be able to fix some strange flickering on Zelda - Link's Awakening (NCE) and other games suffering from similar issues, may also fix random crashes on games that are supposed to work. These settings will be exposed for a short amount of time, meanwhile I receive feedback of the usefulness of having them active or the whole operation being used on Android, aside that, disabling them or one of them will inevitable reduce performance a bit, not so notorious, but it will be up to user's decision now to use them or not. -> AMD FidelityFX's Super Resolution UI handling (a personal request): Now the slider default value will be 0% and will only appear whenever FSR is choosed among other window adapting filters, this will also work with the quick setting menu during runtime. -> Fixed the issue of changing drivers removing all games compiled shader cache: Currently our implementation to safeguard users from unknown issues when a different driver tries to load/ read compiled shaders from another version of Turnip/ QCOM driver, that will delete shaders if the driver is removed or changed; deleted all games compiled shader cache, which increased the annoyance on Android users along with adding unneeded complexity, this used to happen whenever a driver was changed in global settings or per-game settings. Now no longer will happen if the driver is changed on global settings and changing drivers in per-game configuration will only delete current game where the driver was change without affecting others, from here, I'll apologize for this unneeded situation. -> Refactored the input controller detection (another request of mine, hehehe...): This implementation will work to reduce the burden on a new installation (since I have to test everything personally, cuz testers are lazy ass mfs), the input detection is now more accurate to what kind of input a device has, whether is in-built or wireless gamepad, will map it once Eden detect's physical input by reading the controllers inputs that OS provides natively and set or disable touchscreen controllers automatically: - If in-built is detected (Ayaneo, Ayn, Retroid or any Android handheld), Eden will map it automatically and will disable touchscreen controller. - If Wireless gamepad is detected, the same behavior as described above will happen with the extra to recover touchscreen controller whenever the gamepad goes off. It was quite funny to do this, cuz Xiaomi and some other manufacturers always do strange shenanigans with how the inputs are detected (wasn't funny). Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3832 Reviewed-by: MaranBr Co-authored-by: CamilleLaVey Co-committed-by: CamilleLaVey --- .../yuzu_emu/activities/EmulationActivity.kt | 33 ++++----- .../yuzu/yuzu_emu/dialogs/QuickSettings.kt | 4 +- .../features/settings/model/BooleanSetting.kt | 2 + .../features/settings/model/IntSetting.kt | 1 - .../settings/model/view/SettingsItem.kt | 23 +++--- .../settings/ui/SettingsDialogFragment.kt | 5 ++ .../settings/ui/SettingsFragmentPresenter.kt | 36 +++++++-- .../yuzu_emu/fragments/EmulationFragment.kt | 74 ++++++++++++++----- .../yuzu/yuzu_emu/model/DriverViewModel.kt | 19 +++-- .../org/yuzu/yuzu_emu/utils/InputHandler.kt | 62 +++++++++++++++- .../app/src/main/res/values-ar/strings.xml | 5 -- .../app/src/main/res/values-ckb/strings.xml | 5 -- .../app/src/main/res/values-cs/strings.xml | 5 -- .../app/src/main/res/values-de/strings.xml | 5 -- .../app/src/main/res/values-es/strings.xml | 5 -- .../app/src/main/res/values-fa/strings.xml | 6 -- .../app/src/main/res/values-fr/strings.xml | 5 -- .../app/src/main/res/values-he/strings.xml | 5 -- .../app/src/main/res/values-hu/strings.xml | 5 -- .../app/src/main/res/values-id/strings.xml | 5 -- .../app/src/main/res/values-it/strings.xml | 5 -- .../app/src/main/res/values-ja/strings.xml | 5 -- .../app/src/main/res/values-ko/strings.xml | 5 -- .../app/src/main/res/values-nb/strings.xml | 5 -- .../app/src/main/res/values-pl/strings.xml | 5 -- .../src/main/res/values-pt-rBR/strings.xml | 5 -- .../src/main/res/values-pt-rPT/strings.xml | 5 -- .../app/src/main/res/values-ru/strings.xml | 5 -- .../app/src/main/res/values-sr/strings.xml | 5 -- .../app/src/main/res/values-uk/strings.xml | 5 -- .../app/src/main/res/values-vi/strings.xml | 5 -- .../src/main/res/values-zh-rCN/strings.xml | 5 -- .../src/main/res/values-zh-rTW/strings.xml | 5 -- .../app/src/main/res/values/arrays.xml | 15 ---- .../app/src/main/res/values/strings.xml | 11 +-- src/common/settings.h | 12 +-- 36 files changed, 206 insertions(+), 207 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt index 44290fd4b6..949edc1ee3 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt @@ -246,6 +246,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager nfcReader.startScanning() startMotionSensorListener() InputHandler.updateControllerData() + notifyPhysicalControllerState() buildPictureInPictureParams() } @@ -403,8 +404,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager val isPhysicalKeyboard = event.source and InputDevice.SOURCE_KEYBOARD == InputDevice.SOURCE_KEYBOARD && event.device?.isVirtual == false - val isControllerInput = event.source and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK || - event.source and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD + val isControllerInput = InputHandler.isPhysicalGameController(event.device) if (!isControllerInput && event.source and InputDevice.SOURCE_MOUSE != InputDevice.SOURCE_MOUSE && @@ -425,8 +425,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager } override fun dispatchGenericMotionEvent(event: MotionEvent): Boolean { - val isControllerInput = event.source and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK || - event.source and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD + val isControllerInput = InputHandler.isPhysicalGameController(event.device) if (!isControllerInput && event.source and InputDevice.SOURCE_KEYBOARD != InputDevice.SOURCE_KEYBOARD && @@ -460,38 +459,36 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager } private fun isGameController(deviceId: Int): Boolean { - val device = InputDevice.getDevice(deviceId) ?: return false - val sources = device.sources - return sources and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD || - sources and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK + return InputHandler.isPhysicalGameController(InputDevice.getDevice(deviceId)) } override fun onInputDeviceAdded(deviceId: Int) { if (isGameController(deviceId)) { InputHandler.updateControllerData() - val navHostFragment = - supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment - val emulationFragment = - navHostFragment?.childFragmentManager?.fragments?.firstOrNull() as? org.yuzu.yuzu_emu.fragments.EmulationFragment - emulationFragment?.onControllerConnected() + notifyPhysicalControllerState() } } override fun onInputDeviceRemoved(deviceId: Int) { InputHandler.updateControllerData() - val navHostFragment = - supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment - val emulationFragment = - navHostFragment?.childFragmentManager?.fragments?.firstOrNull() as? org.yuzu.yuzu_emu.fragments.EmulationFragment - emulationFragment?.onControllerDisconnected() + notifyPhysicalControllerState() } override fun onInputDeviceChanged(deviceId: Int) { if (isGameController(deviceId)) { InputHandler.updateControllerData() + notifyPhysicalControllerState() } } + private fun notifyPhysicalControllerState() { + val navHostFragment = + supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment + val emulationFragment = + navHostFragment?.childFragmentManager?.fragments?.firstOrNull() as? org.yuzu.yuzu_emu.fragments.EmulationFragment + emulationFragment?.onPhysicalControllerStateChanged(InputHandler.androidControllers.isNotEmpty()) + } + override fun onSensorChanged(event: SensorEvent) { if (!NativeLibrary.isRunning() || NativeLibrary.isPaused()) { return diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt index 400257e8d9..7ba7772bd7 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt @@ -57,7 +57,8 @@ class QuickSettings(val emulationFragment: EmulationFragment) { container: ViewGroup, setting: IntSetting, namesArrayId: Int, - valuesArrayId: Int + valuesArrayId: Int, + onValueChanged: ((Int) -> Unit)? = null ) { val inflater = LayoutInflater.from(emulationFragment.requireContext()) val itemView = inflater.inflate(R.layout.item_quick_settings_menu, container, false) @@ -89,6 +90,7 @@ class QuickSettings(val emulationFragment: EmulationFragment) { setting.setInt(values[index]) saveSettings() valueView.text = name + onValueChanged?.invoke(values[index]) } } radioGroup.addView(radioButton) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index 2418003904..3dee92b0aa 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -22,6 +22,8 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { USE_AUTO_STUB("use_auto_stub"), RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"), RENDERER_FORCE_MAX_CLOCK("force_max_clock"), + RENDERER_ASYNCHRONOUS_GPU_EMULATION("use_asynchronous_gpu_emulation"), + RENDERER_ASYNC_PRESENTATION("async_presentation"), RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"), RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"), ENABLE_BUFFER_HISTORY("enable_buffer_history"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt index 4c70d2b35b..99f51243db 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt @@ -17,7 +17,6 @@ enum class IntSetting(override val key: String) : AbstractIntSetting { RENDERER_VRAM_USAGE_MODE("vram_usage_mode"), RENDERER_NVDEC_EMULATION("nvdec_emulation"), RENDERER_ASTC_DECODE_METHOD("accelerate_astc"), - RENDERER_ASTC_RECOMPRESSION("astc_recompression"), RENDERER_ACCURACY("gpu_accuracy"), RENDERER_RESOLUTION("resolution_setup"), RENDERER_VSYNC("use_vsync"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 6f25856cbf..9ddb414193 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -349,15 +349,6 @@ abstract class SettingsItem( valuesId = R.array.astcDecodingMethodValues ) ) - put( - SingleChoiceSetting( - IntSetting.RENDERER_ASTC_RECOMPRESSION, - titleId = R.string.astc_recompression, - descriptionId = R.string.astc_recompression_description, - choicesId = R.array.astcRecompressionMethodNames, - valuesId = R.array.astcRecompressionMethodValues - ) - ) put( SingleChoiceSetting( IntSetting.RENDERER_VRAM_USAGE_MODE, @@ -652,6 +643,20 @@ abstract class SettingsItem( descriptionId = R.string.renderer_force_max_clock_description ) ) + put( + SwitchSetting( + BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION, + titleId = R.string.renderer_asynchronous_gpu_emulation, + descriptionId = R.string.renderer_asynchronous_gpu_emulation_description + ) + ) + put( + SwitchSetting( + BooleanSetting.RENDERER_ASYNC_PRESENTATION, + titleId = R.string.renderer_async_presentation, + descriptionId = R.string.renderer_async_presentation_description + ) + ) put( SingleChoiceSetting( IntSetting.RENDERER_OPTIMIZE_SPIRV_OUTPUT, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt index 4dcb35c010..4e4ac47ea2 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt @@ -29,6 +29,7 @@ import org.yuzu.yuzu_emu.databinding.DialogSliderBinding import org.yuzu.yuzu_emu.databinding.DialogSpinboxBinding import org.yuzu.yuzu_emu.features.input.NativeInput import org.yuzu.yuzu_emu.features.input.model.AnalogDirection +import org.yuzu.yuzu_emu.features.settings.model.IntSetting import org.yuzu.yuzu_emu.features.settings.model.view.AnalogInputSetting import org.yuzu.yuzu_emu.features.settings.model.view.ButtonInputSetting import org.yuzu.yuzu_emu.features.settings.model.view.IntSingleChoiceSetting @@ -381,6 +382,10 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener } scSetting.setSelectedValue(value) + if (scSetting.setting.key == IntSetting.RENDERER_SCALING_FILTER.key) { + settingsViewModel.setShouldReloadSettingsList(true) + } + if (scSetting.setting.key == "app_language") { settingsViewModel.setShouldRecreateForLanguageChange(true) // recreate page apply language change instantly diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 060a6fe9ae..eaf1ed2c00 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -58,19 +58,38 @@ class SettingsFragmentPresenter( val pairedSettingKey = item.setting.pairedSettingKey if (pairedSettingKey.isNotEmpty()) { + val needsGlobal = getNeedsGlobalForKey(pairedSettingKey) val pairedSettingValue = NativeConfig.getBoolean( pairedSettingKey, - if (NativeLibrary.isRunning() && !NativeConfig.isPerGameConfigLoaded()) { - !NativeConfig.usingGlobal(pairedSettingKey) - } else { - NativeConfig.usingGlobal(pairedSettingKey) - } + needsGlobal ) if (!pairedSettingValue) return } add(item) } + private fun getNeedsGlobalForKey(key: String): Boolean { + return if (NativeLibrary.isRunning() && !NativeConfig.isPerGameConfigLoaded()) { + !NativeConfig.usingGlobal(key) + } else { + NativeConfig.usingGlobal(key) + } + } + + private fun isFsrScalingFilterSelected(): Boolean { + val fsrFilterValue = resolveFsrScalingFilterValue() ?: return false + val needsGlobal = getNeedsGlobalForKey(IntSetting.RENDERER_SCALING_FILTER.key) + val selectedFilter = IntSetting.RENDERER_SCALING_FILTER.getInt(needsGlobal) + return selectedFilter == fsrFilterValue + } + + private fun resolveFsrScalingFilterValue(): Int? { + val names = context.resources.getStringArray(R.array.rendererScalingFilterNames) + val values = context.resources.getIntArray(R.array.rendererScalingFilterValues) + val fsrIndex = names.indexOf(context.getString(R.string.scaling_filter_fsr)) + return if (fsrIndex in values.indices) values[fsrIndex] else null + } + // Allows you to show/hide abstract settings based on the paired setting key private fun ArrayList.addAbstract(item: SettingsItem) { val pairedSettingKey = item.setting.pairedSettingKey @@ -248,7 +267,9 @@ class SettingsFragmentPresenter( add(IntSetting.RENDERER_RESOLUTION.key) add(IntSetting.RENDERER_VSYNC.key) add(IntSetting.RENDERER_SCALING_FILTER.key) - add(IntSetting.FSR_SHARPENING_SLIDER.key) + if (isFsrScalingFilterSelected()) { + add(IntSetting.FSR_SHARPENING_SLIDER.key) + } add(IntSetting.RENDERER_ANTI_ALIASING.key) add(IntSetting.RENDERER_OPTIMIZE_SPIRV_OUTPUT.key) @@ -259,11 +280,12 @@ class SettingsFragmentPresenter( add(IntSetting.MAX_ANISOTROPY.key) add(IntSetting.RENDERER_VRAM_USAGE_MODE.key) add(IntSetting.RENDERER_ASTC_DECODE_METHOD.key) - add(IntSetting.RENDERER_ASTC_RECOMPRESSION.key) add(BooleanSetting.SYNC_MEMORY_OPERATIONS.key) add(BooleanSetting.RENDERER_USE_DISK_SHADER_CACHE.key) add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key) + add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key) + add(BooleanSetting.RENDERER_ASYNC_PRESENTATION.key) add(BooleanSetting.RENDERER_REACTIVE_FLUSHING.key) add(BooleanSetting.ENABLE_BUFFER_HISTORY.key) add(BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS.key) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index b67bc6a9cc..a4c9eb9039 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt @@ -90,6 +90,7 @@ import org.yuzu.yuzu_emu.utils.FileUtil import org.yuzu.yuzu_emu.utils.GameHelper import org.yuzu.yuzu_emu.utils.GameIconUtils import org.yuzu.yuzu_emu.utils.GpuDriverHelper +import org.yuzu.yuzu_emu.utils.InputHandler import org.yuzu.yuzu_emu.utils.Log import org.yuzu.yuzu_emu.utils.NativeConfig import org.yuzu.yuzu_emu.utils.NativeFreedrenoConfig @@ -114,6 +115,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { val handler = Handler(Looper.getMainLooper()) private var controllerInputReceived = false + private var hasPhysicalControllerConnected = false + private var overlayHiddenByPhysicalController = false private var _binding: FragmentEmulationBinding? = null @@ -666,6 +669,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { driverInUse = driverViewModel.selectedDriverVersion.value updateQuickOverlayMenuEntry(BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) + onPhysicalControllerStateChanged(InputHandler.androidControllers.isNotEmpty()) binding.surfaceEmulation.holder.addCallback(this) binding.doneControlConfig.setOnClickListener { stopConfiguringControls() } @@ -760,11 +764,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { R.id.menu_quick_overlay -> { val newState = !BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() - BooleanSetting.SHOW_INPUT_OVERLAY.setBoolean(newState) - updateQuickOverlayMenuEntry(newState) - binding.surfaceInputOverlay.refreshControls() - // Sync view visibility with the setting toggleOverlay(newState) + updateQuickOverlayMenuEntry(BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) NativeConfig.saveGlobalConfig() true } @@ -1053,7 +1054,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { val shouldShowOverlay = if (args.overlayGamelessEditMode) { true } else { - showInputOverlay && emulationViewModel.emulationStarted.value + showInputOverlay && emulationViewModel.emulationStarted.value && + !hasPhysicalControllerConnected } b.surfaceInputOverlay.setVisible(shouldShowOverlay) if (!isInFoldableLayout) { @@ -1078,6 +1080,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private fun addQuickSettings() { binding.quickSettingsSheet.apply { val container = binding.quickSettingsSheet.findViewById(R.id.quick_settings_container) + val isFsrSelected = isFsrScalingFilterSelected() container.removeAllViews() @@ -1159,16 +1162,20 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { IntSetting.RENDERER_SCALING_FILTER, R.array.rendererScalingFilterNames, R.array.rendererScalingFilterValues - ) + ) { + addQuickSettings() + } - quickSettings.addSliderSetting( - R.string.fsr_sharpness, - container, - IntSetting.FSR_SHARPENING_SLIDER, - minValue = 0, - maxValue = 100, - units = "%" - ) + if (isFsrSelected) { + quickSettings.addSliderSetting( + R.string.fsr_sharpness, + container, + IntSetting.FSR_SHARPENING_SLIDER, + minValue = 0, + maxValue = 100, + units = "%" + ) + } quickSettings.addIntSetting( R.string.renderer_anti_aliasing, @@ -1180,6 +1187,19 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } } + private fun isFsrScalingFilterSelected(): Boolean { + val fsrFilterValue = resolveFsrScalingFilterValue() ?: return false + val selectedFilter = IntSetting.RENDERER_SCALING_FILTER.getInt(needsGlobal = false) + return selectedFilter == fsrFilterValue + } + + private fun resolveFsrScalingFilterValue(): Int? { + val names = resources.getStringArray(R.array.rendererScalingFilterNames) + val values = resources.getIntArray(R.array.rendererScalingFilterValues) + val fsrIndex = names.indexOf(getString(R.string.scaling_filter_fsr)) + return if (fsrIndex in values.indices) values[fsrIndex] else null + } + private fun openQuickSettingsMenu() { binding.drawerLayout.closeDrawer(binding.inGameMenu) binding.drawerLayout.openDrawer(binding.quickSettingsSheet) @@ -2479,6 +2499,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { fun toggleOverlay(enable: Boolean) { if (!isAdded || _binding == null) return + if (enable && hasPhysicalControllerConnected && !args.overlayGamelessEditMode) return if (enable == !BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) { // Reset controller input flag so controller can hide overlay again if (!enable) { @@ -2502,13 +2523,30 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } fun onControllerConnected() { - controllerInputReceived = false + onPhysicalControllerStateChanged(InputHandler.androidControllers.isNotEmpty()) } fun onControllerDisconnected() { - if (!BooleanSetting.HIDE_OVERLAY_ON_CONTROLLER_INPUT.getBoolean()) return - if (!BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) return + onPhysicalControllerStateChanged(InputHandler.androidControllers.isNotEmpty()) + } + + fun onPhysicalControllerStateChanged(hasConnectedControllers: Boolean) { + hasPhysicalControllerConnected = hasConnectedControllers controllerInputReceived = false - toggleOverlay(true) + if (!isAdded || _binding == null) return + if (binding.surfaceInputOverlay.isGamelessMode()) return + + if (hasConnectedControllers) { + if (BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) { + overlayHiddenByPhysicalController = true + toggleOverlay(false) + } + return + } + + if (overlayHiddenByPhysicalController) { + overlayHiddenByPhysicalController = false + toggleOverlay(true) + } } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt index 3904f83279..41f03c2488 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt @@ -58,6 +58,7 @@ class DriverViewModel : ViewModel() { private val driversToDelete = mutableListOf() private var previousDriverPath: String = "" + private var activeGame: Game? = null private val _shouldShowDriverShaderDialog = MutableStateFlow(false) val shouldShowDriverShaderDialog: StateFlow get() = _shouldShowDriverShaderDialog @@ -98,6 +99,7 @@ class DriverViewModel : ViewModel() { } fun onOpenDriverManager(game: Game?) { + activeGame = game if (game != null) { SettingsFile.loadCustomConfig(game) } @@ -116,10 +118,12 @@ class DriverViewModel : ViewModel() { } if (!skipShaderWipe && newDriverPath != previousDriverPath) { - wipeAllShaders() + activeGame?.let { + wipeGameShaders(it) - if (!BooleanSetting.DONT_SHOW_DRIVER_SHADER_WARNING.getBoolean(needsGlobal = true)) { - _shouldShowDriverShaderDialog.value = true + if (!BooleanSetting.DONT_SHOW_DRIVER_SHADER_WARNING.getBoolean(needsGlobal = true)) { + _shouldShowDriverShaderDialog.value = true + } } } @@ -139,12 +143,14 @@ class DriverViewModel : ViewModel() { _shouldShowDriverShaderDialog.value = false } - private fun wipeAllShaders() { + private fun wipeGameShaders(game: Game) { viewModelScope.launch { withContext(Dispatchers.IO) { + val externalFilesDir = YuzuApplication.appContext.getExternalFilesDir(null) + ?: return@withContext val shaderDir = File( - YuzuApplication.appContext.getExternalFilesDir(null)?.canonicalPath + - "/shader/" + externalFilesDir.absolutePath + + "/shader/" + game.settingsName.lowercase() ) if (shaderDir.exists()) { shaderDir.deleteRecursively() @@ -202,6 +208,7 @@ class DriverViewModel : ViewModel() { } driversToDelete.clear() } finally { + activeGame = null _isDeletingDrivers.value = false } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InputHandler.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InputHandler.kt index 2c7356e6a7..1909a73319 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InputHandler.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InputHandler.kt @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -14,6 +17,60 @@ object InputHandler { var androidControllers = mapOf() var registeredControllers = mutableListOf() + private val controllerButtons = intArrayOf( + KeyEvent.KEYCODE_BUTTON_A, + KeyEvent.KEYCODE_BUTTON_B, + KeyEvent.KEYCODE_BUTTON_X, + KeyEvent.KEYCODE_BUTTON_Y, + KeyEvent.KEYCODE_BUTTON_L1, + KeyEvent.KEYCODE_BUTTON_R1, + KeyEvent.KEYCODE_BUTTON_L2, + KeyEvent.KEYCODE_BUTTON_R2, + KeyEvent.KEYCODE_BUTTON_THUMBL, + KeyEvent.KEYCODE_BUTTON_THUMBR, + KeyEvent.KEYCODE_BUTTON_START, + KeyEvent.KEYCODE_BUTTON_SELECT, + KeyEvent.KEYCODE_DPAD_UP, + KeyEvent.KEYCODE_DPAD_DOWN, + KeyEvent.KEYCODE_DPAD_LEFT, + KeyEvent.KEYCODE_DPAD_RIGHT + ) + + private val controllerAxes = intArrayOf( + MotionEvent.AXIS_X, + MotionEvent.AXIS_Y, + MotionEvent.AXIS_Z, + MotionEvent.AXIS_RX, + MotionEvent.AXIS_RY, + MotionEvent.AXIS_RZ, + MotionEvent.AXIS_HAT_X, + MotionEvent.AXIS_HAT_Y, + MotionEvent.AXIS_LTRIGGER, + MotionEvent.AXIS_RTRIGGER + ) + + fun isPhysicalGameController(device: InputDevice?): Boolean { + device ?: return false + + if (device.isVirtual) { + return false + } + + val sources = device.sources + val hasControllerSource = + sources and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD || + sources and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK + if (!hasControllerSource) { + return false + } + + val hasControllerButtons = device.hasKeys(*controllerButtons).any { it } + val hasControllerAxes = device.motionRanges.any { range -> + controllerAxes.contains(range.axis) + } + return hasControllerButtons || hasControllerAxes + } + fun dispatchKeyEvent(event: KeyEvent): Boolean { val action = when (event.action) { KeyEvent.ACTION_DOWN -> NativeInput.ButtonState.PRESSED @@ -57,10 +114,7 @@ object InputHandler { val inputSettings = NativeConfig.getInputSettings(true) deviceIds.forEach { deviceId -> InputDevice.getDevice(deviceId)?.apply { - // Verify that the device has gamepad buttons, control sticks, or both. - if (sources and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD || - sources and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK - ) { + if (isPhysicalGameController(this)) { if (!gameControllerDeviceIds.contains(controllerNumber)) { gameControllerDeviceIds[controllerNumber] = YuzuPhysicalDevice( this, diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 0b544747c5..4f0c11a2e8 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -479,8 +479,6 @@ تحكم في مدى قوة تخصيص المحاكي لذاكرة وحدة معالجة الرسومات وتحريرها. طريقة فك ضغط ASTC حدد كيفية فك ضغط نسيج ASTC للعرض: CPU (بطيء، آمن)، GPU (سريع، موصى به)، أو CPU Async (بدون توقف، قد يسبب مشاكل) - طريقة إعادة ضغط ASTC - حدد كيفية إعادة ضغط نسيج ASTC لتحسين التوافق والأداء. تمكين هذا الخيار يوفر VRAM ولكن قد يقلل من جودة النسيج. مزامنة عمليات الذاكرة يضمن اتساق البيانات بين عمليات الحوسبة والذاكرة. هذا الخيار قد يحل المشكلات في بعض الألعاب، ولكن قد يقلل الأداء في بعض الحالات. يبدو أن الألعاب التي تستخدم Unreal Engine 4 هي الأكثر تأثرًا. @@ -997,9 +995,6 @@ غير آمن آمن - - غير مضغوط - محافظ عدواني diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index 3adce117c3..b22fbe0298 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -343,8 +343,6 @@ کۆنتڕۆڵی بەکارهێنانی VRAM ڕێگای دیکۆدکردنی ASTC هەڵبژێرە چۆن تێکستوورە پەستووکراوەکانی ASTC دەکرێنەوە بۆ ڕێندرکردن: CPU (هێواش، سەلامەت)، GPU (خێرا، پێشنیارکراو)، یان CPU Async (بێ ستەتەر، لەوانەیە کێشە دروست بکات) - ڕێگای پێکهێنانەوەی ASTC - هەڵبژێرە چۆن تێکستوورەکانی ASTC پەستوو دەکرێنەوە بۆ باشترکردنی گونجاندن و کارایی. چالاککردنی ئەم هەڵبژاردە VRAM هەڵدەگرێت بەڵام لەوانەیە کەمکردنەوەی کوالێتی تێکستوور بکات. هاوبەشیی کردارەکانی بیرگە دڵنیایی داتا لە نێوان کردارەکانی کۆمپیوتەر و بیرگە. ئەم هەڵبژاردە کێشەکان لە هەندێک یاری چارەسەر دەکات، بەڵام لە هەندێک حاڵەت کارایی کەم دەکاتەوە. وا دیارە یارییەکانی Unreal Engine 4 زۆرترین کاریگەریان هەیە. @@ -577,9 +575,6 @@ بنەڕەتی - - پێکهێنەنەوە - پارێزەر توند diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index f42e743173..530a33f3b2 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -458,8 +458,6 @@ Určuje, jak moc agresivně emulátor přiděluje a uvolňuje grafickou paměť. Metoda dekódování ASTC Vyberte způsob jak se dekódují ASTC textury: CPU (pomalé, bezpečné), GPU (rychlé, doporučené) nebo CPU Async (asynchronní, žádné zasekávání, ale může způsobit problémy) - Metoda rekomprese ASTC - Vyberte způsob rekomprese textur ASTC pro zlepšení kompatibility a výkonu. Zapnutí této volby ušetří VRAM, ale může snížit kvalitu textur. Synchronizace paměťových operací Zajišťuje konzistenci dat mezi výpočetními a paměťovými operacemi. Tato volba by měla opravit problémy v některých hrách, ale může v některých případech snížit výkon. Největší změny se týkají her založených na Unreal Engine 4. @@ -727,9 +725,6 @@ Nebezpečné Bezpečné - - Nekomprimované - Konzervativní Agresivní diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index f97bd4c08c..f8cc0af96b 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -458,8 +458,6 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die Steuerung der GPU-Speicherzuweisung ASTC-Decodierung Wählen Sie aus, wie ASTC-komprimierte Texturen für das Rendering decodiert werden: CPU (langsam, sicher), GPU (schnell, empfohlen) oder CPU Async (kein Ruckeln, kann Probleme verursachen) - ASTC-Neukompression - Wählen Sie, wie ASTC-Texturen neu komprimiert werden, um die Kompatibilität und Leistung zu verbessern. Diese Option spart VRAM, kann aber die Texturqualität verringern. Speicheroperationen synchronisieren Stellt die Datenkonsistenz zwischen Compute- und Speicheroperationen sicher. Diese Option sollte Probleme in einigen Spielen beheben, kann aber in einigen Fällen die Leistung verringern. Spiele mit Unreal Engine 4 scheinen am stärksten betroffen zu sein. @@ -935,9 +933,6 @@ Wirklich fortfahren? Unsicher Sicher - - Unkomprimiert - Konservativ Aggressiv diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 5d0102f985..e09d18f48e 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -473,8 +473,6 @@ Controla con qué agresividad el emulador asigna y libera la memoria de la GPU. Método de decodificación ASTC Elija cómo se descodifican las texturas comprimidas ASTC para el renderizado: CPU (lento, seguro), GPU (rápido, recomendado) o CPU Async (sin tirones, puede causar problemas) - Método de recompresión ASTC - Elija cómo se recomprimen las texturas ASTC para mejorar la compatibilidad y el rendimiento. Habilitar esta opción ahorra VRAM pero puede reducir la calidad de las texturas. Sincronizar operaciones de memoria Garantiza la consistencia de los datos entre las operaciones de computación y memoria. Esta opción debería solucionar problemas en algunos juegos, pero también puede reducir el rendimiento en algunos casos. Los juegos de Unreal Engine 4 a menudo ven los cambios más significativos de los mismos. @@ -991,9 +989,6 @@ Inseguro Seguro - - Sin compresión - Conservador Agresivo diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml index 80e40444c2..05c146ea0e 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -114,12 +114,6 @@ GPU CPU ناهمگام - - روش فشرده‌سازی مجدد ASTC - انتخاب کنید که بافت‌های ASTC چگونه فشرده‌سازی مجدد شوند تا سازگاری و عملکرد بهبود یابد. فعال کردن این گزینه VRAM را ذخیره می‌کند اما ممکن است کیفیت بافت را کاهش دهد. - فشرده‌نشده - BC1 (کیفیت پایین) - BC3 (کیفیت متوسط) حالت استفاده از VRAM diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index 3f681a2850..a2b0942a2c 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -466,8 +466,6 @@ Gestion de la mémoire GPU Méthode ASTC Choisissez comment les textures compressées ASTC sont décodées pour le rendu : CPU (lent, sûr), GPU (rapide, recommandé) ou CPU Async (pas de saccades, peut causer des problèmes) - Recompression ASTC - Choisissez comment les textures ASTC sont recompressées pour améliorer la compatibilité et les performances. Activer cette option économise la VRAM mais peut réduire la qualité des textures. Synchroniser les opérations mémoire Garantit la cohérence des données entre les opérations de calcul et de mémoire. Cette option devrait résoudre les problèmes dans certains jeux, mais peut réduire les performances dans certains cas. Les jeux utilisant Unreal Engine 4 semblent être les plus affectés. @@ -864,9 +862,6 @@ Dangereux Sûr - - Non compressé - Conservateur Agressif diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index 74d61af932..b498c7eb64 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -373,8 +373,6 @@ שליטה בקצב הקצאת ושחרור זיכרון GPU שיטת פענוח ASTC בחר כיצד לפרק את הטקסטורות הדחוסות ב-ASTC עבור רינדור: CPU (איטי, בטוח), GPU (מהיר, מומלץ) או CPU Async (ללא קפיצות, עלול לגרום לבעיות) - שיטת דחיסת ASTC - בחר כיצד דחיסה מחדש של טקסטורות ASTC משפרת תאימות וביצועים. הפעלת אפשרות זו חוסכת VRAM אך עלולה להוריד את איכות הטקסטורה. סנכרון פעולות זיכרון מבטיח עקביות נתונים בין פעולות חישוב וזיכרון. אפשרות זו אמורה לתקן בעיות במשחקים מסוימים, אך עלולה להפחית ביצועים במקרים מסוימים. נראה שהמשחקים עם Unreal Engine 4 הם המושפעים ביותר. @@ -622,9 +620,6 @@ ברירת מחדל - - לא דחוס - שמרני אגרסיבי diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index aae6766321..2c777e3d3f 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -362,8 +362,6 @@ GPU memória kezelésének módja ASTC dekódolási módszer Válassza ki, hogyan legyenek dekódolva az ASTC tömörített textúrák a rendereléshez: CPU (lassú, biztonságos), GPU (gyors, ajánlott) vagy CPU Async (nincs megakadás, de problémákat okozhat) - ASTC újratömörítési módszer - Válassza ki, hogyan történik az ASTC textúrák újratömörítése a kompatibilitás és a teljesítmény javításáért. Ez az opció VRAM-ot takarít meg, de csökkentheti a textúra minőségét. Memória-műveletek szinkronizálása Biztosítja az adatok konzisztenciáját a számítási és memória-műveletek között. Ez az opciónak javítania kell néhány játékban előforduló problémát, de bizonyos esetekben csökkentheti a teljesítményt. Az Unreal Engine 4-et használó játékok látszanak a legérintettebbek. @@ -711,9 +709,6 @@ Alapértelmezett - - Tömörítetlen - Konzervatív Aggresszív diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index 02ed67feb6..247510efb9 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -394,8 +394,6 @@ Kontrol seberapa agresif emulator mengalokasikan dan membebaskan memori GPU. Metode Dekoding ASTC Pilih cara tekstur terkompresi ASTC didekode untuk rendering: CPU (lambat, aman), GPU (cepat, direkomendasikan), atau CPU Async (tanpa lag, mungkin menyebabkan masalah) - Metode Rekompresi ASTC - Pilih cara tekstur ASTC dikompresi ulang untuk meningkatkan kompatibilitas dan performa. Mengaktifkan opsi ini menghemat VRAM tetapi dapat menurunkan kualitas tekstur. Sinkronisasi Operasi Memori Memastikan konsistensi data antara operasi komputasi dan memori. Opsi ini seharusnya memperbaiki masalah di beberapa game, tetapi mungkin mengurangi performa dalam beberapa kasus. Game dengan Unreal Engine 4 tampaknya yang paling terpengaruh. @@ -757,9 +755,6 @@ Bawaan - - Tidak Dikompresi - Konservatif Agresif diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 74cc07f8d9..7bc25d40bb 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -401,8 +401,6 @@ Controlla l`allocazione della memoria GPU Metodo decodifica ASTC Scegli come decodificare le texture compresse ASTC per il rendering: CPU (lento, sicuro), GPU (veloce, consigliato) o CPU Async (senza stuttering, può causare problemi) - Metodo ricompressione ASTC - Scegli come ricomprimere le texture ASTC per migliorare compatibilità e prestazioni. Abilitare questa opzione salva VRAM ma può ridurre la qualità delle texture. Sincronizza operazioni di memoria Garantisce la coerenza dei dati tra le operazioni di calcolo e memoria. Questa opzione dovrebbe risolvere problemi in alcuni giochi, ma potrebbe ridurre le prestazioni in alcuni casi. I giochi con Unreal Engine 4 sembrano essere i più colpiti. @@ -797,9 +795,6 @@ Non sicura Sicura - - Non compresso - Conservativa Aggressiva diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index 34fd473de3..647b6f82b4 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -360,8 +360,6 @@ VRAMの使用効率を設定 ASTCデコード方法 ASTC圧縮テクスチャのデコード方法を選択: CPU (低速、安全)、GPU (高速、推奨)、またはCPU非同期 (カクつきなし、問題が発生する可能性あり) - ASTC再圧縮方法 - ASTCテクスチャの再圧縮方法を選択して互換性とパフォーマンスを向上させます。このオプションを有効にするとVRAMを節約できますが、テクスチャ品質が低下する可能性があります。 メモリ操作の同期 計算処理とメモリ操作間のデータ一貫性を保証します。 このオプションは一部のゲームの問題を修正しますが、場合によってはパフォーマンスが低下する可能性があります。 Unreal Engine 4のゲームが最も影響を受けるようです。 @@ -618,9 +616,6 @@ デフォルト - - 非圧縮 - 保守的 積極的 diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index 30b9feb33e..0b2b1af8ac 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -360,8 +360,6 @@ GPU 메모리 할당/해제 방식 선택 ASTC 디코딩 방법 ASTC 압축 텍스처의 디코딩 방식을 선택하세요: CPU (느림, 안전), GPU (빠름, 권장), 또는 CPU 비동기 (끊김 없음, 문제 발생 가능) - ASTC 재압축 방법 - ASTC 텍스처의 재압축 방식을 선택하여 호환성과 성능을 향상시킵니다. 이 옵션을 활성화하면 VRAM을 절약할 수 있지만 텍스처 품질이 저하될 수 있습니다. 메모리 작업 동기화 컴퓨팅 및 메모리 작업 간 데이터 일관성을 보장합니다. 이 옵션은 일부 게임의 문제를 해결할 수 있지만 경우에 따라 성능이 저하될 수 있습니다. Unreal Engine 4 게임이 가장 큰 영향을 받는 것으로 보입니다. @@ -670,9 +668,6 @@ 기본값 - - 비압축 - 보수적 적극적 diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index 559c1f61f4..fb507c8b36 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -343,8 +343,6 @@ Kontroller minnetildeling for GPU ASTC-dekoding Velg hvordan ASTC-komprimerte teksturer skal dekodes for rendering: CPU (tregt, sikkert), GPU (raskt, anbefalt) eller CPU Async (ingen stuttering, kan forårsake problemer) - ASTC-komprimering - Velg hvordan ASTC-teksturer komprimeres på nytt for å forbedre kompatibilitet og ytelse. Å aktivere dette alternativet sparer VRAM, men kan redusere teksturkvaliteten. Synkroniser minneoperasjoner Sikrer datakonsistens mellom beregnings- og minneoperasjoner. Dette alternativet bør fikse problemer i noen spill, men kan redusere ytelsen i noen tilfeller. Spill med Unreal Engine 4 ser ut til å være de mest berørte. @@ -590,9 +588,6 @@ Standard - - Ukomprimert - Konservativ Aggressiv diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index a0bfa481d4..675dae5895 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -458,8 +458,6 @@ Kontroluj alokację i zwalnianie pamięci GPU. Metoda dekodowania ASTC Wybierz sposób dekodowania tekstur skompresowanych w formacie ASTC do renderowania: CPU (wolne, bezpieczne), GPU (szybkie, zalecane) lub CPU Async (bez zacięć, może powodować problemy) - Metoda rekompresji ASTC - Wybierz sposób ponownej kompresji tekstur ASTC w celu poprawy zgodności i wydajności. Włączenie tej opcji oszczędza VRAM, ale może obniżyć jakość tekstur. Synchronizuj operacje pamięci Zapewnia spójność danych między operacjami obliczeniowymi i pamięciowymi. Ta opcja powinna naprawiać problemy w niektórych grach, ale może zmniejszyć wydajność w niektórych przypadkach. Gry z Unreal Engine 4 wydają się być najbardziej dotknięte. @@ -913,9 +911,6 @@ Niezalecane Bezpieczne - - Bez kompresji - Oszczędny Agresywny diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index 91d739fc8a..14ba444d22 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -446,8 +446,6 @@ Controla a alocação de memória GPU Método de decodificação ASTC Escolha como as texturas comprimidas em ASTC são decodificadas para renderização: CPU (lenta, segura), GPU (rápida, recomendada) ou CPU Assíncrona (sem travamentos, mas pode causar problemas). - Método de recompressão ASTC - Escolha como as texturas ASTC são recompactadas para melhorar a compatibilidade e o desempenho. Ativar esta opção economiza VRAM, mas pode reduzir a qualidade da textura. Sincronizar Operações de Memória Garante a consistência de dados entre operações de computação e memória. Esta opção pode corrigir problemas em alguns jogos, mas também pode reduzir o desempenho, sendo os jogos da Unreal Engine 4 os mais afetados. @@ -858,9 +856,6 @@ Insegura Segura - - Não comprimido - Conservador Agressivo diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index 05612390a8..9e8eb88729 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -366,8 +366,6 @@ Controla alocação de memória GPU. Método ASTC Escolha como as texturas comprimidas em ASTC são descodificadas para renderização: CPU (lento, seguro), GPU (rápido, recomendado) ou CPU Async (sem engasgos, pode causar problemas) - Recompressão ASTC - Escolha como as texturas ASTC são recomprimidas para melhorar a compatibilidade e o desempenho. Ativar esta opção poupa VRAM, mas pode reduzir a qualidade da textura. Sincronizar Operações de Memória Garante a consistência dos dados entre operações de computação e memória. Esta opção deve corrigir problemas em alguns jogos, mas pode reduzir o desempenho nalguns casos. Os jogos com Unreal Engine 4 parecem ser os mais afectados. @@ -723,9 +721,6 @@ uma tentativa de mapeamento automático Predefinido - - Não Comprimido - Conservador Agressivo diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index f6d9d15c54..617973a176 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -475,8 +475,6 @@ Стратегия управления видеопамятью Метод декодирования ASTC Выберите способ декодирования сжатых текстур ASTC для рендеринга: ЦП (медленно, безопасно), ГПУ (быстро, рекомендуется) или ЦП асинхронно (без заиканий, могут возникнуть проблемы) - Метод пережатия ASTC - Выберите способ пересжатия текстур ASTC для улучшения совместимости и производительности. Включение этой опции экономит VRAM, но может снизить качество текстур. Синхронизация операций с памятью Обеспечивает согласованность данных между вычислительными операциями и операциями с памятью. Эта опция должна исправлять проблемы в некоторых играх, но может снижать производительность в некоторых случаях. Наиболее сильно это затрагивает игры на Unreal Engine 4. @@ -993,9 +991,6 @@ Небезопасно Безопасный - - Без сжатия - Консервативный Агрессивный diff --git a/src/android/app/src/main/res/values-sr/strings.xml b/src/android/app/src/main/res/values-sr/strings.xml index 7ac829cd91..a8e5fbb39f 100644 --- a/src/android/app/src/main/res/values-sr/strings.xml +++ b/src/android/app/src/main/res/values-sr/strings.xml @@ -365,8 +365,6 @@ Контролишите колико агресивно емулатор додељује и ослобађа ГПУ меморију. АСТЦ метода декодирања Изаберите како су текстуре са компримираним текстовима декодиране за приказивање: ЦПУ (споро, сигуран), ГПУ (Фаст, Препоручи) или ЦПУ АСИНЦ (без затезача, могу да изазове питања) - Метода рекомпресије АСТЦ-а - Изаберите како се текстуре АСТЦ препоручују да би се побољшале компатибилност и перформансе. Омогућавање ове опције штеди ВРАМ, али може смањити квалитет текстуре. Синхронизација меморијских операција Осигурава конзистентност података између рачунских и меморијских операција. Ова опција би требало да поправи проблеме у неким играма, али може смањити перформансе у неким случајевима. Чини се да су игре са Unreal Engine 4 највише погођене. @@ -720,9 +718,6 @@ Подразумевано - - Некомпримован - Конзервативан Агресиван diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index b53d8b98c7..528e8b5b74 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -475,8 +475,6 @@ Налаштування виділення пам`яті GPU Метод декодування ASTC Виберіть спосіб декодування стиснених текстур ASTC для рендерингу: CPU (повільно, безпечно), GPU (швидко, рекомендовано) або CPU Async (без затримок, можуть виникнути несправності) - Метод перестиснення ASTC - Виберіть спосіб перестиснення текстур ASTC для покращення сумісності та продуктивності. Увімкнення цієї опції зберігає VRAM, але може знизити якість текстур. Синхронізація операцій з пам\'яттю Забезпечує узгодженість даних між обчислювальними операціями та операціями з пам\'яттю. Ця опція має виправляти проблеми в деяких іграх, але може знижувати продуктивність у деяких випадках. Ігри на Unreal Engine 4, здається, найбільш постраждалі. @@ -993,9 +991,6 @@ Небезпечно Безпечно - - Без стиснення - Консервативний Агресивний diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index fe3e3037b1..d6ee495098 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -341,8 +341,6 @@ Kiểm soát cách cấp phát bộ nhớ GPU Phương thức giải mã ASTC Chọn cách giải mã texture nén ASTC để kết xuất: CPU (chậm, an toàn), GPU (nhanh, khuyên dùng) hoặc CPU Async (không giật, có thể gây ra sự cố) - Phương thức nén lại ASTC - Chọn cách nén lại texture ASTC để cải thiện khả năng tương thích và hiệu suất. Bật tùy chọn này tiết kiệm VRAM nhưng có thể làm giảm chất lượng texture. Đồng bộ hoá thao tác bộ nhớ Đảm bảo tính nhất quán dữ liệu giữa các thao tác tính toán và bộ nhớ. Tùy chọn này nên khắc phục sự cố trong một số trò chơi, nhưng có thể làm giảm hiệu suất trong một số trường hợp. Các trò chơi với Unreal Engine 4 có vẻ bị ảnh hưởng nhiều nhất. @@ -586,9 +584,6 @@ Mặc định - - Không nén - Bảo thủ Mạnh diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index 0ef0544ac0..defc1c5377 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -469,8 +469,6 @@ 控制显存分配策略 ASTC解码方式 选择ASTC压缩纹理的解码方式:CPU(慢速、安全)、GPU(快速、推荐)或CPU异步(无卡顿,可能导致问题) - ASTC重压缩方式 - 选择ASTC纹理的重新压缩方式以提高兼容性和性能。启用此选项可节省VRAM,但可能会降低纹理质量。 同步内存操作 确保计算和内存操作之间的数据一致性。 此选项应能修复某些游戏中的问题,但在某些情况下可能会降低性能。 使用Unreal Engine 4的游戏似乎受影响最大。 @@ -987,9 +985,6 @@ 不安全 安全 - - 不压缩 - 保守模式 激进模式 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index f0180b47b6..6231fc5f17 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -451,8 +451,6 @@ 控制GPU記憶體的分配與釋放策略 ASTC解碼方式 選擇ASTC壓縮紋理的解碼方式:CPU(慢速、安全)、GPU(快速、推薦)或CPU非同步(無卡頓,可能導致問題) - ASTC重新壓縮方式 - 選擇ASTC紋理的重新壓縮方式以提高相容性和效能。啟用此選項可節省VRAM,但可能會降低紋理品質。 同步記憶體操作 確保計算和記憶體操作之間的資料一致性。 此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。 使用Unreal Engine 4的遊戲似乎受影響最大。 @@ -861,9 +859,6 @@ 不安全 安全 - - 未壓縮 - 保守 積極 diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 9f787ab00c..99838b98cc 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -138,21 +138,6 @@ 1 2 - - - - @string/astc_recompression_uncompressed - @string/astc_recompression_bc1 - @string/astc_recompression_bc3 - - - - - 0 - 1 - 2 - - @string/nvdec_emulation_none diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 74c5bcd276..68d3502d52 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -485,8 +485,6 @@ Control how aggressively the emulator allocates and frees GPU memory. ASTC Decoding Method Pick how ASTC-compressed textures are decoded for rendering: CPU (slow, safe), GPU (fast, recommended), or CPU Async (no stutters, may cause issues) - ASTC Recompression Method - Choose how ASTC textures are recompressed to improve compatibility and performance. Enabling this option saves VRAM but may lower texture quality. Sync Memory Operations Ensures data consistency between compute and memory operations. This option should fix issues in some games, but may also reduce performance in some cases. Unreal Engine 4 games often see the most significant changes thereof. @@ -494,6 +492,10 @@ Reduces stuttering by locally storing and loading generated shaders. Force maximum clocks (Adreno only) Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied). + GPU async emulation + Runs GPU emulation asynchronously to reduce CPU stalls and improve throughput. Disable this only if you run into timing-related issues. + Asynchronous presentation + Slightly improves performance by moving presentation to a separate CPU thread. Use reactive flushing Improves rendering accuracy in some games at the cost of performance. Enable buffer history @@ -1041,12 +1043,7 @@ GPU CPU Async - - Uncompressed - BC1 - BC3 - Conservative Aggressive diff --git a/src/common/settings.h b/src/common/settings.h index 2540282790..24f1732d62 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -359,7 +359,11 @@ struct Values { true, true}; SwitchableSetting fsr_sharpening_slider{linkage, +#ifdef ANDROID + 0, +#else 25, +#endif 0, 200, "fsr_sharpening_slider", @@ -450,11 +454,7 @@ struct Values { "max_anisotropy", Category::RendererAdvanced}; SwitchableSetting accelerate_astc{linkage, -#ifdef ANDROID - AstcDecodeMode::Cpu, -#else AstcDecodeMode::Gpu, -#endif "accelerate_astc", Category::RendererAdvanced}; @@ -583,7 +583,9 @@ struct Values { Category::RendererHacks}; SwitchableSetting dyna_state{linkage, -#if defined (ANDROID) || defined (__APPLE__) +#if defined(ANDROID) + ExtendedDynamicState::EDS1, +#elif defined(__APPLE__) ExtendedDynamicState::Disabled, #else ExtendedDynamicState::EDS2, From 3d0eb4b5d71c6e051480408ab4274082c6b232e3 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Wed, 8 Apr 2026 23:46:50 +0200 Subject: [PATCH 2/2] [vulkan] 1st Vulkan Global Maintenance (#3839) This pr aims to make a first step into giving Eden's Vulkan backend maintenance with better formatting, understanding and reduce the redundancy between some wrong implementations: -> ProvokingVertex: Has been reworked completely, now the wiring to ExtendedDynamicState3 (ProvokingVertexMode) it works safe, the gating of the extension no longer requires user enabling on UI, it will be enabled automatically based on what features of the extension are available on driver, depending if first or last mode are available and also will be properly set under TrasformFeedback operations; this way we're gonna ensure all drivers, including Android stock drivers on QCOM, Mali and other mobile vendors drivers access correctly to the extension, fixing some graphical issues (flickering textures or wrong sccisors on vertex that required first mode) generated by the missing first mode handling or the proper clearing on pipeline state. This change will increase/ decrease slightly the performance on some games that changes dynamically between first and last modes, but will also ensure a clear path to GPU to use resources smartly, reducing VRAM consumption in PC and MEM/GPU percentage of use on Android (marginal to 5 - 8% approx). -> Removal VK_EXT_multi_draw: It has passed some months since the first try to implement this feature, but wasn't completed so functionality was null to negative, taking space in source and using small CPU cicles for initialization during device creation that reduced CPU effectiveness by 2 - 5%, aside that, after reviewing the situation of formally introducing handling for multidraws to reduce the floods of constants draw calls into 1 per batch, seems to not pay the overhead when the multidraw capacity is less or equal to 1, aside that, for the time being batching multidraws will introduce indirections on each batch of command draws, that graphical issues will appear and reducing performance can happen, something it was gonna solve. For the time being it's discarded, but, may be analyzed the chance to introduce it properly in a later date. -> Removal VK_EXT_indexing_descriptor: Currently the implementation of this feature was partial, with not proper handling on layouts; just the initial checks on device creation and chained up to the pNext feature, currently this extension will require a buffer cache and texture cache rework to set layouts and reduce the amount of use of descriptor into making it a less expensive cost effective, aside that to generate a path for the Bindless Texture and Bindless Buffer, allowing to track state of textures in runtime and ensuring the state of some compiled shaders doesn't change if it's no needed, among other benefits, besides that, enabling this feature was only generating innecessary checks on GPU, so consumption would be higher than it should be. -> Removal of VK_EXT_swapchain_maintenance1: The use of this feature was really conditional to certain support on newer drivers and cards, which wasn't available for all platforms, I concluded that if the support for this instance wasn't really there, the cost effective between the try to initialize it and running it, won't be good as when it didn't exist on our Vulkan device, with also the constant factor of not being completely implemented, right now I'm aiming to reduce the complexity on Vulkan side to keep it as simple as it could for a future video_core rework, which may start somewhere these weeks. -> Refined the Maintenance features: Meawhile this features are usually inherent to Vulkan core functionality, sometimes drivers doesn't expose them well, which leads to Eden run Vulkan without really noticing the existence of maintenance features on driver to improve stability, so we're tied to declare them and load them when a device creation starts by asking if driver supports and which, currently 1 - 5 are core maintenance features, meanwhile the 7 - 9 are more experimental and not being available everywhere, so right now to help drivers give attention to this features we not only load them, but also calculate with features bits which features inside Maintenance5 are available to use, that was the initial purpose, but we weren't using the full potential of the extension; I made cleaned part of the unneeded log code for the initialization of this Maintenance5 and it's feature flags, but also making an operation to sanitize depth/ stencil when One is not available in swizzle operations, making it easier to draw it; it's also needed to mention that Maintenance9 was removed from source code until we can have better handling on Arrays2D, aside that, the use of the extension was really conditional to certain drivers being capable of use it, so I remove it. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3839 Co-authored-by: CamilleLaVey Co-committed-by: CamilleLaVey --- dist/languages/ar.ts | 26 +---- dist/languages/ca.ts | 24 +---- dist/languages/cs.ts | 24 +---- dist/languages/da.ts | 24 +---- dist/languages/de.ts | 24 +---- dist/languages/el.ts | 24 +---- dist/languages/es.ts | 26 +---- dist/languages/fi.ts | 24 +---- dist/languages/fr.ts | 26 +---- dist/languages/hu.ts | 24 +---- dist/languages/id.ts | 24 +---- dist/languages/it.ts | 26 +---- dist/languages/ja_JP.ts | 24 +---- dist/languages/ko_KR.ts | 24 +---- dist/languages/nb.ts | 24 +---- dist/languages/nl.ts | 24 +---- dist/languages/pl.ts | 26 +---- dist/languages/pt_BR.ts | 24 +---- dist/languages/pt_PT.ts | 24 +---- dist/languages/ru_RU.ts | 26 +---- dist/languages/sv.ts | 26 +---- dist/languages/tr_TR.ts | 24 +---- dist/languages/uk.ts | 26 +---- dist/languages/vi.ts | 24 +---- dist/languages/vi_VN.ts | 25 +---- dist/languages/zh_CN.ts | 25 +---- dist/languages/zh_TW.ts | 24 +---- .../features/settings/model/BooleanSetting.kt | 2 - .../settings/model/view/SettingsItem.kt | 14 --- .../settings/ui/SettingsFragmentPresenter.kt | 2 - .../app/src/main/res/values-ar/strings.xml | 4 - .../app/src/main/res/values-ckb/strings.xml | 4 - .../app/src/main/res/values-cs/strings.xml | 4 - .../app/src/main/res/values-de/strings.xml | 4 - .../app/src/main/res/values-es/strings.xml | 4 - .../app/src/main/res/values-fa/strings.xml | 4 - .../app/src/main/res/values-fr/strings.xml | 4 - .../app/src/main/res/values-he/strings.xml | 4 - .../app/src/main/res/values-hu/strings.xml | 4 - .../app/src/main/res/values-id/strings.xml | 4 - .../app/src/main/res/values-it/strings.xml | 4 - .../app/src/main/res/values-ja/strings.xml | 4 - .../app/src/main/res/values-ko/strings.xml | 4 - .../app/src/main/res/values-nb/strings.xml | 4 - .../app/src/main/res/values-pl/strings.xml | 4 - .../src/main/res/values-pt-rBR/strings.xml | 4 - .../src/main/res/values-pt-rPT/strings.xml | 4 - .../app/src/main/res/values-ru/strings.xml | 4 - .../app/src/main/res/values-sr/strings.xml | 4 - .../app/src/main/res/values-uk/strings.xml | 4 - .../app/src/main/res/values-vi/strings.xml | 4 - .../src/main/res/values-zh-rCN/strings.xml | 4 - .../src/main/res/values-zh-rTW/strings.xml | 4 - .../app/src/main/res/values/strings.xml | 4 - src/common/settings.h | 2 - src/qt_common/config/shared_translation.cpp | 8 -- .../renderer_vulkan/fixed_pipeline_state.cpp | 26 ++++- .../renderer_vulkan/fixed_pipeline_state.h | 6 +- .../renderer_vulkan/vk_graphics_pipeline.cpp | 15 ++- .../renderer_vulkan/vk_pipeline_cache.cpp | 20 ++++ .../renderer_vulkan/vk_rasterizer.cpp | 52 ++------- .../renderer_vulkan/vk_texture_cache.cpp | 14 +++ src/video_core/vulkan_common/vulkan.h | 5 +- .../vulkan_common/vulkan_device.cpp | 100 ++---------------- src/video_core/vulkan_common/vulkan_device.h | 41 +++---- .../vulkan_common/vulkan_instance.cpp | 8 -- .../vulkan_common/vulkan_wrapper.cpp | 2 - src/video_core/vulkan_common/vulkan_wrapper.h | 15 --- 68 files changed, 134 insertions(+), 960 deletions(-) diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index d3646b55cb..72195d7f4a 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -1136,30 +1136,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. يتيح ميزة الحالة الديناميكية لإدخال الرأس لتحسين الجودة والأداء. - - - Provoking Vertex - استفزاز قمة الرأس - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - يُحسّن الإضاءة ومعالجة الرؤوس في بعض الألعاب. -تدعم هذه الإضافة أجهزة Vulkan 1.0+‎ فقط. - - - - Descriptor Indexing - فهرسة الوصف - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - يُحسّن معالجة الملمس والذاكرة المؤقتة وطبقة ترجمة ماكسويل. -تدعم بعض أجهزة Vulkan الإصدار 1.1+‎ وجميع أجهزة 1.2+‎ هذه الإضافة. - Sample Shading @@ -10632,4 +10608,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be وصل إجمالي زمن التشغيل إلى الحد الأقصى. - \ No newline at end of file + diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index 24c4a4c076..74a8c99ef9 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -1084,28 +1084,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10504,4 +10482,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index c37db5b5fe..34cf60f078 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -1084,28 +1084,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10492,4 +10470,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/da.ts b/dist/languages/da.ts index 315a828e29..939c641541 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -1086,28 +1086,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10486,4 +10464,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/de.ts b/dist/languages/de.ts index 83acb48a4c..bed5d5e94d 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -1094,28 +1094,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10516,4 +10494,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/el.ts b/dist/languages/el.ts index dffe07574b..9742495ac4 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -1086,28 +1086,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10482,4 +10460,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/es.ts b/dist/languages/es.ts index f6d1e7c690..29557af4b2 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -1141,30 +1141,6 @@ Números más altos permiten úsar más funciones y pueden aumentar el rendimien Enables vertex input dynamic state feature for better quality and performance. Activa la función de estado dinámico de entrada de vértices para una mejor calidad y rendimiento. - - - Provoking Vertex - Vértice provocante - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - Mejora la iluminación y la gestión de vértices en algunos juegos. -Solo los dispositivos Vulkan 1.0+ son compatibles con esta extensión. - - - - Descriptor Indexing - Indexación del descriptor - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - Mejora el manejo de texturas, búferes y la capa de traducción de Maxwell. -Algunos dispositivos Vulkan 1.1+ y todos los 1.2+ son compatibles con esta extensión. - Sample Shading @@ -10646,4 +10622,4 @@ Seleccionando "Desde Eden", los datos de guardado anteriores alojados Se ha alcanzado el límite total de tiempo de juego. - \ No newline at end of file + diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index 5f2153d32e..f29f994c13 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -1084,28 +1084,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10453,4 +10431,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index 23cce1f623..1339bd47ed 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -1132,30 +1132,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - Vertex provoquant - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - Améliore l’éclairage et la gestion des points 3D dans certains jeux. -Seuls les appareils compatibles avec Vulkan 1.0+ prennent en charge cette extension. - - - - Descriptor Indexing - Indexation des descripteurs - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - Améliore la gestion des textures et des tampons ainsi que la couche de traduction Maxwell. -Certains appareils compatibles Vulkan 1.1+ et tous ceux en 1.2+ prennent en charge cette extension. - Sample Shading @@ -10593,4 +10569,4 @@ En sélectionnant « Depuis Eden », les données de sauvegarde précédemment s Le temps de jeu total a atteint le maximum. - \ No newline at end of file + diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index 34c30987ab..ad9a959bb8 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -1092,28 +1092,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10487,4 +10465,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/id.ts b/dist/languages/id.ts index cd5f96a886..26e9e4a601 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -1107,28 +1107,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10508,4 +10486,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/it.ts b/dist/languages/it.ts index 9fddfa79e0..aa18ace584 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -1136,30 +1136,6 @@ Gli stati più alti consentono più funzionalità e possono migliorare le presta Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - Provoking Vertex - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - Migliora l'illuminazione e la gestione dei vertici in alcuni giochi. -Solo i dispositivi con Vulkan 1.0+ supportano quest'estensione. - - - - Descriptor Indexing - Indicizzazione descrittori - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - Migliora la gestione di texture e buffer, ma anche il layer di traduzione Maxwell. -Alcuni dispositivi con Vulkan 1.1+ e tutti quelli con 1.2+ supportano quest'estensione. - Sample Shading @@ -10625,4 +10601,4 @@ Selezionando "Da Eden", i dati di salvataggio pre-esistenti in Ryujinx Il tempo di gioco totale ha raggiunto il limite massimo. - \ No newline at end of file + diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index c457a9fb88..bad9dcfcf2 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -1089,28 +1089,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10510,4 +10488,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index 99957e42e6..078e3b3a20 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -1086,28 +1086,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10508,4 +10486,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index ed97ddb20d..6c88a222aa 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -1086,28 +1086,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10509,4 +10487,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index b50a262d75..869ead9df0 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -1095,28 +1095,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10505,4 +10483,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index 1e19c09806..6668939f93 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -1135,30 +1135,6 @@ Wyższe poziomy pozwalają na użycie większej liczby funkcji i mogą zwiększy Enables vertex input dynamic state feature for better quality and performance. Włącza funkcję dynamicznego stanu wejścia wierzchołków, poprawiając jakość i wydajność. - - - Provoking Vertex - Wierzchołek prowokujący - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - Poprawia oświetlenie i obsługę wierzchołków w niektórych grach. -To rozszerzenie jest obsługiwane tylko na urządzeniach z Vulkanem 1.0+. - - - - Descriptor Indexing - Indeksowanie deskryptorów - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - Poprawia obsługę tekstur i buforów oraz warstwę translacji Maxwell. -Niektóre urządzenia z Vulkanem 1.1+ i wszystkie z 1.2+ obsługują to rozszerzenie. - Sample Shading @@ -10627,4 +10603,4 @@ Wybierając „Z Eden”, dotychczasowe dane zapisu przechowywane w Ryujinx zost Łączny czas gry osiągnął maksimum. - \ No newline at end of file + diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index c7bb8304d8..c0ff995256 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -1119,28 +1119,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10542,4 +10520,4 @@ Ao selecionar "Do Eden", os dados salvos anteriores armazenados no Ryu - \ No newline at end of file + diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index 5b205a4504..fb0f3e11c9 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -1094,28 +1094,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10508,4 +10486,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 32af1943f0..2511049613 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -1141,30 +1141,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. Включает функцию динамического состояния вершинного ввода для повышения качества и производительности. - - - Provoking Vertex - Определяющая вершина - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - Улучшает освещение и обработку вершин в определенных играх. - Поддерживаются устройства только с Vulkan 1.0+. - - - - Descriptor Indexing - Индексирование дескрипторов - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - Улучшает текстуру и обработку буфера и уровень трансляции Maxwell. -Некоторые устройства Vulkan 1.1+ и все 1.2+ поддерживают это расширение. - Sample Shading @@ -10639,4 +10615,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be Общее максимальное игровое время. - \ No newline at end of file + diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index f88f465027..8c525ba02a 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -1149,30 +1149,6 @@ Högre tillstånd möjliggör fler funktioner och kan öka prestandan, men kan o Enables vertex input dynamic state feature for better quality and performance. Aktiverar funktionen för dynamiskt tillstånd för vertexinmatning för bättre kvalitet och prestanda. - - - Provoking Vertex - Provocerande toppunkt - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - Förbättrar belysning och vertexhantering i vissa spel. -Endast enheter med Vulkan 1.0+ stöder denna tilläggsfunktion. - - - - Descriptor Indexing - Indexering av deskriptorer - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - Förbättrar textur- och bufferthantering samt Maxwell-översättningslagret. -Vissa Vulkan 1.1+ och alla 1.2+ enheter stöder detta tillägg. - Sample Shading @@ -10647,4 +10623,4 @@ Om du väljer ”Från Eden” tas tidigare sparade data bort som lagrats i Ryuj Maximal total speltid uppnådd. - \ No newline at end of file + diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index b9e459c61e..9edaac9303 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -1103,28 +1103,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. Daha iyi kalite ve performans için Vertex dinamik durum özelliğini etkinleştirir. - - - Provoking Vertex - Provoking Vertex - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - Bazı oyunlarda aydınlatmayı ve köşe işlemeyi iyileştirir. Bu uzantıyı yalnızca Vulkan 1.0 ve üzeri cihazlar destekler. - - - - Descriptor Indexing - Tanımlayıcı İndeksleme - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - Doku ve arabellek işlemeyi ve Maxwell çeviri katmanını iyileştirir. Bazı Vulkan 1.1 ve üzeri ile tüm 1.2 ve üzeri cihazlar bu uzantıyı destekler. - Sample Shading @@ -10536,4 +10514,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index cc098e778c..ecc023ea8b 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -1144,30 +1144,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. Вмикає можливість динамічного стану введення вершин для кращих якості й продуктивності. - - - Provoking Vertex - Провокативна вершина - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - Покращує освітлення та взаємодію з вершинами у деяких іграх. -Це розширення підтримують лише пристрої з Vulkan 1.0+. - - - - Descriptor Indexing - Індексування дескрипторів - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - Покращує взаємодію з текстурами й буфером, а також шар перетворення Maxwell. -Це розширення підтримують деякі пристрої з Vulkan 1.1+ та всі з 1.2+. - Sample Shading @@ -10647,4 +10623,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be Загальний награний час досягнув максимуму. - \ No newline at end of file + diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index 7871a695ff..aeef3f2908 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -1086,28 +1086,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10508,4 +10486,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 183bf92471..a588ef4952 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -1086,29 +1086,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - Cải thiện việc xử lý texture và bộ đệm buffer, cũng như lớp dịch Maxwell. -Một số thiết bị hỗ trợ Vulkan 1.1+ và tất cả thiết bị Vulkan 1.2+ đều hỗ trợ tiện ích mở rộng này. - Sample Shading @@ -10509,4 +10486,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 80a3e98c38..6fb006631b 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -1142,29 +1142,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. 开启顶点输入动态状态功能来获得更好的质量和性能。 - - - Provoking Vertex - 激活顶点 - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - 改善某些游戏中的照明和顶点处理。仅 Vulkan 1.0 设备支持此扩展。 - - - - Descriptor Indexing - 描述符索引 - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - 改进了纹理和缓冲处理以及 Maxwell 翻译层。 -部分 Vulkan 1.1 设备和所有 1.2 设备支持此扩展。 - Sample Shading @@ -10618,4 +10595,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be 总计游戏时间已到达最大值。 - \ No newline at end of file + diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index e1710ad23e..4227f7500d 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -1116,28 +1116,6 @@ Higher states allow for more features and can increase performance, but may caus Enables vertex input dynamic state feature for better quality and performance. - - - Provoking Vertex - - - - - Improves lighting and vertex handling in some games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - Sample Shading @@ -10536,4 +10514,4 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - \ No newline at end of file + diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index 3dee92b0aa..e47263bfb2 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -33,8 +33,6 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { RENDERER_DEBUG("debug"), RENDERER_PATCH_OLD_QCOM_DRIVERS("patch_old_qcom_drivers"), RENDERER_VERTEX_INPUT_DYNAMIC_STATE("vertex_input_dynamic_state"), - RENDERER_PROVOKING_VERTEX("provoking_vertex"), - RENDERER_DESCRIPTOR_INDEXING("descriptor_indexing"), RENDERER_SAMPLE_SHADING("sample_shading"), GPU_UNSWIZZLE_ENABLED("gpu_unswizzle_enabled"), PICTURE_IN_PICTURE("picture_in_picture"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 9ddb414193..8ca9533f83 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -141,13 +141,6 @@ abstract class SettingsItem( valuesId = R.array.dynaStateValues ) ) - put( - SwitchSetting( - BooleanSetting.RENDERER_PROVOKING_VERTEX, - titleId = R.string.provoking_vertex, - descriptionId = R.string.provoking_vertex_description - ) - ) put( SwitchSetting( BooleanSetting.RENDERER_VERTEX_INPUT_DYNAMIC_STATE, @@ -155,13 +148,6 @@ abstract class SettingsItem( descriptionId = R.string.vertex_input_dynamic_state_description ) ) - put( - SwitchSetting( - BooleanSetting.RENDERER_DESCRIPTOR_INDEXING, - titleId = R.string.descriptor_indexing, - descriptionId = R.string.descriptor_indexing_description - ) - ) put( SliderSetting( IntSetting.RENDERER_SAMPLE_SHADING, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index eaf1ed2c00..9a218dc2a2 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -302,8 +302,6 @@ class SettingsFragmentPresenter( add(IntSetting.RENDERER_DYNA_STATE.key) add(BooleanSetting.RENDERER_VERTEX_INPUT_DYNAMIC_STATE.key) - add(BooleanSetting.RENDERER_PROVOKING_VERTEX.key) - add(BooleanSetting.RENDERER_DESCRIPTOR_INDEXING.key) add(IntSetting.RENDERER_SAMPLE_SHADING.key) add(HeaderSetting(R.string.display)) diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 4f0c11a2e8..660f0e2632 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -523,10 +523,6 @@ معطل حالة ديناميكية لإدخال الرأس يتيح ميزة الحالة الديناميكية لإدخال الرأس لتحسين الجودة والأداء. - الرأس المثير - يحسن الإضاءة ومعالجة الرؤوس في بعض الألعاب. مدعوم فقط على وحدات معالجة الرسومات Vulkan 1.0+. - فهرسة الوصف - يحسن معالجة النسيج والمخزن المؤقت، بالإضافة إلى طبقة الترجمة Maxwell. مدعوم من بعض وحدات معالجة الرسومات Vulkan 1.1 وجميع وحدات معالجة الرسومات Vulkan 1.2+. تظليل العينة يسمح هذا الخيار بتنفيذ مُظلل الأجزاء لكل عينة في جزء متعدد العينات بدلاً من تنفيذه مرة واحدة لكل جزء. يُحسّن هذا من جودة الرسومات على حساب بعض الأداء. diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index b22fbe0298..bb40866228 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -358,10 +358,6 @@ کۆمپایلکردنی شادەرەکان بەشێوەی ناڕێک. ئەمە ڕەنگە کەمکردنەوەی ستەتەر بکات بەڵام لەوانەیە هەڵەش دروست بکات. الحالة الديناميكية الممتدة ناچالاک - الرأس المثير - يحسن الإضاءة ومعالجة الرؤوس في بعض الألعاب. مدعوم فقط على وحدات معالجة الرسومات التي تدعم فولكان 1.0+. - فهرسة الواصفات - يحسن معالجة القوام والمخازن المؤقتة، بالإضافة إلى طبقة ترجمة ماكسويل. مدعوم من قبل بعض وحدات معالجة الرسومات التي تدعم فولكان 1.1 وجميع وحدات معالجة الرسومات التي تدعم فولكان 1.2+. پیشاندان ڕێکخستنی شاشە diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index 530a33f3b2..98a042652c 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -484,10 +484,6 @@ Vypnuto Dynamický stav vstupu vrcholů (Vertex Input) Aktivuje funkci dynamického stavu vstupu vrcholů (Vertex Input Dynamic State) pro lepší kvalitu a výkon. - Určující vrchol - Zlepšuje osvětlení a zpracování vrcholů v některých hrách. Podporováno pouze na GPU s API Vulkan 1.0+. - Indexování deskriptorů - Zlepšuje zpracování textur a bufferů, stejně jako překladovou vrstvu architektury Maxwell. Podporováno některými GPU s API Vulkan 1.1 a všemi GPU s API Vulkan 1.2+. Zobrazení Orientace diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index f8cc0af96b..ed1bd62a1c 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -482,10 +482,6 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die Deaktiviert Vertex Input Dynamic State Aktiviert die Funktion \"Vertex Input Dynamic State\" für bessere Qualität und Leistung. - Provokanter Vertex - Verbessert die Beleuchtung und die Vertex-Verarbeitung in einigen Spielen. Wird nur von GPUs mit Vulkan 1.0+ unterstützt. - Deskriptor-Indizierung - Verbessert die Textur- und Puffer-Verarbeitung sowie die Maxwell-Übersetzungsschicht. Wird von einigen Vulkan 1.1-GPUs und allen Vulkan 1.2+-GPUs unterstützt. Sample Shading Ermöglicht es dem Fragment-Shader, in einem Multisample-Fragment pro Sample anstatt einmal pro Fragment ausgeführt zu werden. Verbessert die Grafikqualität auf Kosten der Leistung. diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index e09d18f48e..7f20ea341c 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -517,10 +517,6 @@ Desactivado Estado dinámico de entrada de vértices Activa la función de estado dinámico de entrada de vértices para una mejor calidad y rendimiento. - Vértice provocante - Mejora la iluminación y el manejo de vértices en ciertos juegos. Solo es compatible con las GPU Vulkan 1.0+. - Indexación del descriptor - Mejora la textura y el manejo del búfer, así como la capa de traducción Maxwell. Compatible con algunas GPU Vulkan 1.1 y todas las GPU Vulkan 1.2+. Muestreo de sombreado Permite que el sombreador de fragmentos se ejecute por muestra en un fragmento multimuestreado, en lugar de una sola vez por fragmento. Mejora la calidad de los gráficos a coste de algo de rendimiento. diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml index 05c146ea0e..316bb57b56 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -71,10 +71,6 @@ حذف فرمور آن را از دستگاه پاک می‌کند و ممکن است بر سازگاری بازی‌ها تأثیر بگذارد در حال حذف فرمور فرمور با موفقیت حذف شد - رأس تحریک‌کننده - نورپردازی و مدیریت رأس را در برخی بازی‌ها بهبود می‌بخشد. فقط در کارت‌های گرافیک با پشتیبانی از ولکان 1.0+ قابل استفاده است - نمایه‌سازی توصیفگر - مدیریت بافت‌ها و بافرها و همچنین لایه ترجمه ماکسول را بهبود می‌بخشد. توسط برخی کارت‌های گرافیک ولکان 1.1 و تمام کارت‌های گرافیک ولکان 1.2+ پشتیبانی می‌شود فاکتور اورکلاک GPU برای حداکثر عملکرد از 128 و برای حداکثر وفاداری گرافیکی از 512 استفاده کنید. متوسط (256) diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index a2b0942a2c..dc625eca8b 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -483,10 +483,6 @@ Désactivé État dynamique d\'entrée de sommet Active la fonctionnalité d\'état dynamique des entrées de sommets pour une meilleure qualité et de meilleures performances. - Provoque des Vertex - Améliore l`éclairage et la gestion des vertex dans certains jeux. Pris en charge uniquement par les GPU Vulkan 1.0+. - Indexation des descripteurs - Améliore la gestion des textures et des tampons, ainsi que la couche de traduction Maxwell. Pris en charge par certains GPU Vulkan 1.1 et tous les GPU Vulkan 1.2+. Affichage Orientation diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index b498c7eb64..c43dbd94fa 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -388,10 +388,6 @@ מקמפל שיידרים באופן אסינכרוני. זה עשוי להפחית קפיצות אך גם עלול לגרום לתקלות גרפיות. מצב דינמי מורחב מושבת - קודקוד מעורר - משפר תאורה וטיפול בקודקודים במשחקים מסוימים. נתמך רק בכרטיסי מסך עם Vulkan 1.0+. - אינדוקס תיאורים - משפר טיפול במרקמים ומאגרים, כמו גם בשכבת התרגום של Maxwell. נתמך בחלק מכרטיסי ה-Vulkan 1.1 ובכל כרטיסי ה-Vulkan 1.2+. תצוגה כיוון diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index 2c777e3d3f..e7922386ba 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -377,10 +377,6 @@ A shaderek aszinkron fordítása. Csökkentheti a belassulásokat, de hibákat is okozhat. Kiterjesztett Dinamikus Állapot Letiltva - Provokáló csúcs - Javítja a világítást és a csúcskezelést bizonyos játékokban. Csak Vulkan 1.0+ GPU-kon támogatott. - Deskriptor Indexelés - Javítja a textúrák és pufferek kezelését, valamint a Maxwell fordítási réteget. Néhány Vulkan 1.1 GPU és minden Vulkan 1.2+ GPU támogatja. Kijelző Orientáció diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index 247510efb9..90231d088e 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -409,10 +409,6 @@ Kompilasi shader secara asinkron. Ini dapat mengurangi lag tetapi juga dapat menyebabkan glitch. Status Dinamis Ekstensi Dinonaktifkan - Vertex Provokasi - Meningkatkan pencahayaan dan penanganan vertex di beberapa game. Hanya didukung di GPU Vulkan 1.0+. - Pengindeks Deskriptor - Meningkatkan penanganan tekstur dan buffer, serta lapisan terjemahan Maxwell. Didukung oleh beberapa GPU Vulkan 1.1 dan semua GPU Vulkan 1.2+. Tampilan Orientasi diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 7bc25d40bb..d1d1727780 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -416,10 +416,6 @@ Compila gli shader in modo asincrono. Può ridurre gli scatti, ma può anche causare glitch grafici. Stato dinamico esteso Disabilitato - Vertice provocante - Migliora illuminazione e gestione dei vertici in alcuni giochi. Supportato solo su GPU Vulkan 1.0+. - Indicizzazione descrittori - Migliora la gestione di texture e buffer, nonché il livello di traduzione Maxwell. Supportato da alcune GPU Vulkan 1.1 e tutte le GPU Vulkan 1.2+. Schermo Orientamento diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index 647b6f82b4..694bd94493 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -375,10 +375,6 @@ シェーダーを非同期でコンパイルします。これによりカクつきが減る可能性がありますが、グラフィックの不具合が発生する場合もあります。 拡張ダイナミックステート 無効 - プロボーキング頂点 - 特定のゲームで照明と頂点処理を改善します。Vulkan 1.0+ GPUでのみサポートされています。 - ディスクリプタインデキシング - テクスチャとバッファの処理、およびMaxwell翻訳レイヤーを改善します。一部のVulkan 1.1 GPUとすべてのVulkan 1.2+ GPUでサポートされています。 ディスプレイ 画面の向き diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index 0b2b1af8ac..3758b25468 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -375,10 +375,6 @@ 셰이더를 비동기적으로 컴파일합니다. 이로 인해 끊김 현상이 줄어들 수 있지만 그래픽 오류가 발생할 수도 있습니다. 확장 동적 상태 비활성화됨 - 프로보킹 버텍스 - 일부 게임에서 조명과 버텍스 처리를 개선합니다. Vulkan 1.0+ GPU에서만 지원됩니다. - 디스크립터 인덱싱 - 텍스처 및 버퍼 처리와 Maxwell 변환 레이어를 개선합니다. 일부 Vulkan 1.1 GPU 및 모든 Vulkan 1.2+ GPU에서 지원됩니다. 디스플레이 화면 방향 diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index fb507c8b36..1423fc1417 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -358,10 +358,6 @@ Kompilerer shadere asynkront. Dette kan redusere rykk, men kan også forårsake grafiske feil. Utvidet dynamisk tilstand Deaktivert - Provoserende vertex - Forbedrer belysning og vertexhåndtering i enkelte spill. Støttes kun på Vulkan 1.0+ GPU-er. - Beskrivelsesindeksering - Forbedrer tekstur- og bufferhåndtering, samt Maxwell-oversettelseslaget. Støttes av noen Vulkan 1.1 GPU-er og alle Vulkan 1.2+ GPU-er. Skjerm Orientering diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index 675dae5895..557b8a0697 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -482,10 +482,6 @@ Wyłączone Dynamiczny stan wejścia wierzchołków Włącza funkcję dynamicznego stanu wejścia wierzchołków, poprawiając jakość i wydajność. - Wierzchołek prowokujący - Poprawia oświetlenie i obsługę wierzchołków w niektórych grach. Obsługiwane tylko przez GPU Vulkan 1.0+. - Indeksowanie deskryptorów - Poprawia obsługę tekstur i buforów oraz warstwę tłumaczenia Maxwell. Obsługiwane przez niektóre GPU Vulkan 1.1 i wszystkie GPU Vulkan 1.2+. Cieniowanie próbkowane Pozwala uruchamiać shader fragmentów dla każdej próbki w wielopróbkowanym fragmencie zamiast raz na fragment. Poprawia jakość grafiki kosztem części wydajności. diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index 14ba444d22..85d72b7665 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -465,10 +465,6 @@ Desativado Vertex Input Dynamic State Ativa o recurso de vertex input dynamic state para melhor qualidade e desempenho. - Provoking Vertex - Vértice Provocante: Melhora a iluminação e o processamento de vértices em certos jogos. Suportado apenas em GPUs com Vulkan 1.0 ou superior. - Descriptor Indexing - Indexação de Descritores: Melhora o processamento de texturas e buffers, assim como a camada de tradução Maxwell. Suportado por algumas GPUs Vulkan 1.1 e todas as GPUs Vulkan 1.2 ou superiores. Tela Orientação diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index 9e8eb88729..a21c142026 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -381,10 +381,6 @@ Compila shaders de forma assíncrona. Isto pode reduzir engasgadelas, mas também pode introduzir falhas gráficas. Estado Dinâmico Estendido Desativado - Vértice provocante - Melhora a iluminação e o tratamento de vértices em certos jogos. Suportado apenas em GPUs Vulkan 1.0+. - Indexação de descritores - Melhora o tratamento de texturas e buffers, assim como a camada de tradução Maxwell. Suportado por algumas GPUs Vulkan 1.1 e todas Vulkan 1.2+. Ecrã Oriantação diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 617973a176..ec7105e25f 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -519,10 +519,6 @@ Отключено Динамическое состояние ввода вершин Включает функцию динамического состояния ввода вершин для повышения качества и производительности - Определяющая вершина - Улучшает освещение и обработку вершин в некоторых играх. Поддерживается только ГПУ с Vulkan 1.0+. - Индексирование дескрипторов - Улучшает обработку текстур и буферов, а также слой перевода Maxwell. Поддерживается некоторыми ГПУ Vulkan 1.1 и всеми ГПУ Vulkan 1.2+. Сэмпловое затенение Позволяет шейдеру фрагментов выполняться для каждого сэмпла в многосэмпловом фрагменте, а не один раз на фрагмент. Улучшает качество графики ценой некоторого падения производительности. diff --git a/src/android/app/src/main/res/values-sr/strings.xml b/src/android/app/src/main/res/values-sr/strings.xml index a8e5fbb39f..d3a630d376 100644 --- a/src/android/app/src/main/res/values-sr/strings.xml +++ b/src/android/app/src/main/res/values-sr/strings.xml @@ -380,10 +380,6 @@ Саставља схадера асинхроно. Ово може умањити затезаче, али могу такође да уведе пропусте. Проширена динамичка држава Искључено - Провоцирајући врх - Побољшава осветљење и вертификат руковања у одређеним играма. Подржан само на Вулкану 1.0+ ГПУ-у. - Индексирање дескриптора - Побољшава текстуру и руковање међуспремника, као и преводилачки слој Маквелл. Подржани од стране неких Вулкана 1.1 ГПУ-а и сви Вулкан 1.2+ ГПУ. Приказ Оријентација diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index 528e8b5b74..434d3fbb3d 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -519,10 +519,6 @@ Вимкнено Динамічний стан введення вершин Вмикає можливість динамічного стану введення вершин для кращих якості й продуктивності. - Провокативна вершина - Покращує освітлення та взаємодію з вершинами у деяких іграх. Лише для ГП з підтримкою Vulkan 1.0+. - Індексація дескрипторів - Покращує обробку текстур та буферів, а також шар перекладу Maxwell. Підтримується деякими GPU Vulkan 1.1 та всіма GPU Vulkan 1.2+. Простий шейдинг Дозволяє виконувати фрагмент шейдера для кожного зразка в багатозразковому фрагменті замість одного разу для кожного фрагмента. Покращує якість графікі ціною втрати продуктивності. diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index d6ee495098..829aeb58bc 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -356,10 +356,6 @@ Biên dịch shader không đồng bộ. Điều này có thể giảm giật lag nhưng cũng có thể gây ra lỗi đồ họa. Trạng thái động mở rộng Đã tắt - Đỉnh kích hoạt - Cải thiện ánh sáng và xử lý đỉnh trong một số trò chơi. Chỉ được hỗ trợ trên GPU Vulkan 1.0+. - Lập chỉ mục bộ mô tả - Cải thiện xử lý kết cấu và bộ đệm, cũng như lớp dịch Maxwell. Được hỗ trợ bởi một số GPU Vulkan 1.1 và tất cả GPU Vulkan 1.2+. Hiển thị Hướng màn hình diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index defc1c5377..8103e568b7 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -513,10 +513,6 @@ 已禁用 顶点输入动态状态 开启顶点输入动态状态功能来获得更好的质量和性能。 - 引发顶点 - 改善某些游戏中的光照和顶点处理。仅支持Vulkan 1.0+ GPU。 - 描述符索引 - 改进纹理和缓冲区处理以及Maxwell转换层。部分Vulkan 1.1 GPU和所有Vulkan 1.2+ GPU支持。 采样着色 允许片段着色器在多采样片段中每个样本执行一次,而不是每个片段执行一次。以提高性能为代价改善图形质量。 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 6231fc5f17..522cff664e 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -468,10 +468,6 @@ 已停用 頂點輸入動態狀態 啟用頂點輸入動態狀態以取得更佳的品質及性能 - 引發頂點 - 改善某些遊戲中的光照和頂點處理。僅支援Vulkan 1.0+ GPU。 - 描述符索引 - 改進紋理和緩衝區處理以及Maxwell轉換層。部分Vulkan 1.1 GPU和所有Vulkan 1.2+ GPU支援。 顯示 方向 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 68d3502d52..d42fb37d58 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -533,10 +533,6 @@ Disabled Vertex Input Dynamic State Enables vertex input dynamic state feature for better quality and performance. - Provoking Vertex - Improves lighting and vertex handling in certain games. Only supported on Vulkan 1.0+ GPUs. - Descriptor Indexing - Improves texture and buffer handling, as well as the Maxwell translation layer. Supported by some Vulkan 1.1 GPUs and all Vulkan 1.2+ GPUs. Sample Shading Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. diff --git a/src/common/settings.h b/src/common/settings.h index 24f1732d62..bec1e93e79 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -608,8 +608,6 @@ struct Values { true, #endif "vertex_input_dynamic_state", Category::RendererExtensions}; - SwitchableSetting provoking_vertex{linkage, false, "provoking_vertex", Category::RendererExtensions}; - SwitchableSetting descriptor_indexing{linkage, false, "descriptor_indexing", Category::RendererExtensions}; Setting renderer_debug{linkage, false, "debug", Category::RendererDebug}; Setting renderer_shader_feedback{linkage, false, "shader_feedback", diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index eda0fb2002..5e0c0d8b44 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -286,14 +286,6 @@ std::unique_ptr InitializeTranslations(QObject* parent) { INSERT(Settings, vertex_input_dynamic_state, tr("Vertex Input Dynamic State"), tr("Enables vertex input dynamic state feature for better quality and performance.")); - INSERT(Settings, provoking_vertex, tr("Provoking Vertex"), - tr("Improves lighting and vertex handling in some games.\n" - "Only Vulkan 1.0+ devices support this extension.")); - - INSERT(Settings, descriptor_indexing, tr("Descriptor Indexing"), - tr("Improves texture & buffer handling and the Maxwell translation layer.\n" - "Some Vulkan 1.1+ and all 1.2+ devices support this extension.")); - INSERT( Settings, sample_shading, tr("Sample Shading"), tr("Allows the fragment shader to execute per sample in a multi-sampled fragment " diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp index 06cbd9e6da..866b721a84 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -83,7 +83,29 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe depth_enabled.Assign(regs.zeta_enable != 0 ? 1 : 0); depth_format.Assign(static_cast(regs.zeta.format)); y_negate.Assign(regs.window_origin.mode != Maxwell::WindowOrigin::Mode::UpperLeft ? 1 : 0); - provoking_vertex_last.Assign(regs.provoking_vertex == Maxwell::ProvokingVertex::Last ? 1 : 0); + + bool use_last_provoking_vertex = false; + const bool provoking_vertex_available = features.has_provoking_vertex; + const bool supports_first_mode = features.has_provoking_vertex_first_mode; + const bool supports_last_mode = features.has_provoking_vertex_last_mode; + const bool transform_feedback_active = regs.transform_feedback_enabled != 0; + const bool tf_preserves_provoking_vertex = features.has_provoking_vertex_tf_preserve; + + if (provoking_vertex_available && (supports_first_mode || supports_last_mode)) { + use_last_provoking_vertex = regs.provoking_vertex == Maxwell::ProvokingVertex::Last; + + if (transform_feedback_active && !tf_preserves_provoking_vertex) { + use_last_provoking_vertex = false; + } + + if (use_last_provoking_vertex && !supports_last_mode) { + use_last_provoking_vertex = false; + } else if (!use_last_provoking_vertex && !supports_first_mode) { + use_last_provoking_vertex = true; + } + } + + provoking_vertex_last.Assign(use_last_provoking_vertex ? 1 : 0); conservative_raster_enable.Assign(regs.conservative_raster_enable != 0 ? 1 : 0); smooth_lines.Assign(regs.line_anti_alias_enable != 0 ? 1 : 0); alpha_to_coverage_enabled.Assign(regs.anti_alias_alpha_control.alpha_to_coverage != 0 ? 1 : 0); diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.h b/src/video_core/renderer_vulkan/fixed_pipeline_state.h index c5bc14f448..ffc91e9a55 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.h +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -28,6 +28,10 @@ struct DynamicFeatures { bool has_extended_dynamic_state_3_blend; bool has_extended_dynamic_state_3_enables; bool has_dynamic_vertex_input; + bool has_provoking_vertex; + bool has_provoking_vertex_first_mode; + bool has_provoking_vertex_last_mode; + bool has_provoking_vertex_tf_preserve; }; struct FixedPipelineState { diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 75fbcaa968..8f706a02c8 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -749,12 +749,19 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { : VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT, .extraPrimitiveOverestimationSize = 0.0f, }; + const bool supports_provoking_first_mode = device.SupportsProvokingVertexFirstMode(); + const bool supports_provoking_last_mode = device.SupportsProvokingVertexLastMode(); + const bool requested_provoking_last_mode = key.state.provoking_vertex_last != 0; + const VkProvokingVertexModeEXT provoking_vertex_mode = + requested_provoking_last_mode + ? (supports_provoking_last_mode ? VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT + : VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT) + : (supports_provoking_first_mode ? VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT + : VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT); VkPipelineRasterizationProvokingVertexStateCreateInfoEXT provoking_vertex{ .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT, .pNext = nullptr, - .provokingVertexMode = key.state.provoking_vertex_last != 0 - ? VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT - : VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, + .provokingVertexMode = provoking_vertex_mode, }; if (IsLine(input_assembly_topology) && device.IsExtLineRasterizationSupported()) { @@ -763,7 +770,7 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { if (device.IsExtConservativeRasterizationSupported()) { conservative_raster.pNext = std::exchange(rasterization_ci.pNext, &conservative_raster); } - if (device.IsExtProvokingVertexSupported() && Settings::values.provoking_vertex.GetValue()) { + if (device.IsExtProvokingVertexSupported()) { provoking_vertex.pNext = std::exchange(rasterization_ci.pNext, &provoking_vertex); } diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 77a4e8616a..5f86506961 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -490,6 +490,14 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, dynamic_features.has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported() && Settings::values.vertex_input_dynamic_state.GetValue(); + + dynamic_features.has_provoking_vertex = device.IsExtProvokingVertexSupported(); + dynamic_features.has_provoking_vertex_first_mode = + device.SupportsProvokingVertexFirstMode(); + dynamic_features.has_provoking_vertex_last_mode = + device.SupportsProvokingVertexLastMode(); + dynamic_features.has_provoking_vertex_tf_preserve = + device.SupportsTransformFeedbackProvokingVertexPreservation(); } PipelineCache::~PipelineCache() { @@ -603,6 +611,18 @@ void PipelineCache::LoadDiskResources(u64 title_id, std::stop_token stop_loading (key.state.dynamic_vertex_input != 0) != dynamic_features.has_dynamic_vertex_input) { return; } + + const bool key_requests_provoking_last = key.state.provoking_vertex_last != 0; + if (key_requests_provoking_last && !dynamic_features.has_provoking_vertex_last_mode) { + return; + } + + const bool key_uses_transform_feedback = key.state.xfb_enabled != 0; + if (key_uses_transform_feedback && key_requests_provoking_last && + !dynamic_features.has_provoking_vertex_tf_preserve) { + return; + } + workers.QueueWork([this, key, envs_ = std::move(envs), &state, &callback]() mutable { ShaderPools pools; boost::container::static_vector env_ptrs; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index f867980a6f..ba7b5d8c1b 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -200,11 +200,6 @@ RasterizerVulkan::RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra fence_manager(*this, gpu, texture_cache, buffer_cache, query_cache, device, scheduler), wfi_event(device.GetLogical().CreateEvent()) { scheduler.SetQueryCache(query_cache); - - // Log multi-draw support - if (device.IsExtMultiDrawSupported()) { - LOG_INFO(Render_Vulkan, "VK_EXT_multi_draw is enabled for optimized draw calls"); - } } RasterizerVulkan::~RasterizerVulkan() = default; @@ -243,43 +238,16 @@ void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) { const u32 num_instances{instance_count}; const DrawParams draw_params{MakeDrawParams(draw_state, num_instances, is_indexed)}; - // Use VK_EXT_multi_draw if available (single draw becomes multi-draw with count=1) - if (device.IsExtMultiDrawSupported()) { - scheduler.Record([draw_params](vk::CommandBuffer cmdbuf) { - if (draw_params.is_indexed) { - // Use multi-draw indexed with single draw - const VkMultiDrawIndexedInfoEXT multi_draw_info{ - .firstIndex = draw_params.first_index, - .indexCount = draw_params.num_vertices, - }; - const int32_t vertex_offset = static_cast(draw_params.base_vertex); - cmdbuf.DrawMultiIndexedEXT(1, &multi_draw_info, draw_params.num_instances, - draw_params.base_instance, - sizeof(VkMultiDrawIndexedInfoEXT), &vertex_offset); - } else { - // Use multi-draw with single draw - const VkMultiDrawInfoEXT multi_draw_info{ - .firstVertex = draw_params.base_vertex, - .vertexCount = draw_params.num_vertices, - }; - cmdbuf.DrawMultiEXT(1, &multi_draw_info, draw_params.num_instances, - draw_params.base_instance, - sizeof(VkMultiDrawInfoEXT)); - } - }); - } else { - // Fallback to standard draw calls - scheduler.Record([draw_params](vk::CommandBuffer cmdbuf) { - if (draw_params.is_indexed) { - cmdbuf.DrawIndexed(draw_params.num_vertices, draw_params.num_instances, - draw_params.first_index, draw_params.base_vertex, - draw_params.base_instance); - } else { - cmdbuf.Draw(draw_params.num_vertices, draw_params.num_instances, - draw_params.base_vertex, draw_params.base_instance); - } - }); - } + scheduler.Record([draw_params](vk::CommandBuffer cmdbuf) { + if (draw_params.is_indexed) { + cmdbuf.DrawIndexed(draw_params.num_vertices, draw_params.num_instances, + draw_params.first_index, draw_params.base_vertex, + draw_params.base_instance); + } else { + cmdbuf.Draw(draw_params.num_vertices, draw_params.num_instances, + draw_params.base_vertex, draw_params.base_instance); + } + }); // Log draw call if (Settings::values.gpu_logging_enabled.GetValue() && diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index d51564dcb3..48aa5ec476 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -275,6 +275,19 @@ constexpr VkBorderColor ConvertBorderColor(const std::array& color) { return VK_COMPONENT_SWIZZLE_ZERO; } +void SanitizeDepthStencilSwizzle(std::array& swizzle, + bool supports_depth_stencil_swizzle_one) { + if (supports_depth_stencil_swizzle_one) { + return; + } + std::replace_if(swizzle.begin(), swizzle.end(), + [](SwizzleSource value) { + return value == SwizzleSource::OneFloat || + value == SwizzleSource::OneInt; + }, + SwizzleSource::Zero); +} + [[nodiscard]] VkImageViewType ImageViewType(Shader::TextureType type) { switch (type) { case Shader::TextureType::Color1D: @@ -2109,6 +2122,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI !device->IsExt4444FormatsSupported()); if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) { std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); + SanitizeDepthStencilSwizzle(swizzle, device->SupportsDepthStencilSwizzleOne()); } } const auto format_info = MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, format); diff --git a/src/video_core/vulkan_common/vulkan.h b/src/video_core/vulkan_common/vulkan.h index 2cc0f0d7f0..2609e8dc0f 100644 --- a/src/video_core/vulkan_common/vulkan.h +++ b/src/video_core/vulkan_common/vulkan.h @@ -22,16 +22,13 @@ #include -// Define maintenance 7-9 extension names (not yet in official Vulkan headers) +// Define maintenance 7-8 extension names (not yet in official Vulkan headers) #ifndef VK_KHR_MAINTENANCE_7_EXTENSION_NAME #define VK_KHR_MAINTENANCE_7_EXTENSION_NAME "VK_KHR_maintenance7" #endif #ifndef VK_KHR_MAINTENANCE_8_EXTENSION_NAME #define VK_KHR_MAINTENANCE_8_EXTENSION_NAME "VK_KHR_maintenance8" #endif -#ifndef VK_KHR_MAINTENANCE_9_EXTENSION_NAME -#define VK_KHR_MAINTENANCE_9_EXTENSION_NAME "VK_KHR_maintenance9" -#endif // Sanitize macros #undef CreateEvent diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index b51c57d380..5075a79bcd 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -465,18 +465,6 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR first_next = &diagnostics_nv; } - VkPhysicalDeviceDescriptorIndexingFeaturesEXT descriptor_indexing{ - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, - .pNext = use_diagnostics_nv ? static_cast(&diagnostics_nv) : static_cast(&features2), - .shaderSampledImageArrayNonUniformIndexing = VK_TRUE, - .descriptorBindingPartiallyBound = VK_TRUE, - .descriptorBindingVariableDescriptorCount = VK_TRUE, - }; - - if (extensions.descriptor_indexing && Settings::values.descriptor_indexing.GetValue()) { - first_next = &descriptor_indexing; - } - is_blit_depth24_stencil8_supported = TestDepthStencilBlits(VK_FORMAT_D24_UNORM_S8_UINT); is_blit_depth32_stencil8_supported = TestDepthStencilBlits(VK_FORMAT_D32_SFLOAT_S8_UINT); is_optimal_astc_supported = ComputeIsOptimalAstcSupported(); @@ -1078,11 +1066,6 @@ bool Device::GetSuitability(bool requires_swapchain) { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR; SetNext(next, properties.maintenance5); } - if (extensions.multi_draw) { - properties.multi_draw.sType = - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT; - SetNext(next, properties.multi_draw); - } // Perform the property fetch. physical.GetProperties2(properties2); @@ -1196,7 +1179,7 @@ void Device::RemoveUnsuitableExtensions() { RemoveExtensionFeatureIfUnsuitable(extensions.depth_clip_control, features.depth_clip_control, VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME); - /* */ // VK_EXT_extended_dynamic_state + // VK_EXT_extended_dynamic_state extensions.extended_dynamic_state = features.extended_dynamic_state.extendedDynamicState; RemoveExtensionFeatureIfUnsuitable(extensions.extended_dynamic_state, features.extended_dynamic_state, @@ -1268,7 +1251,6 @@ void Device::RemoveUnsuitableExtensions() { VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); // VK_EXT_robustness2 - // Enable if at least one robustness2 feature is available extensions.robustness_2 = features.robustness2.robustBufferAccess2 || features.robustness2.robustImageAccess2 || features.robustness2.nullDescriptor; @@ -1277,25 +1259,10 @@ void Device::RemoveUnsuitableExtensions() { VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); // VK_EXT_image_robustness - // Enable if robustImageAccess is available extensions.image_robustness = features.image_robustness.robustImageAccess; RemoveExtensionFeatureIfUnsuitable(extensions.image_robustness, features.image_robustness, VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME); - // VK_EXT_provoking_vertex - if (Settings::values.provoking_vertex.GetValue()) { - extensions.provoking_vertex = features.provoking_vertex.provokingVertexLast - && features.provoking_vertex - .transformFeedbackPreservesProvokingVertex; - RemoveExtensionFeatureIfUnsuitable(extensions.provoking_vertex, - features.provoking_vertex, - VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME); - } else { - RemoveExtensionFeature(extensions.provoking_vertex, - features.provoking_vertex, - VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME); - } - // VK_KHR_shader_atomic_int64 extensions.shader_atomic_int64 = features.shader_atomic_int64.shaderBufferInt64Atomics && features.shader_atomic_int64.shaderSharedInt64Atomics; @@ -1319,21 +1286,12 @@ void Device::RemoveUnsuitableExtensions() { VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME); // VK_EXT_transform_feedback - // We only require the basic transformFeedback feature and at least - // one transform feedback buffer. We keep transformFeedbackQueries as it's used by - // the streaming byte count implementation. GeometryStreams and multiple streams - // are not strictly required since we currently support only stream 0. extensions.transform_feedback = features.transform_feedback.transformFeedback && properties.transform_feedback.maxTransformFeedbackBuffers > 0 && properties.transform_feedback.transformFeedbackQueries; RemoveExtensionFeatureIfUnsuitable(extensions.transform_feedback, features.transform_feedback, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME); - if (extensions.transform_feedback) { - LOG_INFO(Render_Vulkan, "VK_EXT_transform_feedback enabled (buffers={}, queries={})", - properties.transform_feedback.maxTransformFeedbackBuffers, - properties.transform_feedback.transformFeedbackQueries); - } // VK_EXT_vertex_input_dynamic_state extensions.vertex_input_dynamic_state = @@ -1342,17 +1300,6 @@ void Device::RemoveUnsuitableExtensions() { features.vertex_input_dynamic_state, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); - // VK_EXT_multi_draw - extensions.multi_draw = features.multi_draw.multiDraw; - - if (extensions.multi_draw) { - LOG_INFO(Render_Vulkan, "VK_EXT_multi_draw: maxMultiDrawCount={}", - properties.multi_draw.maxMultiDrawCount); - } - - RemoveExtensionFeatureIfUnsuitable(extensions.multi_draw, features.multi_draw, - VK_EXT_MULTI_DRAW_EXTENSION_NAME); - // VK_KHR_pipeline_executable_properties if (Settings::values.renderer_shader_feedback.GetValue()) { extensions.pipeline_executable_properties = @@ -1377,35 +1324,15 @@ void Device::RemoveUnsuitableExtensions() { features.workgroup_memory_explicit_layout, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME); - // VK_EXT_swapchain_maintenance1 (extension only, has features) - // Requires VK_EXT_surface_maintenance1 instance extension - extensions.swapchain_maintenance1 = features.swapchain_maintenance1.swapchainMaintenance1; - if (extensions.swapchain_maintenance1) { - // Check if VK_EXT_surface_maintenance1 instance extension is available - const auto instance_extensions = vk::EnumerateInstanceExtensionProperties(dld); - const bool has_surface_maintenance1 = instance_extensions && std::ranges::any_of(*instance_extensions, - [](const VkExtensionProperties& prop) { - return std::strcmp(prop.extensionName, VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME) == 0; - }); - if (!has_surface_maintenance1) { - LOG_WARNING(Render_Vulkan, - "VK_EXT_swapchain_maintenance1 requires VK_EXT_surface_maintenance1, disabling"); - extensions.swapchain_maintenance1 = false; - features.swapchain_maintenance1.swapchainMaintenance1 = false; - } - } - RemoveExtensionFeatureIfUnsuitable(extensions.swapchain_maintenance1, features.swapchain_maintenance1, - VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME); - - // VK_KHR_maintenance1 (core in Vulkan 1.1, no features) + // VK_KHR_maintenance1 extensions.maintenance1 = loaded_extensions.contains(VK_KHR_MAINTENANCE_1_EXTENSION_NAME); RemoveExtensionIfUnsuitable(extensions.maintenance1, VK_KHR_MAINTENANCE_1_EXTENSION_NAME); - // VK_KHR_maintenance2 (core in Vulkan 1.1, no features) + // VK_KHR_maintenance2 extensions.maintenance2 = loaded_extensions.contains(VK_KHR_MAINTENANCE_2_EXTENSION_NAME); RemoveExtensionIfUnsuitable(extensions.maintenance2, VK_KHR_MAINTENANCE_2_EXTENSION_NAME); - // VK_KHR_maintenance3 (core in Vulkan 1.1, no features) + // VK_KHR_maintenance3 extensions.maintenance3 = loaded_extensions.contains(VK_KHR_MAINTENANCE_3_EXTENSION_NAME); RemoveExtensionIfUnsuitable(extensions.maintenance3, VK_KHR_MAINTENANCE_3_EXTENSION_NAME); @@ -1416,17 +1343,6 @@ void Device::RemoveUnsuitableExtensions() { // VK_KHR_maintenance5 extensions.maintenance5 = features.maintenance5.maintenance5; - - if (extensions.maintenance5) { - LOG_INFO(Render_Vulkan, "VK_KHR_maintenance5 properties: polygonModePointSize={} " - "depthStencilSwizzleOne={} earlyFragmentTests={} nonStrictWideLines={}", - properties.maintenance5.polygonModePointSize, - properties.maintenance5.depthStencilSwizzleOneSupport, - properties.maintenance5.earlyFragmentMultisampleCoverageAfterSampleCounting && - properties.maintenance5.earlyFragmentSampleMaskTestBeforeSampleCounting, - properties.maintenance5.nonStrictWideLinesUseParallelogram); - } - RemoveExtensionFeatureIfUnsuitable(extensions.maintenance5, features.maintenance5, VK_KHR_MAINTENANCE_5_EXTENSION_NAME); @@ -1435,17 +1351,13 @@ void Device::RemoveUnsuitableExtensions() { RemoveExtensionFeatureIfUnsuitable(extensions.maintenance6, features.maintenance6, VK_KHR_MAINTENANCE_6_EXTENSION_NAME); - // VK_KHR_maintenance7 (proposed for Vulkan 1.4, no features) + // VK_KHR_maintenance7 extensions.maintenance7 = loaded_extensions.contains(VK_KHR_MAINTENANCE_7_EXTENSION_NAME); RemoveExtensionIfUnsuitable(extensions.maintenance7, VK_KHR_MAINTENANCE_7_EXTENSION_NAME); - // VK_KHR_maintenance8 (proposed for Vulkan 1.4, no features) + // VK_KHR_maintenance8 extensions.maintenance8 = loaded_extensions.contains(VK_KHR_MAINTENANCE_8_EXTENSION_NAME); RemoveExtensionIfUnsuitable(extensions.maintenance8, VK_KHR_MAINTENANCE_8_EXTENSION_NAME); - - // VK_KHR_maintenance9 (proposed for Vulkan 1.4, no features) - extensions.maintenance9 = loaded_extensions.contains(VK_KHR_MAINTENANCE_9_EXTENSION_NAME); - RemoveExtensionIfUnsuitable(extensions.maintenance9, VK_KHR_MAINTENANCE_9_EXTENSION_NAME); } void Device::SetupFamilies(VkSurfaceKHR surface) { diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index caf91104df..ad9d53ce16 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -57,14 +57,12 @@ VK_DEFINE_HANDLE(VmaAllocator) FEATURE(EXT, 4444Formats, 4444_FORMATS, format_a4b4g4r4) \ FEATURE(EXT, IndexTypeUint8, INDEX_TYPE_UINT8, index_type_uint8) \ FEATURE(EXT, LineRasterization, LINE_RASTERIZATION, line_rasterization) \ - FEATURE(EXT, MultiDraw, MULTI_DRAW, multi_draw) \ FEATURE(EXT, PrimitiveTopologyListRestart, PRIMITIVE_TOPOLOGY_LIST_RESTART, \ primitive_topology_list_restart) \ FEATURE(EXT, ProvokingVertex, PROVOKING_VERTEX, provoking_vertex) \ FEATURE(EXT, Robustness2, ROBUSTNESS_2, robustness2) \ FEATURE(EXT, TransformFeedback, TRANSFORM_FEEDBACK, transform_feedback) \ FEATURE(EXT, VertexInputDynamicState, VERTEX_INPUT_DYNAMIC_STATE, vertex_input_dynamic_state) \ - FEATURE(EXT, SwapchainMaintenance1, SWAPCHAIN_MAINTENANCE_1, swapchain_maintenance1) \ FEATURE(KHR, Maintenance5, MAINTENANCE_5, maintenance5) \ FEATURE(KHR, Maintenance6, MAINTENANCE_6, maintenance6) \ FEATURE(KHR, PipelineExecutableProperties, PIPELINE_EXECUTABLE_PROPERTIES, \ @@ -100,12 +98,10 @@ VK_DEFINE_HANDLE(VmaAllocator) EXTENSION(KHR, MAINTENANCE_3, maintenance3) \ EXTENSION(KHR, MAINTENANCE_7, maintenance7) \ EXTENSION(KHR, MAINTENANCE_8, maintenance8) \ - EXTENSION(KHR, MAINTENANCE_9, maintenance9) \ EXTENSION(NV, DEVICE_DIAGNOSTICS_CONFIG, device_diagnostics_config) \ EXTENSION(NV, GEOMETRY_SHADER_PASSTHROUGH, geometry_shader_passthrough) \ EXTENSION(NV, VIEWPORT_ARRAY2, viewport_array2) \ EXTENSION(NV, VIEWPORT_SWIZZLE, viewport_swizzle) \ - EXTENSION(EXT, DESCRIPTOR_INDEXING, descriptor_indexing) \ EXTENSION(EXT, FILTER_CUBIC, filter_cubic) \ EXTENSION(IMG, FILTER_CUBIC, filter_cubic_img) \ EXTENSION(QCOM, FILTER_CUBIC_WEIGHTS, filter_cubic_weights) @@ -443,11 +439,6 @@ public: return extensions.viewport_array2; } - /// Returns true if the device supporst VK_EXT_DESCRIPTOR_INDEXING - bool isExtDescriptorIndexingSupported() const { - return extensions.descriptor_indexing; - } - /// Returns true if the device supports VK_NV_geometry_shader_passthrough. bool IsNvGeometryShaderPassthroughSupported() const { return extensions.geometry_shader_passthrough; @@ -473,11 +464,6 @@ public: return extensions.swapchain_mutable_format; } - /// Returns true if VK_EXT_swapchain_maintenance1 is enabled. - bool IsExtSwapchainMaintenance1Enabled() const { - return extensions.swapchain_maintenance1; - } - /// Returns true if VK_KHR_shader_float_controls is enabled. bool IsKhrShaderFloatControlsSupported() const { return extensions.shader_float_controls; @@ -719,6 +705,22 @@ public: return extensions.provoking_vertex; } + /// Returns true if first vertex provoking mode can be used. + bool SupportsProvokingVertexFirstMode() const { + return extensions.provoking_vertex; + } + + /// Returns true if last vertex provoking mode can be used. + bool SupportsProvokingVertexLastMode() const { + return extensions.provoking_vertex && features.provoking_vertex.provokingVertexLast; + } + + /// Returns true if transform feedback preserves provoking vertex mode semantics. + bool SupportsTransformFeedbackProvokingVertexPreservation() const { + return extensions.provoking_vertex && + features.provoking_vertex.transformFeedbackPreservesProvokingVertex; + } + /// Returns true if the device supports VK_KHR_shader_atomic_int64. bool IsExtShaderAtomicInt64Supported() const { return extensions.shader_atomic_int64; @@ -878,11 +880,6 @@ public: return extensions.maintenance6; } - /// Returns true if the device supports VK_EXT_multi_draw. - bool IsExtMultiDrawSupported() const { - return extensions.multi_draw; - } - /// Returns true if the device supports VK_KHR_maintenance7. bool IsKhrMaintenance7Supported() const { return extensions.maintenance7; @@ -893,11 +890,6 @@ public: return extensions.maintenance8; } - /// Returns true if the device supports VK_KHR_maintenance9. - bool IsKhrMaintenance9Supported() const { - return extensions.maintenance9; - } - /// Returns true if the device supports UINT8 index buffer conversion via compute shader. bool SupportsUint8Indices() const { return features.bit8_storage.storageBuffer8BitAccess && @@ -1025,7 +1017,6 @@ private: VkPhysicalDeviceSubgroupSizeControlProperties subgroup_size_control{}; VkPhysicalDeviceTransformFeedbackPropertiesEXT transform_feedback{}; VkPhysicalDeviceMaintenance5PropertiesKHR maintenance5{}; - VkPhysicalDeviceMultiDrawPropertiesEXT multi_draw{}; VkPhysicalDeviceProperties properties{}; }; diff --git a/src/video_core/vulkan_common/vulkan_instance.cpp b/src/video_core/vulkan_common/vulkan_instance.cpp index b1a53ab4f3..398342296e 100644 --- a/src/video_core/vulkan_common/vulkan_instance.cpp +++ b/src/video_core/vulkan_common/vulkan_instance.cpp @@ -81,14 +81,6 @@ namespace { #endif if (enable_validation && AreExtensionsSupported(dld, *properties, std::array{VK_EXT_DEBUG_UTILS_EXTENSION_NAME})) extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); - // VK_EXT_surface_maintenance1 is required for VK_EXT_swapchain_maintenance1 - if (window_type != Core::Frontend::WindowSystemType::Headless && AreExtensionsSupported(dld, *properties, std::array{VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME})) { - extensions.push_back(VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME); - // Some(which?) drivers dont like being told to load this extension(why?) - // NVIDIA on FreeBSD is totally fine with this through - if (AreExtensionsSupported(dld, *properties, std::array{VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME})) - extensions.push_back(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME); - } } return extensions; } diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index a2fa2b50c6..f59ac7d6bc 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -116,8 +116,6 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { X(vkCmdDrawIndirectCount); X(vkCmdDrawIndexedIndirectCount); X(vkCmdDrawIndirectByteCountEXT); - X(vkCmdDrawMultiEXT); - X(vkCmdDrawMultiIndexedEXT); X(vkCmdEndConditionalRenderingEXT); X(vkCmdEndQuery); X(vkCmdEndRenderPass); diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index 872fbd858e..aaff66359e 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -218,8 +218,6 @@ struct DeviceDispatch : InstanceDispatch { PFN_vkCmdDrawIndirectCount vkCmdDrawIndirectCount{}; PFN_vkCmdDrawIndexedIndirectCount vkCmdDrawIndexedIndirectCount{}; PFN_vkCmdDrawIndirectByteCountEXT vkCmdDrawIndirectByteCountEXT{}; - PFN_vkCmdDrawMultiEXT vkCmdDrawMultiEXT{}; - PFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT{}; PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT{}; PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT{}; PFN_vkCmdEndQuery vkCmdEndQuery{}; @@ -1241,19 +1239,6 @@ public: counter_buffer_offset, counter_offset, stride); } - void DrawMultiEXT(u32 draw_count, const VkMultiDrawInfoEXT* vertex_info, - u32 instance_count, u32 first_instance, u32 stride) const noexcept { - dld->vkCmdDrawMultiEXT(handle, draw_count, vertex_info, instance_count, first_instance, - stride); - } - - void DrawMultiIndexedEXT(u32 draw_count, const VkMultiDrawIndexedInfoEXT* index_info, - u32 instance_count, u32 first_instance, u32 stride, - const int32_t* vertex_offset) const noexcept { - dld->vkCmdDrawMultiIndexedEXT(handle, draw_count, index_info, instance_count, - first_instance, stride, vertex_offset); - } - void ClearAttachments(Span attachments, Span rects) const noexcept { dld->vkCmdClearAttachments(handle, attachments.size(), attachments.data(), rects.size(),