diff --git a/src/core/guncon.cpp b/src/core/guncon.cpp index d7de1468a..e06aec1d2 100644 --- a/src/core/guncon.cpp +++ b/src/core/guncon.cpp @@ -6,7 +6,7 @@ #include "host.h" #include "system.h" -#include "util/gpu_device.h" +#include "util/input_manager.h" #include "util/state_wrapper.h" #include "common/assert.h" @@ -183,8 +183,9 @@ bool GunCon::Transfer(const u8 data_in, u8* data_out) void GunCon::UpdatePosition() { // get screen coordinates - const s32 mouse_x = g_gpu_device->GetMousePositionX(); - const s32 mouse_y = g_gpu_device->GetMousePositionY(); + const auto& [fmouse_x, fmouse_y] = InputManager::GetPointerAbsolutePosition(0); + const s32 mouse_x = static_cast(fmouse_x); + const s32 mouse_y = static_cast(fmouse_y); // are we within the active display area? u32 tick, line; diff --git a/src/core/playstation_mouse.cpp b/src/core/playstation_mouse.cpp index e2505e380..f01e68b33 100644 --- a/src/core/playstation_mouse.cpp +++ b/src/core/playstation_mouse.cpp @@ -6,7 +6,7 @@ #include "host.h" #include "system.h" -#include "util/gpu_device.h" +#include "util/input_manager.h" #include "util/state_wrapper.h" #include "common/assert.h" @@ -20,8 +20,9 @@ static constexpr std::array(PlayStationMouse::Button::Co PlayStationMouse::PlayStationMouse(u32 index) : Controller(index) { - m_last_host_position_x = g_gpu_device->GetMousePositionX(); - m_last_host_position_y = g_gpu_device->GetMousePositionY(); + const auto& [x, y] = InputManager::GetPointerAbsolutePosition(0); + m_last_host_position_x = static_cast(x); + m_last_host_position_y = static_cast(y); } PlayStationMouse::~PlayStationMouse() = default; @@ -161,8 +162,9 @@ bool PlayStationMouse::Transfer(const u8 data_in, u8* data_out) void PlayStationMouse::UpdatePosition() { // get screen coordinates - const s32 mouse_x = g_gpu_device->GetMousePositionX(); - const s32 mouse_y = g_gpu_device->GetMousePositionY(); + const auto& [fmouse_x, fmouse_y] = InputManager::GetPointerAbsolutePosition(0); + const s32 mouse_x = static_cast(fmouse_x); + const s32 mouse_y = static_cast(fmouse_y); const s32 delta_x = mouse_x - m_last_host_position_x; const s32 delta_y = mouse_y - m_last_host_position_y; m_last_host_position_x = mouse_x; diff --git a/src/duckstation-qt/displaywidget.cpp b/src/duckstation-qt/displaywidget.cpp index 12e1c1fd3..318c5b3de 100644 --- a/src/duckstation-qt/displaywidget.cpp +++ b/src/duckstation-qt/displaywidget.cpp @@ -244,7 +244,7 @@ bool DisplayWidget::event(QEvent* event) const float scaled_x = static_cast(static_cast(mouse_pos.x()) * dpr); const float scaled_y = static_cast(static_cast(mouse_pos.y()) * dpr); - emit windowMouseMoveEvent(false, scaled_x, scaled_y); + InputManager::UpdatePointerAbsolutePosition(0, scaled_x, scaled_y); } else { @@ -270,8 +270,10 @@ bool DisplayWidget::event(QEvent* event) } #endif - if (dx != 0.0f || dy != 0.0f) - emit windowMouseMoveEvent(true, dx, dy); + if (dx != 0.0f) + InputManager::UpdatePointerRelativeDelta(0, InputPointerAxis::X, dx); + if (dy != 0.0f) + InputManager::UpdatePointerRelativeDelta(0, InputPointerAxis::Y, dy); } return true; diff --git a/src/duckstation-qt/displaywidget.h b/src/duckstation-qt/displaywidget.h index a99263495..9d461d84e 100644 --- a/src/duckstation-qt/displaywidget.h +++ b/src/duckstation-qt/displaywidget.h @@ -38,7 +38,6 @@ Q_SIGNALS: void windowRestoredEvent(); void windowKeyEvent(int key_code, bool pressed); void windowTextEntered(const QString& text); - void windowMouseMoveEvent(bool relative, float x, float y); void windowMouseButtonEvent(int button, bool pressed); void windowMouseWheelEvent(const QPoint& angle_delta); diff --git a/src/duckstation-qt/qthost.cpp b/src/duckstation-qt/qthost.cpp index f184be96d..3abda8e7e 100644 --- a/src/duckstation-qt/qthost.cpp +++ b/src/duckstation-qt/qthost.cpp @@ -568,35 +568,6 @@ void EmuThread::onDisplayWindowTextEntered(const QString& text) ImGuiManager::AddTextInput(text.toStdString()); } -void EmuThread::onDisplayWindowMouseMoveEvent(bool relative, float x, float y) -{ - // display might be null here if the event happened after shutdown - DebugAssert(isOnThread()); - if (!relative) - { - if (g_gpu_device) - g_gpu_device->SetMousePosition(static_cast(x), static_cast(y)); - - InputManager::UpdatePointerAbsolutePosition(0, x, y); - ImGuiManager::UpdateMousePosition(x, y); - } - else - { - if (x != 0.0f) - InputManager::UpdatePointerRelativeDelta(0, InputPointerAxis::X, x); - if (y != 0.0f) - InputManager::UpdatePointerRelativeDelta(0, InputPointerAxis::Y, y); - - if (g_gpu_device) - { - const float abs_x = static_cast(g_gpu_device->GetMousePositionX()) + x; - const float abs_y = static_cast(g_gpu_device->GetMousePositionY()) + y; - g_gpu_device->SetMousePosition(static_cast(abs_x), static_cast(abs_y)); - ImGuiManager::UpdateMousePosition(abs_x, abs_y); - } - } -} - void EmuThread::onDisplayWindowMouseButtonEvent(int button, bool pressed) { DebugAssert(isOnThread()); @@ -733,7 +704,6 @@ void EmuThread::connectDisplaySignals(DisplayWidget* widget) connect(widget, &DisplayWidget::windowRestoredEvent, this, &EmuThread::redrawDisplayWindow); connect(widget, &DisplayWidget::windowKeyEvent, this, &EmuThread::onDisplayWindowKeyEvent); connect(widget, &DisplayWidget::windowTextEntered, this, &EmuThread::onDisplayWindowTextEntered); - connect(widget, &DisplayWidget::windowMouseMoveEvent, this, &EmuThread::onDisplayWindowMouseMoveEvent); connect(widget, &DisplayWidget::windowMouseButtonEvent, this, &EmuThread::onDisplayWindowMouseButtonEvent); connect(widget, &DisplayWidget::windowMouseWheelEvent, this, &EmuThread::onDisplayWindowMouseWheelEvent); } diff --git a/src/duckstation-qt/qthost.h b/src/duckstation-qt/qthost.h index 7a8ef3611..93528cd0b 100644 --- a/src/duckstation-qt/qthost.h +++ b/src/duckstation-qt/qthost.h @@ -192,7 +192,6 @@ public Q_SLOTS: private Q_SLOTS: void stopInThread(); - void onDisplayWindowMouseMoveEvent(bool relative, float x, float y); void onDisplayWindowMouseButtonEvent(int button, bool pressed); void onDisplayWindowMouseWheelEvent(const QPoint& delta_angle); void onDisplayWindowResized(int width, int height, float scale); diff --git a/src/util/gpu_device.cpp b/src/util/gpu_device.cpp index 5d930a634..b8ad87082 100644 --- a/src/util/gpu_device.cpp +++ b/src/util/gpu_device.cpp @@ -793,7 +793,6 @@ void GPUDevice::ClearDisplayTexture() m_display_texture_view_y = 0; m_display_texture_view_width = 0; m_display_texture_view_height = 0; - m_display_changed = true; } void GPUDevice::SetDisplayTexture(GPUTexture* texture, s32 view_x, s32 view_y, s32 view_width, s32 view_height) @@ -804,7 +803,6 @@ void GPUDevice::SetDisplayTexture(GPUTexture* texture, s32 view_x, s32 view_y, s m_display_texture_view_y = view_y; m_display_texture_view_width = view_width; m_display_texture_view_height = view_height; - m_display_changed = true; } void GPUDevice::SetDisplayTextureRect(s32 view_x, s32 view_y, s32 view_width, s32 view_height) @@ -813,7 +811,6 @@ void GPUDevice::SetDisplayTextureRect(s32 view_x, s32 view_y, s32 view_width, s3 m_display_texture_view_y = view_y; m_display_texture_view_width = view_width; m_display_texture_view_height = view_height; - m_display_changed = true; } void GPUDevice::SetDisplayParameters(s32 display_width, s32 display_height, s32 active_left, s32 active_top, @@ -826,7 +823,6 @@ void GPUDevice::SetDisplayParameters(s32 display_width, s32 display_height, s32 m_display_active_width = active_width; m_display_active_height = active_height; m_display_aspect_ratio = display_aspect_ratio; - m_display_changed = true; } bool GPUDevice::GetHostRefreshRate(float* refresh_rate) diff --git a/src/util/gpu_device.h b/src/util/gpu_device.h index 9b732bab9..d59e31291 100644 --- a/src/util/gpu_device.h +++ b/src/util/gpu_device.h @@ -506,15 +506,6 @@ public: ALWAYS_INLINE GPUSampler* GetLinearSampler() const { return m_linear_sampler.get(); } ALWAYS_INLINE GPUSampler* GetNearestSampler() const { return m_nearest_sampler.get(); } - // Position is relative to the top-left corner of the window. - ALWAYS_INLINE s32 GetMousePositionX() const { return m_mouse_position_x; } - ALWAYS_INLINE s32 GetMousePositionY() const { return m_mouse_position_y; } - ALWAYS_INLINE void SetMousePosition(s32 x, s32 y) - { - m_mouse_position_x = x; - m_mouse_position_y = y; - } - ALWAYS_INLINE const void* GetDisplayTextureHandle() const { return m_display_texture; } ALWAYS_INLINE s32 GetDisplayWidth() const { return m_display_width; } ALWAYS_INLINE s32 GetDisplayHeight() const { return m_display_height; } @@ -714,9 +705,6 @@ private: u64 m_last_frame_displayed_time = 0; - s32 m_mouse_position_x = 0; - s32 m_mouse_position_y = 0; - s32 m_display_width = 0; s32 m_display_height = 0; s32 m_display_active_left = 0; @@ -736,8 +724,6 @@ private: std::unique_ptr m_imgui_pipeline; std::unique_ptr m_imgui_font_texture; - bool m_display_changed = false; - std::unique_ptr m_post_processing_chain; }; diff --git a/src/util/input_manager.cpp b/src/util/input_manager.cpp index 8e713f32c..1a07dbf7b 100644 --- a/src/util/input_manager.cpp +++ b/src/util/input_manager.cpp @@ -1038,9 +1038,18 @@ void InputManager::UpdatePointerAbsolutePosition(u32 index, float x, float y) const float dy = y - std::exchange(s_host_pointer_positions[index][static_cast(InputPointerAxis::Y)], y); if (dx != 0.0f) - UpdatePointerRelativeDelta(index, InputPointerAxis::X, dx); + { + s_pointer_state[index][static_cast(InputPointerAxis::X)].delta.fetch_add(static_cast(dx * 65536.0f), + std::memory_order_release); + } if (dy != 0.0f) - UpdatePointerRelativeDelta(index, InputPointerAxis::Y, dy); + { + s_pointer_state[index][static_cast(InputPointerAxis::Y)].delta.fetch_add(static_cast(dy * 65536.0f), + std::memory_order_release); + } + + if (index == 0) + ImGuiManager::UpdateMousePosition(x, y); } void InputManager::UpdatePointerRelativeDelta(u32 index, InputPointerAxis axis, float d, bool raw_input) @@ -1048,8 +1057,12 @@ void InputManager::UpdatePointerRelativeDelta(u32 index, InputPointerAxis axis, if (raw_input != IsUsingRawInput()) return; + s_host_pointer_positions[index][static_cast(axis)] += d; s_pointer_state[index][static_cast(axis)].delta.fetch_add(static_cast(d * 65536.0f), std::memory_order_release); + + if (index == 0 && axis <= InputPointerAxis::Y) + ImGuiManager::UpdateMousePosition(s_host_pointer_positions[0][0], s_host_pointer_positions[0][1]); } void InputManager::UpdateHostMouseMode()