From 4704c032096540fa452d4dc7e12e7390b63f6a92 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Jun 2025 20:45:05 +0200 Subject: [PATCH 1/6] Fix some static analysis warnings, including c-style cast --- Utilities/Thread.h | 4 ++-- Utilities/transactional_storage.h | 3 +-- rpcs3/Emu/Memory/vm_reservation.h | 3 ++- rpcs3/Emu/NP/np_allocator.h | 2 +- rpcs3/util/asm.hpp | 2 +- rpcs3/util/atomic.cpp | 4 ++-- rpcs3/util/atomic.hpp | 8 ++++---- rpcs3/util/bless.hpp | 2 ++ rpcs3/util/cpu_stats.cpp | 2 +- 9 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Utilities/Thread.h b/Utilities/Thread.h index 52096a2702..6dc2dc8cf6 100644 --- a/Utilities/Thread.h +++ b/Utilities/Thread.h @@ -96,7 +96,7 @@ class thread_future thread_future* prev{}; protected: - atomic_t exec{}; + atomic_t exec{}; atomic_t done{0}; @@ -389,7 +389,7 @@ public: : m_args(std::forward(args)...) , m_func(std::forward(func)) { - thread_future::exec.raw() = +[](thread_base* tb, thread_future* tf) + thread_future::exec.raw() = +[](const thread_base* tb, thread_future* tf) { const auto _this = static_cast(tf); diff --git a/Utilities/transactional_storage.h b/Utilities/transactional_storage.h index 55e8aa9f95..1be923233e 100644 --- a/Utilities/transactional_storage.h +++ b/Utilities/transactional_storage.h @@ -84,9 +84,8 @@ public: transactional_storage& operator=(const transactional_storage&) = delete; transactional_storage(transactional_storage&& other) + : pool(std::move(other.pool)) { - pool = std::move(other.pool); - std::unique_lock lock_other{other.current_mutex}; const std::shared_ptr other_current = other.current; other.current = nullptr; diff --git a/rpcs3/Emu/Memory/vm_reservation.h b/rpcs3/Emu/Memory/vm_reservation.h index c9d2e0c50a..af402249bf 100644 --- a/rpcs3/Emu/Memory/vm_reservation.h +++ b/rpcs3/Emu/Memory/vm_reservation.h @@ -81,7 +81,8 @@ namespace vm static inline atomic_t* reservation_notifier_begin_wait(u32 raddr, u64 rtime) { - atomic_t& waiter = *reservation_notifier(raddr).first; + const auto notifiers = reservation_notifier(raddr); + atomic_t& waiter = *notifiers.first; waiter.atomic_op([](reservation_waiter_t& value) { diff --git a/rpcs3/Emu/NP/np_allocator.h b/rpcs3/Emu/NP/np_allocator.h index 25c65ea2e4..ee8017cb72 100644 --- a/rpcs3/Emu/NP/np_allocator.h +++ b/rpcs3/Emu/NP/np_allocator.h @@ -59,7 +59,7 @@ namespace np u32 last_free = 0; bool found_space = false; - for (auto& a : m_allocs) + for (const auto& a : m_allocs) { if ((a.first - last_free) >= alloc_size) { diff --git a/rpcs3/util/asm.hpp b/rpcs3/util/asm.hpp index 947aa4f54a..14eaa1409d 100644 --- a/rpcs3/util/asm.hpp +++ b/rpcs3/util/asm.hpp @@ -135,7 +135,7 @@ namespace utils #endif } - constexpr void prefetch_write(void* ptr) + constexpr void prefetch_write(const void* ptr) { if (std::is_constant_evaluated()) { diff --git a/rpcs3/util/atomic.cpp b/rpcs3/util/atomic.cpp index c8e76cbf17..67f48f8dc7 100644 --- a/rpcs3/util/atomic.cpp +++ b/rpcs3/util/atomic.cpp @@ -15,12 +15,12 @@ namespace utils { u128 __vectorcall atomic_load16(const void* ptr) { - return std::bit_cast(_mm_load_si128((__m128i*)ptr)); + return std::bit_cast(_mm_load_si128(static_cast(ptr))); } void __vectorcall atomic_store16(void* ptr, u128 value) { - _mm_store_si128((__m128i*)ptr, std::bit_cast<__m128i>(value)); + _mm_store_si128(static_cast<__m128i*>(ptr), std::bit_cast<__m128i>(value)); } } #endif diff --git a/rpcs3/util/atomic.hpp b/rpcs3/util/atomic.hpp index 80d9e34f9d..4503eaac61 100644 --- a/rpcs3/util/atomic.hpp +++ b/rpcs3/util/atomic.hpp @@ -479,7 +479,7 @@ struct atomic_storage #endif #if defined(_M_X64) && defined(_MSC_VER) - return _interlockedbittestandset((long*)dst, bit) != 0; + return _interlockedbittestandset(reinterpret_cast(dst), bit) != 0; #elif defined(ARCH_X64) bool result; __asm__ volatile ("lock btsl %2, 0(%1)\n" : "=@ccc" (result) : "r" (dst), "Ir" (bit) : "cc", "memory"); @@ -506,7 +506,7 @@ struct atomic_storage #endif #if defined(_M_X64) && defined(_MSC_VER) - return _interlockedbittestandreset((long*)dst, bit) != 0; + return _interlockedbittestandreset(reinterpret_cast(dst), bit) != 0; #elif defined(ARCH_X64) bool result; __asm__ volatile ("lock btrl %2, 0(%1)\n" : "=@ccc" (result) : "r" (dst), "Ir" (bit) : "cc", "memory"); @@ -536,9 +536,9 @@ struct atomic_storage while (true) { // Keep trying until we actually invert desired bit - if (!_bittest((long*)dst, bit) && !_interlockedbittestandset((long*)dst, bit)) + if (!_bittest(reinterpret_cast(dst), bit) && !_interlockedbittestandset(reinterpret_cast(dst), bit)) return false; - if (_interlockedbittestandreset((long*)dst, bit)) + if (_interlockedbittestandreset(reinterpret_cast(dst), bit)) return true; } #elif defined(ARCH_X64) diff --git a/rpcs3/util/bless.hpp b/rpcs3/util/bless.hpp index 49ffa8facb..af2f8d32f3 100644 --- a/rpcs3/util/bless.hpp +++ b/rpcs3/util/bless.hpp @@ -16,6 +16,8 @@ namespace utils T* result; __asm__("mov %0, %1" : "=r" (result) : "r" (ptr) : "memory"); return result; +#else +#error "Missing utils::bless() implementation" #endif } } diff --git a/rpcs3/util/cpu_stats.cpp b/rpcs3/util/cpu_stats.cpp index 42c5304bea..8203d1977b 100644 --- a/rpcs3/util/cpu_stats.cpp +++ b/rpcs3/util/cpu_stats.cpp @@ -444,7 +444,7 @@ namespace utils if (proc_dir) { // proc available, iterate through tasks and count them - struct dirent* entry; + const struct dirent* entry; while ((entry = readdir(proc_dir)) != NULL) { if (entry->d_name[0] == '.') From d8bc2d5c7531cb1795cbff1740844f89dff2b1bf Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 2 Jun 2025 00:52:05 +0200 Subject: [PATCH 2/6] input: move copilot code to pad_thread --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 32 +++---- rpcs3/Emu/Cell/Modules/cellPad.cpp | 133 +++++++--------------------- rpcs3/Emu/Cell/Modules/cellPad.h | 1 - rpcs3/Emu/Io/Buzz.cpp | 2 +- rpcs3/Emu/Io/GHLtar.cpp | 2 +- rpcs3/Emu/Io/GameTablet.cpp | 4 +- rpcs3/Emu/Io/GunCon3.cpp | 2 +- rpcs3/Emu/Io/TopShotElite.cpp | 2 +- rpcs3/Emu/Io/TopShotFearmaster.cpp | 2 +- rpcs3/Emu/Io/Turntable.cpp | 2 +- rpcs3/Emu/Io/emulated_pad_config.h | 6 +- rpcs3/Emu/Io/pad_types.h | 9 ++ rpcs3/Emu/Io/usio.cpp | 4 +- rpcs3/Emu/RSX/Overlays/overlays.cpp | 6 +- rpcs3/Input/pad_thread.cpp | 104 ++++++++++++++++++++-- rpcs3/Input/pad_thread.h | 1 + 16 files changed, 173 insertions(+), 139 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index bfbeb416df..ba796be28e 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -351,7 +351,7 @@ public: for (u32 i = 0; i < CELL_GEM_MAX_NUM; i++) { const auto& pad = ::at32(handler->GetPads(), pad_num(i)); - const bool connected = pad && pad->is_connected() && i < attribute.max_connect; + const bool connected = pad && pad->is_connected() && !pad->is_copilot() && i < attribute.max_connect; const bool is_real_move = g_cfg.io.move != move_handler::real || pad->m_pad_handler == pad_handler::move; update_connection(i, connected && is_real_move); @@ -407,7 +407,7 @@ public: std::lock_guard pad_lock(pad::g_pad_mutex); const auto handler = pad::get_pad_thread(); const auto& pad = ::at32(handler->GetPads(), pad_num(gem_num)); - if (pad && pad->m_pad_handler == pad_handler::move) + if (pad && pad->m_pad_handler == pad_handler::move && !pad->is_copilot()) { if (!pad->move_data.calibration_requested || !pad->move_data.calibration_succeeded) { @@ -437,7 +437,7 @@ public: std::lock_guard pad_lock(pad::g_pad_mutex); const auto handler = pad::get_pad_thread(); const auto& pad = ::at32(handler->GetPads(), pad_num(gem_num)); - if (pad && pad->m_pad_handler == pad_handler::move) + if (pad && pad->m_pad_handler == pad_handler::move && !pad->is_copilot()) { pad->move_data.calibration_requested = false; pad->move_data.calibration_succeeded = false; @@ -469,7 +469,7 @@ public: for (u32 i = 0; i < std::min(attribute.max_connect, CELL_GEM_MAX_NUM); i++) { const auto& pad = ::at32(handler->GetPads(), pad_num(i)); - if (pad && pad->m_pad_handler == pad_handler::move && pad->is_connected()) + if (pad && pad->m_pad_handler == pad_handler::move && pad->is_connected() && !pad->is_copilot()) { connected_controllers++; @@ -490,7 +490,7 @@ public: for (u32 i = 0; i < std::min(attribute.max_connect, CELL_GEM_MAX_NUM); i++) { const auto& pad = ::at32(handler->GetPads(), pad_num(i)); - if (pad && pad->is_connected()) + if (pad && pad->is_connected() && !pad->is_copilot()) { connected_controllers++; @@ -1776,7 +1776,7 @@ static void ds3_input_to_pad(const u32 gem_num, be_t& digital_buttons, be_t const auto handler = pad::get_pad_thread(); const auto& pad = ::at32(handler->GetPads(), pad_num(gem_num)); - if (!pad->is_connected()) + if (!pad->is_connected() || pad->is_copilot()) { return; } @@ -1864,7 +1864,7 @@ static void ds3_pos_to_gem_state(u32 gem_num, gem_config::gem_controller& contro const auto handler = pad::get_pad_thread(); const auto& pad = ::at32(handler->GetPads(), pad_num(gem_num)); - if (!pad->is_connected()) + if (!pad->is_connected() || pad->is_copilot()) { return; } @@ -1895,7 +1895,7 @@ static void ps_move_pos_to_gem_state(u32 gem_num, gem_config::gem_controller& co const auto handler = pad::get_pad_thread(); const auto& pad = ::at32(handler->GetPads(), pad_num(gem_num)); - if (pad->m_pad_handler != pad_handler::move || !pad->is_connected()) + if (pad->m_pad_handler != pad_handler::move || !pad->is_connected() || pad->is_copilot()) { return; } @@ -1940,7 +1940,7 @@ static void ds3_input_to_ext(u32 gem_num, gem_config::gem_controller& controller const auto handler = pad::get_pad_thread(); const auto& pad = ::at32(handler->GetPads(), pad_num(gem_num)); - if (!pad->is_connected()) + if (!pad->is_connected() || pad->is_copilot()) { return; } @@ -1952,7 +1952,7 @@ static void ds3_input_to_ext(u32 gem_num, gem_config::gem_controller& controller ext.status = controller.ext_status; - for (const AnalogStick& stick : pad->m_sticks) + for (const AnalogStick& stick : pad->m_sticks_external) { switch (stick.m_offset) { @@ -1964,7 +1964,7 @@ static void ds3_input_to_ext(u32 gem_num, gem_config::gem_controller& controller } } - for (const Button& button : pad->m_buttons) + for (const Button& button : pad->m_buttons_external) { if (!button.m_pressed) continue; @@ -2400,7 +2400,7 @@ error_code cellGemEnableMagnetometer(u32 gem_num, u32 enable) const auto handler = pad::get_pad_thread(); const auto& pad = ::at32(handler->GetPads(), pad_num(gem_num)); - if (pad && pad->m_pad_handler == pad_handler::move) + if (pad && pad->m_pad_handler == pad_handler::move && !pad->is_copilot()) { pad->move_data.magnetometer_enabled = controller.enabled_magnetometer; } @@ -2448,7 +2448,7 @@ error_code cellGemEnableMagnetometer2(u32 gem_num, u32 enable) const auto handler = pad::get_pad_thread(); const auto& pad = ::at32(handler->GetPads(), pad_num(gem_num)); - if (pad && pad->m_pad_handler == pad_handler::move) + if (pad && pad->m_pad_handler == pad_handler::move && !pad->is_copilot()) { pad->move_data.magnetometer_enabled = controller.enabled_magnetometer; } @@ -2777,7 +2777,7 @@ error_code cellGemGetInertialState(u32 gem_num, u32 state_flag, u64 timestamp, v const auto handler = pad::get_pad_thread(); const auto& pad = ::at32(handler->GetPads(), pad_num(gem_num)); - if (pad && pad->is_connected()) + if (pad && pad->is_connected() && !pad->is_copilot()) { inertial_state->temperature = pad->move_data.temperature; inertial_state->accelerometer[0] = pad->move_data.accelerometer_x; @@ -3392,7 +3392,7 @@ error_code cellGemReadExternalPortDeviceInfo(u32 gem_num, vm::ptr ext_id, v const auto handler = pad::get_pad_thread(); const auto& pad = ::at32(handler->GetPads(), pad_num(gem_num)); - if (pad->m_pad_handler != pad_handler::move || !pad->is_connected()) + if (pad->m_pad_handler != pad_handler::move || !pad->is_connected() || pad->is_copilot()) { return CELL_GEM_NOT_CONNECTED; } @@ -3706,7 +3706,7 @@ error_code cellGemWriteExternalPort(u32 gem_num, vm::ptrGetPads(), pad_num(gem_num)); - if (pad->m_pad_handler != pad_handler::move || !pad->is_connected()) + if (pad->m_pad_handler != pad_handler::move || !pad->is_connected() || pad->is_copilot()) { return CELL_GEM_NOT_CONNECTED; } diff --git a/rpcs3/Emu/Cell/Modules/cellPad.cpp b/rpcs3/Emu/Cell/Modules/cellPad.cpp index 61e29805aa..086a341854 100644 --- a/rpcs3/Emu/Cell/Modules/cellPad.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPad.cpp @@ -411,60 +411,27 @@ void pad_get_data(u32 port_no, CellPadData* data, bool get_periph_data = false) } }; - for (const Button& button : pad->m_buttons) + for (const Button& button : pad->m_buttons_external) { // here we check btns, and set pad accordingly, // if something changed, set btnChanged - bool pressed = button.m_pressed; - u16 value = button.m_value; - - // Merge copilots - if (!pad->copilots.empty()) - { - for (const auto& copilot : pad->copilots) - { - if (!copilot || !copilot->is_connected()) - { - continue; - } - - for (const Button& other : copilot->m_buttons) - { - if (button.m_offset == other.m_offset && button.m_outKeyCode == other.m_outKeyCode) - { - if (other.m_pressed) - { - pressed = true; - - if (value < other.m_value) - { - value = other.m_value; - } - } - - break; - } - } - } - } - switch (button.m_offset) { case CELL_PAD_BTN_OFFSET_DIGITAL1: { - if (pressed) + if (button.m_pressed) pad->m_digital_1 |= button.m_outKeyCode; else pad->m_digital_1 &= ~button.m_outKeyCode; switch (button.m_outKeyCode) { - case CELL_PAD_CTRL_LEFT: set_value(pad->m_press_left, value); break; - case CELL_PAD_CTRL_DOWN: set_value(pad->m_press_down, value); break; - case CELL_PAD_CTRL_RIGHT: set_value(pad->m_press_right, value); break; - case CELL_PAD_CTRL_UP: set_value(pad->m_press_up, value); break; - // These arent pressure btns + case CELL_PAD_CTRL_LEFT: set_value(pad->m_press_left, button.m_value); break; + case CELL_PAD_CTRL_DOWN: set_value(pad->m_press_down, button.m_value); break; + case CELL_PAD_CTRL_RIGHT: set_value(pad->m_press_right, button.m_value); break; + case CELL_PAD_CTRL_UP: set_value(pad->m_press_up, button.m_value); break; + // These aren't pressure btns case CELL_PAD_CTRL_R3: case CELL_PAD_CTRL_L3: case CELL_PAD_CTRL_START: @@ -475,21 +442,21 @@ void pad_get_data(u32 port_no, CellPadData* data, bool get_periph_data = false) } case CELL_PAD_BTN_OFFSET_DIGITAL2: { - if (pressed) + if (button.m_pressed) pad->m_digital_2 |= button.m_outKeyCode; else pad->m_digital_2 &= ~button.m_outKeyCode; switch (button.m_outKeyCode) { - case CELL_PAD_CTRL_SQUARE: set_value(pad->m_press_square, value); break; - case CELL_PAD_CTRL_CROSS: set_value(pad->m_press_cross, value); break; - case CELL_PAD_CTRL_CIRCLE: set_value(pad->m_press_circle, value); break; - case CELL_PAD_CTRL_TRIANGLE: set_value(pad->m_press_triangle, value); break; - case CELL_PAD_CTRL_R1: set_value(pad->m_press_R1, value); break; - case CELL_PAD_CTRL_L1: set_value(pad->m_press_L1, value); break; - case CELL_PAD_CTRL_R2: set_value(pad->m_press_R2, value); break; - case CELL_PAD_CTRL_L2: set_value(pad->m_press_L2, value); break; + case CELL_PAD_CTRL_SQUARE: set_value(pad->m_press_square, button.m_value); break; + case CELL_PAD_CTRL_CROSS: set_value(pad->m_press_cross, button.m_value); break; + case CELL_PAD_CTRL_CIRCLE: set_value(pad->m_press_circle, button.m_value); break; + case CELL_PAD_CTRL_TRIANGLE: set_value(pad->m_press_triangle, button.m_value); break; + case CELL_PAD_CTRL_R1: set_value(pad->m_press_R1, button.m_value); break; + case CELL_PAD_CTRL_L1: set_value(pad->m_press_L1, button.m_value); break; + case CELL_PAD_CTRL_R2: set_value(pad->m_press_R2, button.m_value); break; + case CELL_PAD_CTRL_L2: set_value(pad->m_press_L2, button.m_value); break; default: break; } break; @@ -498,18 +465,18 @@ void pad_get_data(u32 port_no, CellPadData* data, bool get_periph_data = false) { switch (button.m_outKeyCode) { - case CELL_PAD_CTRL_PRESS_RIGHT: set_value(pad->m_press_right, value, true); break; - case CELL_PAD_CTRL_PRESS_LEFT: set_value(pad->m_press_left, value, true); break; - case CELL_PAD_CTRL_PRESS_UP: set_value(pad->m_press_up, value, true); break; - case CELL_PAD_CTRL_PRESS_DOWN: set_value(pad->m_press_down, value, true); break; - case CELL_PAD_CTRL_PRESS_TRIANGLE: set_value(pad->m_press_triangle, value, true, 255, 63); break; // Infrared on RIDE Skateboard - case CELL_PAD_CTRL_PRESS_CIRCLE: set_value(pad->m_press_circle, value, true, 255, 63); break; // Infrared on RIDE Skateboard - case CELL_PAD_CTRL_PRESS_CROSS: set_value(pad->m_press_cross, value, true, 255, 63); break; // Infrared on RIDE Skateboard - case CELL_PAD_CTRL_PRESS_SQUARE: set_value(pad->m_press_square, value, true, 255, 63); break; // Infrared on RIDE Skateboard - case CELL_PAD_CTRL_PRESS_L1: set_value(pad->m_press_L1, value, true); break; - case CELL_PAD_CTRL_PRESS_R1: set_value(pad->m_press_R1, value, true); break; - case CELL_PAD_CTRL_PRESS_L2: set_value(pad->m_press_L2, value, true); break; - case CELL_PAD_CTRL_PRESS_R2: set_value(pad->m_press_R2, value, true); break; + case CELL_PAD_CTRL_PRESS_RIGHT: set_value(pad->m_press_right, button.m_value, true); break; + case CELL_PAD_CTRL_PRESS_LEFT: set_value(pad->m_press_left, button.m_value, true); break; + case CELL_PAD_CTRL_PRESS_UP: set_value(pad->m_press_up, button.m_value, true); break; + case CELL_PAD_CTRL_PRESS_DOWN: set_value(pad->m_press_down, button.m_value, true); break; + case CELL_PAD_CTRL_PRESS_TRIANGLE: set_value(pad->m_press_triangle, button.m_value, true, 255, 63); break; // Infrared on RIDE Skateboard + case CELL_PAD_CTRL_PRESS_CIRCLE: set_value(pad->m_press_circle, button.m_value, true, 255, 63); break; // Infrared on RIDE Skateboard + case CELL_PAD_CTRL_PRESS_CROSS: set_value(pad->m_press_cross, button.m_value, true, 255, 63); break; // Infrared on RIDE Skateboard + case CELL_PAD_CTRL_PRESS_SQUARE: set_value(pad->m_press_square, button.m_value, true, 255, 63); break; // Infrared on RIDE Skateboard + case CELL_PAD_CTRL_PRESS_L1: set_value(pad->m_press_L1, button.m_value, true); break; + case CELL_PAD_CTRL_PRESS_R1: set_value(pad->m_press_R1, button.m_value, true); break; + case CELL_PAD_CTRL_PRESS_L2: set_value(pad->m_press_L2, button.m_value, true); break; + case CELL_PAD_CTRL_PRESS_R2: set_value(pad->m_press_R2, button.m_value, true); break; default: break; } break; @@ -519,46 +486,14 @@ void pad_get_data(u32 port_no, CellPadData* data, bool get_periph_data = false) } } - for (const AnalogStick& stick : pad->m_sticks) + for (const AnalogStick& stick : pad->m_sticks_external) { - u16 value = stick.m_value; - - // Merge copilots - if (!pad->copilots.empty()) - { - const auto normalize = [](s32 value) - { - return (value - 128) / 127.0f; - }; - - f32 accumulated_value = normalize(value); - - for (const auto& copilot : pad->copilots) - { - if (!copilot || !copilot->is_connected()) - { - continue; - } - - for (const AnalogStick& other : copilot->m_sticks) - { - if (stick.m_offset == other.m_offset) - { - accumulated_value += normalize(other.m_value); - break; - } - } - } - - value = static_cast(std::round(std::clamp(accumulated_value * 127.0f + 128.0f, 0.0f, 255.0f))); - } - switch (stick.m_offset) { - case CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X: set_value(pad->m_analog_left_x, value); break; - case CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y: set_value(pad->m_analog_left_y, value); break; - case CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X: set_value(pad->m_analog_right_x, value); break; - case CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y: set_value(pad->m_analog_right_y, value); break; + case CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X: set_value(pad->m_analog_left_x, stick.m_value); break; + case CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y: set_value(pad->m_analog_left_y, stick.m_value); break; + case CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X: set_value(pad->m_analog_right_x, stick.m_value); break; + case CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y: set_value(pad->m_analog_right_y, stick.m_value); break; default: break; } } @@ -1305,7 +1240,7 @@ error_code cellPadLddGetPortNo(s32 handle) return CELL_PAD_ERROR_UNINITIALIZED; const auto handler = pad::get_pad_thread(); - auto& pads = handler->GetPads(); + const auto& pads = handler->GetPads(); if (handle < 0 || static_cast(handle) >= pads.size()) return CELL_PAD_ERROR_INVALID_PARAMETER; diff --git a/rpcs3/Emu/Cell/Modules/cellPad.h b/rpcs3/Emu/Cell/Modules/cellPad.h index 3394fe6b2b..0d199e488c 100644 --- a/rpcs3/Emu/Cell/Modules/cellPad.h +++ b/rpcs3/Emu/Cell/Modules/cellPad.h @@ -3,7 +3,6 @@ #include "Emu/Io/pad_types.h" #include -#include "util/types.hpp" enum CellPadError : u32 { diff --git a/rpcs3/Emu/Io/Buzz.cpp b/rpcs3/Emu/Io/Buzz.cpp index d5b7fe4f23..840220b967 100644 --- a/rpcs3/Emu/Io/Buzz.cpp +++ b/rpcs3/Emu/Io/Buzz.cpp @@ -173,7 +173,7 @@ void usb_device_buzz::interrupt_transfer(u32 buf_size, u8* buf, u32 /*endpoint*/ { const auto& pad = pads[i]; - if (!pad->is_connected()) + if (!pad->is_connected() || pad->is_copilot()) { continue; } diff --git a/rpcs3/Emu/Io/GHLtar.cpp b/rpcs3/Emu/Io/GHLtar.cpp index 9a2b9d0ce6..0c99c6aabf 100644 --- a/rpcs3/Emu/Io/GHLtar.cpp +++ b/rpcs3/Emu/Io/GHLtar.cpp @@ -152,7 +152,7 @@ void usb_device_ghltar::interrupt_transfer(u32 buf_size, u8* buf, u32 /*endpoint const auto handler = pad::get_pad_thread(); const auto& pad = ::at32(handler->GetPads(), m_controller_index); - if (!pad->is_connected()) + if (!pad->is_connected() || pad->is_copilot()) { return; } diff --git a/rpcs3/Emu/Io/GameTablet.cpp b/rpcs3/Emu/Io/GameTablet.cpp index 0b87a709bf..4c2330d908 100644 --- a/rpcs3/Emu/Io/GameTablet.cpp +++ b/rpcs3/Emu/Io/GameTablet.cpp @@ -198,9 +198,9 @@ void usb_device_gametablet::interrupt_transfer(u32 buf_size, u8* buf, u32 /*endp const auto gamepad_handler = pad::get_pad_thread(); const auto& pads = gamepad_handler->GetPads(); const auto& pad = ::at32(pads, m_controller_index); - if (pad->is_connected()) + if (pad->is_connected() && !pad->is_copilot()) { - for (Button& button : pad->m_buttons) + for (Button& button : pad->m_buttons_external) { if (!button.m_pressed) { diff --git a/rpcs3/Emu/Io/GunCon3.cpp b/rpcs3/Emu/Io/GunCon3.cpp index 8dc5688f73..522369d8a4 100644 --- a/rpcs3/Emu/Io/GunCon3.cpp +++ b/rpcs3/Emu/Io/GunCon3.cpp @@ -258,7 +258,7 @@ void usb_device_guncon3::interrupt_transfer(u32 buf_size, u8* buf, u32 endpoint, const auto gamepad_handler = pad::get_pad_thread(); const auto& pads = gamepad_handler->GetPads(); const auto& pad = ::at32(pads, m_controller_index); - if (pad->is_connected()) + if (pad->is_connected() && !pad->is_copilot()) { cfg->handle_input(pad, true, input_callback); } diff --git a/rpcs3/Emu/Io/TopShotElite.cpp b/rpcs3/Emu/Io/TopShotElite.cpp index b7e2b64b98..c241fe1ed4 100644 --- a/rpcs3/Emu/Io/TopShotElite.cpp +++ b/rpcs3/Emu/Io/TopShotElite.cpp @@ -318,7 +318,7 @@ void usb_device_topshotelite::interrupt_transfer(u32 buf_size, u8* buf, u32 /*en const auto gamepad_handler = pad::get_pad_thread(); const auto& pads = gamepad_handler->GetPads(); const auto& pad = ::at32(pads, m_controller_index); - if (pad->is_connected()) + if (pad->is_connected() && !pad->is_copilot()) { cfg->handle_input(pad, true, input_callback); } diff --git a/rpcs3/Emu/Io/TopShotFearmaster.cpp b/rpcs3/Emu/Io/TopShotFearmaster.cpp index 03c634d839..eed7ade977 100644 --- a/rpcs3/Emu/Io/TopShotFearmaster.cpp +++ b/rpcs3/Emu/Io/TopShotFearmaster.cpp @@ -342,7 +342,7 @@ void usb_device_topshotfearmaster::interrupt_transfer(u32 buf_size, u8* buf, u32 const auto gamepad_handler = pad::get_pad_thread(); const auto& pads = gamepad_handler->GetPads(); const auto& pad = ::at32(pads, m_controller_index); - if (pad->is_connected()) + if (pad->is_connected() && !pad->is_copilot()) { cfg->handle_input(pad, true, input_callback); } diff --git a/rpcs3/Emu/Io/Turntable.cpp b/rpcs3/Emu/Io/Turntable.cpp index ec67fabc22..261af88d16 100644 --- a/rpcs3/Emu/Io/Turntable.cpp +++ b/rpcs3/Emu/Io/Turntable.cpp @@ -166,7 +166,7 @@ void usb_device_turntable::interrupt_transfer(u32 buf_size, u8* buf, u32 /*endpo const auto& pads = handler->GetPads(); const auto& pad = ::at32(pads, m_controller_index); - if (!pad->is_connected()) + if (!pad->is_connected() || pad->is_copilot()) return; const auto& cfg = ::at32(g_cfg_turntable.players, m_controller_index); diff --git a/rpcs3/Emu/Io/emulated_pad_config.h b/rpcs3/Emu/Io/emulated_pad_config.h index e2b46d3daa..b9bf68a223 100644 --- a/rpcs3/Emu/Io/emulated_pad_config.h +++ b/rpcs3/Emu/Io/emulated_pad_config.h @@ -90,10 +90,10 @@ public: void handle_input(std::shared_ptr pad, bool press_only, const std::function& func) const { - if (!pad) + if (!pad || pad->is_copilot()) return; - for (const Button& button : pad->m_buttons) + for (const Button& button : pad->m_buttons_external) { if (button.m_pressed || !press_only) { @@ -104,7 +104,7 @@ public: } } - for (const AnalogStick& stick : pad->m_sticks) + for (const AnalogStick& stick : pad->m_sticks_external) { if (handle_input(func, stick.m_offset, get_axis_keycode(stick.m_offset, stick.m_value), stick.m_value, true, true)) { diff --git a/rpcs3/Emu/Io/pad_types.h b/rpcs3/Emu/Io/pad_types.h index 57634a66b4..356c86d6ae 100644 --- a/rpcs3/Emu/Io/pad_types.h +++ b/rpcs3/Emu/Io/pad_types.h @@ -543,6 +543,9 @@ struct Pad std::array m_sensors{}; std::array m_vibrateMotors{}; + std::vector