diff options
| -rw-r--r-- | src/common/input.h | 3 | ||||
| -rw-r--r-- | src/core/hid/emulated_controller.cpp | 10 | ||||
| -rw-r--r-- | src/input_common/helpers/stick_from_buttons.cpp | 17 | ||||
| -rw-r--r-- | src/input_common/main.cpp | 26 | ||||
| -rw-r--r-- | src/shader_recompiler/frontend/maxwell/translate_program.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 20 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 2 | 
11 files changed, 72 insertions, 24 deletions
| diff --git a/src/common/input.h b/src/common/input.h index fc14fd7bf..d27b1d772 100644 --- a/src/common/input.h +++ b/src/common/input.h @@ -292,9 +292,6 @@ class InputDevice {  public:      virtual ~InputDevice() = default; -    // Request input device to update if necessary -    virtual void SoftUpdate() {} -      // Force input device to update data regardless of the current state      virtual void ForceUpdate() {} diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp index 71364c323..7a01f3f4c 100644 --- a/src/core/hid/emulated_controller.cpp +++ b/src/core/hid/emulated_controller.cpp @@ -1434,16 +1434,6 @@ AnalogSticks EmulatedController::GetSticks() const {          return {};      } -    // Some drivers like stick from buttons need constant refreshing -    for (auto& device : stick_devices) { -        if (!device) { -            continue; -        } -        lock.unlock(); -        device->SoftUpdate(); -        lock.lock(); -    } -      return controller.analog_stick_state;  } diff --git a/src/input_common/helpers/stick_from_buttons.cpp b/src/input_common/helpers/stick_from_buttons.cpp index 82aa6ac2f..f3a0b3419 100644 --- a/src/input_common/helpers/stick_from_buttons.cpp +++ b/src/input_common/helpers/stick_from_buttons.cpp @@ -13,11 +13,11 @@ class Stick final : public Common::Input::InputDevice {  public:      using Button = std::unique_ptr<Common::Input::InputDevice>; -    Stick(Button up_, Button down_, Button left_, Button right_, Button modifier_, +    Stick(Button up_, Button down_, Button left_, Button right_, Button modifier_, Button updater_,            float modifier_scale_, float modifier_angle_)          : up(std::move(up_)), down(std::move(down_)), left(std::move(left_)), -          right(std::move(right_)), modifier(std::move(modifier_)), modifier_scale(modifier_scale_), -          modifier_angle(modifier_angle_) { +          right(std::move(right_)), modifier(std::move(modifier_)), updater(std::move(updater_)), +          modifier_scale(modifier_scale_), modifier_angle(modifier_angle_) {          up->SetCallback({              .on_change =                  [this](const Common::Input::CallbackStatus& callback_) { @@ -48,6 +48,9 @@ public:                      UpdateModButtonStatus(callback_);                  },          }); +        updater->SetCallback({ +            .on_change = [this](const Common::Input::CallbackStatus& callback_) { SoftUpdate(); }, +        });          last_x_axis_value = 0.0f;          last_y_axis_value = 0.0f;      } @@ -248,7 +251,7 @@ public:          modifier->ForceUpdate();      } -    void SoftUpdate() override { +    void SoftUpdate() {          Common::Input::CallbackStatus status{              .type = Common::Input::InputType::Stick,              .stick_status = GetStatus(), @@ -308,6 +311,7 @@ private:      Button left;      Button right;      Button modifier; +    Button updater;      float modifier_scale{};      float modifier_angle{};      float angle{}; @@ -331,11 +335,12 @@ std::unique_ptr<Common::Input::InputDevice> StickFromButton::Create(      auto left = Common::Input::CreateInputDeviceFromString(params.Get("left", null_engine));      auto right = Common::Input::CreateInputDeviceFromString(params.Get("right", null_engine));      auto modifier = Common::Input::CreateInputDeviceFromString(params.Get("modifier", null_engine)); +    auto updater = Common::Input::CreateInputDeviceFromString("engine:updater,button:0");      auto modifier_scale = params.Get("modifier_scale", 0.5f);      auto modifier_angle = params.Get("modifier_angle", 5.5f);      return std::make_unique<Stick>(std::move(up), std::move(down), std::move(left), -                                   std::move(right), std::move(modifier), modifier_scale, -                                   modifier_angle); +                                   std::move(right), std::move(modifier), std::move(updater), +                                   modifier_scale, modifier_angle);  }  } // namespace InputCommon diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp index 4dc92f482..e0b2131ed 100644 --- a/src/input_common/main.cpp +++ b/src/input_common/main.cpp @@ -28,6 +28,28 @@  namespace InputCommon { +/// Dummy engine to get periodic updates +class UpdateEngine final : public InputEngine { +public: +    explicit UpdateEngine(std::string input_engine_) : InputEngine(std::move(input_engine_)) { +        PreSetController(identifier); +    } + +    void PumpEvents() { +        SetButton(identifier, 0, last_state); +        last_state = !last_state; +    } + +private: +    static constexpr PadIdentifier identifier = { +        .guid = Common::UUID{}, +        .port = 0, +        .pad = 0, +    }; + +    bool last_state{}; +}; +  struct InputSubsystem::Impl {      template <typename Engine>      void RegisterEngine(std::string name, std::shared_ptr<Engine>& engine) { @@ -45,6 +67,7 @@ struct InputSubsystem::Impl {      void Initialize() {          mapping_factory = std::make_shared<MappingFactory>(); +        RegisterEngine("updater", update_engine);          RegisterEngine("keyboard", keyboard);          RegisterEngine("mouse", mouse);          RegisterEngine("touch", touch_screen); @@ -74,6 +97,7 @@ struct InputSubsystem::Impl {      }      void Shutdown() { +        UnregisterEngine(update_engine);          UnregisterEngine(keyboard);          UnregisterEngine(mouse);          UnregisterEngine(touch_screen); @@ -252,6 +276,7 @@ struct InputSubsystem::Impl {      }      void PumpEvents() const { +        update_engine->PumpEvents();  #ifdef HAVE_SDL2          sdl->PumpEvents();  #endif @@ -263,6 +288,7 @@ struct InputSubsystem::Impl {      std::shared_ptr<MappingFactory> mapping_factory; +    std::shared_ptr<UpdateEngine> update_engine;      std::shared_ptr<Keyboard> keyboard;      std::shared_ptr<Mouse> mouse;      std::shared_ptr<TouchScreen> touch_screen; diff --git a/src/shader_recompiler/frontend/maxwell/translate_program.cpp b/src/shader_recompiler/frontend/maxwell/translate_program.cpp index a3b99e24d..a42453e90 100644 --- a/src/shader_recompiler/frontend/maxwell/translate_program.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate_program.cpp @@ -259,7 +259,7 @@ IR::Program TranslateProgram(ObjectPool<IR::Inst>& inst_pool, ObjectPool<IR::Blo          program.is_geometry_passthrough = sph.common0.geometry_passthrough != 0;          if (program.is_geometry_passthrough) {              const auto& mask{env.GpPassthroughMask()}; -            for (size_t i = 0; i < program.info.passthrough.mask.size(); ++i) { +            for (size_t i = 0; i < mask.size() * 32; ++i) {                  program.info.passthrough.mask[i] = ((mask[i / 32] >> (i % 32)) & 1) == 0;              } diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 7d48af8e1..181857d9c 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -139,6 +139,7 @@ void RasterizerOpenGL::LoadDiskResources(u64 title_id, std::stop_token stop_load  void RasterizerOpenGL::Clear(u32 layer_count) {      MICROPROFILE_SCOPE(OpenGL_Clears); +    gpu_memory->FlushCaching();      const auto& regs = maxwell3d->regs;      bool use_color{};      bool use_depth{}; @@ -207,6 +208,7 @@ void RasterizerOpenGL::PrepareDraw(bool is_indexed, Func&& draw_func) {      MICROPROFILE_SCOPE(OpenGL_Drawing);      SCOPE_EXIT({ gpu.TickWork(); }); +    gpu_memory->FlushCaching();      query_cache.UpdateCounters();      GraphicsPipeline* const pipeline{shader_cache.CurrentGraphicsPipeline()}; @@ -319,6 +321,7 @@ void RasterizerOpenGL::DrawIndirect() {  }  void RasterizerOpenGL::DispatchCompute() { +    gpu_memory->FlushCaching();      ComputePipeline* const pipeline{shader_cache.CurrentComputePipeline()};      if (!pipeline) {          return; @@ -526,6 +529,7 @@ void RasterizerOpenGL::TickFrame() {  }  bool RasterizerOpenGL::AccelerateConditionalRendering() { +    gpu_memory->FlushCaching();      if (Settings::IsGPULevelHigh()) {          // Reimplement Host conditional rendering.          return false; diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index bc75680f0..de95f2634 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -442,7 +442,13 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {      glBindTextureUnit(0, screen_info.display_texture); -    const auto anti_aliasing = Settings::values.anti_aliasing.GetValue(); +    auto anti_aliasing = Settings::values.anti_aliasing.GetValue(); +    if (anti_aliasing > Settings::AntiAliasing::LastAA) { +        LOG_ERROR(Render_OpenGL, "Invalid antialiasing option selected {}", anti_aliasing); +        anti_aliasing = Settings::AntiAliasing::None; +        Settings::values.anti_aliasing.SetValue(anti_aliasing); +    } +      if (anti_aliasing != Settings::AntiAliasing::None) {          glEnablei(GL_SCISSOR_TEST, 0);          auto viewport_width = screen_info.texture.width; diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 1578cb206..52855120c 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -110,7 +110,7 @@ RendererVulkan::RendererVulkan(Core::TelemetrySession& telemetry_session_,                    screen_info),        rasterizer(render_window, gpu, cpu_memory, screen_info, device, memory_allocator,                   state_tracker, scheduler) { -    if (Settings::values.renderer_force_max_clock.GetValue()) { +    if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) {          turbo_mode.emplace(instance, dld);      }      Report(); diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index ed4a72166..b75b8eec6 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -270,6 +270,7 @@ void RasterizerVulkan::Clear(u32 layer_count) {      MICROPROFILE_SCOPE(Vulkan_Clearing);      FlushWork(); +    gpu_memory->FlushCaching();      query_cache.UpdateCounters(); @@ -628,6 +629,7 @@ void RasterizerVulkan::TickFrame() {  }  bool RasterizerVulkan::AccelerateConditionalRendering() { +    gpu_memory->FlushCaching();      if (Settings::IsGPULevelHigh()) {          // TODO(Blinkhawk): Reimplement Host conditional rendering.          return false; diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 77aee802d..fd1c5a683 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -991,6 +991,18 @@ std::string Device::GetDriverName() const {      }  } +bool Device::ShouldBoostClocks() const { +    const bool validated_driver = +        driver_id == VK_DRIVER_ID_AMD_PROPRIETARY || driver_id == VK_DRIVER_ID_AMD_OPEN_SOURCE || +        driver_id == VK_DRIVER_ID_MESA_RADV || driver_id == VK_DRIVER_ID_NVIDIA_PROPRIETARY || +        driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS || +        driver_id == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA; + +    const bool is_steam_deck = properties.vendorID == 0x1002 && properties.deviceID == 0x163F; + +    return validated_driver && !is_steam_deck; +} +  static std::vector<const char*> ExtensionsRequiredForInstanceVersion(u32 available_version) {      std::vector<const char*> extensions{REQUIRED_EXTENSIONS.begin(), REQUIRED_EXTENSIONS.end()}; @@ -1520,8 +1532,12 @@ void Device::SetupFamilies(VkSurfaceKHR surface) {          LOG_ERROR(Render_Vulkan, "Device lacks a present queue");          throw vk::Exception(VK_ERROR_FEATURE_NOT_PRESENT);      } -    graphics_family = *graphics; -    present_family = *present; +    if (graphics) { +        graphics_family = *graphics; +    } +    if (present) { +        present_family = *present; +    }  }  void Device::SetupFeatures() { diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 6042046e1..4bc267163 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -106,6 +106,8 @@ public:          return driver_id;      } +    bool ShouldBoostClocks() const; +      /// Returns uniform buffer alignment requeriment.      VkDeviceSize GetUniformBufferAlignment() const {          return properties.limits.minUniformBufferOffsetAlignment; | 
