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 08bb8a1334..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 = Settings::values.sample_shading.GetValue() ? 1.0f : 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"