mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-08-04 15:19:47 +00:00
Merge branch 'master' into fix_cmake_on_windows
This commit is contained in:
commit
7f4ccd9f47
14 changed files with 113 additions and 91 deletions
|
@ -48,8 +48,8 @@ ln -s /usr/local/opt/curl/bin/curl /opt/homebrew1/opt/curl/bin/curl
|
||||||
brew_arm64_install_packages 0mq aom aribb24 ca-certificates cjson dav1d ffmpeg@5 fontconfig freetype freetype2 gettext glew gmp gnutls lame libbluray libidn2 libnettle libogg libpng librist libsodium libsoxr libtasn libtasn1 libunistring libvmaf libvorbis libvpx libx11 libxau libxcb libxdmcp llvm@$LLVM_COMPILER_VER mbedtls molten-vk nettle opencore-amr openjpeg openssl opus p11-kit pkg-config pkgconfig pzstd rav1e sdl2 snappy speex srt svt-av1 theora vulkan-headers webp x264 x265 xz z3 zeromq zmq zstd
|
brew_arm64_install_packages 0mq aom aribb24 ca-certificates cjson dav1d ffmpeg@5 fontconfig freetype freetype2 gettext glew gmp gnutls lame libbluray libidn2 libnettle libogg libpng librist libsodium libsoxr libtasn libtasn1 libunistring libvmaf libvorbis libvpx libx11 libxau libxcb libxdmcp llvm@$LLVM_COMPILER_VER mbedtls molten-vk nettle opencore-amr openjpeg openssl opus p11-kit pkg-config pkgconfig pzstd rav1e sdl2 snappy speex srt svt-av1 theora vulkan-headers webp x264 x265 xz z3 zeromq zmq zstd
|
||||||
"$BREW_ARM64_PATH/bin/brew" link -f ffmpeg@5
|
"$BREW_ARM64_PATH/bin/brew" link -f ffmpeg@5
|
||||||
|
|
||||||
# moltenvk based on commit for 1.2.10 release
|
# moltenvk based on commit for 1.2.11 release
|
||||||
wget https://raw.githubusercontent.com/Homebrew/homebrew-core/0d9f25fbd1658e975d00bd0e8cccd20a0c2cb74b/Formula/m/molten-vk.rb
|
wget https://raw.githubusercontent.com/Homebrew/homebrew-core/6bfc8950c696d1f952425e8af2a6248603dc0df9/Formula/m/molten-vk.rb
|
||||||
/usr/local/bin/brew install -f --overwrite ./molten-vk.rb
|
/usr/local/bin/brew install -f --overwrite ./molten-vk.rb
|
||||||
export CXX=clang++
|
export CXX=clang++
|
||||||
export CC=clang
|
export CC=clang
|
||||||
|
|
|
@ -9,15 +9,15 @@ brew install -f --overwrite nasm ninja p7zip ccache pipenv #create-dmg
|
||||||
#/usr/sbin/softwareupdate --install-rosetta --agree-to-license
|
#/usr/sbin/softwareupdate --install-rosetta --agree-to-license
|
||||||
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||||
arch -x86_64 /usr/local/bin/brew update
|
arch -x86_64 /usr/local/bin/brew update
|
||||||
arch -x86_64 /usr/local/bin/brew install -f --overwrite python@3.12 || arch -x86_64 /usr/local/bin/brew link --overwrite python@3.12
|
arch -x86_64 /usr/local/bin/brew install -f --overwrite python || arch -x86_64 /usr/local/bin/brew link --overwrite python
|
||||||
arch -x86_64 /usr/local/bin/brew uninstall -f --ignore-dependencies ffmpeg
|
arch -x86_64 /usr/local/bin/brew uninstall -f --ignore-dependencies ffmpeg
|
||||||
arch -x86_64 /usr/local/bin/brew install -f --build-from-source ffmpeg@5
|
arch -x86_64 /usr/local/bin/brew install -f --build-from-source ffmpeg@5
|
||||||
arch -x86_64 /usr/local/bin/brew reinstall -f --build-from-source gnutls freetype
|
arch -x86_64 /usr/local/bin/brew reinstall -f --build-from-source gnutls freetype
|
||||||
arch -x86_64 /usr/local/bin/brew install llvm@$LLVM_COMPILER_VER glew cmake sdl2 vulkan-headers coreutils
|
arch -x86_64 /usr/local/bin/brew install llvm@$LLVM_COMPILER_VER glew cmake sdl2 vulkan-headers coreutils
|
||||||
arch -x86_64 /usr/local/bin/brew link -f llvm@$LLVM_COMPILER_VER ffmpeg@5
|
arch -x86_64 /usr/local/bin/brew link -f llvm@$LLVM_COMPILER_VER ffmpeg@5
|
||||||
|
|
||||||
# moltenvk based on commit for 1.2.10 release
|
# moltenvk based on commit for 1.2.11 release
|
||||||
wget https://raw.githubusercontent.com/Homebrew/homebrew-core/0d9f25fbd1658e975d00bd0e8cccd20a0c2cb74b/Formula/m/molten-vk.rb
|
wget https://raw.githubusercontent.com/Homebrew/homebrew-core/6bfc8950c696d1f952425e8af2a6248603dc0df9/Formula/m/molten-vk.rb
|
||||||
arch -x86_64 /usr/local/bin/brew install -f --overwrite ./molten-vk.rb
|
arch -x86_64 /usr/local/bin/brew install -f --overwrite ./molten-vk.rb
|
||||||
export CXX=clang++
|
export CXX=clang++
|
||||||
export CC=clang
|
export CC=clang
|
||||||
|
|
2
3rdparty/MoltenVK/CMakeLists.txt
vendored
2
3rdparty/MoltenVK/CMakeLists.txt
vendored
|
@ -4,7 +4,7 @@ include(ExternalProject)
|
||||||
|
|
||||||
ExternalProject_Add(moltenvk
|
ExternalProject_Add(moltenvk
|
||||||
GIT_REPOSITORY https://github.com/KhronosGroup/MoltenVK.git
|
GIT_REPOSITORY https://github.com/KhronosGroup/MoltenVK.git
|
||||||
GIT_TAG edbdcf0
|
GIT_TAG 81541f6
|
||||||
BUILD_IN_SOURCE 1
|
BUILD_IN_SOURCE 1
|
||||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK
|
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK
|
||||||
CONFIGURE_COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/fetchDependencies" --macos
|
CONFIGURE_COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/fetchDependencies" --macos
|
||||||
|
|
|
@ -562,6 +562,11 @@ error_code sys_spu_thread_initialize(ppu_thread& ppu, vm::ptr<u32> thread, u32 g
|
||||||
|
|
||||||
sys_spu.warning("sys_spu_thread_initialize(thread=*0x%x, group=0x%x, spu_num=%d, img=*0x%x, attr=*0x%x, arg=*0x%x)", thread, group_id, spu_num, img, attr, arg);
|
sys_spu.warning("sys_spu_thread_initialize(thread=*0x%x, group=0x%x, spu_num=%d, img=*0x%x, attr=*0x%x, arg=*0x%x)", thread, group_id, spu_num, img, attr, arg);
|
||||||
|
|
||||||
|
if (spu_num >= std::size(decltype(lv2_spu_group::threads_map){}))
|
||||||
|
{
|
||||||
|
return CELL_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!attr)
|
if (!attr)
|
||||||
{
|
{
|
||||||
return CELL_EFAULT;
|
return CELL_EFAULT;
|
||||||
|
@ -598,7 +603,7 @@ error_code sys_spu_thread_initialize(ppu_thread& ppu, vm::ptr<u32> thread, u32 g
|
||||||
{
|
{
|
||||||
case SYS_SPU_IMAGE_TYPE_KERNEL:
|
case SYS_SPU_IMAGE_TYPE_KERNEL:
|
||||||
{
|
{
|
||||||
const auto handle = idm::get<lv2_obj, lv2_spu_image>(img->entry_point);
|
const auto handle = idm::get<lv2_obj, lv2_spu_image>(image.entry_point);
|
||||||
|
|
||||||
if (!handle)
|
if (!handle)
|
||||||
{
|
{
|
||||||
|
@ -703,11 +708,6 @@ error_code sys_spu_thread_initialize(ppu_thread& ppu, vm::ptr<u32> thread, u32 g
|
||||||
return CELL_ESRCH;
|
return CELL_ESRCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spu_num >= group->threads_map.size())
|
|
||||||
{
|
|
||||||
return CELL_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_lock lock(group->mutex);
|
std::unique_lock lock(group->mutex);
|
||||||
|
|
||||||
if (auto state = +group->run_state; state != SPU_THREAD_GROUP_STATUS_NOT_INITIALIZED)
|
if (auto state = +group->run_state; state != SPU_THREAD_GROUP_STATUS_NOT_INITIALIZED)
|
||||||
|
@ -1831,6 +1831,11 @@ error_code sys_spu_thread_write_snr(ppu_thread& ppu, u32 id, u32 number, u32 val
|
||||||
|
|
||||||
sys_spu.trace("sys_spu_thread_write_snr(id=0x%x, number=%d, value=0x%x)", id, number, value);
|
sys_spu.trace("sys_spu_thread_write_snr(id=0x%x, number=%d, value=0x%x)", id, number, value);
|
||||||
|
|
||||||
|
if (number > 1)
|
||||||
|
{
|
||||||
|
return CELL_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
const auto [thread, group] = lv2_spu_group::get_thread(id);
|
const auto [thread, group] = lv2_spu_group::get_thread(id);
|
||||||
|
|
||||||
if (!thread) [[unlikely]]
|
if (!thread) [[unlikely]]
|
||||||
|
@ -1838,11 +1843,6 @@ error_code sys_spu_thread_write_snr(ppu_thread& ppu, u32 id, u32 number, u32 val
|
||||||
return CELL_ESRCH;
|
return CELL_ESRCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (number > 1)
|
|
||||||
{
|
|
||||||
return CELL_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
thread->push_snr(number, value);
|
thread->push_snr(number, value);
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
|
@ -1919,17 +1919,15 @@ error_code sys_spu_thread_group_disconnect_event(ppu_thread& ppu, u32 id, u32 et
|
||||||
if (!ep)
|
if (!ep)
|
||||||
{
|
{
|
||||||
sys_spu.error("sys_spu_thread_group_disconnect_event(): unknown event type (%d)", et);
|
sys_spu.error("sys_spu_thread_group_disconnect_event(): unknown event type (%d)", et);
|
||||||
return CELL_EINVAL;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// No error checking is performed
|
||||||
|
|
||||||
std::lock_guard lock(group->mutex);
|
std::lock_guard lock(group->mutex);
|
||||||
|
|
||||||
if (!lv2_obj::check(*ep))
|
|
||||||
{
|
|
||||||
return CELL_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ep->reset();
|
ep->reset();
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2092,6 +2090,11 @@ error_code sys_spu_thread_group_connect_event_all_threads(ppu_thread& ppu, u32 i
|
||||||
|
|
||||||
sys_spu.warning("sys_spu_thread_group_connect_event_all_threads(id=0x%x, eq=0x%x, req=0x%llx, spup=*0x%x)", id, eq, req, spup);
|
sys_spu.warning("sys_spu_thread_group_connect_event_all_threads(id=0x%x, eq=0x%x, req=0x%llx, spup=*0x%x)", id, eq, req, spup);
|
||||||
|
|
||||||
|
if (!req)
|
||||||
|
{
|
||||||
|
return CELL_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
const auto group = idm::get<lv2_spu_group>(id);
|
const auto group = idm::get<lv2_spu_group>(id);
|
||||||
const auto queue = idm::get<lv2_obj, lv2_event_queue>(eq);
|
const auto queue = idm::get<lv2_obj, lv2_event_queue>(eq);
|
||||||
|
|
||||||
|
@ -2100,11 +2103,6 @@ error_code sys_spu_thread_group_connect_event_all_threads(ppu_thread& ppu, u32 i
|
||||||
return CELL_ESRCH;
|
return CELL_ESRCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!req)
|
|
||||||
{
|
|
||||||
return CELL_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_lock lock(group->mutex);
|
std::unique_lock lock(group->mutex);
|
||||||
|
|
||||||
if (auto state = +group->run_state;
|
if (auto state = +group->run_state;
|
||||||
|
@ -2174,6 +2172,11 @@ error_code sys_spu_thread_group_disconnect_event_all_threads(ppu_thread& ppu, u3
|
||||||
|
|
||||||
sys_spu.warning("sys_spu_thread_group_disconnect_event_all_threads(id=0x%x, spup=%d)", id, spup);
|
sys_spu.warning("sys_spu_thread_group_disconnect_event_all_threads(id=0x%x, spup=%d)", id, spup);
|
||||||
|
|
||||||
|
if (spup > 63)
|
||||||
|
{
|
||||||
|
return CELL_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
const auto group = idm::get<lv2_spu_group>(id);
|
const auto group = idm::get<lv2_spu_group>(id);
|
||||||
|
|
||||||
if (!group)
|
if (!group)
|
||||||
|
@ -2181,11 +2184,6 @@ error_code sys_spu_thread_group_disconnect_event_all_threads(ppu_thread& ppu, u3
|
||||||
return CELL_ESRCH;
|
return CELL_ESRCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spup > 63)
|
|
||||||
{
|
|
||||||
return CELL_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::lock_guard lock(group->mutex);
|
std::lock_guard lock(group->mutex);
|
||||||
|
|
||||||
for (auto& t : group->threads)
|
for (auto& t : group->threads)
|
||||||
|
|
|
@ -54,7 +54,7 @@ error_code sys_vm_memory_map(ppu_thread& ppu, u64 vsize, u64 psize, u32 cid, u64
|
||||||
|
|
||||||
sys_vm.warning("sys_vm_memory_map(vsize=0x%x, psize=0x%x, cid=0x%x, flags=0x%x, policy=0x%x, addr=*0x%x)", vsize, psize, cid, flag, policy, addr);
|
sys_vm.warning("sys_vm_memory_map(vsize=0x%x, psize=0x%x, cid=0x%x, flags=0x%x, policy=0x%x, addr=*0x%x)", vsize, psize, cid, flag, policy, addr);
|
||||||
|
|
||||||
if (!vsize || !psize || vsize % 0x200'0000 || vsize > 0x1000'0000 || psize > 0x1000'0000 || psize % 0x1'0000 || psize % policy != SYS_VM_POLICY_AUTO_RECOMMENDED)
|
if (!vsize || !psize || vsize % 0x200'0000 || vsize > 0x1000'0000 || psize % 0x1'0000 || policy != SYS_VM_POLICY_AUTO_RECOMMENDED)
|
||||||
{
|
{
|
||||||
return CELL_EINVAL;
|
return CELL_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -350,7 +350,6 @@ void PadHandlerBase::get_motion_sensors(const std::string& pad_id, const motion_
|
||||||
|
|
||||||
// Get the current motion values
|
// Get the current motion values
|
||||||
std::shared_ptr<Pad> pad = std::make_shared<Pad>(m_type, 0, 0, 0, 0);
|
std::shared_ptr<Pad> pad = std::make_shared<Pad>(m_type, 0, 0, 0, 0);
|
||||||
pad->m_sensors.resize(preview_values.size(), AnalogSensor(0, 0, 0, 0, 0));
|
|
||||||
pad_ensemble binding{pad, device, nullptr};
|
pad_ensemble binding{pad, device, nullptr};
|
||||||
get_extended_info(binding);
|
get_extended_info(binding);
|
||||||
|
|
||||||
|
@ -505,18 +504,18 @@ bool PadHandlerBase::bindPadToDevice(std::shared_ptr<Pad> pad)
|
||||||
pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_PRESS_PIGGYBACK, mapping[button::skateboard_tilt_right], CELL_PAD_CTRL_PRESS_R1);
|
pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_PRESS_PIGGYBACK, mapping[button::skateboard_tilt_right], CELL_PAD_CTRL_PRESS_R1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X, mapping[button::ls_left], mapping[button::ls_right]);
|
pad->m_sticks[0] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X, mapping[button::ls_left], mapping[button::ls_right]);
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y, mapping[button::ls_down], mapping[button::ls_up]);
|
pad->m_sticks[1] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y, mapping[button::ls_down], mapping[button::ls_up]);
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X, mapping[button::rs_left], mapping[button::rs_right]);
|
pad->m_sticks[2] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X, mapping[button::rs_left], mapping[button::rs_right]);
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y, mapping[button::rs_down], mapping[button::rs_up]);
|
pad->m_sticks[3] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y, mapping[button::rs_down], mapping[button::rs_up]);
|
||||||
|
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_X, 0, 0, 0, DEFAULT_MOTION_X);
|
pad->m_sensors[0] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_X, 0, 0, 0, DEFAULT_MOTION_X);
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_Y, 0, 0, 0, DEFAULT_MOTION_Y);
|
pad->m_sensors[1] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_Y, 0, 0, 0, DEFAULT_MOTION_Y);
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_Z, 0, 0, 0, DEFAULT_MOTION_Z);
|
pad->m_sensors[2] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_Z, 0, 0, 0, DEFAULT_MOTION_Z);
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_G, 0, 0, 0, DEFAULT_MOTION_G);
|
pad->m_sensors[3] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_G, 0, 0, 0, DEFAULT_MOTION_G);
|
||||||
|
|
||||||
pad->m_vibrateMotors.emplace_back(true, 0);
|
pad->m_vibrateMotors[0] = VibrateMotor(true, 0);
|
||||||
pad->m_vibrateMotors.emplace_back(false, 0);
|
pad->m_vibrateMotors[1] = VibrateMotor(false, 0);
|
||||||
|
|
||||||
m_bindings.emplace_back(pad, pad_device, nullptr);
|
m_bindings.emplace_back(pad, pad_device, nullptr);
|
||||||
|
|
||||||
|
|
|
@ -417,6 +417,7 @@ struct AnalogStick
|
||||||
std::map<u32, u16> m_pressed_keys_min{}; // only used in keyboard_pad_handler
|
std::map<u32, u16> m_pressed_keys_min{}; // only used in keyboard_pad_handler
|
||||||
std::map<u32, u16> m_pressed_keys_max{}; // only used in keyboard_pad_handler
|
std::map<u32, u16> m_pressed_keys_max{}; // only used in keyboard_pad_handler
|
||||||
|
|
||||||
|
AnalogStick() {}
|
||||||
AnalogStick(u32 offset, std::set<u32> key_codes_min, std::set<u32> key_codes_max)
|
AnalogStick(u32 offset, std::set<u32> key_codes_min, std::set<u32> key_codes_max)
|
||||||
: m_offset(offset)
|
: m_offset(offset)
|
||||||
, m_key_codes_min(std::move(key_codes_min))
|
, m_key_codes_min(std::move(key_codes_min))
|
||||||
|
@ -447,6 +448,7 @@ struct VibrateMotor
|
||||||
bool m_is_large_motor = false;
|
bool m_is_large_motor = false;
|
||||||
u8 m_value = 0;
|
u8 m_value = 0;
|
||||||
|
|
||||||
|
VibrateMotor() {}
|
||||||
VibrateMotor(bool is_large_motor, u8 value)
|
VibrateMotor(bool is_large_motor, u8 value)
|
||||||
: m_is_large_motor(is_large_motor)
|
: m_is_large_motor(is_large_motor)
|
||||||
, m_value(value)
|
, m_value(value)
|
||||||
|
@ -489,9 +491,9 @@ struct Pad
|
||||||
u8 m_battery_level{0};
|
u8 m_battery_level{0};
|
||||||
|
|
||||||
std::vector<Button> m_buttons;
|
std::vector<Button> m_buttons;
|
||||||
std::vector<AnalogStick> m_sticks;
|
std::array<AnalogStick, 4> m_sticks{};
|
||||||
std::vector<AnalogSensor> m_sensors;
|
std::array<AnalogSensor, 4> m_sensors{};
|
||||||
std::vector<VibrateMotor> m_vibrateMotors;
|
std::array<VibrateMotor, 2> m_vibrateMotors{};
|
||||||
|
|
||||||
// These hold bits for their respective buttons
|
// These hold bits for their respective buttons
|
||||||
u16 m_digital_1{0};
|
u16 m_digital_1{0};
|
||||||
|
|
|
@ -1219,7 +1219,7 @@ void evdev_joystick_handler::apply_input_events(const std::shared_ptr<Pad>& pad)
|
||||||
s32 stick_val[4]{};
|
s32 stick_val[4]{};
|
||||||
|
|
||||||
// Translate any corresponding keycodes to our two sticks. (ignoring thresholds for now)
|
// Translate any corresponding keycodes to our two sticks. (ignoring thresholds for now)
|
||||||
for (int i = 0; i < static_cast<int>(pad->m_sticks.size()); i++)
|
for (usz i = 0; i < pad->m_sticks.size(); i++)
|
||||||
{
|
{
|
||||||
bool pressed{}; // unused
|
bool pressed{}; // unused
|
||||||
u16 val_min{};
|
u16 val_min{};
|
||||||
|
@ -1424,23 +1424,23 @@ bool evdev_joystick_handler::bindPadToDevice(std::shared_ptr<Pad> pad)
|
||||||
m_dev->axis_right[2] = find_buttons(cfg->rs_up);
|
m_dev->axis_right[2] = find_buttons(cfg->rs_up);
|
||||||
m_dev->axis_right[3] = find_buttons(cfg->rs_down);
|
m_dev->axis_right[3] = find_buttons(cfg->rs_down);
|
||||||
|
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X, m_dev->axis_left[1], m_dev->axis_left[0]);
|
pad->m_sticks[0] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X, m_dev->axis_left[1], m_dev->axis_left[0]);
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y, m_dev->axis_left[3], m_dev->axis_left[2]);
|
pad->m_sticks[1] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y, m_dev->axis_left[3], m_dev->axis_left[2]);
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X, m_dev->axis_right[1], m_dev->axis_right[0]);
|
pad->m_sticks[2] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X, m_dev->axis_right[1], m_dev->axis_right[0]);
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y, m_dev->axis_right[3], m_dev->axis_right[2]);
|
pad->m_sticks[3] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y, m_dev->axis_right[3], m_dev->axis_right[2]);
|
||||||
|
|
||||||
m_dev->axis_motion[0] = find_motion_button(cfg->motion_sensor_x);
|
m_dev->axis_motion[0] = find_motion_button(cfg->motion_sensor_x);
|
||||||
m_dev->axis_motion[1] = find_motion_button(cfg->motion_sensor_y);
|
m_dev->axis_motion[1] = find_motion_button(cfg->motion_sensor_y);
|
||||||
m_dev->axis_motion[2] = find_motion_button(cfg->motion_sensor_z);
|
m_dev->axis_motion[2] = find_motion_button(cfg->motion_sensor_z);
|
||||||
m_dev->axis_motion[3] = find_motion_button(cfg->motion_sensor_g);
|
m_dev->axis_motion[3] = find_motion_button(cfg->motion_sensor_g);
|
||||||
|
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_X, m_dev->axis_motion[0].code, m_dev->axis_motion[0].mirrored, m_dev->axis_motion[0].shift, DEFAULT_MOTION_X);
|
pad->m_sensors[0] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_X, m_dev->axis_motion[0].code, m_dev->axis_motion[0].mirrored, m_dev->axis_motion[0].shift, DEFAULT_MOTION_X);
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_Y, m_dev->axis_motion[1].code, m_dev->axis_motion[1].mirrored, m_dev->axis_motion[1].shift, DEFAULT_MOTION_Y);
|
pad->m_sensors[1] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_Y, m_dev->axis_motion[1].code, m_dev->axis_motion[1].mirrored, m_dev->axis_motion[1].shift, DEFAULT_MOTION_Y);
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_Z, m_dev->axis_motion[2].code, m_dev->axis_motion[2].mirrored, m_dev->axis_motion[2].shift, DEFAULT_MOTION_Z);
|
pad->m_sensors[2] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_Z, m_dev->axis_motion[2].code, m_dev->axis_motion[2].mirrored, m_dev->axis_motion[2].shift, DEFAULT_MOTION_Z);
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_G, m_dev->axis_motion[3].code, m_dev->axis_motion[3].mirrored, m_dev->axis_motion[3].shift, DEFAULT_MOTION_G);
|
pad->m_sensors[3] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_G, m_dev->axis_motion[3].code, m_dev->axis_motion[3].mirrored, m_dev->axis_motion[3].shift, DEFAULT_MOTION_G);
|
||||||
|
|
||||||
pad->m_vibrateMotors.emplace_back(true, 0);
|
pad->m_vibrateMotors[0] = VibrateMotor(true, 0);
|
||||||
pad->m_vibrateMotors.emplace_back(false, 0);
|
pad->m_vibrateMotors[1] = VibrateMotor(false, 0);
|
||||||
|
|
||||||
if (std::shared_ptr<EvdevDevice> evdev_device = add_device(player_config->device, false))
|
if (std::shared_ptr<EvdevDevice> evdev_device = add_device(player_config->device, false))
|
||||||
{
|
{
|
||||||
|
|
|
@ -314,11 +314,6 @@ void keyboard_pad_handler::release_all_keys()
|
||||||
|
|
||||||
for (usz i = 0; i < pad.m_sticks.size(); i++)
|
for (usz i = 0; i < pad.m_sticks.size(); i++)
|
||||||
{
|
{
|
||||||
if (i >= max_sticks)
|
|
||||||
{
|
|
||||||
input_log.fatal("Too many sticks (%d vs %d)", pad.m_sticks.size(), max_sticks);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m_stick_min[i] = 0;
|
m_stick_min[i] = 0;
|
||||||
m_stick_max[i] = 128;
|
m_stick_max[i] = 128;
|
||||||
m_stick_val[i] = 128;
|
m_stick_val[i] = 128;
|
||||||
|
@ -1067,18 +1062,18 @@ bool keyboard_pad_handler::bindPadToDevice(std::shared_ptr<Pad> pad)
|
||||||
pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_PRESS_PIGGYBACK, find_keys(cfg->tilt_right), CELL_PAD_CTRL_PRESS_R1);
|
pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_PRESS_PIGGYBACK, find_keys(cfg->tilt_right), CELL_PAD_CTRL_PRESS_R1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X, find_keys(cfg->ls_left), find_keys(cfg->ls_right));
|
pad->m_sticks[0] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X, find_keys(cfg->ls_left), find_keys(cfg->ls_right));
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y, find_keys(cfg->ls_up), find_keys(cfg->ls_down));
|
pad->m_sticks[1] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y, find_keys(cfg->ls_up), find_keys(cfg->ls_down));
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X, find_keys(cfg->rs_left), find_keys(cfg->rs_right));
|
pad->m_sticks[2] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X, find_keys(cfg->rs_left), find_keys(cfg->rs_right));
|
||||||
pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y, find_keys(cfg->rs_up), find_keys(cfg->rs_down));
|
pad->m_sticks[3] = AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y, find_keys(cfg->rs_up), find_keys(cfg->rs_down));
|
||||||
|
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_X, 0, 0, 0, DEFAULT_MOTION_X);
|
pad->m_sensors[0] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_X, 0, 0, 0, DEFAULT_MOTION_X);
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_Y, 0, 0, 0, DEFAULT_MOTION_Y);
|
pad->m_sensors[1] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_Y, 0, 0, 0, DEFAULT_MOTION_Y);
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_Z, 0, 0, 0, DEFAULT_MOTION_Z);
|
pad->m_sensors[2] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_Z, 0, 0, 0, DEFAULT_MOTION_Z);
|
||||||
pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_G, 0, 0, 0, DEFAULT_MOTION_G);
|
pad->m_sensors[3] = AnalogSensor(CELL_PAD_BTN_OFFSET_SENSOR_G, 0, 0, 0, DEFAULT_MOTION_G);
|
||||||
|
|
||||||
pad->m_vibrateMotors.emplace_back(true, 0);
|
pad->m_vibrateMotors[0] = VibrateMotor(true, 0);
|
||||||
pad->m_vibrateMotors.emplace_back(false, 0);
|
pad->m_vibrateMotors[1] = VibrateMotor(false, 0);
|
||||||
|
|
||||||
m_bindings.emplace_back(pad, nullptr, nullptr);
|
m_bindings.emplace_back(pad, nullptr, nullptr);
|
||||||
m_pads_internal.push_back(*pad);
|
m_pads_internal.push_back(*pad);
|
||||||
|
@ -1258,7 +1253,7 @@ void keyboard_pad_handler::process()
|
||||||
|
|
||||||
// Normalize and apply pad squircling
|
// Normalize and apply pad squircling
|
||||||
// Copy sticks first. We don't want to modify the raw internal values
|
// Copy sticks first. We don't want to modify the raw internal values
|
||||||
std::vector<AnalogStick> squircled_sticks = pad_internal.m_sticks;
|
std::array<AnalogStick, 4> squircled_sticks = pad_internal.m_sticks;
|
||||||
|
|
||||||
// Apply squircling
|
// Apply squircling
|
||||||
if (cfg->lpadsquircling != 0)
|
if (cfg->lpadsquircling != 0)
|
||||||
|
@ -1278,6 +1273,6 @@ void keyboard_pad_handler::process()
|
||||||
}
|
}
|
||||||
|
|
||||||
pad->m_buttons = pad_internal.m_buttons;
|
pad->m_buttons = pad_internal.m_buttons;
|
||||||
pad->m_sticks = std::move(squircled_sticks);
|
pad->m_sticks = squircled_sticks; // Don't use std::move here. We assign values lockless, so std::move can lead to segfaults.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -212,12 +212,9 @@ void pad_thread::SetRumble(const u32 pad, u8 large_motor, bool small_motor)
|
||||||
if (pad >= m_pads.size())
|
if (pad >= m_pads.size())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_pads[pad]->m_vibrateMotors.size() >= 2)
|
|
||||||
{
|
|
||||||
m_pads[pad]->m_vibrateMotors[0].m_value = large_motor;
|
m_pads[pad]->m_vibrateMotors[0].m_value = large_motor;
|
||||||
m_pads[pad]->m_vibrateMotors[1].m_value = small_motor ? 255 : 0;
|
m_pads[pad]->m_vibrateMotors[1].m_value = small_motor ? 255 : 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void pad_thread::SetIntercepted(bool intercepted)
|
void pad_thread::SetIntercepted(bool intercepted)
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,6 +14,30 @@ game_list::game_list() : QTableWidget(), game_list_base()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void game_list::sync_header_actions(QList<QAction*>& actions, std::function<bool(int)> get_visibility)
|
||||||
|
{
|
||||||
|
ensure(get_visibility);
|
||||||
|
|
||||||
|
bool is_dirty = false;
|
||||||
|
|
||||||
|
for (int col = 0; col < actions.count(); ++col)
|
||||||
|
{
|
||||||
|
const bool is_hidden = !get_visibility(col);
|
||||||
|
actions[col]->setChecked(!is_hidden);
|
||||||
|
|
||||||
|
if (isColumnHidden(col) != is_hidden)
|
||||||
|
{
|
||||||
|
setColumnHidden(col, is_hidden);
|
||||||
|
is_dirty = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_dirty)
|
||||||
|
{
|
||||||
|
fix_narrow_columns();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void game_list::create_header_actions(QList<QAction*>& actions, std::function<bool(int)> get_visibility, std::function<void(int, bool)> set_visibility)
|
void game_list::create_header_actions(QList<QAction*>& actions, std::function<bool(int)> get_visibility, std::function<void(int, bool)> set_visibility)
|
||||||
{
|
{
|
||||||
ensure(get_visibility);
|
ensure(get_visibility);
|
||||||
|
@ -48,6 +72,7 @@ void game_list::create_header_actions(QList<QAction*>& actions, std::function<bo
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setColumnHidden(col, !checked); // Negate because it's a set col hidden and we have menu say show.
|
setColumnHidden(col, !checked); // Negate because it's a set col hidden and we have menu say show.
|
||||||
set_visibility(col, checked);
|
set_visibility(col, checked);
|
||||||
|
|
||||||
|
@ -56,11 +81,9 @@ void game_list::create_header_actions(QList<QAction*>& actions, std::function<bo
|
||||||
fix_narrow_columns();
|
fix_narrow_columns();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const bool vis = get_visibility(col);
|
|
||||||
actions[col]->setChecked(vis);
|
|
||||||
setColumnHidden(col, !vis);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sync_header_actions(actions, get_visibility);
|
||||||
}
|
}
|
||||||
|
|
||||||
void game_list::clear_list()
|
void game_list::clear_list()
|
||||||
|
|
|
@ -24,6 +24,7 @@ class game_list : public QTableWidget, public game_list_base
|
||||||
public:
|
public:
|
||||||
game_list();
|
game_list();
|
||||||
|
|
||||||
|
void sync_header_actions(QList<QAction*>& actions, std::function<bool(int)> get_visibility);
|
||||||
void create_header_actions(QList<QAction*>& actions, std::function<bool(int)> get_visibility, std::function<void(int, bool)> set_visibility);
|
void create_header_actions(QList<QAction*>& actions, std::function<bool(int)> get_visibility, std::function<void(int, bool)> set_visibility);
|
||||||
|
|
||||||
void clear_list() override; // Use this instead of clearContents
|
void clear_list() override; // Use this instead of clearContents
|
||||||
|
|
|
@ -230,12 +230,7 @@ void game_list_frame::LoadSettings()
|
||||||
m_show_custom_icons = m_gui_settings->GetValue(gui::gl_custom_icon).toBool();
|
m_show_custom_icons = m_gui_settings->GetValue(gui::gl_custom_icon).toBool();
|
||||||
m_play_hover_movies = m_gui_settings->GetValue(gui::gl_hover_gifs).toBool();
|
m_play_hover_movies = m_gui_settings->GetValue(gui::gl_hover_gifs).toBool();
|
||||||
|
|
||||||
for (int col = 0; col < m_columnActs.count(); ++col)
|
m_game_list->sync_header_actions(m_columnActs, [this](int col) { return m_gui_settings->GetGamelistColVisibility(static_cast<gui::game_list_columns>(col)); });
|
||||||
{
|
|
||||||
const bool vis = m_gui_settings->GetGamelistColVisibility(static_cast<gui::game_list_columns>(col));
|
|
||||||
m_columnActs[col]->setChecked(vis);
|
|
||||||
m_game_list->setColumnHidden(col, !vis);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
game_list_frame::~game_list_frame()
|
game_list_frame::~game_list_frame()
|
||||||
|
@ -915,6 +910,7 @@ void game_list_frame::OnRefreshFinished()
|
||||||
if (!std::exchange(m_initial_refresh_done, true))
|
if (!std::exchange(m_initial_refresh_done, true))
|
||||||
{
|
{
|
||||||
m_game_list->restore_layout(m_gui_settings->GetValue(gui::gl_state).toByteArray());
|
m_game_list->restore_layout(m_gui_settings->GetValue(gui::gl_state).toByteArray());
|
||||||
|
m_game_list->sync_header_actions(m_columnActs, [this](int col) { return m_gui_settings->GetGamelistColVisibility(static_cast<gui::game_list_columns>(col)); });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit signal and remove slots
|
// Emit signal and remove slots
|
||||||
|
|
|
@ -522,6 +522,13 @@ void trophy_manager_dialog::RepaintUI(bool restore_layout)
|
||||||
//m_trophy_table->horizontalHeader()->resizeSections(QHeaderView::ResizeMode::ResizeToContents);
|
//m_trophy_table->horizontalHeader()->resizeSections(QHeaderView::ResizeMode::ResizeToContents);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (restore_layout)
|
||||||
|
{
|
||||||
|
// Make sure the actions and the headers are synced
|
||||||
|
m_game_table->sync_header_actions(m_game_column_acts, [this](int col) { return m_gui_settings->GetTrophyGamelistColVisibility(static_cast<gui::trophy_game_list_columns>(col)); });
|
||||||
|
m_trophy_table->sync_header_actions(m_trophy_column_acts, [this](int col) { return m_gui_settings->GetTrophylistColVisibility(static_cast<gui::trophy_list_columns>(col)); });
|
||||||
|
}
|
||||||
|
|
||||||
ApplyFilter();
|
ApplyFilter();
|
||||||
|
|
||||||
// Show dialog and then paint gui in order to adjust headers correctly
|
// Show dialog and then paint gui in order to adjust headers correctly
|
||||||
|
@ -543,6 +550,10 @@ void trophy_manager_dialog::HandleRepaintUiRequest()
|
||||||
m_game_table->horizontalHeader()->restoreState(game_table_state);
|
m_game_table->horizontalHeader()->restoreState(game_table_state);
|
||||||
m_trophy_table->horizontalHeader()->restoreState(trophy_table_state);
|
m_trophy_table->horizontalHeader()->restoreState(trophy_table_state);
|
||||||
|
|
||||||
|
// Make sure the actions and the headers are synced
|
||||||
|
m_game_table->sync_header_actions(m_game_column_acts, [this](int col) { return m_gui_settings->GetTrophyGamelistColVisibility(static_cast<gui::trophy_game_list_columns>(col)); });
|
||||||
|
m_trophy_table->sync_header_actions(m_trophy_column_acts, [this](int col) { return m_gui_settings->GetTrophylistColVisibility(static_cast<gui::trophy_list_columns>(col)); });
|
||||||
|
|
||||||
resize(window_size);
|
resize(window_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue