diff options
| author | bunnei <bunneidev@gmail.com> | 2021-11-16 18:52:11 -0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-16 18:52:11 -0800 | 
| commit | 71313509f75aeafe425e531824d1faa9e7c0a40b (patch) | |
| tree | cb1df371d288677fcede6a3409eb079e0d278163 /src/common | |
| parent | 3154773c000ca9c40a217a7de55ad62d4c110e2b (diff) | |
| parent | 1c8a3d8d2916e8d43808c9b4e75c756f162890e8 (diff) | |
Merge pull request #7219 from FernandoS27/aristotles-right-testicle
Project A.R.T. Advanced Rendering Techniques
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/math_util.h | 4 | ||||
| -rw-r--r-- | src/common/settings.cpp | 53 | ||||
| -rw-r--r-- | src/common/settings.h | 59 | 
3 files changed, 111 insertions, 5 deletions
| diff --git a/src/common/math_util.h b/src/common/math_util.h index 4c38d8040..510c4e56d 100644 --- a/src/common/math_util.h +++ b/src/common/math_util.h @@ -48,8 +48,8 @@ struct Rectangle {      }      [[nodiscard]] Rectangle<T> Scale(const float s) const { -        return Rectangle{left, top, static_cast<T>(left + GetWidth() * s), -                         static_cast<T>(top + GetHeight() * s)}; +        return Rectangle{left, top, static_cast<T>(static_cast<float>(left + GetWidth()) * s), +                         static_cast<T>(static_cast<float>(top + GetHeight()) * s)};      }  }; diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 9dd5e3efb..3bcaa072f 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -47,7 +47,9 @@ void LogSettings() {      log_setting("System_TimeZoneIndex", values.time_zone_index.GetValue());      log_setting("Core_UseMultiCore", values.use_multi_core.GetValue());      log_setting("CPU_Accuracy", values.cpu_accuracy.GetValue()); -    log_setting("Renderer_UseResolutionFactor", values.resolution_factor.GetValue()); +    log_setting("Renderer_UseResolutionScaling", values.resolution_setup.GetValue()); +    log_setting("Renderer_ScalingFilter", values.scaling_filter.GetValue()); +    log_setting("Renderer_AntiAliasing", values.anti_aliasing.GetValue());      log_setting("Renderer_UseSpeedLimit", values.use_speed_limit.GetValue());      log_setting("Renderer_SpeedLimit", values.speed_limit.GetValue());      log_setting("Renderer_UseDiskShaderCache", values.use_disk_shader_cache.GetValue()); @@ -105,6 +107,55 @@ float Volume() {      return values.volume.GetValue() / 100.0f;  } +void UpdateRescalingInfo() { +    const auto setup = values.resolution_setup.GetValue(); +    auto& info = values.resolution_info; +    info.downscale = false; +    switch (setup) { +    case ResolutionSetup::Res1_2X: +        info.up_scale = 1; +        info.down_shift = 1; +        info.downscale = true; +        break; +    case ResolutionSetup::Res3_4X: +        info.up_scale = 3; +        info.down_shift = 2; +        info.downscale = true; +        break; +    case ResolutionSetup::Res1X: +        info.up_scale = 1; +        info.down_shift = 0; +        break; +    case ResolutionSetup::Res2X: +        info.up_scale = 2; +        info.down_shift = 0; +        break; +    case ResolutionSetup::Res3X: +        info.up_scale = 3; +        info.down_shift = 0; +        break; +    case ResolutionSetup::Res4X: +        info.up_scale = 4; +        info.down_shift = 0; +        break; +    case ResolutionSetup::Res5X: +        info.up_scale = 5; +        info.down_shift = 0; +        break; +    case ResolutionSetup::Res6X: +        info.up_scale = 6; +        info.down_shift = 0; +        break; +    default: +        UNREACHABLE(); +        info.up_scale = 1; +        info.down_shift = 0; +    } +    info.up_factor = static_cast<f32>(info.up_scale) / (1U << info.down_shift); +    info.down_factor = static_cast<f32>(1U << info.down_shift) / info.up_scale; +    info.active = info.up_scale != 1 || info.down_shift != 0; +} +  void RestoreGlobalState(bool is_powered_on) {      // If a game is running, DO NOT restore the global settings state      if (is_powered_on) { diff --git a/src/common/settings.h b/src/common/settings.h index 9ff4cf85d..42f8b4a7d 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -52,6 +52,56 @@ enum class NvdecEmulation : u32 {      GPU = 2,  }; +enum class ResolutionSetup : u32 { +    Res1_2X = 0, +    Res3_4X = 1, +    Res1X = 2, +    Res2X = 3, +    Res3X = 4, +    Res4X = 5, +    Res5X = 6, +    Res6X = 7, +}; + +enum class ScalingFilter : u32 { +    NearestNeighbor = 0, +    Bilinear = 1, +    Bicubic = 2, +    Gaussian = 3, +    ScaleForce = 4, +    Fsr = 5, +    LastFilter = Fsr, +}; + +enum class AntiAliasing : u32 { +    None = 0, +    Fxaa = 1, +    LastAA = Fxaa, +}; + +struct ResolutionScalingInfo { +    u32 up_scale{1}; +    u32 down_shift{0}; +    f32 up_factor{1.0f}; +    f32 down_factor{1.0f}; +    bool active{}; +    bool downscale{}; + +    s32 ScaleUp(s32 value) const { +        if (value == 0) { +            return 0; +        } +        return std::max((value * static_cast<s32>(up_scale)) >> static_cast<s32>(down_shift), 1); +    } + +    u32 ScaleUp(u32 value) const { +        if (value == 0U) { +            return 0U; +        } +        return std::max((value * up_scale) >> down_shift, 1U); +    } +}; +  /** The BasicSetting class is a simple resource manager. It defines a label and default value   * alongside the actual value of the setting for simpler and less-error prone use with frontend   * configurations. Setting a default value and label is required, though subclasses may deviate from @@ -451,7 +501,10 @@ struct Values {                                                           "disable_shader_loop_safety_checks"};      Setting<int> vulkan_device{0, "vulkan_device"}; -    Setting<u16> resolution_factor{1, "resolution_factor"}; +    ResolutionScalingInfo resolution_info{}; +    Setting<ResolutionSetup> resolution_setup{ResolutionSetup::Res1X, "resolution_setup"}; +    Setting<ScalingFilter> scaling_filter{ScalingFilter::Bilinear, "scaling_filter"}; +    Setting<AntiAliasing> anti_aliasing{AntiAliasing::None, "anti_aliasing"};      // *nix platforms may have issues with the borderless windowed fullscreen mode.      // Default to exclusive fullscreen on these platforms for now.      RangedSetting<FullscreenMode> fullscreen_mode{ @@ -462,7 +515,7 @@ struct Values {  #endif          FullscreenMode::Borderless, FullscreenMode::Exclusive, "fullscreen_mode"};      RangedSetting<int> aspect_ratio{0, 0, 3, "aspect_ratio"}; -    RangedSetting<int> max_anisotropy{0, 0, 4, "max_anisotropy"}; +    RangedSetting<int> max_anisotropy{0, 0, 5, "max_anisotropy"};      Setting<bool> use_speed_limit{true, "use_speed_limit"};      RangedSetting<u16> speed_limit{100, 0, 9999, "speed_limit"};      Setting<bool> use_disk_shader_cache{true, "use_disk_shader_cache"}; @@ -595,6 +648,8 @@ std::string GetTimeZoneString();  void LogSettings(); +void UpdateRescalingInfo(); +  // Restore the global state of all applicable settings in the Values struct  void RestoreGlobalState(bool is_powered_on); | 
