diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 12badf9e58..295e1ebc67 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -140,23 +140,16 @@ static bool check_gem_num(const u32 gem_num) */ static bool map_to_ds3_input(const u32 port_no, be_t& digital_buttons, be_t& analog_t) { - const auto handler = fxm::get(); - - if (!handler) - { - return false; - } + const auto handler = pad::get_current_handler(); const PadInfo& rinfo = handler->GetInfo(); - if (port_no >= rinfo.max_connect || port_no >= rinfo.now_connect) - { - return false; - } - auto& pads = handler->GetPads(); auto pad = pads[port_no]; + if (!(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) + return false; + for (Button& button : pad->m_buttons) { //here we check btns, and set pad accordingly, @@ -240,30 +233,17 @@ static bool map_to_ds3_input(const u32 port_no, be_t& digital_buttons, be_t */ static bool map_ext_to_ds3_input(const u32 port_no, CellGemExtPortData& ext) { - const auto handler = fxm::get(); - - if (!handler) - { - return false; - } + const auto handler = pad::get_current_handler(); auto& pads = handler->GetPads(); const PadInfo& rinfo = handler->GetInfo(); - if (port_no >= rinfo.max_connect) - { - return false; - } - - //We have a choice here of NO_DEVICE or READ_FAILED...lets try no device for now - if (port_no >= rinfo.now_connect) - { - return false; - } - auto pad = pads[port_no]; + if (!(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) + return false; + ext.status = 0; // CELL_GEM_EXT_CONNECTED | CELL_GEM_EXT_EXT0 | CELL_GEM_EXT_EXT1 ext.analog_left_x = pad->m_analog_left_x; ext.analog_left_y = pad->m_analog_left_y; diff --git a/rpcs3/Emu/Cell/Modules/cellPad.cpp b/rpcs3/Emu/Cell/Modules/cellPad.cpp index 9eb75516f8..0f0b7c33b4 100644 --- a/rpcs3/Emu/Cell/Modules/cellPad.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPad.cpp @@ -35,16 +35,13 @@ error_code cellPadInit(u32 max_connect) { sys_io.warning("cellPadInit(max_connect=%d)", max_connect); - auto handler = fxm::get(); - - if (handler) + if (fxm::check()) return CELL_PAD_ERROR_ALREADY_INITIALIZED; if (max_connect == 0 || max_connect > CELL_MAX_PADS) return CELL_PAD_ERROR_INVALID_PARAMETER; - handler = fxm::import(Emu.GetCallbacks().get_pad_handler); - handler->Init(std::min(max_connect, (u32)CELL_PAD_MAX_PORT_NUM)); + fxm::make(std::min(max_connect, (u32)CELL_PAD_MAX_PORT_NUM)); return CELL_OK; } @@ -53,7 +50,7 @@ error_code cellPadEnd() { sys_io.notice("cellPadEnd()"); - if (!fxm::remove()) + if (!fxm::remove()) return CELL_PAD_ERROR_UNINITIALIZED; return CELL_OK; @@ -63,17 +60,19 @@ error_code cellPadClearBuf(u32 port_no) { sys_io.trace("cellPadClearBuf(port_no=%d)", port_no); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (port_no >= CELL_MAX_PADS) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= config->max_connect) return CELL_PAD_ERROR_NO_DEVICE; const auto pad = pads[port_no]; @@ -103,20 +102,23 @@ error_code cellPadGetData(u32 port_no, vm::ptr data) { sys_io.trace("cellPadGetData(port_no=%d, data=*0x%x)", port_no, data); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (port_no >= CELL_MAX_PADS || !data) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= config->max_connect) return CELL_PAD_ERROR_NO_DEVICE; const auto pad = pads[port_no]; + const auto setting = config->port_setting[port_no]; if (!(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) return CELL_PAD_ERROR_NO_DEVICE; @@ -237,7 +239,7 @@ error_code cellPadGetData(u32 port_no, vm::ptr data) } } - if (pad->m_port_setting & CELL_PAD_SETTING_SENSOR_ON) + if (setting & CELL_PAD_SETTING_SENSOR_ON) { for (const AnalogSensor& sensor : pad->m_sensors) { @@ -269,7 +271,7 @@ error_code cellPadGetData(u32 port_no, vm::ptr data) btnChanged = true; } - if (pad->m_port_setting & CELL_PAD_SETTING_SENSOR_ON) + if (setting & CELL_PAD_SETTING_SENSOR_ON) { // report back new data every ~10 ms even if the input doesn't change // this is observed behaviour when using a Dualshock 3 controller @@ -289,7 +291,7 @@ error_code cellPadGetData(u32 port_no, vm::ptr data) else if (btnChanged || pad->m_buffer_cleared) { // only give back valid data if a controller state changed - data->len = (pad->m_port_setting & CELL_PAD_SETTING_PRESS_ON) ? CELL_PAD_LEN_CHANGE_PRESS_ON : CELL_PAD_LEN_CHANGE_DEFAULT; + data->len = (setting & CELL_PAD_SETTING_PRESS_ON) ? CELL_PAD_LEN_CHANGE_PRESS_ON : CELL_PAD_LEN_CHANGE_DEFAULT; } else { @@ -313,7 +315,7 @@ error_code cellPadGetData(u32 port_no, vm::ptr data) data->button[CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X] = pad->m_analog_left_x; data->button[CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y] = pad->m_analog_left_y; - if (pad->m_port_setting & CELL_PAD_SETTING_PRESS_ON) + if (setting & CELL_PAD_SETTING_PRESS_ON) { data->button[CELL_PAD_BTN_OFFSET_PRESS_RIGHT] = pad->m_press_right; data->button[CELL_PAD_BTN_OFFSET_PRESS_LEFT] = pad->m_press_left; @@ -351,11 +353,13 @@ error_code cellPadPeriphGetInfo(vm::ptr info) { sys_io.trace("cellPadPeriphGetInfo(info=*0x%x)", info); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (!info) return CELL_PAD_ERROR_INVALID_PARAMETER; @@ -363,7 +367,7 @@ error_code cellPadPeriphGetInfo(vm::ptr info) std::memset(info.get_ptr(), 0, sizeof(CellPadPeriphInfo)); - info->max_connect = rinfo.max_connect; + info->max_connect = config->max_connect; info->now_connect = rinfo.now_connect; info->system_info = rinfo.system_info; @@ -372,12 +376,12 @@ error_code cellPadPeriphGetInfo(vm::ptr info) // TODO: Support other types of controllers for (u32 i = 0; i < CELL_PAD_MAX_PORT_NUM; ++i) { - if (i >= pads.size()) + if (i >= config->max_connect) break; info->port_status[i] = pads[i]->m_port_status; pads[i]->m_port_status &= ~CELL_PAD_STATUS_ASSIGN_CHANGES; - info->port_setting[i] = pads[i]->m_port_setting; + info->port_setting[i] = config->port_setting[i]; info->device_capability[i] = pads[i]->m_device_capability; info->device_type[i] = pads[i]->m_device_type; info->pclass_type[i] = CELL_PAD_PCLASS_TYPE_STANDARD; @@ -390,18 +394,21 @@ error_code cellPadPeriphGetInfo(vm::ptr info) error_code cellPadPeriphGetData(u32 port_no, vm::ptr data) { sys_io.trace("cellPadPeriphGetData(port_no=%d, data=*0x%x)", port_no, data); - const auto handler = fxm::get(); - if (!handler) + const auto config = fxm::get(); + + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + // port_no can only be 0-6 in this function if (port_no >= CELL_PAD_MAX_PORT_NUM || !data) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= config->max_connect) return CELL_PAD_ERROR_NO_DEVICE; const auto pad = pads[port_no]; @@ -420,17 +427,19 @@ error_code cellPadGetRawData(u32 port_no, vm::ptr data) { sys_io.todo("cellPadGetRawData(port_no=%d, data=*0x%x)", port_no, data); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (port_no >= CELL_MAX_PADS || !data) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= config->max_connect) return CELL_PAD_ERROR_NO_DEVICE; const auto pad = pads[port_no]; @@ -447,17 +456,19 @@ error_code cellPadGetDataExtra(u32 port_no, vm::ptr device_type, vm::ptr(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (port_no >= CELL_MAX_PADS || !data) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= config->max_connect) return CELL_PAD_ERROR_NO_DEVICE; const auto pad = pads[port_no]; @@ -484,17 +495,19 @@ error_code cellPadSetActDirect(u32 port_no, vm::ptr param) { sys_io.trace("cellPadSetActDirect(port_no=%d, param=*0x%x)", port_no, param); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (port_no >= CELL_MAX_PADS || !param) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= config->max_connect) return CELL_PAD_ERROR_NO_DEVICE; const auto pad = pads[port_no]; @@ -520,18 +533,20 @@ error_code cellPadGetInfo(vm::ptr info) { sys_io.trace("cellPadGetInfo(info=*0x%x)", info); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (!info) return CELL_PAD_ERROR_INVALID_PARAMETER; std::memset(info.get_ptr(), 0, sizeof(CellPadInfo)); const PadInfo& rinfo = handler->GetInfo(); - info->max_connect = rinfo.max_connect; + info->max_connect = config->max_connect; info->now_connect = rinfo.now_connect; info->system_info = rinfo.system_info; @@ -539,7 +554,7 @@ error_code cellPadGetInfo(vm::ptr info) for (u32 i = 0; i < CELL_MAX_PADS; ++i) { - if (i >= pads.size()) + if (i >= config->max_connect) break; info->status[i] = pads[i]->m_port_status; @@ -555,18 +570,20 @@ error_code cellPadGetInfo2(vm::ptr info) { sys_io.trace("cellPadGetInfo2(info=*0x%x)", info); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (!info) return CELL_PAD_ERROR_INVALID_PARAMETER; std::memset(info.get_ptr(), 0, sizeof(CellPadInfo2)); const PadInfo& rinfo = handler->GetInfo(); - info->max_connect = rinfo.max_connect; + info->max_connect = config->max_connect; info->now_connect = rinfo.now_connect; info->system_info = rinfo.system_info; @@ -574,12 +591,12 @@ error_code cellPadGetInfo2(vm::ptr info) for (u32 i = 0; i < CELL_PAD_MAX_PORT_NUM; ++i) { - if (i >= pads.size()) + if (i >= config->max_connect) break; info->port_status[i] = pads[i]->m_port_status; pads[i]->m_port_status &= ~CELL_PAD_STATUS_ASSIGN_CHANGES; - info->port_setting[i] = pads[i]->m_port_setting; + info->port_setting[i] = config->port_setting[i]; info->device_capability[i] = pads[i]->m_device_capability; info->device_type[i] = pads[i]->m_device_type; } @@ -591,17 +608,19 @@ error_code cellPadGetCapabilityInfo(u32 port_no, vm::ptr { sys_io.trace("cellPadGetCapabilityInfo(port_no=%d, data_addr:=0x%x)", port_no, info.addr()); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (port_no >= CELL_MAX_PADS || !info) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= config->max_connect) return CELL_PAD_ERROR_NO_DEVICE; const auto pad = pads[port_no]; @@ -619,23 +638,21 @@ error_code cellPadSetPortSetting(u32 port_no, u32 port_setting) { sys_io.trace("cellPadSetPortSetting(port_no=%d, port_setting=0x%x)", port_no, port_setting); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (port_no >= CELL_MAX_PADS) return CELL_PAD_ERROR_INVALID_PARAMETER; - const auto& pads = handler->GetPads(); - // CELL_PAD_ERROR_NO_DEVICE is not returned in this case. - // TODO: Set the setting regardless - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= CELL_PAD_MAX_PORT_NUM) return CELL_OK; - const auto pad = pads[port_no]; - pad->m_port_setting = port_setting; + config->port_setting[port_no] = port_setting; // can also return CELL_PAD_ERROR_UNSUPPORTED_GAMEPAD @@ -646,17 +663,19 @@ s32 cellPadInfoPressMode(u32 port_no) { sys_io.trace("cellPadInfoPressMode(port_no=%d)", port_no); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (port_no >= CELL_MAX_PADS) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= config->max_connect) return CELL_PAD_ERROR_NO_DEVICE; const auto pad = pads[port_no]; @@ -671,17 +690,19 @@ s32 cellPadInfoSensorMode(u32 port_no) { sys_io.trace("cellPadInfoSensorMode(port_no=%d)", port_no); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (port_no >= CELL_MAX_PADS) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= config->max_connect) return CELL_PAD_ERROR_NO_DEVICE; const auto pad = pads[port_no]; @@ -696,19 +717,20 @@ error_code cellPadSetPressMode(u32 port_no, u32 mode) { sys_io.trace("cellPadSetPressMode(port_no=%d, mode=%d)", port_no, mode); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; - if (port_no >= CELL_MAX_PADS) + const auto handler = pad::get_current_handler(); + + if (port_no >= CELL_PAD_MAX_PORT_NUM) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); // CELL_PAD_ERROR_NO_DEVICE is not returned in this case. - // TODO: Set the setting regardless - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= CELL_PAD_MAX_PORT_NUM) return CELL_OK; const auto pad = pads[port_no]; @@ -718,9 +740,9 @@ error_code cellPadSetPressMode(u32 port_no, u32 mode) return CELL_PAD_ERROR_UNSUPPORTED_GAMEPAD; if (mode) - pad->m_port_setting |= CELL_PAD_SETTING_PRESS_ON; + config->port_setting[port_no] |= CELL_PAD_SETTING_PRESS_ON; else - pad->m_port_setting &= ~CELL_PAD_SETTING_PRESS_ON; + config->port_setting[port_no] &= ~CELL_PAD_SETTING_PRESS_ON; return CELL_OK; } @@ -729,19 +751,20 @@ error_code cellPadSetSensorMode(u32 port_no, u32 mode) { sys_io.trace("cellPadSetSensorMode(port_no=%d, mode=%d)", port_no, mode); - const auto handler = fxm::get(); + const auto config = fxm::get(); - if (!handler) + if (!config) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (port_no >= CELL_MAX_PADS) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); // CELL_PAD_ERROR_NO_DEVICE is not returned in this case. - // TODO: Set the setting regardless - if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) + if (port_no >= CELL_PAD_MAX_PORT_NUM) return CELL_OK; const auto pad = pads[port_no]; @@ -751,9 +774,9 @@ error_code cellPadSetSensorMode(u32 port_no, u32 mode) return CELL_PAD_ERROR_UNSUPPORTED_GAMEPAD; if (mode) - pad->m_port_setting |= CELL_PAD_SETTING_SENSOR_ON; + config->port_setting[port_no] |= CELL_PAD_SETTING_SENSOR_ON; else - pad->m_port_setting &= ~CELL_PAD_SETTING_SENSOR_ON; + config->port_setting[port_no] &= ~CELL_PAD_SETTING_SENSOR_ON; return CELL_OK; } @@ -762,11 +785,11 @@ error_code cellPadLddRegisterController() { sys_io.todo("cellPadLddRegisterController()"); - const auto handler = fxm::get(); - - if (!handler) + if (!fxm::check()) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + // can return CELL_PAD_ERROR_TOO_MANY_DEVICES return CELL_OK; @@ -776,11 +799,11 @@ error_code cellPadLddDataInsert(s32 handle, vm::ptr data) { sys_io.todo("cellPadLddDataInsert(handle=%d, data=*0x%x)", handle, data); - const auto handler = fxm::get(); - - if (!handler) + if (!fxm::check()) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (handle < 0 || !data) // data == NULL stalls on decr return CELL_PAD_ERROR_INVALID_PARAMETER; @@ -793,11 +816,11 @@ error_code cellPadLddGetPortNo(s32 handle) { sys_io.todo("cellPadLddGetPortNo(handle=%d)", handle); - const auto handler = fxm::get(); - - if (!handler) + if (!fxm::check()) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (handle < 0) return CELL_PAD_ERROR_INVALID_PARAMETER; @@ -808,11 +831,11 @@ error_code cellPadLddUnregisterController(s32 handle) { sys_io.todo("cellPadLddUnregisterController(handle=%d)", handle); - const auto handler = fxm::get(); - - if (!handler) + if (!fxm::check()) return CELL_PAD_ERROR_UNINITIALIZED; + const auto handler = pad::get_current_handler(); + if (handle < 0) return CELL_PAD_ERROR_INVALID_PARAMETER; diff --git a/rpcs3/Emu/Cell/Modules/cellPad.h b/rpcs3/Emu/Cell/Modules/cellPad.h index 1747520bad..ba0fbb16db 100644 --- a/rpcs3/Emu/Cell/Modules/cellPad.h +++ b/rpcs3/Emu/Cell/Modules/cellPad.h @@ -1,6 +1,7 @@ #pragma once - +#include "Emu/Io/PadHandler.h" +#include enum CellPadError : u32 { @@ -92,4 +93,16 @@ struct CellPadActParam { u8 motor[CELL_PAD_ACTUATOR_MAX]; u8 reserved[6]; -}; \ No newline at end of file +}; + +struct pad_t +{ + u32 max_connect; + std::array port_setting; + + pad_t(u32 max_connect) + : max_connect(max_connect) + { + port_setting.fill(CELL_PAD_SETTING_PRESS_OFF | CELL_PAD_SETTING_SENSOR_OFF); + } +}; diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index 4494e5d351..7c077f23e5 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -162,7 +162,6 @@ struct Pad { bool m_buffer_cleared; u32 m_port_status; - u32 m_port_setting; u32 m_device_capability; u32 m_device_type; @@ -208,18 +207,16 @@ struct Pad u16 m_sensor_z; u16 m_sensor_g; - void Init(u32 port_status, u32 port_setting, u32 device_capability, u32 device_type) + void Init(u32 port_status, u32 device_capability, u32 device_type) { m_port_status = port_status; - m_port_setting = port_setting; m_device_capability = device_capability; m_device_type = device_type; } - Pad(u32 port_status, u32 port_setting, u32 device_capability, u32 device_type) + Pad(u32 port_status, u32 device_capability, u32 device_type) : m_buffer_cleared(true) , m_port_status(port_status) - , m_port_setting(port_setting) , m_device_capability(device_capability) , m_device_type(device_type) diff --git a/rpcs3/Emu/RSX/Overlays/overlays.h b/rpcs3/Emu/RSX/Overlays/overlays.h index 14cdd8b783..0f801cf1ab 100644 --- a/rpcs3/Emu/RSX/Overlays/overlays.h +++ b/rpcs3/Emu/RSX/Overlays/overlays.h @@ -82,7 +82,7 @@ namespace rsx s32 run_input_loop() { - const auto handler = fxm::get(); + const auto handler = pad::get_current_handler(); if (!handler) { LOG_ERROR(RSX, "Pad handler expected but none initialized!"); @@ -90,8 +90,6 @@ namespace rsx } const PadInfo& rinfo = handler->GetInfo(); - if (rinfo.max_connect == 0) - return selection_code::error; std::array timestamp; timestamp.fill(std::chrono::steady_clock::now()); diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index f03e785ddb..c63120e4fe 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -1196,6 +1196,7 @@ void Emulator::Load(bool add_only) ppu_load_exec(ppu_exec); fxm::import(Emu.GetCallbacks().get_gs_render); // TODO: must be created in appropriate sys_rsx syscall + fxm::import(Emu.GetCallbacks().get_pad_handler); network_thread_init(); } else if (ppu_prx.open(elf_file) == elf_error::ok) diff --git a/rpcs3/ds4_pad_handler.cpp b/rpcs3/ds4_pad_handler.cpp index 36403647cf..a7204adb4c 100644 --- a/rpcs3/ds4_pad_handler.cpp +++ b/rpcs3/ds4_pad_handler.cpp @@ -792,7 +792,6 @@ bool ds4_pad_handler::bindPadToDevice(std::shared_ptr pad, const std::strin pad->Init ( CELL_PAD_STATUS_DISCONNECTED, - CELL_PAD_SETTING_PRESS_OFF | CELL_PAD_SETTING_SENSOR_OFF, CELL_PAD_CAPABILITY_PS3_CONFORMITY | CELL_PAD_CAPABILITY_PRESS_MODE | CELL_PAD_CAPABILITY_HP_ANALOG_STICK | CELL_PAD_CAPABILITY_ACTUATOR | CELL_PAD_CAPABILITY_SENSOR_MODE, CELL_PAD_DEV_TYPE_STANDARD ); diff --git a/rpcs3/evdev_joystick_handler.cpp b/rpcs3/evdev_joystick_handler.cpp index c933bdc416..8ea06cb53d 100644 --- a/rpcs3/evdev_joystick_handler.cpp +++ b/rpcs3/evdev_joystick_handler.cpp @@ -938,7 +938,6 @@ bool evdev_joystick_handler::bindPadToDevice(std::shared_ptr pad, const std pad->Init ( CELL_PAD_STATUS_DISCONNECTED, - CELL_PAD_SETTING_PRESS_OFF | CELL_PAD_SETTING_SENSOR_OFF, CELL_PAD_CAPABILITY_PS3_CONFORMITY | CELL_PAD_CAPABILITY_PRESS_MODE | CELL_PAD_CAPABILITY_HP_ANALOG_STICK | CELL_PAD_CAPABILITY_ACTUATOR | CELL_PAD_CAPABILITY_SENSOR_MODE, CELL_PAD_DEV_TYPE_STANDARD ); diff --git a/rpcs3/keyboard_pad_handler.cpp b/rpcs3/keyboard_pad_handler.cpp index 655c67611b..96a6164f0e 100644 --- a/rpcs3/keyboard_pad_handler.cpp +++ b/rpcs3/keyboard_pad_handler.cpp @@ -527,7 +527,6 @@ bool keyboard_pad_handler::bindPadToDevice(std::shared_ptr pad, const std:: pad->Init ( CELL_PAD_STATUS_DISCONNECTED, - CELL_PAD_SETTING_PRESS_OFF | CELL_PAD_SETTING_SENSOR_OFF, CELL_PAD_CAPABILITY_PS3_CONFORMITY | CELL_PAD_CAPABILITY_PRESS_MODE | CELL_PAD_CAPABILITY_HP_ANALOG_STICK | CELL_PAD_CAPABILITY_ACTUATOR | CELL_PAD_CAPABILITY_SENSOR_MODE, CELL_PAD_DEV_TYPE_STANDARD ); diff --git a/rpcs3/mm_joystick_handler.cpp b/rpcs3/mm_joystick_handler.cpp index b126904e71..99f41af74f 100644 --- a/rpcs3/mm_joystick_handler.cpp +++ b/rpcs3/mm_joystick_handler.cpp @@ -147,7 +147,6 @@ bool mm_joystick_handler::bindPadToDevice(std::shared_ptr pad, const std::s pad->Init ( CELL_PAD_STATUS_DISCONNECTED, - CELL_PAD_SETTING_PRESS_OFF | CELL_PAD_SETTING_SENSOR_OFF, CELL_PAD_CAPABILITY_PS3_CONFORMITY | CELL_PAD_CAPABILITY_PRESS_MODE | CELL_PAD_CAPABILITY_HP_ANALOG_STICK | CELL_PAD_CAPABILITY_ACTUATOR | CELL_PAD_CAPABILITY_SENSOR_MODE, CELL_PAD_DEV_TYPE_STANDARD ); diff --git a/rpcs3/pad_thread.cpp b/rpcs3/pad_thread.cpp index d9ade37018..fa5655fbc5 100644 --- a/rpcs3/pad_thread.cpp +++ b/rpcs3/pad_thread.cpp @@ -1,4 +1,4 @@ -#include "pad_thread.h" +#include "pad_thread.h" #include "ds4_pad_handler.h" #ifdef _WIN32 #include "xinput_pad_handler.h" @@ -9,24 +9,14 @@ #include "keyboard_pad_handler.h" #include "Emu/Io/Null/NullPadHandler.h" +namespace pad +{ + atomic_t g_current = nullptr; +} pad_thread::pad_thread(void *_curthread, void *_curwindow) : curthread(_curthread), curwindow(_curwindow) -{ - -} - -pad_thread::~pad_thread() -{ - active = false; - thread->join(); - - handlers.clear(); -} - -void pad_thread::Init(const u32 max_connect) { std::memset(&m_info, 0, sizeof(m_info)); - m_info.max_connect = std::min(max_connect, (u32)7); // max 7 pads m_info.now_connect = 0; g_cfg_input.load(); @@ -37,7 +27,7 @@ void pad_thread::Init(const u32 max_connect) std::shared_ptr nullpad = std::make_shared(); handlers.emplace(pad_handler::null, nullpad); - for (u32 i = 0; i < m_info.max_connect; i++) + for (u32 i = 0; i < 7 /* Max 7 pads */; i++) { std::shared_ptr cur_pad_handler; @@ -82,7 +72,6 @@ void pad_thread::Init(const u32 max_connect) m_pads.push_back(std::make_shared( CELL_PAD_STATUS_DISCONNECTED, - CELL_PAD_SETTING_PRESS_OFF | CELL_PAD_SETTING_SENSOR_OFF, CELL_PAD_CAPABILITY_PS3_CONFORMITY | CELL_PAD_CAPABILITY_PRESS_MODE | CELL_PAD_CAPABILITY_ACTUATOR, CELL_PAD_DEV_TYPE_STANDARD)); @@ -95,6 +84,16 @@ void pad_thread::Init(const u32 max_connect) } thread = std::make_shared(&pad_thread::ThreadFunc, this); + pad::g_current = this; +} + +pad_thread::~pad_thread() +{ + pad::g_current = nullptr; + active = false; + thread->join(); + + handlers.clear(); } void pad_thread::SetRumble(const u32 pad, u8 largeMotor, bool smallMotor) diff --git a/rpcs3/pad_thread.h b/rpcs3/pad_thread.h index 9f0ee57ceb..e0dae6bffb 100644 --- a/rpcs3/pad_thread.h +++ b/rpcs3/pad_thread.h @@ -8,7 +8,6 @@ struct PadInfo { - u32 max_connect; u32 now_connect; u32 system_info; }; @@ -19,7 +18,6 @@ public: pad_thread(void *_curthread, void *_curwindow); // void * instead of QThread * and QWindow * because of include in emucore ~pad_thread(); - void Init(const u32 max_connect); PadInfo& GetInfo() { return m_info; } std::vector>& GetPads() { return m_pads; } void SetRumble(const u32 pad, u8 largeMotor, bool smallMotor); @@ -40,3 +38,13 @@ protected: bool active; std::shared_ptr thread; }; + +namespace pad +{ + extern atomic_t g_current; + + static inline class pad_thread* get_current_handler() + { + return verify(HERE, g_current.load()); + }; +} diff --git a/rpcs3/xinput_pad_handler.cpp b/rpcs3/xinput_pad_handler.cpp index d2d35b90fc..2fd86ec4d5 100644 --- a/rpcs3/xinput_pad_handler.cpp +++ b/rpcs3/xinput_pad_handler.cpp @@ -480,7 +480,6 @@ bool xinput_pad_handler::bindPadToDevice(std::shared_ptr pad, const std::st pad->Init ( CELL_PAD_STATUS_DISCONNECTED, - CELL_PAD_SETTING_PRESS_OFF | CELL_PAD_SETTING_SENSOR_OFF, CELL_PAD_CAPABILITY_PS3_CONFORMITY | CELL_PAD_CAPABILITY_PRESS_MODE | CELL_PAD_CAPABILITY_HP_ANALOG_STICK | CELL_PAD_CAPABILITY_ACTUATOR | CELL_PAD_CAPABILITY_SENSOR_MODE, CELL_PAD_DEV_TYPE_STANDARD );