From 394ee0dc827c7f1d927f5a3f32f802b07b267fad Mon Sep 17 00:00:00 2001 From: wildcard Date: Fri, 15 Aug 2025 01:17:38 +0200 Subject: [PATCH] [Vk] FixSampleShading (#218) Co-authored-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/218 Co-authored-by: wildcard Co-committed-by: wildcard --- .../yuzu_emu/features/settings/model/IntSetting.kt | 3 ++- .../features/settings/model/view/SettingsItem.kt | 8 ++++++++ .../settings/ui/SettingsFragmentPresenter.kt | 1 + src/android/app/src/main/res/values/strings.xml | 2 ++ src/common/settings.h | 12 +++++++++++- .../renderer_vulkan/vk_graphics_pipeline.cpp | 2 +- .../configuration/configure_graphics_extensions.cpp | 11 ++++++++++- src/yuzu/configuration/shared_translation.cpp | 4 +++- 8 files changed, 38 insertions(+), 5 deletions(-) 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 02950484ac..d53aa46265 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 @@ -39,6 +39,7 @@ enum class IntSetting(override val key: String) : AbstractIntSetting { SOC_OVERLAY_POSITION("soc_overlay_position"), MEMORY_LAYOUT("memory_layout_mode"), FSR_SHARPENING_SLIDER("fsr_sharpening_slider"), + RENDERER_SAMPLE_SHADING_FRACTION("sample_shading_fraction"), FAST_CPU_TIME("fast_cpu_time"), CPU_TICKS("cpu_ticks"), FAST_GPU_TIME("fast_gpu_time"), @@ -57,7 +58,7 @@ enum class IntSetting(override val key: String) : AbstractIntSetting { OFFLINE_WEB_APPLET("offline_web_applet_mode"), LOGIN_SHARE_APPLET("login_share_applet_mode"), WIFI_WEB_AUTH_APPLET("wifi_web_auth_applet_mode"), - MY_PAGE_APPLET("my_page_applet_mode") + MY_PAGE_APPLET("my_page_applet_mode"), ; override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal) 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 13dd32fcdd..73834c1184 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 @@ -159,6 +159,14 @@ abstract class SettingsItem( descriptionId = R.string.sample_shading_description ) ) + put( + SliderSetting( + IntSetting.RENDERER_SAMPLE_SHADING_FRACTION, + titleId = R.string.sample_shading_fraction, + descriptionId = R.string.sample_shading_fraction_description, + units = "%" + ) + ) put( SliderSetting( ShortSetting.RENDERER_SPEED_LIMIT, 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 f4b6f1b4ed..28411309e6 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 @@ -443,6 +443,7 @@ class SettingsFragmentPresenter( add(BooleanSetting.RENDERER_PROVOKING_VERTEX.key) add(BooleanSetting.RENDERER_DESCRIPTOR_INDEXING.key) add(BooleanSetting.RENDERER_SAMPLE_SHADING.key) + add(IntSetting.RENDERER_SAMPLE_SHADING_FRACTION.key) add(HeaderSetting(R.string.veil_renderer)) add(BooleanSetting.ENABLE_RAII.key) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 0c67e66510..d649ba08ac 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -82,6 +82,8 @@ 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. Only Vulkan 1.1+ devices support this extension. + Sample Shading Fraction + The intensity of the sample shading pass. Higher values improve quality more but also reduce performance to a greater extent. Renderer RAII diff --git a/src/common/settings.h b/src/common/settings.h index 41c042bcf1..faf7210f5d 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -527,7 +527,17 @@ struct Values { SwitchableSetting provoking_vertex{linkage, false, "provoking_vertex", Category::RendererExtensions}; SwitchableSetting descriptor_indexing{linkage, false, "descriptor_indexing", Category::RendererExtensions}; - SwitchableSetting sample_shading{linkage, false, "sample_shading", Category::RendererExtensions}; + SwitchableSetting sample_shading{linkage, false, "sample_shading", Category::RendererExtensions, Specialization::Paired}; + SwitchableSetting sample_shading_fraction{linkage, + 50, + 0, + 100, + "sample_shading_fraction", + Category::RendererExtensions, + Specialization::Scalar, + true, + false, + &sample_shading}; Setting renderer_debug{linkage, false, "debug", Category::RendererDebug}; Setting renderer_shader_feedback{linkage, false, "shader_feedback", diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 6381483790..0226eb2c14 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -743,7 +743,7 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { .flags = 0, .rasterizationSamples = MaxwellToVK::MsaaMode(key.state.msaa_mode), .sampleShadingEnable = Settings::values.sample_shading.GetValue() ? VK_TRUE : VK_FALSE, - .minSampleShading = 0.0f, + .minSampleShading = static_cast(Settings::values.sample_shading_fraction.GetValue()) / 100.0f, .pSampleMask = nullptr, .alphaToCoverageEnable = key.state.alpha_to_coverage_enabled != 0 ? VK_TRUE : VK_FALSE, .alphaToOneEnable = key.state.alpha_to_one_enabled != 0 ? VK_TRUE : VK_FALSE, diff --git a/src/yuzu/configuration/configure_graphics_extensions.cpp b/src/yuzu/configuration/configure_graphics_extensions.cpp index 61491c0ab7..c8dee6b073 100644 --- a/src/yuzu/configuration/configure_graphics_extensions.cpp +++ b/src/yuzu/configuration/configure_graphics_extensions.cpp @@ -36,7 +36,16 @@ void ConfigureGraphicsExtensions::Setup(const ConfigurationShared::Builder& buil for (auto setting : Settings::values.linkage.by_category[Settings::Category::RendererExtensions]) { - ConfigurationShared::Widget* widget = builder.BuildWidget(setting, apply_funcs); + ConfigurationShared::Widget* widget = [&]() { + if (setting->Id() == Settings::values.sample_shading_fraction.Id()) { + // TODO(crueter): should support this natively perhaps? + return builder.BuildWidget( + setting, apply_funcs, ConfigurationShared::RequestType::Slider, true, + 1.0f, nullptr, tr("%", "Sample Shading percentage (e.g. 50%)")); + } else { + return builder.BuildWidget(setting, apply_funcs); + } + }(); if (widget == nullptr) { continue; diff --git a/src/yuzu/configuration/shared_translation.cpp b/src/yuzu/configuration/shared_translation.cpp index 770a16a481..22f1921dbf 100644 --- a/src/yuzu/configuration/shared_translation.cpp +++ b/src/yuzu/configuration/shared_translation.cpp @@ -360,8 +360,10 @@ std::unique_ptr InitializeTranslations(QWidget* parent) 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, QString(), QString()); + INSERT(Settings, - sample_shading, + sample_shading_fraction, tr("Sample Shading"), tr("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.\n"