Просмотр исходного кода

video_core: Option to apply anisotropic filtering for all mipmap modes

Wollnashorn 3 лет назад
Родитель
Сommit
0eacf547c0

+ 1 - 0
src/common/settings.cpp

@@ -236,6 +236,7 @@ void RestoreGlobalState(bool is_powered_on) {
     values.bg_blue.SetGlobal(true);
     values.bg_blue.SetGlobal(true);
     values.enable_compute_pipelines.SetGlobal(true);
     values.enable_compute_pipelines.SetGlobal(true);
     values.use_video_framerate.SetGlobal(true);
     values.use_video_framerate.SetGlobal(true);
+    values.use_aggressive_anisotropic_filtering.SetGlobal(true);
 
 
     // System
     // System
     values.language_index.SetGlobal(true);
     values.language_index.SetGlobal(true);

+ 2 - 0
src/common/settings.h

@@ -483,6 +483,8 @@ struct Values {
         AstcRecompression::Uncompressed, AstcRecompression::Uncompressed, AstcRecompression::Bc3,
         AstcRecompression::Uncompressed, AstcRecompression::Uncompressed, AstcRecompression::Bc3,
         "astc_recompression"};
         "astc_recompression"};
     SwitchableSetting<bool> use_video_framerate{false, "use_video_framerate"};
     SwitchableSetting<bool> use_video_framerate{false, "use_video_framerate"};
+    SwitchableSetting<bool> use_aggressive_anisotropic_filtering{
+        false, "use_aggressive_anisotropic_filtering"};
 
 
     SwitchableSetting<u8> bg_red{0, "bg_red"};
     SwitchableSetting<u8> bg_red{0, "bg_red"};
     SwitchableSetting<u8> bg_green{0, "bg_green"};
     SwitchableSetting<u8> bg_green{0, "bg_green"};

+ 2 - 1
src/video_core/textures/texture.cpp

@@ -62,7 +62,8 @@ std::array<float, 4> TSCEntry::BorderColor() const noexcept {
 }
 }
 
 
 float TSCEntry::MaxAnisotropy() const noexcept {
 float TSCEntry::MaxAnisotropy() const noexcept {
-    if (max_anisotropy == 0 && mipmap_filter != TextureMipmapFilter::Linear) {
+    if (max_anisotropy == 0 && (mipmap_filter != TextureMipmapFilter::Linear &&
+                                !Settings::values.use_aggressive_anisotropic_filtering)) {
         return 1.0f;
         return 1.0f;
     }
     }
     const auto anisotropic_settings = Settings::values.max_anisotropy.GetValue();
     const auto anisotropic_settings = Settings::values.max_anisotropy.GetValue();

+ 2 - 0
src/yuzu/configuration/config.cpp

@@ -761,6 +761,7 @@ void Config::ReadRendererValues() {
     ReadGlobalSetting(Settings::values.use_vulkan_driver_pipeline_cache);
     ReadGlobalSetting(Settings::values.use_vulkan_driver_pipeline_cache);
     ReadGlobalSetting(Settings::values.enable_compute_pipelines);
     ReadGlobalSetting(Settings::values.enable_compute_pipelines);
     ReadGlobalSetting(Settings::values.use_video_framerate);
     ReadGlobalSetting(Settings::values.use_video_framerate);
+    ReadGlobalSetting(Settings::values.use_aggressive_anisotropic_filtering);
     ReadGlobalSetting(Settings::values.bg_red);
     ReadGlobalSetting(Settings::values.bg_red);
     ReadGlobalSetting(Settings::values.bg_green);
     ReadGlobalSetting(Settings::values.bg_green);
     ReadGlobalSetting(Settings::values.bg_blue);
     ReadGlobalSetting(Settings::values.bg_blue);
@@ -1417,6 +1418,7 @@ void Config::SaveRendererValues() {
     WriteGlobalSetting(Settings::values.use_vulkan_driver_pipeline_cache);
     WriteGlobalSetting(Settings::values.use_vulkan_driver_pipeline_cache);
     WriteGlobalSetting(Settings::values.enable_compute_pipelines);
     WriteGlobalSetting(Settings::values.enable_compute_pipelines);
     WriteGlobalSetting(Settings::values.use_video_framerate);
     WriteGlobalSetting(Settings::values.use_video_framerate);
+    WriteGlobalSetting(Settings::values.use_aggressive_anisotropic_filtering);
     WriteGlobalSetting(Settings::values.bg_red);
     WriteGlobalSetting(Settings::values.bg_red);
     WriteGlobalSetting(Settings::values.bg_green);
     WriteGlobalSetting(Settings::values.bg_green);
     WriteGlobalSetting(Settings::values.bg_blue);
     WriteGlobalSetting(Settings::values.bg_blue);

+ 11 - 0
src/yuzu/configuration/configure_graphics_advanced.cpp

@@ -31,6 +31,7 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {
     ui->use_asynchronous_shaders->setEnabled(runtime_lock);
     ui->use_asynchronous_shaders->setEnabled(runtime_lock);
     ui->anisotropic_filtering_combobox->setEnabled(runtime_lock);
     ui->anisotropic_filtering_combobox->setEnabled(runtime_lock);
     ui->enable_compute_pipelines_checkbox->setEnabled(runtime_lock);
     ui->enable_compute_pipelines_checkbox->setEnabled(runtime_lock);
+    ui->use_aggressive_anisotropic_filtering->setEnabled(runtime_lock);
 
 
     ui->async_present->setChecked(Settings::values.async_presentation.GetValue());
     ui->async_present->setChecked(Settings::values.async_presentation.GetValue());
     ui->renderer_force_max_clock->setChecked(Settings::values.renderer_force_max_clock.GetValue());
     ui->renderer_force_max_clock->setChecked(Settings::values.renderer_force_max_clock.GetValue());
@@ -43,6 +44,8 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {
     ui->enable_compute_pipelines_checkbox->setChecked(
     ui->enable_compute_pipelines_checkbox->setChecked(
         Settings::values.enable_compute_pipelines.GetValue());
         Settings::values.enable_compute_pipelines.GetValue());
     ui->use_video_framerate_checkbox->setChecked(Settings::values.use_video_framerate.GetValue());
     ui->use_video_framerate_checkbox->setChecked(Settings::values.use_video_framerate.GetValue());
+    ui->use_aggressive_anisotropic_filtering->setChecked(
+        Settings::values.use_aggressive_anisotropic_filtering.GetValue());
 
 
     if (Settings::IsConfiguringGlobal()) {
     if (Settings::IsConfiguringGlobal()) {
         ui->gpu_accuracy->setCurrentIndex(
         ui->gpu_accuracy->setCurrentIndex(
@@ -94,6 +97,9 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {
                                              enable_compute_pipelines);
                                              enable_compute_pipelines);
     ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_video_framerate,
     ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_video_framerate,
                                              ui->use_video_framerate_checkbox, use_video_framerate);
                                              ui->use_video_framerate_checkbox, use_video_framerate);
+    ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_aggressive_anisotropic_filtering,
+                                             ui->use_aggressive_anisotropic_filtering,
+                                             use_aggressive_anisotropic_filtering);
 }
 }
 
 
 void ConfigureGraphicsAdvanced::changeEvent(QEvent* event) {
 void ConfigureGraphicsAdvanced::changeEvent(QEvent* event) {
@@ -130,6 +136,8 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {
             Settings::values.enable_compute_pipelines.UsingGlobal());
             Settings::values.enable_compute_pipelines.UsingGlobal());
         ui->use_video_framerate_checkbox->setEnabled(
         ui->use_video_framerate_checkbox->setEnabled(
             Settings::values.use_video_framerate.UsingGlobal());
             Settings::values.use_video_framerate.UsingGlobal());
+        ui->use_aggressive_anisotropic_filtering->setEnabled(
+            Settings::values.use_aggressive_anisotropic_filtering.UsingGlobal());
 
 
         return;
         return;
     }
     }
@@ -157,6 +165,9 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {
     ConfigurationShared::SetColoredTristate(ui->use_video_framerate_checkbox,
     ConfigurationShared::SetColoredTristate(ui->use_video_framerate_checkbox,
                                             Settings::values.use_video_framerate,
                                             Settings::values.use_video_framerate,
                                             use_video_framerate);
                                             use_video_framerate);
+    ConfigurationShared::SetColoredTristate(ui->use_aggressive_anisotropic_filtering,
+                                            Settings::values.use_aggressive_anisotropic_filtering,
+                                            use_aggressive_anisotropic_filtering);
     ConfigurationShared::SetColoredComboBox(
     ConfigurationShared::SetColoredComboBox(
         ui->gpu_accuracy, ui->label_gpu_accuracy,
         ui->gpu_accuracy, ui->label_gpu_accuracy,
         static_cast<int>(Settings::values.gpu_accuracy.GetValue(true)));
         static_cast<int>(Settings::values.gpu_accuracy.GetValue(true)));

+ 1 - 0
src/yuzu/configuration/configure_graphics_advanced.h

@@ -48,6 +48,7 @@ private:
     ConfigurationShared::CheckState use_vulkan_driver_pipeline_cache;
     ConfigurationShared::CheckState use_vulkan_driver_pipeline_cache;
     ConfigurationShared::CheckState enable_compute_pipelines;
     ConfigurationShared::CheckState enable_compute_pipelines;
     ConfigurationShared::CheckState use_video_framerate;
     ConfigurationShared::CheckState use_video_framerate;
+    ConfigurationShared::CheckState use_aggressive_anisotropic_filtering;
 
 
     const Core::System& system;
     const Core::System& system;
 };
 };

+ 13 - 0
src/yuzu/configuration/configure_graphics_advanced.ui

@@ -260,6 +260,19 @@ Compute pipelines are always enabled on all other drivers.</string>
           </layout>
           </layout>
          </widget>
          </widget>
         </item>
         </item>
+        <item>
+         <widget class="QCheckBox" name="use_aggressive_anisotropic_filtering">
+          <property name="toolTip">
+           <string>Enable this option for a more aggressive approach to applying Anisotropic Filtering to textures.
+By toggling this, Anisotropic Filtering is added to textures with both nearest and linear mipmapping modes.
+This may result in improved visual quality for a wider range of textures, but can also introduce artifacts in
+some titles.</string>
+          </property>
+          <property name="text">
+           <string>Apply Anisotropic Filtering for all mipmap modes</string>
+          </property>
+         </widget>
+        </item>
        </layout>
        </layout>
       </widget>
       </widget>
      </item>
      </item>

+ 1 - 0
src/yuzu_cmd/config.cpp

@@ -321,6 +321,7 @@ void Config::ReadValues() {
     ReadSetting("Renderer", Settings::values.astc_recompression);
     ReadSetting("Renderer", Settings::values.astc_recompression);
     ReadSetting("Renderer", Settings::values.use_fast_gpu_time);
     ReadSetting("Renderer", Settings::values.use_fast_gpu_time);
     ReadSetting("Renderer", Settings::values.use_vulkan_driver_pipeline_cache);
     ReadSetting("Renderer", Settings::values.use_vulkan_driver_pipeline_cache);
+    ReadSetting("Renderer", Settings::values.use_aggressive_anisotropic_filtering);
 
 
     ReadSetting("Renderer", Settings::values.bg_red);
     ReadSetting("Renderer", Settings::values.bg_red);
     ReadSetting("Renderer", Settings::values.bg_green);
     ReadSetting("Renderer", Settings::values.bg_green);

+ 4 - 0
src/yuzu_cmd/default_ini.h

@@ -325,6 +325,10 @@ aspect_ratio =
 # 0: Default, 1: 2x, 2: 4x, 3: 8x, 4: 16x
 # 0: Default, 1: 2x, 2: 4x, 3: 8x, 4: 16x
 max_anisotropy =
 max_anisotropy =
 
 
+# Apply Anisotropic Filtering to all mipmap modes.
+# 0 (default): Off, 1: On
+use_aggressive_anisotropic_filtering =
+
 # Whether to enable VSync or not.
 # Whether to enable VSync or not.
 # OpenGL: Values other than 0 enable VSync
 # OpenGL: Values other than 0 enable VSync
 # Vulkan: FIFO is selected if the requested mode is not supported by the driver.
 # Vulkan: FIFO is selected if the requested mode is not supported by the driver.