summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar ameerj2021-08-08 16:56:40 -0400
committerGravatar ameerj2021-08-16 14:40:53 -0400
commitcd016d3cb5191b9f4f2756e440a6aa67e577c414 (patch)
treee96e08167a350f05feb9c081950be305612d9113
parentcodec: Improve libav memory alloc and cleanup (diff)
downloadyuzu-cd016d3cb5191b9f4f2756e440a6aa67e577c414.tar.gz
yuzu-cd016d3cb5191b9f4f2756e440a6aa67e577c414.tar.xz
yuzu-cd016d3cb5191b9f4f2756e440a6aa67e577c414.zip
configure_graphics: Add GPU nvdec decoding as an option
Some system configurations may see visual regressions or lower performance using GPU decoding compared to CPU decoding. This setting provides the option for users to specify their decoding preference. Co-Authored-By: yzct12345 <87620833+yzct12345@users.noreply.github.com>
Diffstat (limited to '')
-rw-r--r--src/common/settings.cpp4
-rw-r--r--src/common/settings.h8
-rw-r--r--src/core/telemetry_session.cpp16
-rw-r--r--src/video_core/command_classes/codecs/codec.cpp6
-rw-r--r--src/video_core/video_core.cpp3
-rw-r--r--src/yuzu/configuration/config.cpp7
-rw-r--r--src/yuzu/configuration/config.h1
-rw-r--r--src/yuzu/configuration/configure_graphics.cpp42
-rw-r--r--src/yuzu/configuration/configure_graphics.h1
-rw-r--r--src/yuzu/configuration/configure_graphics.ui51
-rw-r--r--src/yuzu_cmd/config.cpp2
-rw-r--r--src/yuzu_cmd/default_ini.h6
12 files changed, 120 insertions, 27 deletions
diff --git a/src/common/settings.cpp b/src/common/settings.cpp
index 996315999..33665eab8 100644
--- a/src/common/settings.cpp
+++ b/src/common/settings.cpp
@@ -54,7 +54,7 @@ void LogSettings() {
54 log_setting("Renderer_GPUAccuracyLevel", values.gpu_accuracy.GetValue()); 54 log_setting("Renderer_GPUAccuracyLevel", values.gpu_accuracy.GetValue());
55 log_setting("Renderer_UseAsynchronousGpuEmulation", 55 log_setting("Renderer_UseAsynchronousGpuEmulation",
56 values.use_asynchronous_gpu_emulation.GetValue()); 56 values.use_asynchronous_gpu_emulation.GetValue());
57 log_setting("Renderer_UseNvdecEmulation", values.use_nvdec_emulation.GetValue()); 57 log_setting("Renderer_NvdecEmulation", values.nvdec_emulation.GetValue());
58 log_setting("Renderer_AccelerateASTC", values.accelerate_astc.GetValue()); 58 log_setting("Renderer_AccelerateASTC", values.accelerate_astc.GetValue());
59 log_setting("Renderer_UseVsync", values.use_vsync.GetValue()); 59 log_setting("Renderer_UseVsync", values.use_vsync.GetValue());
60 log_setting("Renderer_ShaderBackend", values.shader_backend.GetValue()); 60 log_setting("Renderer_ShaderBackend", values.shader_backend.GetValue());
@@ -137,7 +137,7 @@ void RestoreGlobalState(bool is_powered_on) {
137 values.use_disk_shader_cache.SetGlobal(true); 137 values.use_disk_shader_cache.SetGlobal(true);
138 values.gpu_accuracy.SetGlobal(true); 138 values.gpu_accuracy.SetGlobal(true);
139 values.use_asynchronous_gpu_emulation.SetGlobal(true); 139 values.use_asynchronous_gpu_emulation.SetGlobal(true);
140 values.use_nvdec_emulation.SetGlobal(true); 140 values.nvdec_emulation.SetGlobal(true);
141 values.accelerate_astc.SetGlobal(true); 141 values.accelerate_astc.SetGlobal(true);
142 values.use_vsync.SetGlobal(true); 142 values.use_vsync.SetGlobal(true);
143 values.shader_backend.SetGlobal(true); 143 values.shader_backend.SetGlobal(true);
diff --git a/src/common/settings.h b/src/common/settings.h
index 1ba9b606c..28074c1b9 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -48,6 +48,12 @@ enum class FullscreenMode : u32 {
48 Exclusive = 1, 48 Exclusive = 1,
49}; 49};
50 50
51enum class NvdecEmulation : u32 {
52 Off = 0,
53 CPU = 1,
54 GPU = 2,
55};
56
51/** The BasicSetting class is a simple resource manager. It defines a label and default value 57/** The BasicSetting class is a simple resource manager. It defines a label and default value
52 * alongside the actual value of the setting for simpler and less-error prone use with frontend 58 * alongside the actual value of the setting for simpler and less-error prone use with frontend
53 * configurations. Setting a default value and label is required, though subclasses may deviate from 59 * configurations. Setting a default value and label is required, though subclasses may deviate from
@@ -466,7 +472,7 @@ struct Values {
466 RangedSetting<GPUAccuracy> gpu_accuracy{GPUAccuracy::High, GPUAccuracy::Normal, 472 RangedSetting<GPUAccuracy> gpu_accuracy{GPUAccuracy::High, GPUAccuracy::Normal,
467 GPUAccuracy::Extreme, "gpu_accuracy"}; 473 GPUAccuracy::Extreme, "gpu_accuracy"};
468 Setting<bool> use_asynchronous_gpu_emulation{true, "use_asynchronous_gpu_emulation"}; 474 Setting<bool> use_asynchronous_gpu_emulation{true, "use_asynchronous_gpu_emulation"};
469 Setting<bool> use_nvdec_emulation{true, "use_nvdec_emulation"}; 475 Setting<NvdecEmulation> nvdec_emulation{NvdecEmulation::GPU, "nvdec_emulation"};
470 Setting<bool> accelerate_astc{true, "accelerate_astc"}; 476 Setting<bool> accelerate_astc{true, "accelerate_astc"};
471 Setting<bool> use_vsync{true, "use_vsync"}; 477 Setting<bool> use_vsync{true, "use_vsync"};
472 BasicRangedSetting<u16> fps_cap{1000, 1, 1000, "fps_cap"}; 478 BasicRangedSetting<u16> fps_cap{1000, 1, 1000, "fps_cap"};
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp
index 5a8cfd301..1f1607998 100644
--- a/src/core/telemetry_session.cpp
+++ b/src/core/telemetry_session.cpp
@@ -72,6 +72,18 @@ static const char* TranslateGPUAccuracyLevel(Settings::GPUAccuracy backend) {
72 return "Unknown"; 72 return "Unknown";
73} 73}
74 74
75static const char* TranslateNvdecEmulation(Settings::NvdecEmulation backend) {
76 switch (backend) {
77 case Settings::NvdecEmulation::Off:
78 return "Off";
79 case Settings::NvdecEmulation::CPU:
80 return "CPU";
81 case Settings::NvdecEmulation::GPU:
82 return "GPU";
83 }
84 return "Unknown";
85}
86
75u64 GetTelemetryId() { 87u64 GetTelemetryId() {
76 u64 telemetry_id{}; 88 u64 telemetry_id{};
77 const auto filename = Common::FS::GetYuzuPath(Common::FS::YuzuPath::ConfigDir) / "telemetry_id"; 89 const auto filename = Common::FS::GetYuzuPath(Common::FS::YuzuPath::ConfigDir) / "telemetry_id";
@@ -229,8 +241,8 @@ void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader,
229 TranslateGPUAccuracyLevel(Settings::values.gpu_accuracy.GetValue())); 241 TranslateGPUAccuracyLevel(Settings::values.gpu_accuracy.GetValue()));
230 AddField(field_type, "Renderer_UseAsynchronousGpuEmulation", 242 AddField(field_type, "Renderer_UseAsynchronousGpuEmulation",
231 Settings::values.use_asynchronous_gpu_emulation.GetValue()); 243 Settings::values.use_asynchronous_gpu_emulation.GetValue());
232 AddField(field_type, "Renderer_UseNvdecEmulation", 244 AddField(field_type, "Renderer_NvdecEmulation",
233 Settings::values.use_nvdec_emulation.GetValue()); 245 TranslateNvdecEmulation(Settings::values.nvdec_emulation.GetValue()));
234 AddField(field_type, "Renderer_AccelerateASTC", Settings::values.accelerate_astc.GetValue()); 246 AddField(field_type, "Renderer_AccelerateASTC", Settings::values.accelerate_astc.GetValue());
235 AddField(field_type, "Renderer_UseVsync", Settings::values.use_vsync.GetValue()); 247 AddField(field_type, "Renderer_UseVsync", Settings::values.use_vsync.GetValue());
236 AddField(field_type, "Renderer_ShaderBackend", 248 AddField(field_type, "Renderer_ShaderBackend",
diff --git a/src/video_core/command_classes/codecs/codec.cpp b/src/video_core/command_classes/codecs/codec.cpp
index 18aa40ca3..61966cbfe 100644
--- a/src/video_core/command_classes/codecs/codec.cpp
+++ b/src/video_core/command_classes/codecs/codec.cpp
@@ -5,6 +5,7 @@
5#include <fstream> 5#include <fstream>
6#include <vector> 6#include <vector>
7#include "common/assert.h" 7#include "common/assert.h"
8#include "common/settings.h"
8#include "video_core/command_classes/codecs/codec.h" 9#include "video_core/command_classes/codecs/codec.h"
9#include "video_core/command_classes/codecs/h264.h" 10#include "video_core/command_classes/codecs/h264.h"
10#include "video_core/command_classes/codecs/vp9.h" 11#include "video_core/command_classes/codecs/vp9.h"
@@ -142,8 +143,11 @@ void Codec::Initialize() {
142 } 143 }
143 }(); 144 }();
144 av_codec = avcodec_find_decoder(codec); 145 av_codec = avcodec_find_decoder(codec);
146
145 InitializeAvCodecContext(); 147 InitializeAvCodecContext();
146 InitializeGpuDecoder(); 148 if (Settings::values.nvdec_emulation.GetValue() == Settings::NvdecEmulation::GPU) {
149 InitializeGpuDecoder();
150 }
147 if (const int res = avcodec_open2(av_codec_ctx, av_codec, nullptr); res < 0) { 151 if (const int res = avcodec_open2(av_codec_ctx, av_codec, nullptr); res < 0) {
148 LOG_ERROR(Service_NVDRV, "avcodec_open2() Failed with result {}", res); 152 LOG_ERROR(Service_NVDRV, "avcodec_open2() Failed with result {}", res);
149 avcodec_free_context(&av_codec_ctx); 153 avcodec_free_context(&av_codec_ctx);
diff --git a/src/video_core/video_core.cpp b/src/video_core/video_core.cpp
index 3b575db4d..cae543a51 100644
--- a/src/video_core/video_core.cpp
+++ b/src/video_core/video_core.cpp
@@ -37,7 +37,8 @@ std::unique_ptr<VideoCore::RendererBase> CreateRenderer(
37namespace VideoCore { 37namespace VideoCore {
38 38
39std::unique_ptr<Tegra::GPU> CreateGPU(Core::Frontend::EmuWindow& emu_window, Core::System& system) { 39std::unique_ptr<Tegra::GPU> CreateGPU(Core::Frontend::EmuWindow& emu_window, Core::System& system) {
40 const bool use_nvdec = Settings::values.use_nvdec_emulation.GetValue(); 40 const auto nvdec_value = Settings::values.nvdec_emulation.GetValue();
41 const bool use_nvdec = nvdec_value != Settings::NvdecEmulation::Off;
41 const bool use_async = Settings::values.use_asynchronous_gpu_emulation.GetValue(); 42 const bool use_async = Settings::values.use_asynchronous_gpu_emulation.GetValue();
42 auto gpu = std::make_unique<Tegra::GPU>(system, use_async, use_nvdec); 43 auto gpu = std::make_unique<Tegra::GPU>(system, use_async, use_nvdec);
43 auto context = emu_window.CreateSharedContext(); 44 auto context = emu_window.CreateSharedContext();
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 380379eb4..6aec3c46c 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -811,7 +811,7 @@ void Config::ReadRendererValues() {
811 ReadGlobalSetting(Settings::values.use_disk_shader_cache); 811 ReadGlobalSetting(Settings::values.use_disk_shader_cache);
812 ReadGlobalSetting(Settings::values.gpu_accuracy); 812 ReadGlobalSetting(Settings::values.gpu_accuracy);
813 ReadGlobalSetting(Settings::values.use_asynchronous_gpu_emulation); 813 ReadGlobalSetting(Settings::values.use_asynchronous_gpu_emulation);
814 ReadGlobalSetting(Settings::values.use_nvdec_emulation); 814 ReadGlobalSetting(Settings::values.nvdec_emulation);
815 ReadGlobalSetting(Settings::values.accelerate_astc); 815 ReadGlobalSetting(Settings::values.accelerate_astc);
816 ReadGlobalSetting(Settings::values.use_vsync); 816 ReadGlobalSetting(Settings::values.use_vsync);
817 ReadGlobalSetting(Settings::values.shader_backend); 817 ReadGlobalSetting(Settings::values.shader_backend);
@@ -1348,7 +1348,10 @@ void Config::SaveRendererValues() {
1348 static_cast<u32>(Settings::values.gpu_accuracy.GetDefault()), 1348 static_cast<u32>(Settings::values.gpu_accuracy.GetDefault()),
1349 Settings::values.gpu_accuracy.UsingGlobal()); 1349 Settings::values.gpu_accuracy.UsingGlobal());
1350 WriteGlobalSetting(Settings::values.use_asynchronous_gpu_emulation); 1350 WriteGlobalSetting(Settings::values.use_asynchronous_gpu_emulation);
1351 WriteGlobalSetting(Settings::values.use_nvdec_emulation); 1351 WriteSetting(QString::fromStdString(Settings::values.nvdec_emulation.GetLabel()),
1352 static_cast<u32>(Settings::values.nvdec_emulation.GetValue(global)),
1353 static_cast<u32>(Settings::values.nvdec_emulation.GetDefault()),
1354 Settings::values.nvdec_emulation.UsingGlobal());
1352 WriteGlobalSetting(Settings::values.accelerate_astc); 1355 WriteGlobalSetting(Settings::values.accelerate_astc);
1353 WriteGlobalSetting(Settings::values.use_vsync); 1356 WriteGlobalSetting(Settings::values.use_vsync);
1354 WriteSetting(QString::fromStdString(Settings::values.shader_backend.GetLabel()), 1357 WriteSetting(QString::fromStdString(Settings::values.shader_backend.GetLabel()),
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index c1d7feb9f..334623997 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -182,5 +182,6 @@ private:
182Q_DECLARE_METATYPE(Settings::CPUAccuracy); 182Q_DECLARE_METATYPE(Settings::CPUAccuracy);
183Q_DECLARE_METATYPE(Settings::GPUAccuracy); 183Q_DECLARE_METATYPE(Settings::GPUAccuracy);
184Q_DECLARE_METATYPE(Settings::FullscreenMode); 184Q_DECLARE_METATYPE(Settings::FullscreenMode);
185Q_DECLARE_METATYPE(Settings::NvdecEmulation);
185Q_DECLARE_METATYPE(Settings::RendererBackend); 186Q_DECLARE_METATYPE(Settings::RendererBackend);
186Q_DECLARE_METATYPE(Settings::ShaderBackend); 187Q_DECLARE_METATYPE(Settings::ShaderBackend);
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp
index 37e896258..c594164be 100644
--- a/src/yuzu/configuration/configure_graphics.cpp
+++ b/src/yuzu/configuration/configure_graphics.cpp
@@ -88,24 +88,30 @@ void ConfigureGraphics::SetConfiguration() {
88 ui->api_widget->setEnabled(runtime_lock); 88 ui->api_widget->setEnabled(runtime_lock);
89 ui->use_asynchronous_gpu_emulation->setEnabled(runtime_lock); 89 ui->use_asynchronous_gpu_emulation->setEnabled(runtime_lock);
90 ui->use_disk_shader_cache->setEnabled(runtime_lock); 90 ui->use_disk_shader_cache->setEnabled(runtime_lock);
91 ui->use_nvdec_emulation->setEnabled(runtime_lock); 91 ui->nvdec_emulation_widget->setEnabled(runtime_lock);
92 ui->accelerate_astc->setEnabled(runtime_lock); 92 ui->accelerate_astc->setEnabled(runtime_lock);
93 ui->use_disk_shader_cache->setChecked(Settings::values.use_disk_shader_cache.GetValue()); 93 ui->use_disk_shader_cache->setChecked(Settings::values.use_disk_shader_cache.GetValue());
94 ui->use_asynchronous_gpu_emulation->setChecked( 94 ui->use_asynchronous_gpu_emulation->setChecked(
95 Settings::values.use_asynchronous_gpu_emulation.GetValue()); 95 Settings::values.use_asynchronous_gpu_emulation.GetValue());
96 ui->use_nvdec_emulation->setChecked(Settings::values.use_nvdec_emulation.GetValue());
97 ui->accelerate_astc->setChecked(Settings::values.accelerate_astc.GetValue()); 96 ui->accelerate_astc->setChecked(Settings::values.accelerate_astc.GetValue());
98 97
99 if (Settings::IsConfiguringGlobal()) { 98 if (Settings::IsConfiguringGlobal()) {
100 ui->api->setCurrentIndex(static_cast<int>(Settings::values.renderer_backend.GetValue())); 99 ui->api->setCurrentIndex(static_cast<int>(Settings::values.renderer_backend.GetValue()));
101 ui->fullscreen_mode_combobox->setCurrentIndex( 100 ui->fullscreen_mode_combobox->setCurrentIndex(
102 static_cast<int>(Settings::values.fullscreen_mode.GetValue())); 101 static_cast<int>(Settings::values.fullscreen_mode.GetValue()));
102 ui->nvdec_emulation->setCurrentIndex(
103 static_cast<int>(Settings::values.nvdec_emulation.GetValue()));
103 ui->aspect_ratio_combobox->setCurrentIndex(Settings::values.aspect_ratio.GetValue()); 104 ui->aspect_ratio_combobox->setCurrentIndex(Settings::values.aspect_ratio.GetValue());
104 } else { 105 } else {
105 ConfigurationShared::SetPerGameSetting(ui->api, &Settings::values.renderer_backend); 106 ConfigurationShared::SetPerGameSetting(ui->api, &Settings::values.renderer_backend);
106 ConfigurationShared::SetHighlight(ui->api_widget, 107 ConfigurationShared::SetHighlight(ui->api_widget,
107 !Settings::values.renderer_backend.UsingGlobal()); 108 !Settings::values.renderer_backend.UsingGlobal());
108 109
110 ConfigurationShared::SetPerGameSetting(ui->nvdec_emulation,
111 &Settings::values.nvdec_emulation);
112 ConfigurationShared::SetHighlight(ui->nvdec_emulation_widget,
113 !Settings::values.nvdec_emulation.UsingGlobal());
114
109 ConfigurationShared::SetPerGameSetting(ui->fullscreen_mode_combobox, 115 ConfigurationShared::SetPerGameSetting(ui->fullscreen_mode_combobox,
110 &Settings::values.fullscreen_mode); 116 &Settings::values.fullscreen_mode);
111 ConfigurationShared::SetHighlight(ui->fullscreen_mode_label, 117 ConfigurationShared::SetHighlight(ui->fullscreen_mode_label,
@@ -137,8 +143,6 @@ void ConfigureGraphics::ApplyConfiguration() {
137 ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_gpu_emulation, 143 ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_gpu_emulation,
138 ui->use_asynchronous_gpu_emulation, 144 ui->use_asynchronous_gpu_emulation,
139 use_asynchronous_gpu_emulation); 145 use_asynchronous_gpu_emulation);
140 ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_nvdec_emulation,
141 ui->use_nvdec_emulation, use_nvdec_emulation);
142 ConfigurationShared::ApplyPerGameSetting(&Settings::values.accelerate_astc, ui->accelerate_astc, 146 ConfigurationShared::ApplyPerGameSetting(&Settings::values.accelerate_astc, ui->accelerate_astc,
143 accelerate_astc); 147 accelerate_astc);
144 148
@@ -147,6 +151,9 @@ void ConfigureGraphics::ApplyConfiguration() {
147 if (Settings::values.renderer_backend.UsingGlobal()) { 151 if (Settings::values.renderer_backend.UsingGlobal()) {
148 Settings::values.renderer_backend.SetValue(GetCurrentGraphicsBackend()); 152 Settings::values.renderer_backend.SetValue(GetCurrentGraphicsBackend());
149 } 153 }
154 if (Settings::values.nvdec_emulation.UsingGlobal()) {
155 Settings::values.nvdec_emulation.SetValue(GetCurrentNvdecEmulation());
156 }
150 if (Settings::values.shader_backend.UsingGlobal()) { 157 if (Settings::values.shader_backend.UsingGlobal()) {
151 Settings::values.shader_backend.SetValue(shader_backend); 158 Settings::values.shader_backend.SetValue(shader_backend);
152 } 159 }
@@ -180,6 +187,13 @@ void ConfigureGraphics::ApplyConfiguration() {
180 } 187 }
181 } 188 }
182 189
190 if (ui->nvdec_emulation->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
191 Settings::values.nvdec_emulation.SetGlobal(true);
192 } else {
193 Settings::values.nvdec_emulation.SetGlobal(false);
194 Settings::values.nvdec_emulation.SetValue(GetCurrentNvdecEmulation());
195 }
196
183 if (ui->bg_combobox->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) { 197 if (ui->bg_combobox->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
184 Settings::values.bg_red.SetGlobal(true); 198 Settings::values.bg_red.SetGlobal(true);
185 Settings::values.bg_green.SetGlobal(true); 199 Settings::values.bg_green.SetGlobal(true);
@@ -278,6 +292,20 @@ Settings::RendererBackend ConfigureGraphics::GetCurrentGraphicsBackend() const {
278 ConfigurationShared::USE_GLOBAL_OFFSET); 292 ConfigurationShared::USE_GLOBAL_OFFSET);
279} 293}
280 294
295Settings::NvdecEmulation ConfigureGraphics::GetCurrentNvdecEmulation() const {
296 if (Settings::IsConfiguringGlobal()) {
297 return static_cast<Settings::NvdecEmulation>(ui->nvdec_emulation->currentIndex());
298 }
299
300 if (ui->nvdec_emulation->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
301 Settings::values.nvdec_emulation.SetGlobal(true);
302 return Settings::values.nvdec_emulation.GetValue();
303 }
304 Settings::values.nvdec_emulation.SetGlobal(false);
305 return static_cast<Settings::NvdecEmulation>(ui->nvdec_emulation->currentIndex() -
306 ConfigurationShared::USE_GLOBAL_OFFSET);
307}
308
281void ConfigureGraphics::SetupPerGameUI() { 309void ConfigureGraphics::SetupPerGameUI() {
282 if (Settings::IsConfiguringGlobal()) { 310 if (Settings::IsConfiguringGlobal()) {
283 ui->api->setEnabled(Settings::values.renderer_backend.UsingGlobal()); 311 ui->api->setEnabled(Settings::values.renderer_backend.UsingGlobal());
@@ -286,7 +314,7 @@ void ConfigureGraphics::SetupPerGameUI() {
286 ui->aspect_ratio_combobox->setEnabled(Settings::values.aspect_ratio.UsingGlobal()); 314 ui->aspect_ratio_combobox->setEnabled(Settings::values.aspect_ratio.UsingGlobal());
287 ui->use_asynchronous_gpu_emulation->setEnabled( 315 ui->use_asynchronous_gpu_emulation->setEnabled(
288 Settings::values.use_asynchronous_gpu_emulation.UsingGlobal()); 316 Settings::values.use_asynchronous_gpu_emulation.UsingGlobal());
289 ui->use_nvdec_emulation->setEnabled(Settings::values.use_nvdec_emulation.UsingGlobal()); 317 ui->nvdec_emulation->setEnabled(Settings::values.nvdec_emulation.UsingGlobal());
290 ui->accelerate_astc->setEnabled(Settings::values.accelerate_astc.UsingGlobal()); 318 ui->accelerate_astc->setEnabled(Settings::values.accelerate_astc.UsingGlobal());
291 ui->use_disk_shader_cache->setEnabled(Settings::values.use_disk_shader_cache.UsingGlobal()); 319 ui->use_disk_shader_cache->setEnabled(Settings::values.use_disk_shader_cache.UsingGlobal());
292 ui->bg_button->setEnabled(Settings::values.bg_red.UsingGlobal()); 320 ui->bg_button->setEnabled(Settings::values.bg_red.UsingGlobal());
@@ -301,8 +329,6 @@ void ConfigureGraphics::SetupPerGameUI() {
301 329
302 ConfigurationShared::SetColoredTristate( 330 ConfigurationShared::SetColoredTristate(
303 ui->use_disk_shader_cache, Settings::values.use_disk_shader_cache, use_disk_shader_cache); 331 ui->use_disk_shader_cache, Settings::values.use_disk_shader_cache, use_disk_shader_cache);
304 ConfigurationShared::SetColoredTristate(
305 ui->use_nvdec_emulation, Settings::values.use_nvdec_emulation, use_nvdec_emulation);
306 ConfigurationShared::SetColoredTristate(ui->accelerate_astc, Settings::values.accelerate_astc, 332 ConfigurationShared::SetColoredTristate(ui->accelerate_astc, Settings::values.accelerate_astc,
307 accelerate_astc); 333 accelerate_astc);
308 ConfigurationShared::SetColoredTristate(ui->use_asynchronous_gpu_emulation, 334 ConfigurationShared::SetColoredTristate(ui->use_asynchronous_gpu_emulation,
@@ -316,4 +342,6 @@ void ConfigureGraphics::SetupPerGameUI() {
316 static_cast<int>(Settings::values.fullscreen_mode.GetValue(true))); 342 static_cast<int>(Settings::values.fullscreen_mode.GetValue(true)));
317 ConfigurationShared::InsertGlobalItem( 343 ConfigurationShared::InsertGlobalItem(
318 ui->api, static_cast<int>(Settings::values.renderer_backend.GetValue(true))); 344 ui->api, static_cast<int>(Settings::values.renderer_backend.GetValue(true)));
345 ConfigurationShared::InsertGlobalItem(
346 ui->nvdec_emulation, static_cast<int>(Settings::values.nvdec_emulation.GetValue(true)));
319} 347}
diff --git a/src/yuzu/configuration/configure_graphics.h b/src/yuzu/configuration/configure_graphics.h
index c866b911b..7d7ac329d 100644
--- a/src/yuzu/configuration/configure_graphics.h
+++ b/src/yuzu/configuration/configure_graphics.h
@@ -43,6 +43,7 @@ private:
43 void SetupPerGameUI(); 43 void SetupPerGameUI();
44 44
45 Settings::RendererBackend GetCurrentGraphicsBackend() const; 45 Settings::RendererBackend GetCurrentGraphicsBackend() const;
46 Settings::NvdecEmulation GetCurrentNvdecEmulation() const;
46 47
47 std::unique_ptr<Ui::ConfigureGraphics> ui; 48 std::unique_ptr<Ui::ConfigureGraphics> ui;
48 QColor bg_color; 49 QColor bg_color;
diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui
index 099ddbb7c..41e930f6b 100644
--- a/src/yuzu/configuration/configure_graphics.ui
+++ b/src/yuzu/configuration/configure_graphics.ui
@@ -168,13 +168,6 @@
168 </widget> 168 </widget>
169 </item> 169 </item>
170 <item> 170 <item>
171 <widget class="QCheckBox" name="use_nvdec_emulation">
172 <property name="text">
173 <string>Use NVDEC emulation</string>
174 </property>
175 </widget>
176 </item>
177 <item>
178 <widget class="QCheckBox" name="accelerate_astc"> 171 <widget class="QCheckBox" name="accelerate_astc">
179 <property name="text"> 172 <property name="text">
180 <string>Accelerate ASTC texture decoding</string> 173 <string>Accelerate ASTC texture decoding</string>
@@ -182,6 +175,50 @@
182 </widget> 175 </widget>
183 </item> 176 </item>
184 <item> 177 <item>
178 <widget class="QWidget" name="nvdec_emulation_widget" native="true">
179 <layout class="QHBoxLayout" name="nvdec_emulation_layout">
180 <property name="leftMargin">
181 <number>0</number>
182 </property>
183 <property name="topMargin">
184 <number>0</number>
185 </property>
186 <property name="rightMargin">
187 <number>0</number>
188 </property>
189 <property name="bottomMargin">
190 <number>0</number>
191 </property>
192 <item>
193 <widget class="QLabel" name="nvdec_emulation_label">
194 <property name="text">
195 <string>NVDEC emulation:</string>
196 </property>
197 </widget>
198 </item>
199 <item>
200 <widget class="QComboBox" name="nvdec_emulation">
201 <item>
202 <property name="text">
203 <string>Disabled</string>
204 </property>
205 </item>
206 <item>
207 <property name="text">
208 <string>CPU Decoding</string>
209 </property>
210 </item>
211 <item>
212 <property name="text">
213 <string>GPU Decoding</string>
214 </property>
215 </item>
216 </widget>
217 </item>
218 </layout>
219 </widget>
220 </item>
221 <item>
185 <widget class="QWidget" name="fullscreen_mode_layout" native="true"> 222 <widget class="QWidget" name="fullscreen_mode_layout" native="true">
186 <layout class="QHBoxLayout" name="horizontalLayout_1"> 223 <layout class="QHBoxLayout" name="horizontalLayout_1">
187 <property name="leftMargin"> 224 <property name="leftMargin">
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp
index 4f14be524..464cd472e 100644
--- a/src/yuzu_cmd/config.cpp
+++ b/src/yuzu_cmd/config.cpp
@@ -465,7 +465,7 @@ void Config::ReadValues() {
465 ReadSetting("Renderer", Settings::values.disable_fps_limit); 465 ReadSetting("Renderer", Settings::values.disable_fps_limit);
466 ReadSetting("Renderer", Settings::values.shader_backend); 466 ReadSetting("Renderer", Settings::values.shader_backend);
467 ReadSetting("Renderer", Settings::values.use_asynchronous_shaders); 467 ReadSetting("Renderer", Settings::values.use_asynchronous_shaders);
468 ReadSetting("Renderer", Settings::values.use_nvdec_emulation); 468 ReadSetting("Renderer", Settings::values.nvdec_emulation);
469 ReadSetting("Renderer", Settings::values.accelerate_astc); 469 ReadSetting("Renderer", Settings::values.accelerate_astc);
470 ReadSetting("Renderer", Settings::values.use_fast_gpu_time); 470 ReadSetting("Renderer", Settings::values.use_fast_gpu_time);
471 ReadSetting("Renderer", Settings::values.use_caches_gc); 471 ReadSetting("Renderer", Settings::values.use_caches_gc);
diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h
index e02eceb99..72f3213fb 100644
--- a/src/yuzu_cmd/default_ini.h
+++ b/src/yuzu_cmd/default_ini.h
@@ -261,9 +261,9 @@ shader_backend =
261# 0 (default): Off, 1: On 261# 0 (default): Off, 1: On
262use_asynchronous_shaders = 262use_asynchronous_shaders =
263 263
264# Enable NVDEC emulation. 264# NVDEC emulation.
265# 0: Off, 1 (default): On 265# 0: Disabled, 1: CPU Decoding, 2 (default): GPU Decoding
266use_nvdec_emulation = 266nvdec_emulation =
267 267
268# Accelerate ASTC texture decoding. 268# Accelerate ASTC texture decoding.
269# 0: Off, 1 (default): On 269# 0: Off, 1 (default): On