From c05b6c1eeef445798915c80aeabf3c65663da16e Mon Sep 17 00:00:00 2001 From: N3xoX1 Date: Fri, 22 Aug 2025 10:27:31 +0930 Subject: [PATCH] UI: clean up config graphics --- external/sciterui | 2 +- lang/english/css/input_config.css | 10 + lang/english/html/system_config.html | 2 +- lang/english/html/system_config_graphics.html | 48 ++--- src/nxemu-video/video_settings.cpp | 177 +++++++++++++++++- src/nxemu-video/video_settings_identifiers.h | 5 + src/nxemu/main.cpp | 2 + .../user_interface/settings/system_config.cpp | 24 ++- .../settings/system_config_graphics.cpp | 135 ++++++++++--- .../settings/system_config_graphics.h | 1 + 10 files changed, 355 insertions(+), 51 deletions(-) diff --git a/external/sciterui b/external/sciterui index e070d982..b831d458 160000 --- a/external/sciterui +++ b/external/sciterui @@ -1 +1 @@ -Subproject commit e070d9827a9342f64623a2503d898180447ceeeb +Subproject commit b831d458cdc12c55b62d6c122a4b2ca2ec9ae5e8 diff --git a/lang/english/css/input_config.css b/lang/english/css/input_config.css index 3bc3ef07..8e672532 100644 --- a/lang/english/css/input_config.css +++ b/lang/english/css/input_config.css @@ -1,3 +1,13 @@ +popup.tooltip +{ + background: #4f6459; + border: 1px solid #6a6a6a; + padding: 0.5rem; + color: #eff0f1; + font-family: 'Segoe UI', Arial, sans-serif; + font-size: 0.8rem; +} + button { color: #eff0f1; diff --git a/lang/english/html/system_config.html b/lang/english/html/system_config.html index 234abda6..b840ff06 100644 --- a/lang/english/html/system_config.html +++ b/lang/english/html/system_config.html @@ -246,7 +246,7 @@ PageNav.page_tabs page.active { -
+
diff --git a/lang/english/html/system_config_graphics.html b/lang/english/html/system_config_graphics.html index 15ddbe23..26735848 100644 --- a/lang/english/html/system_config_graphics.html +++ b/lang/english/html/system_config_graphics.html @@ -4,48 +4,48 @@
API Settings
-
+
-
+
-
+
Graphics Settings
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -53,7 +53,7 @@
-
+
@@ -66,43 +66,43 @@
Advanced Graphics Settings
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/src/nxemu-video/video_settings.cpp b/src/nxemu-video/video_settings.cpp index 27408c80..d27591bd 100644 --- a/src/nxemu-video/video_settings.cpp +++ b/src/nxemu-video/video_settings.cpp @@ -17,13 +17,18 @@ namespace IntValueRanged, RendererBackend, ShaderBackend, - AstcDecodeMode, + AstcDecodeMode, + VSyncMode, NvdecEmulation, FullscreenMode, AspectRatio, ResolutionSetup, ScalingFilter, AntiAliasing, + GpuAccuracy, + AnisotropyMode, + AstcRecompression, + VramUsageMode, }; class VideoSetting @@ -35,12 +40,17 @@ namespace VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); + VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); + VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); + VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); + VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); + VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val); const char * identifier; const char * json_section; @@ -54,12 +64,17 @@ namespace Settings::SwitchableSetting* rendererBackend; Settings::SwitchableSetting * shaderBackend; Settings::SwitchableSetting * astcDecodeMode; + Settings::SwitchableSetting * vSyncMode; Settings::SwitchableSetting * nvdecEmulation; Settings::SwitchableSetting * fullscreenMode; Settings::SwitchableSetting * aspectRatio; Settings::SwitchableSetting * resolutionSetup; Settings::SwitchableSetting * scalingFilter; Settings::SwitchableSetting * antiAliasing; + Settings::SwitchableSetting * gpuAccuracy; + Settings::SwitchableSetting * anisotropyMode; + Settings::SwitchableSetting * astcRecompression; + Settings::SwitchableSetting * vramUsageMode; } setting; }; @@ -70,6 +85,7 @@ namespace { NXVideoSetting::UseDiskPipelineCache, "video", "use_disk_shader_cache", &Settings::values.use_disk_shader_cache }, { NXVideoSetting::UseAsynchronousGPUEmulation, "video", "use_asynchronous_gpu_emulation", &Settings::values.use_asynchronous_gpu_emulation }, { NXVideoSetting::AstcDecodeMode, "video", "astc_decode_mode", &Settings::values.accelerate_astc }, + { NXVideoSetting::VSyncMode, "video", "vsync_mode", &Settings::values.vsync_mode }, { NXVideoSetting::NvdecEmulation, "video", "nvdec_emulation", &Settings::values.nvdec_emulation }, { NXVideoSetting::FullscreenMode, "video", "fullscreen_mode", &Settings::values.fullscreen_mode }, { NXVideoSetting::AspectRatio, "video", "aspect_ratio", &Settings::values.aspect_ratio }, @@ -85,6 +101,10 @@ namespace { NXVideoSetting::UseVulkanPipelineCache, "video", "use_vulkan_driver_pipeline_cache", &Settings::values.use_vulkan_driver_pipeline_cache }, { NXVideoSetting::SyncToFramerateOfVideoPlayback, "video", "use_video_framerate", &Settings::values.use_video_framerate }, { NXVideoSetting::BarrierFeedbackLoops, "video", "barrier_feedback_loops", &Settings::values.barrier_feedback_loops }, + { NXVideoSetting::AccuracyLevel, "video", "accuracy_level", &Settings::values.gpu_accuracy }, + { NXVideoSetting::AnisotropicFiltering, "video", "anisotropic_filtering", &Settings::values.max_anisotropy }, + { NXVideoSetting::ASTCRecompressionMethod, "video", "astc_recompression_method", &Settings::values.astc_recompression }, + { NXVideoSetting::VRAMUsageMode, "video", "vram_usage_mode", &Settings::values.vram_usage_mode }, }; } @@ -116,6 +136,9 @@ void VideoSettingChanged(const char * setting, void * /*userData*/) case SettingType::AstcDecodeMode: videoSetting.setting.astcDecodeMode->SetValue((Settings::AstcDecodeMode)g_settings->GetInt(setting)); break; + case SettingType::VSyncMode: + videoSetting.setting.vSyncMode->SetValue((Settings::VSyncMode)g_settings->GetInt(setting)); + break; case SettingType::NvdecEmulation: videoSetting.setting.nvdecEmulation->SetValue((Settings::NvdecEmulation)g_settings->GetInt(setting)); break; @@ -134,6 +157,18 @@ void VideoSettingChanged(const char * setting, void * /*userData*/) case SettingType::AntiAliasing: videoSetting.setting.antiAliasing->SetValue((Settings::AntiAliasing)g_settings->GetInt(setting)); break; + case SettingType::GpuAccuracy: + videoSetting.setting.gpuAccuracy->SetValue((Settings::GpuAccuracy)g_settings->GetInt(setting)); + break; + case SettingType::AnisotropyMode: + videoSetting.setting.anisotropyMode->SetValue((Settings::AnisotropyMode)g_settings->GetInt(setting)); + break; + case SettingType::AstcRecompression: + videoSetting.setting.astcRecompression->SetValue((Settings::AstcRecompression)g_settings->GetInt(setting)); + break; + case SettingType::VramUsageMode: + videoSetting.setting.vramUsageMode->SetValue((Settings::VramUsageMode)g_settings->GetInt(setting)); + break; default: UNIMPLEMENTED(); } @@ -164,6 +199,9 @@ void SetupVideoSetting(void) case SettingType::AstcDecodeMode: videoSetting.setting.astcDecodeMode->SetValue(videoSetting.setting.astcDecodeMode->GetDefault()); break; + case SettingType::VSyncMode: + videoSetting.setting.vSyncMode->SetValue(videoSetting.setting.vSyncMode->GetDefault()); + break; case SettingType::NvdecEmulation: videoSetting.setting.nvdecEmulation->SetValue(videoSetting.setting.nvdecEmulation->GetDefault()); break; @@ -182,6 +220,18 @@ void SetupVideoSetting(void) case SettingType::AntiAliasing: videoSetting.setting.antiAliasing->SetValue(videoSetting.setting.antiAliasing->GetDefault()); break; + case SettingType::GpuAccuracy: + videoSetting.setting.gpuAccuracy->SetValue(videoSetting.setting.gpuAccuracy->GetDefault()); + break; + case SettingType::AnisotropyMode: + videoSetting.setting.anisotropyMode->SetValue(videoSetting.setting.anisotropyMode->GetDefault()); + break; + case SettingType::AstcRecompression: + videoSetting.setting.astcRecompression->SetValue(videoSetting.setting.astcRecompression->GetDefault()); + break; + case SettingType::VramUsageMode: + videoSetting.setting.vramUsageMode->SetValue(videoSetting.setting.vramUsageMode->GetDefault()); + break; default: UNIMPLEMENTED(); } @@ -239,6 +289,12 @@ void SetupVideoSetting(void) videoSetting.setting.astcDecodeMode->SetValue(Settings::ToEnum(value.asString())); } break; + case SettingType::VSyncMode: + if (value.isString()) + { + videoSetting.setting.vSyncMode->SetValue(Settings::ToEnum(value.asString())); + } + break; case SettingType::NvdecEmulation: if (value.isString()) { @@ -275,6 +331,30 @@ void SetupVideoSetting(void) videoSetting.setting.antiAliasing->SetValue(Settings::ToEnum(value.asString())); } break; + case SettingType::GpuAccuracy: + if (value.isString()) + { + videoSetting.setting.gpuAccuracy->SetValue(Settings::ToEnum(value.asString())); + } + break; + case SettingType::AnisotropyMode: + if (value.isString()) + { + videoSetting.setting.anisotropyMode->SetValue(Settings::ToEnum(value.asString())); + } + break; + case SettingType::AstcRecompression: + if (value.isString()) + { + videoSetting.setting.astcRecompression->SetValue(Settings::ToEnum(value.asString())); + } + break; + case SettingType::VramUsageMode: + if (value.isString()) + { + videoSetting.setting.vramUsageMode->SetValue(Settings::ToEnum(value.asString())); + } + break; default: UNIMPLEMENTED(); } @@ -309,6 +389,10 @@ void SetupVideoSetting(void) g_settings->SetDefaultInt(videoSetting.identifier, (int32_t)videoSetting.setting.astcDecodeMode->GetDefault()); g_settings->SetInt(videoSetting.identifier, (int32_t)videoSetting.setting.astcDecodeMode->GetValue()); break; + case SettingType::VSyncMode: + g_settings->SetDefaultInt(videoSetting.identifier, (int32_t)videoSetting.setting.vSyncMode->GetDefault()); + g_settings->SetInt(videoSetting.identifier, (int32_t)videoSetting.setting.vSyncMode->GetValue()); + break; case SettingType::NvdecEmulation: g_settings->SetDefaultInt(videoSetting.identifier, (int32_t)videoSetting.setting.nvdecEmulation->GetDefault()); g_settings->SetInt(videoSetting.identifier, (int32_t)videoSetting.setting.nvdecEmulation->GetValue()); @@ -333,6 +417,22 @@ void SetupVideoSetting(void) g_settings->SetDefaultInt(videoSetting.identifier, (int32_t)videoSetting.setting.antiAliasing->GetDefault()); g_settings->SetInt(videoSetting.identifier, (int32_t)videoSetting.setting.antiAliasing->GetValue()); break; + case SettingType::GpuAccuracy: + g_settings->SetDefaultInt(videoSetting.identifier, (int32_t)videoSetting.setting.gpuAccuracy->GetDefault()); + g_settings->SetInt(videoSetting.identifier, (int32_t)videoSetting.setting.gpuAccuracy->GetValue()); + break; + case SettingType::AnisotropyMode: + g_settings->SetDefaultInt(videoSetting.identifier, (int32_t)videoSetting.setting.anisotropyMode->GetDefault()); + g_settings->SetInt(videoSetting.identifier, (int32_t)videoSetting.setting.anisotropyMode->GetValue()); + break; + case SettingType::AstcRecompression: + g_settings->SetDefaultInt(videoSetting.identifier, (int32_t)videoSetting.setting.astcRecompression->GetDefault()); + g_settings->SetInt(videoSetting.identifier, (int32_t)videoSetting.setting.astcRecompression->GetValue()); + break; + case SettingType::VramUsageMode: + g_settings->SetDefaultInt(videoSetting.identifier, (int32_t)videoSetting.setting.vramUsageMode->GetDefault()); + g_settings->SetInt(videoSetting.identifier, (int32_t)videoSetting.setting.vramUsageMode->GetValue()); + break; default: UNIMPLEMENTED(); } @@ -385,6 +485,12 @@ void SaveVideoSettings(void) sections[videoSetting.json_section][videoSetting.json_key] = Settings::CanonicalizeEnum(videoSetting.setting.astcDecodeMode->GetValue()); } break; + case SettingType::VSyncMode: + if (videoSetting.setting.vSyncMode->GetValue() != videoSetting.setting.vSyncMode->GetDefault()) + { + sections[videoSetting.json_section][videoSetting.json_key] = Settings::CanonicalizeEnum(videoSetting.setting.vSyncMode->GetValue()); + } + break; case SettingType::NvdecEmulation: if (videoSetting.setting.nvdecEmulation->GetValue() != videoSetting.setting.nvdecEmulation->GetDefault()) { @@ -421,6 +527,30 @@ void SaveVideoSettings(void) sections[videoSetting.json_section][videoSetting.json_key] = Settings::CanonicalizeEnum(videoSetting.setting.antiAliasing->GetValue()); } break; + case SettingType::GpuAccuracy: + if (videoSetting.setting.gpuAccuracy->GetValue() != videoSetting.setting.gpuAccuracy->GetDefault()) + { + sections[videoSetting.json_section][videoSetting.json_key] = Settings::CanonicalizeEnum(videoSetting.setting.gpuAccuracy->GetValue()); + } + break; + case SettingType::AnisotropyMode: + if (videoSetting.setting.anisotropyMode->GetValue() != videoSetting.setting.anisotropyMode->GetDefault()) + { + sections[videoSetting.json_section][videoSetting.json_key] = Settings::CanonicalizeEnum(videoSetting.setting.anisotropyMode->GetValue()); + } + break; + case SettingType::AstcRecompression: + if (videoSetting.setting.astcRecompression->GetValue() != videoSetting.setting.astcRecompression->GetDefault()) + { + sections[videoSetting.json_section][videoSetting.json_key] = Settings::CanonicalizeEnum(videoSetting.setting.astcRecompression->GetValue()); + } + break; + case SettingType::VramUsageMode: + if (videoSetting.setting.vramUsageMode->GetValue() != videoSetting.setting.vramUsageMode->GetDefault()) + { + sections[videoSetting.json_section][videoSetting.json_key] = Settings::CanonicalizeEnum(videoSetting.setting.vramUsageMode->GetValue()); + } + break; default: UNIMPLEMENTED(); } @@ -493,6 +623,15 @@ namespace setting.astcDecodeMode = val; } + VideoSetting::VideoSetting(const char* id, const char * section, const char * key, Settings::SwitchableSetting * val) : + identifier(id), + json_section(section), + json_key(key), + settingType(SettingType::VSyncMode) + { + setting.vSyncMode = val; + } + VideoSetting::VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val) : identifier(id), json_section(section), @@ -546,4 +685,40 @@ namespace { setting.antiAliasing = val; } + + VideoSetting::VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val) : + identifier(id), + json_section(section), + json_key(key), + settingType(SettingType::GpuAccuracy) + { + setting.gpuAccuracy = val; + } + + VideoSetting::VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val) : + identifier(id), + json_section(section), + json_key(key), + settingType(SettingType::AnisotropyMode) + { + setting.anisotropyMode = val; + } + + VideoSetting::VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val) : + identifier(id), + json_section(section), + json_key(key), + settingType(SettingType::AstcRecompression) + { + setting.astcRecompression = val; + } + + VideoSetting::VideoSetting(const char * id, const char * section, const char * key, Settings::SwitchableSetting * val) : + identifier(id), + json_section(section), + json_key(key), + settingType(SettingType::VramUsageMode) + { + setting.vramUsageMode = val; + } } \ No newline at end of file diff --git a/src/nxemu-video/video_settings_identifiers.h b/src/nxemu-video/video_settings_identifiers.h index 23a30ef5..ad93bdc3 100644 --- a/src/nxemu-video/video_settings_identifiers.h +++ b/src/nxemu-video/video_settings_identifiers.h @@ -8,6 +8,7 @@ namespace NXVideoSetting constexpr const char * UseDiskPipelineCache = "nxvideo:UseDiskPipelineCache"; constexpr const char * UseAsynchronousGPUEmulation = "nxvideo:UseAsynchronousGPUEmulation"; constexpr const char * AstcDecodeMode = "nxvideo:AstcDecodeMode"; + constexpr const char * VSyncMode = "nxvideo:VSyncMode"; constexpr const char * NvdecEmulation = "nxvideo:NvdecEmulation"; constexpr const char * FullscreenMode = "nxvideo:FullscreenMode"; constexpr const char * AspectRatio = "nxvideo:AspectRatio"; @@ -23,5 +24,9 @@ namespace NXVideoSetting constexpr const char * UseVulkanPipelineCache = "nxvideo:UseVulkanPipelineCache"; constexpr const char * SyncToFramerateOfVideoPlayback = "nxvideo:SyncToFramerateOfVideoPlayback"; constexpr const char * BarrierFeedbackLoops = "nxvideo:BarrierFeedbackLoops"; + constexpr const char * AccuracyLevel = "nxvideo:AccuracyLevel"; + constexpr const char * AnisotropicFiltering = "nxvideo:AnisotropicFiltering"; + constexpr const char * ASTCRecompressionMethod = "nxvideo:ASTCRecompressionMethod"; + constexpr const char * VRAMUsageMode = "nxvideo:VRAMUsageMode"; } // namespace NXVideoSetting \ No newline at end of file diff --git a/src/nxemu/main.cpp b/src/nxemu/main.cpp index ba20ad48..cdaefe1a 100644 --- a/src/nxemu/main.cpp +++ b/src/nxemu/main.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include void RegisterWidgets(ISciterUI & sciterUI) @@ -17,6 +18,7 @@ void RegisterWidgets(ISciterUI & sciterUI) Register_WidgetComboBox(sciterUI); Register_WidgetMenuBar(sciterUI); Register_WidgetPageNav(sciterUI); + Register_WidgetToolTipHost(sciterUI); } int WINAPI WinMain(_In_ HINSTANCE /*hInstance*/, _In_opt_ HINSTANCE /*hPrevInstance*/, _In_ LPSTR /*lpszArgs*/, _In_ int /*nWinMode*/) diff --git a/src/nxemu/user_interface/settings/system_config.cpp b/src/nxemu/user_interface/settings/system_config.cpp index 66b91922..5a9ee11f 100644 --- a/src/nxemu/user_interface/settings/system_config.cpp +++ b/src/nxemu/user_interface/settings/system_config.cpp @@ -321,8 +321,28 @@ void SystemConfig::InitializeTranslations() {(uint32_t)Settings::AntiAliasing::Fxaa, "FXAA"}, {(uint32_t)Settings::AntiAliasing::Smaa, "SMAA"}, }}); - - + m_settingTranslations.insert({ Settings::EnumMetadata::Index(), { + {(uint32_t)Settings::GpuAccuracy::Normal, "Normal"}, + {(uint32_t)Settings::GpuAccuracy::High, "High"}, + {(uint32_t)Settings::GpuAccuracy::Extreme, "Extreme"}, + }}); + m_settingTranslations.insert({ Settings::EnumMetadata::Index(), { + {(uint32_t)Settings::AnisotropyMode::Automatic, "Automatic"}, + {(uint32_t)Settings::AnisotropyMode::Default, "Default"}, + {(uint32_t)Settings::AnisotropyMode::X2, "2x"}, + {(uint32_t)Settings::AnisotropyMode::X4, "4x"}, + {(uint32_t)Settings::AnisotropyMode::X8, "8x"}, + {(uint32_t)Settings::AnisotropyMode::X16, "16x"}, + }}); + m_settingTranslations.insert({ Settings::EnumMetadata::Index(), { + {(uint32_t)Settings::AstcRecompression::Uncompressed, "Uncompressed (Best quality)"}, + {(uint32_t)Settings::AstcRecompression::Bc1, "BC1 (Low quality)"}, + {(uint32_t)Settings::AstcRecompression::Bc3, "BC3 (Medium quality)"}, + }}); + m_settingTranslations.insert({ Settings::EnumMetadata::Index(), { + {(uint32_t)Settings::VramUsageMode::Conservative, "Conservative"}, + {(uint32_t)Settings::VramUsageMode::Aggressive, "Aggressive"}, + }}); SettingTranslationList vulkanDeviceTranslations; for (size_t i = 0; i < m_vkDeviceRecords.size(); ++i) { diff --git a/src/nxemu/user_interface/settings/system_config_graphics.cpp b/src/nxemu/user_interface/settings/system_config_graphics.cpp index e3196e7f..a0bd54b5 100644 --- a/src/nxemu/user_interface/settings/system_config_graphics.cpp +++ b/src/nxemu/user_interface/settings/system_config_graphics.cpp @@ -3,6 +3,7 @@ #include "system_config.h" #include #include +#include #include #include @@ -15,6 +16,7 @@ namespace ConfigSetting(ConfigSetting::CheckBox, "UseDiskPipelineCache", NXVideoSetting::UseDiskPipelineCache), ConfigSetting(ConfigSetting::CheckBox, "UseAsynchronousGPUEmulation", NXVideoSetting::UseAsynchronousGPUEmulation), ConfigSetting(ConfigSetting::ComboBox, "AstcDecodeMode", Settings::EnumMetadata::Index(), NXVideoSetting::AstcDecodeMode), + ConfigSetting(ConfigSetting::ComboBox, "VSyncMode", Settings::EnumMetadata::Index(), NXVideoSetting::VSyncMode), ConfigSetting(ConfigSetting::ComboBox, "NvdecEmulation", Settings::EnumMetadata::Index(), NXVideoSetting::NvdecEmulation), ConfigSetting(ConfigSetting::ComboBox, "FullscreenMode", Settings::EnumMetadata::Index(), NXVideoSetting::FullscreenMode), ConfigSetting(ConfigSetting::ComboBox, "AspectRatio", Settings::EnumMetadata::Index(), NXVideoSetting::AspectRatio), @@ -25,6 +27,10 @@ namespace }; static ConfigSetting advancedSettings[] = { + ConfigSetting(ConfigSetting::ComboBox, "AccuracyLevel", Settings::EnumMetadata::Index(), NXVideoSetting::AccuracyLevel), + ConfigSetting(ConfigSetting::ComboBox, "AnisotropicFiltering", Settings::EnumMetadata::Index(), NXVideoSetting::AnisotropicFiltering), + ConfigSetting(ConfigSetting::ComboBox, "ASTCRecompressionMethod", Settings::EnumMetadata::Index(), NXVideoSetting::ASTCRecompressionMethod), + ConfigSetting(ConfigSetting::ComboBox, "VRAMUsageMode", Settings::EnumMetadata::Index(), NXVideoSetting::VRAMUsageMode), ConfigSetting(ConfigSetting::CheckBox, "EnableAsynchronousPresentation", NXVideoSetting::EnableAsynchronousPresentation), ConfigSetting(ConfigSetting::CheckBox, "ForceMaximumClocks", NXVideoSetting::ForceMaximumClocks), ConfigSetting(ConfigSetting::CheckBox, "EnableReactiveFlushing", NXVideoSetting::EnableReactiveFlushing), @@ -34,6 +40,29 @@ namespace ConfigSetting(ConfigSetting::CheckBox, "SyncToFramerateOfVideoPlayback", NXVideoSetting::SyncToFramerateOfVideoPlayback), ConfigSetting(ConfigSetting::CheckBox, "BarrierFeedbackLoops", NXVideoSetting::BarrierFeedbackLoops), }; + + Settings::RendererBackend RendererModeSelcted(ISciterUI & sciterUI, SciterElement & graphicsPage) + { + std::shared_ptr interfacePtr = graphicsPage ? sciterUI.GetElementInterface(graphicsPage.GetElementByID("GraphicsAPI"), IID_ICOMBOBOX) : nullptr; + if (!interfacePtr) + { + return Settings::RendererBackend::Null; + } + std::shared_ptr comboBox = std::static_pointer_cast(interfacePtr); + SciterElement element = comboBox->GetSelectedItem(); + if (!element) + { + return Settings::RendererBackend::Null; + } + std::string value = element.GetAttribute("value"); + if (value.empty()) + { + return Settings::RendererBackend::Null; + } + Settings::RendererBackend backend = (Settings::RendererBackend)std::stoi(value.c_str()); + return backend; + } + } SystemConfigGraphics::SystemConfigGraphics(ISciterUI & sciterUI, SystemConfig & config, HWINDOW parent, SciterElement page) : @@ -97,6 +126,7 @@ bool SystemConfigGraphics::OnStateChange(SCITER_ELEMENT elem, uint32_t /*eventRe if (m_graphicsPage && elem == m_graphicsPage.GetElementByID("GraphicsAPI")) { UpdateGraphicsAPI(); + UpdateVSyncMode(); } else if (m_graphicsPage && elem == m_graphicsPage.GetElementByID("FSPSharpness")) { @@ -117,48 +147,29 @@ void SystemConfigGraphics::SetupGraphicsPage(SciterElement page) m_config.SetupPage(page, graphicsSettings, sizeof(graphicsSettings) / sizeof(graphicsSettings[0])); m_sciterUI.AttachHandler(page.GetElementByID("GraphicsAPI"), IID_ISTATECHANGESINK, (IStateChangeSink*)this); UpdateGraphicsAPI(); + UpdateVSyncMode(); UpdateFSPSharpnessDisplay(); } void SystemConfigGraphics::UpdateGraphicsAPI() { - std::shared_ptr interfacePtr = m_graphicsPage ? m_sciterUI.GetElementInterface(m_graphicsPage.GetElementByID("GraphicsAPI"), IID_ICOMBOBOX) : nullptr; - if (!interfacePtr) - { - return; - } - std::shared_ptr comboBox = std::static_pointer_cast(interfacePtr); - SciterElement element = comboBox->GetSelectedItem(); - if (!element) - { - return; - } - std::string value = element.GetAttribute("value"); - if (value.empty()) - { - return; - } - SciterElement ShaderBackend = m_graphicsPage.GetElementByID("ShaderBackendRow"); SciterElement VulkanDevices = m_graphicsPage.GetElementByID("VulkanDevicesRow"); - SciterElement VSyncMode = m_graphicsPage.GetElementByID("VSyncMode"); - Settings::RendererBackend backend = (Settings::RendererBackend)std::stoi(value.c_str()); + Settings::RendererBackend backend = RendererModeSelcted(m_sciterUI, m_graphicsPage); + switch (backend) { case Settings::RendererBackend::OpenGL: ShaderBackend.SetStyleAttribute("display", "block"); VulkanDevices.SetStyleAttribute("display", "none"); - VSyncMode.RemoveAttribute("disabled"); break; case Settings::RendererBackend::Vulkan: ShaderBackend.SetStyleAttribute("display", "none"); VulkanDevices.SetStyleAttribute("display", "block"); - VSyncMode.RemoveAttribute("disabled"); break; case Settings::RendererBackend::Null: ShaderBackend.SetStyleAttribute("display", "none"); VulkanDevices.SetStyleAttribute("display", "none"); - VSyncMode.SetAttribute("disabled", ""); break; } } @@ -181,4 +192,84 @@ void SystemConfigGraphics::UpdateFSPSharpnessDisplay() fspSharpnessDisplay.SetHTML((const uint8_t*)text.c_str(), text.size()); } } +} + +void SystemConfigGraphics::UpdateVSyncMode() +{ + Settings::RendererBackend backend = RendererModeSelcted(m_sciterUI, m_graphicsPage); + SciterElement vsyncMode = m_graphicsPage.GetElementByID("VSyncMode"); + std::shared_ptr interfacePtr = m_graphicsPage ? m_sciterUI.GetElementInterface(vsyncMode, IID_ICOMBOBOX) : nullptr; + if (!interfacePtr) + { + return; + } + std::shared_ptr comboBox = std::static_pointer_cast(interfacePtr); + SciterElement currentItem = comboBox->GetSelectedItem(); + std::string currentValue; + if (currentItem) + { + currentValue = currentItem.GetAttribute("value"); + } + SettingsStore & settingsStore = SettingsStore::GetInstance(); + int32_t settingValue = settingsStore.GetInt(NXVideoSetting::VSyncMode); + int32_t defaultSettingValue = settingsStore.GetDefaultInt(NXVideoSetting::VSyncMode); + SciterElement element = comboBox->GetSelectedItem(); + if (element) + { + std::string value = element.GetAttribute("value"); + if (value.size() > 0) + { + settingValue = std::stoi(value.c_str()); + } + } + + std::vector> vsyncOptions; + + switch (backend) + { + case Settings::RendererBackend::OpenGL: + vsyncOptions.push_back({(int)Settings::VSyncMode::Immediate, "Off"}); + vsyncOptions.push_back({(int)Settings::VSyncMode::Fifo, "On"}); + break; + case Settings::RendererBackend::Vulkan: + vsyncOptions.push_back({ (int)Settings::VSyncMode::Immediate, "Immediate (VSync Off)" }); + vsyncOptions.push_back({ (int)Settings::VSyncMode::Mailbox, "Mailbox (Recommended)" }); + vsyncOptions.push_back({ (int)Settings::VSyncMode::Fifo, "FIFO (VSync On)" }); + vsyncOptions.push_back({ (int)Settings::VSyncMode::FifoRelaxed, "FIFO Relaxed" }); + break; + case Settings::RendererBackend::Null: + break; + } + comboBox->ClearContents(); + int32_t selectedIndex = -1, defaultSelectedIndex = -1; + if (vsyncOptions.size() > 0) + { + vsyncMode.RemoveAttribute("disabled"); + } + else + { + vsyncMode.SetAttribute("disabled", ""); + } + + for (size_t i = 0; i < vsyncOptions.size(); i++) + { + int32_t index = comboBox->AddItem(vsyncOptions[i].second.c_str(), stdstr_f("%d", vsyncOptions[i].first).c_str()); + if (settingValue == vsyncOptions[i].first) + { + selectedIndex = index; + } + if (defaultSettingValue == vsyncOptions[i].first) + { + defaultSelectedIndex = index; + } + + } + if (selectedIndex >= 0) + { + comboBox->SelectItem(selectedIndex); + } + else if (defaultSelectedIndex >= 0) + { + comboBox->SelectItem(defaultSelectedIndex); + } } \ No newline at end of file diff --git a/src/nxemu/user_interface/settings/system_config_graphics.h b/src/nxemu/user_interface/settings/system_config_graphics.h index 2dc2bb8c..fbf5cd57 100644 --- a/src/nxemu/user_interface/settings/system_config_graphics.h +++ b/src/nxemu/user_interface/settings/system_config_graphics.h @@ -34,6 +34,7 @@ private: void SetupGraphicsPage(SciterElement page); void UpdateGraphicsAPI(); void UpdateFSPSharpnessDisplay(); + void UpdateVSyncMode(); ISciterUI & m_sciterUI; SystemConfig & m_config;