From 9e2c41bd4896e276870c2798d35e464fcbf0f7b6 Mon Sep 17 00:00:00 2001 From: Rad0van Date: Sat, 6 Jun 2026 18:13:39 +0200 Subject: [PATCH 01/64] cellAudio: fix _mxr000 surmixer event-queue key constant The "Dirty hack for sound" in AudioSetNotifyEventQueue() is gated on a named constant c_mxr000 that is supposed to equal the IPC key of the _mxr000 event queue created by the game's _cellsurMixerMain thread (0x8000cafe02460300, e.g. Virtua Fighter 5 FS / SEGA AM2 CRI titles). When the inline literal was refactored into the named constant in 730badd37 ("cellAudio: Move and partially fix _mxr000 hack", 2023) a trailing hex digit was dropped: 0x8000cafe0246030 instead of 0x8000cafe02460300 (the value used by the original 2018 hack in cc0d7c598). As a result `key == c_mxr000` never matches and lv2_event_queue::find(c_mxr000) looks up the wrong key, so the surmixer-queue serialization path is effectively dead for every _mxr000 CRI game. Restore the correct 16-digit key so the gate and lookup match the queue the game actually creates. Note: this corrects a real latent bug but does not by itself resolve the cellSurMixer null-deref in VF5FS (#17066), which is a separate, flaky CRI channel-strip init divergence. Co-Authored-By: Claude Opus 4.8 (1M context) --- rpcs3/Emu/Cell/Modules/cellAudio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/Modules/cellAudio.cpp b/rpcs3/Emu/Cell/Modules/cellAudio.cpp index b28809ef03..d2aed65f25 100644 --- a/rpcs3/Emu/Cell/Modules/cellAudio.cpp +++ b/rpcs3/Emu/Cell/Modules/cellAudio.cpp @@ -1662,7 +1662,7 @@ error_code AudioSetNotifyEventQueue(ppu_thread& ppu, u64 key, u32 iFlags) lv2_sleep(20, &ppu); // Dirty hack for sound: confirm the creation of _mxr000 event queue by _cellsurMixerMain thread - constexpr u64 c_mxr000 = 0x8000cafe0246030; + constexpr u64 c_mxr000 = 0x8000cafe02460300; if (key == c_mxr000 || key == 0) { From d85f1c715584f8d6bc2f58c6435b2b893212905a Mon Sep 17 00:00:00 2001 From: Malcolm Date: Sat, 6 Jun 2026 14:35:34 -0400 Subject: [PATCH 02/64] RSX: Add hardware spin_wait helper, use it in flush requests --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 4 +- rpcs3/Emu/RSX/GL/GLGSRender.h | 11 ++-- rpcs3/Emu/RSX/VK/VKGSRenderTypes.hpp | 12 ++--- rpcs3/util/asm.hpp | 80 ++++++++++++++++++++++++++++ rpcs3/util/atomic.hpp | 5 ++ 5 files changed, 99 insertions(+), 13 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 15226ab485..02233d46f4 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1307,11 +1307,11 @@ void GLGSRender::do_local_task(rsx::FIFO::state state) { std::lock_guard lock(queue_guard); - work_queue.remove_if([](auto &q) { return q.received; }); + work_queue.remove_if([](auto &q) { return q.received.load(); }); for (auto& q : work_queue) { - if (q.processed) continue; + if (q.processed.load()) continue; gl::command_context cmd{ gl_state }; q.result = m_gl_texture_cache.flush_all(cmd, q.section_data); diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index 330838f804..530da541c7 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -6,6 +6,7 @@ #include "GLOverlays.h" #include "GLShaderInterpreter.h" #include "Emu/RSX/rsx_cache.h" +#include "util/asm.hpp" #include #include @@ -45,16 +46,16 @@ namespace gl u32 address_to_flush = 0; gl::texture_cache::thrashed_set section_data; - volatile bool processed = false; + atomic_t processed = false; volatile bool result = false; - volatile bool received = false; + atomic_t received = false; void producer_wait() { - while (!processed) + utils::spin_wait(processed, [](auto v) { - std::this_thread::yield(); - } + return v; + }); received = true; } diff --git a/rpcs3/Emu/RSX/VK/VKGSRenderTypes.hpp b/rpcs3/Emu/RSX/VK/VKGSRenderTypes.hpp index 0a400c68d9..0b80a5d4e6 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRenderTypes.hpp +++ b/rpcs3/Emu/RSX/VK/VKGSRenderTypes.hpp @@ -254,18 +254,18 @@ namespace vk void consumer_wait() const { - while (num_waiters.load() != 0) + utils::spin_wait(num_waiters, [](auto v) { - utils::pause(); - } + return v == 0; + }); } void producer_wait() const { - while (pending_state.load()) + utils::spin_wait(pending_state, [](auto v) { - std::this_thread::yield(); - } + return !v; + }); } }; diff --git a/rpcs3/util/asm.hpp b/rpcs3/util/asm.hpp index 0aea4c10c2..b65e722639 100644 --- a/rpcs3/util/asm.hpp +++ b/rpcs3/util/asm.hpp @@ -3,11 +3,13 @@ #include "util/types.hpp" #include "util/tsc.hpp" #include "util/atomic.hpp" +#include "util/sysinfo.hpp" #include #ifdef ARCH_X64 #ifdef _MSC_VER #include +#include #else #include #include @@ -216,6 +218,84 @@ namespace utils while (get_tsc() < stop); } + template +#if defined(ARCH_X64) && !defined(_MSC_VER) + __attribute__((target("waitpkg,mwaitx"))) +#endif + inline void spin_wait(const atomic_t& var, Pred predicate) + { +#ifdef ARCH_X64 + static const bool use_umwait = has_waitpkg(); + static const bool use_waitx = has_waitx(); +#endif + + const auto read_mem = [&]() + { + return var.load(); + }; + + const void* addr = &var.raw(); + + while (true) + { + if (predicate(read_mem())) + { + return; + } + +#if defined(ARCH_ARM64) + using value_type = decltype(read_mem()); + using wait_type = std::remove_cvref_t; + + wait_type value{}; + const auto* wait_addr = static_cast(addr); + + if constexpr (sizeof(wait_type) == 1) __asm__ volatile("ldaxrb %w0, %1" : "=r"(value) : "Q"(*wait_addr) : "memory"); + else if constexpr (sizeof(wait_type) == 2) __asm__ volatile("ldaxrh %w0, %1" : "=r"(value) : "Q"(*wait_addr) : "memory"); + else if constexpr (sizeof(wait_type) == 4) __asm__ volatile("ldaxr %w0, %1" : "=r"(value) : "Q"(*wait_addr) : "memory"); + else if constexpr (sizeof(wait_type) == 8) __asm__ volatile("ldaxr %x0, %1" : "=r"(value) : "Q"(*wait_addr) : "memory"); + else static_assert(sizeof(wait_type) <= 8, "Unsupported atomic size for spin_wait"); + + if (predicate(static_cast(value))) + { + __asm__ volatile("clrex" ::: "memory"); + return; + } + + __asm__ volatile("wfe" ::: "memory"); + __asm__ volatile("clrex" ::: "memory"); + +#elif defined(ARCH_X64) + if (use_umwait) + { + _umonitor(const_cast(addr)); + if (predicate(read_mem())) + { + return; + } + + _umwait(0, ~0ULL); + } + else if (use_waitx) + { + _mm_monitorx(const_cast(addr), 0, 0); + if (predicate(read_mem())) + { + return; + } + + _mm_mwaitx(0, 0, 0); + } + else + { + pause(); + } +#else + pause(); +#endif + } + } + // Align to power of 2 template requires std::is_unsigned_v diff --git a/rpcs3/util/atomic.hpp b/rpcs3/util/atomic.hpp index f77aad7825..49d9663dec 100644 --- a/rpcs3/util/atomic.hpp +++ b/rpcs3/util/atomic.hpp @@ -1742,6 +1742,11 @@ public: return base::load() != 0; } + const uchar& raw() const + { + return base::raw(); + } + // Override implicit conversion from the parent type explicit operator uchar() const = delete; From e7165cbe99afb232c2e80d773bc6fed5d3da879a Mon Sep 17 00:00:00 2001 From: Malcolm Date: Sat, 6 Jun 2026 14:36:14 -0400 Subject: [PATCH 03/64] RSX: Use one-shot cacheline wait in semaphore acquire --- rpcs3/Emu/RSX/NV47/HW/nv406e.cpp | 13 +++- rpcs3/util/asm.hpp | 117 +++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp b/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp index 4307cc8289..3eaebb1528 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp @@ -29,6 +29,7 @@ namespace rsx RSX(ctx)->m_graphics_state |= rsx::pipeline_state::fragment_program_needs_rehash; const auto& sema = vm::_ref(addr); + const auto& atomic_sema = vm::_ref>(addr); if (sema == arg) { @@ -79,7 +80,17 @@ namespace rsx } } - RSX(ctx)->cpu_wait({}); + if (RSX(ctx)->external_interrupt_lock || + (RSX(ctx)->state & (cpu_flag::dbg_global_pause + cpu_flag::exit)) == cpu_flag::dbg_global_pause) + { + RSX(ctx)->cpu_wait({}); + continue; + } + + RSX(ctx)->on_semaphore_acquire_wait(); + + // Wait until the value changes or until 100us pass. + utils::spin_on_cacheline_once(atomic_sema, sema, 100); } RSX(ctx)->fifo_wake_delay(); diff --git a/rpcs3/util/asm.hpp b/rpcs3/util/asm.hpp index b65e722639..da7326a09f 100644 --- a/rpcs3/util/asm.hpp +++ b/rpcs3/util/asm.hpp @@ -5,6 +5,7 @@ #include "util/atomic.hpp" #include "util/sysinfo.hpp" #include +#include #ifdef ARCH_X64 #ifdef _MSC_VER @@ -218,6 +219,122 @@ namespace utils while (get_tsc() < stop); } +#ifdef ARCH_X64 + inline u64 get_wait_cycles(u64 timeout_us, u64 tsc_freq) + { + constexpr u64 max_timeout = u64{umax}; + + if (!tsc_freq) + { + return 0; + } + + if (timeout_us == max_timeout) + { + return max_timeout; + } + + const u64 seconds = timeout_us / 1'000'000; + const u64 micros = timeout_us % 1'000'000; + + if (seconds > max_timeout / tsc_freq) + { + return max_timeout; + } + + const u64 sec_cycles = seconds * tsc_freq; + const u64 cycles_per_us = tsc_freq / 1'000'000; + + if (micros && cycles_per_us > max_timeout / micros) + { + return max_timeout; + } + + const u64 us_cycles = micros * cycles_per_us + (micros * (tsc_freq % 1'000'000)) / 1'000'000; + return sec_cycles > max_timeout - us_cycles ? max_timeout : sec_cycles + us_cycles; + } +#endif + + template +#if defined(ARCH_X64) && !defined(_MSC_VER) + __attribute__((target("waitpkg,mwaitx"))) +#endif + inline void spin_on_cacheline_once(const atomic_t& var, T old_value, u64 timeout_us) + { + const void* addr = &var.raw(); + +#if defined(ARCH_ARM64) + // WFE will wake from the periodic event stream, so the explicit timeout is ignored on ARM. + (void)timeout_us; + + using wait_type = std::remove_cvref_t; + using raw_type = std::conditional_t>>; + + static_assert(sizeof(wait_type) <= 8, "Unsupported atomic size for spin_on_cacheline_once"); + + raw_type value{}; + const auto* wait_addr = static_cast(addr); + + if constexpr (sizeof(raw_type) == 1) __asm__ volatile("ldaxrb %w0, %1" : "=r"(value) : "Q"(*wait_addr) : "memory"); + else if constexpr (sizeof(raw_type) == 2) __asm__ volatile("ldaxrh %w0, %1" : "=r"(value) : "Q"(*wait_addr) : "memory"); + else if constexpr (sizeof(raw_type) == 4) __asm__ volatile("ldaxr %w0, %1" : "=r"(value) : "Q"(*wait_addr) : "memory"); + else if constexpr (sizeof(raw_type) == 8) __asm__ volatile("ldaxr %x0, %1" : "=r"(value) : "Q"(*wait_addr) : "memory"); + + if (std::bit_cast(value) != old_value) + { + __asm__ volatile("clrex" ::: "memory"); + return; + } + + __asm__ volatile("wfe" ::: "memory"); + __asm__ volatile("clrex" ::: "memory"); +#elif defined(ARCH_X64) + static const bool use_umwait = has_waitpkg(); + static const bool use_waitx = has_waitx(); + + const u64 cycles = get_wait_cycles(timeout_us, get_tsc_freq()); + + if (use_umwait && cycles) + { + _umonitor(const_cast(addr)); + + if (var.load() != old_value) + { + return; + } + + constexpr u64 max_timeout = u64{umax}; + const u64 now = get_tsc(); + const u64 deadline = cycles > max_timeout - now ? max_timeout : now + cycles; + _umwait(0, deadline); + } + else if (use_waitx && cycles) + { + _mm_monitorx(const_cast(addr), 0, 0); + + if (var.load() != old_value) + { + return; + } + + constexpr u32 timer_enable = 2; + _mm_mwaitx(timer_enable, 0, cycles > u32{umax} ? u32{umax} : static_cast(cycles)); + } + else + { + std::this_thread::yield(); + } +#else + (void)addr; + (void)old_value; + (void)timeout_us; + + std::this_thread::yield(); +#endif + } + template #if defined(ARCH_X64) && !defined(_MSC_VER) __attribute__((target("waitpkg,mwaitx"))) From 339877ea7dd1d4cd2f995a20d30b7d56bab3e65c Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 7 Jun 2026 17:20:52 +0300 Subject: [PATCH 04/64] rsx: Handle mipmap sampling edge case when SNORM emulation is active --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 22 +++++++++++++++++++++- rpcs3/Emu/RSX/GL/glutils/sampler.cpp | 4 ++-- rpcs3/Emu/RSX/VK/VKDraw.cpp | 1 + 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index 57a9b08a17..9c09a96d39 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -8,6 +8,8 @@ namespace gl { + extern GLenum tex_min_filter(rsx::texture_minify_filter min_filter); + inline GLenum comparison_op(rsx::comparison_function op) { return static_cast(op); @@ -410,8 +412,26 @@ void GLGSRender::load_texture_env() if (is_depth_reconstructed || is_snorm) { + GLint adjusted_min_filter = GL_NEAREST; + if (!is_depth_reconstructed) [[ unlikely ]] + { + switch (gl::tex_min_filter(tex.min_filter())) + { + default: + break; + case GL_LINEAR_MIPMAP_LINEAR: + case GL_LINEAR_MIPMAP_NEAREST: + case GL_NEAREST_MIPMAP_LINEAR: + case GL_NEAREST_MIPMAP_NEAREST: + // This is a hack and an unfortunate one at that as there is no feasible workaround. + // Doing full trilinear filtering in a shader is just dumb, approximate it instead with NEAREST_NEAREST. + adjusted_min_filter = GL_NEAREST_MIPMAP_NEAREST; + break; + } + } + // Depth format redirected to BGRA8 resample stage. Do not filter to avoid bits leaking. - m_fs_sampler_states[i].set_parameteri(GL_TEXTURE_MIN_FILTER, GL_NEAREST); + m_fs_sampler_states[i].set_parameteri(GL_TEXTURE_MIN_FILTER, adjusted_min_filter); m_fs_sampler_states[i].set_parameteri(GL_TEXTURE_MAG_FILTER, GL_NEAREST); } } diff --git a/rpcs3/Emu/RSX/GL/glutils/sampler.cpp b/rpcs3/Emu/RSX/GL/glutils/sampler.cpp index 4b1b603fc6..005f6fa1d6 100644 --- a/rpcs3/Emu/RSX/GL/glutils/sampler.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/sampler.cpp @@ -45,7 +45,7 @@ namespace gl return 1.0f; } - int tex_min_filter(rsx::texture_minify_filter min_filter) + GLenum tex_min_filter(rsx::texture_minify_filter min_filter) { switch (min_filter) { @@ -60,7 +60,7 @@ namespace gl fmt::throw_exception("Unknown min filter"); } - int tex_mag_filter(rsx::texture_magnify_filter mag_filter) + GLenum tex_mag_filter(rsx::texture_magnify_filter mag_filter) { switch (mag_filter) { diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 8a6789213b..132f832416 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -457,6 +457,7 @@ void VKGSRender::load_texture_env() { mag_filter = VK_FILTER_NEAREST; min_filter.filter = VK_FILTER_NEAREST; + min_filter.mipmap_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST; } if (min_filter.sample_mipmaps && mipmap_count > 1) From 57b4687ac2a27250a75d9feeefa4906830782321 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sun, 7 Jun 2026 16:51:21 +0300 Subject: [PATCH 05/64] cellAudio: Fix _mxr000 event queue hack --- rpcs3/Emu/Cell/Modules/cellAudio.cpp | 48 ++++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellAudio.cpp b/rpcs3/Emu/Cell/Modules/cellAudio.cpp index d2aed65f25..a52482e155 100644 --- a/rpcs3/Emu/Cell/Modules/cellAudio.cpp +++ b/rpcs3/Emu/Cell/Modules/cellAudio.cpp @@ -1666,32 +1666,31 @@ error_code AudioSetNotifyEventQueue(ppu_thread& ppu, u64 key, u32 iFlags) if (key == c_mxr000 || key == 0) { - bool has_sur_mixer_thread = false; - - for (usz count = 0; !lv2_event_queue::find(c_mxr000) && count < 100; count++) + const bool has_sur_mixer_thread = idm::select>([&](u32 id, named_thread& test_ppu) { - if (has_sur_mixer_thread || idm::select>([&](u32 id, named_thread& test_ppu) + // Confirm thread existence + if (id == ppu.id) { - // Confirm thread existence - if (id == ppu.id) - { - return false; - } - - const auto ptr = test_ppu.ppu_tname.load(); - - if (!ptr) - { - return false; - } - - return *ptr == "_cellsurMixerMain"sv; - }).ret) - { - has_sur_mixer_thread = true; + return false; } - else + + const auto ptr = test_ppu.ppu_tname.load(); + + if (!ptr) { + return false; + } + + return *ptr == "_cellsurMixerMain"sv; + }).ret; + + bool was_mxr000_queue_found = false; + + for (usz count = 0; has_sur_mixer_thread && count < 100; count++) + { + if (lv2_event_queue::find(c_mxr000)) + { + was_mxr000_queue_found = true; break; } @@ -1701,13 +1700,14 @@ error_code AudioSetNotifyEventQueue(ppu_thread& ppu, u64 key, u32 iFlags) return {}; } - cellAudio.error("AudioSetNotifyEventQueue(): Waiting for _mxr000. x%d", count); + (count < 3 ? cellAudio.warning : cellAudio.error)("AudioSetNotifyEventQueue(): Waiting for _mxr000. x%d", count); lv2_sleep(50'000, &ppu); } - if (has_sur_mixer_thread && lv2_event_queue::find(c_mxr000)) + if (key == 0 && was_mxr000_queue_found) { + // Correct key value argument key = c_mxr000; } } From e379fba97d132a84b976709ce35670c520ccc0ae Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sun, 7 Jun 2026 12:29:54 +0300 Subject: [PATCH 06/64] SPU/PPU: Implement PPU reservation priority over SPUs --- rpcs3/Emu/Cell/SPUCommonRecompiler.cpp | 2 +- rpcs3/Emu/Memory/vm.cpp | 8 ++++++++ rpcs3/Emu/system_config.h | 1 + rpcs3/rpcs3qt/emu_settings_type.cpp | 1 + rpcs3/rpcs3qt/emu_settings_type.h | 1 + rpcs3/rpcs3qt/settings_dialog.cpp | 3 +++ rpcs3/rpcs3qt/settings_dialog.ui | 7 +++++++ rpcs3/rpcs3qt/tooltips.h | 1 + 8 files changed, 23 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp index d78bc25508..813915820b 100644 --- a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp @@ -8721,7 +8721,7 @@ spu_program spu_recompiler_base::analyse(const be_t* ls, u32 entry_point, s // This difference cannot be known at analyzer time but from observing callers. static constexpr std::initializer_list allowed_patterns = { - "620oYSe8uQqq9eTkhWfMqoEXX0us"sv, // CellSpurs JobChain acquire pattern + "disabled_620oYSe8uQqq9eTkhWfMqoEXX0us"sv, // CellSpurs JobChain acquire pattern (disabled for now) }; allow_pattern = std::any_of(allowed_patterns.begin(), allowed_patterns.end(), FN(pattern_hash == x)); diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index 9e460a7aa2..0a899f7a7d 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -483,6 +483,14 @@ namespace vm { auto& bits = get_range_lock_bits(true); + if (!!bits) + { + if (i == 0 && g_cfg.core.ppu_reservation_priority_over_spu) + { + busy_wait(5000); + } + } + if (!range_lock) { if (!bits && bits.compare_and_swap_test(0, u64{umax})) diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 89ee372a82..ea7de326f8 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -41,6 +41,7 @@ struct cfg_root : cfg::node cfg::_bool spu_accurate_reservations{ this, "Accurate SPU Reservations", true }; cfg::_bool accurate_cache_line_stores{ this, "Accurate Cache Line Stores", false }; cfg::_bool rsx_accurate_res_access{this, "Accurate RSX reservation access", false, true}; + cfg::_bool ppu_reservation_priority_over_spu{this, "PPU Reservation Priority Over SPUs", false, true}; struct fifo_setting : public cfg::_enum { diff --git a/rpcs3/rpcs3qt/emu_settings_type.cpp b/rpcs3/rpcs3qt/emu_settings_type.cpp index 53260c2c39..e8de70f334 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.cpp +++ b/rpcs3/rpcs3qt/emu_settings_type.cpp @@ -58,6 +58,7 @@ const std::map settings_location = { emu_settings_type::SPUProfiler, get_cfg_location(local_cfg.core.spu_prof) }, { emu_settings_type::DisableSpinOptimization, get_cfg_location(local_cfg.core.spu_getllar_spin_optimization_disabled) }, { emu_settings_type::EnabledSPUEventsBusyLoop, get_cfg_location(local_cfg.core.spu_reservation_busy_waiting_enabled) }, + { emu_settings_type::PPUReservationPriorityOverSPUs, get_cfg_location(local_cfg.core.ppu_reservation_priority_over_spu) }, // Graphics Tab { emu_settings_type::Renderer, get_cfg_location(local_cfg.video.renderer) }, diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index 81f7f5e725..0f3cd313a9 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -52,6 +52,7 @@ enum class emu_settings_type SPUProfiler, DisableSpinOptimization, EnabledSPUEventsBusyLoop, + PPUReservationPriorityOverSPUs, // Graphics Renderer, diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index c84cdc53c6..116057fcf1 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -260,6 +260,9 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std m_emu_settings->EnhanceCheckBox(ui->spuLoopDetection, emu_settings_type::SPULoopDetection); SubscribeTooltip(ui->spuLoopDetection, tooltips.settings.spu_loop_detection); + m_emu_settings->EnhanceCheckBox(ui->ppuReservationPrority, emu_settings_type::PPUReservationPriorityOverSPUs); + SubscribeTooltip(ui->ppuReservationPrority, tooltips.settings.ppu_reservation_priority); + // Comboboxes m_emu_settings->EnhanceComboBox(ui->xfloatAccuracy, emu_settings_type::XFloatAccuracy); SubscribeTooltip(ui->gb_xfloat_accuracy, tooltips.settings.xfloat); diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 46feb0c224..6f587470ff 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2519,6 +2519,13 @@ + + + + PPU Reservation Priority + + + diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index f0f7ded85b..4bc688db38 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -96,6 +96,7 @@ public: const QString spu_block_size = tr("This option controls the SPU analyser, particularly the size of compiled units. The Mega and Giga modes may improve performance by tying smaller units together, decreasing the number of compiled units but increasing their size.\nUse the Safe mode for maximum compatibility."); const QString preferred_spu_threads = tr("Some SPU stages are sensitive to race conditions and allowing a limited number at a time helps alleviate performance stalls.\nSetting this to a smaller value might improve performance and reduce stuttering in some games.\nLeave this on auto if performance is negatively affected when setting a small value."); const QString max_cpu_preempt = tr("Reduces CPU usage and power consumption, improving battery life on mobile devices. (0 means disabled)\nHigher values cause a more pronounced effect, but may cause audio or performance issues. A value of 50 or less is recommended.\nThis option forces an FPS limit because it's active when framerate is stable.\nThe lighter the game is on the hardware, the more power is saved by it. (until the preemption count barrier is reached)"); + const QString ppu_reservation_priority = tr("Give PPUs an execution advantage when the SPUs are using reservations.\nThis setting is recommended only for a few game for improving performance.\nDO NOT use it without being advised to due to potential performance degradation."); // debug From f32ff351da5962588c1b4a26c3ec8ade5fd4010e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 9 Jun 2026 21:23:27 +0300 Subject: [PATCH 07/64] rsx: Use mip0 resolution scale when computing mipmap scaling factors --- rpcs3/Emu/RSX/Common/texture_cache_helpers.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/Common/texture_cache_helpers.h b/rpcs3/Emu/RSX/Common/texture_cache_helpers.h index 8898830034..510dc3f136 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache_helpers.h +++ b/rpcs3/Emu/RSX/Common/texture_cache_helpers.h @@ -968,9 +968,10 @@ namespace rsx // Check for upscaling if requested if (apply_upscaling) { + const auto base_mip = as_surface_type(sections.front()); auto& mip = sections.back(); std::tie(mip.dst_w, mip.dst_h) = rsx::apply_resolution_scale( - as_surface_type(mip)->resolution_scaling_config, + base_mip->resolution_scaling_config, mip.dst_w, mip.dst_h, level0_attr.width, level0_attr.height); } From 0b535328c85b4ebea1a0781ba50670dbe5d41897 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 10 Jun 2026 02:37:46 +0200 Subject: [PATCH 08/64] Qt: Add exit game shortcut --- rpcs3/rpcs3qt/gs_frame.cpp | 8 ++++++++ rpcs3/rpcs3qt/shortcut_settings.cpp | 12 +++++++----- rpcs3/rpcs3qt/shortcut_settings.h | 1 + 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index bcc148d9a6..0754dc0748 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -321,6 +321,14 @@ void gs_frame::handle_shortcut(gui::shortcuts::shortcut shortcut_key, const QKey } break; } + case gui::shortcuts::shortcut::gw_stop: + { + if (!Emu.IsStopped()) + { + Emu.GracefulShutdown(true, true); + } + break; + } case gui::shortcuts::shortcut::gw_restart: case gui::shortcuts::shortcut::gw_savestate_1: case gui::shortcuts::shortcut::gw_savestate_2: diff --git a/rpcs3/rpcs3qt/shortcut_settings.cpp b/rpcs3/rpcs3qt/shortcut_settings.cpp index 64feb94777..4bff7135b5 100644 --- a/rpcs3/rpcs3qt/shortcut_settings.cpp +++ b/rpcs3/rpcs3qt/shortcut_settings.cpp @@ -24,6 +24,7 @@ void fmt_class_string::format(std::string& out, u64 arg) case shortcut::gw_screenshot: return "gw_screenshot"; case shortcut::gw_toggle_recording: return "gw_toggle_recording"; case shortcut::gw_pause_play: return "gw_pause_play"; + case shortcut::gw_stop: return "gw_stop"; case shortcut::gw_savestate: return "gw_savestate"; case shortcut::gw_savestate_1: return "gw_savestate1"; case shortcut::gw_savestate_2: return "gw_savestate2"; @@ -63,7 +64,7 @@ void fmt_class_string::format(std::string& out, u64 arg) shortcut_settings::shortcut_settings() : shortcut_map({ { shortcut::mw_start, shortcut_info{ "main_window_start", tr("Start"), "Ctrl+E", shortcut_handler_id::main_window, false } }, - { shortcut::mw_stop, shortcut_info{ "main_window_stop", tr("Stop"), "Ctrl+S", shortcut_handler_id::main_window, false } }, + { shortcut::mw_stop, shortcut_info{ "main_window_stop", tr("Stop/Exit Game"), "Ctrl+S", shortcut_handler_id::main_window, false } }, { shortcut::mw_pause, shortcut_info{ "main_window_pause", tr("Pause"), "Ctrl+P", shortcut_handler_id::main_window, false } }, { shortcut::mw_restart, shortcut_info{ "main_window_restart", tr("Restart"), "Ctrl+R", shortcut_handler_id::main_window, false } }, { shortcut::mw_toggle_fullscreen, shortcut_info{ "main_window_toggle_fullscreen", tr("Toggle Fullscreen"), "Alt+Return", shortcut_handler_id::main_window, false } }, @@ -76,11 +77,12 @@ shortcut_settings::shortcut_settings() { shortcut::gw_toggle_recording, shortcut_info{ "game_window_toggle_recording", tr("Start/Stop Recording"), "F11", shortcut_handler_id::game_window, false } }, { shortcut::gw_screenshot, shortcut_info{ "game_window_screenshot", tr("Screenshot"), "F12", shortcut_handler_id::game_window, false } }, { shortcut::gw_pause_play, shortcut_info{ "game_window_pause_play", tr("Pause/Play"), "Ctrl+P", shortcut_handler_id::game_window, false } }, + { shortcut::gw_stop, shortcut_info{ "game_window_stop", tr("Stop/Exit Game"), "", shortcut_handler_id::game_window, false } }, { shortcut::gw_savestate, shortcut_info{ "game_window_savestate", tr("Savestate"), "Ctrl+S", shortcut_handler_id::game_window, false } }, - { shortcut::gw_savestate_1, shortcut_info{ "game_window_savestate_1", tr("Savestate"), "Alt+Ctrl+1", shortcut_handler_id::game_window, false } }, - { shortcut::gw_savestate_2, shortcut_info{ "game_window_savestate_2", tr("Savestate"), "Alt+Ctrl+2", shortcut_handler_id::game_window, false } }, - { shortcut::gw_savestate_3, shortcut_info{ "game_window_savestate_3", tr("Savestate"), "Alt+Ctrl+3", shortcut_handler_id::game_window, false } }, - { shortcut::gw_savestate_4, shortcut_info{ "game_window_savestate_4", tr("Savestate"), "Alt+Ctrl+4", shortcut_handler_id::game_window, false } }, + { shortcut::gw_savestate_1, shortcut_info{ "game_window_savestate_1", tr("Savestate 1"), "Alt+Ctrl+1", shortcut_handler_id::game_window, false } }, + { shortcut::gw_savestate_2, shortcut_info{ "game_window_savestate_2", tr("Savestate 2"), "Alt+Ctrl+2", shortcut_handler_id::game_window, false } }, + { shortcut::gw_savestate_3, shortcut_info{ "game_window_savestate_3", tr("Savestate 3"), "Alt+Ctrl+3", shortcut_handler_id::game_window, false } }, + { shortcut::gw_savestate_4, shortcut_info{ "game_window_savestate_4", tr("Savestate 4"), "Alt+Ctrl+4", shortcut_handler_id::game_window, false } }, { shortcut::gw_restart, shortcut_info{ "game_window_restart", tr("Restart"), "Ctrl+R", shortcut_handler_id::game_window, false } }, { shortcut::gw_rsx_capture, shortcut_info{ "game_window_rsx_capture", tr("RSX Capture"), "Alt+C", shortcut_handler_id::game_window, false } }, { shortcut::gw_frame_limit, shortcut_info{ "game_window_frame_limit", tr("Toggle Framelimit"), "Ctrl+F10", shortcut_handler_id::game_window, false } }, diff --git a/rpcs3/rpcs3qt/shortcut_settings.h b/rpcs3/rpcs3qt/shortcut_settings.h index be14ee1e30..43ea21549d 100644 --- a/rpcs3/rpcs3qt/shortcut_settings.h +++ b/rpcs3/rpcs3qt/shortcut_settings.h @@ -33,6 +33,7 @@ namespace gui gw_screenshot, gw_toggle_recording, gw_pause_play, + gw_stop, gw_savestate, gw_savestate_1, gw_savestate_2, From 1492d647f411b04d6a78d4aed9d32f5c55b1f455 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Thu, 11 Jun 2026 19:56:27 +0300 Subject: [PATCH 09/64] SaveStates: Fix lv2_timer serialization --- rpcs3/Emu/Cell/lv2/sys_timer.cpp | 4 ++-- rpcs3/Emu/savestate_utils.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_timer.cpp b/rpcs3/Emu/Cell/lv2/sys_timer.cpp index 8a2419097d..e65fa10432 100644 --- a/rpcs3/Emu/Cell/lv2/sys_timer.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_timer.cpp @@ -37,8 +37,8 @@ lv2_timer::lv2_timer(utils::serial& ar) , source(ar) , data1(ar) , data2(ar) - , expire(ar.pop()) - , period(ar.pop()) + , expire(ar.pop()) + , period(ar.pop()) { } diff --git a/rpcs3/Emu/savestate_utils.cpp b/rpcs3/Emu/savestate_utils.cpp index 7c0cd7390c..ba68dceba2 100644 --- a/rpcs3/Emu/savestate_utils.cpp +++ b/rpcs3/Emu/savestate_utils.cpp @@ -606,7 +606,7 @@ namespace stx if ((saved ^ tag) & data_mask) { ensure(!ar.is_writing()); - fmt::throw_exception("serial_breathe_and_tag(%u): %s\nobject: '%s', next-object: '%s', expected/tag: 0x%x != 0x%x,", s_tls_call_count, ar, s_tls_object_name, name, tag, saved); + fmt::throw_exception("serial_breathe_and_tag(%u): %s\nobject: '%s', next-object: '%s', expected/tag: 0x%x != 0x%x\nLatest known RPCS3 build working for savestates: 0.0.41-19455", s_tls_call_count, ar, s_tls_object_name, name, tag, saved); } s_tls_object_name = name; From 2ce45bd90490a95f757206183da90b95eb5849f5 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 11 Jun 2026 21:50:19 +0200 Subject: [PATCH 10/64] ffmpeg: remove directshow backend --- 3rdparty/ffmpeg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ffmpeg b/3rdparty/ffmpeg index 42300548cb..649d9d9353 160000 --- a/3rdparty/ffmpeg +++ b/3rdparty/ffmpeg @@ -1 +1 @@ -Subproject commit 42300548cb6363b4496e7f0041a461daafd52dfe +Subproject commit 649d9d9353184a17ae78d9df4a6fbbe7456f0428 From 16a53dfec7494c3bebcd00ae913e49d53280a8ab Mon Sep 17 00:00:00 2001 From: Antonino Di Guardo <64427768+digant73@users.noreply.github.com> Date: Sat, 13 Jun 2026 03:13:16 +0200 Subject: [PATCH 11/64] UI: Fix drag & drop of files on main window --- rpcs3/Emu/Cell/Modules/cellAudio.cpp | 7 +++++++ rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp | 14 ++++++++++++++ rpcs3/rpcs3qt/qt_music_handler.cpp | 23 ++++++++++++++++------- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellAudio.cpp b/rpcs3/Emu/Cell/Modules/cellAudio.cpp index a52482e155..557c7ef13b 100644 --- a/rpcs3/Emu/Cell/Modules/cellAudio.cpp +++ b/rpcs3/Emu/Cell/Modules/cellAudio.cpp @@ -1019,6 +1019,13 @@ void cell_audio_thread::operator()() // Destroy ringbuffer ringbuffer.reset(); + + // Destroy the audio backend on this thread (the one that created it in cfg.reset()). + // The backend's ctor calls CoInitializeEx here on Windows; releasing it on a different + // thread (g_fxo->clear() runs on the GUI thread during Kill()) would land the matching + // CoUninitialize on the GUI thread, draining its OLE reference and silently breaking the + // main window's file drag&drop. Keep COM init/teardown balanced on this thread. + cfg.backend.reset(); } audio_port* cell_audio_thread::open_port() diff --git a/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp b/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp index c5204b295c..cb597d3645 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp @@ -1413,6 +1413,20 @@ void rsxaudio_backend_thread::operator()() { lock.unlock(); backend_stop(); + + // Destroy the backend on this thread, the one that created it in backend_init(). + // The backend's ctor calls CoInitializeEx here on Windows; if it is instead released + // by ~rsxaudio_backend_thread() (which runs on the GUI thread via g_fxo->clear() + // during Kill()), the matching CoUninitialize lands on the GUI thread, draining its + // OLE reference and silently breaking the main window's file drag&drop. Keep COM + // init/teardown balanced on this thread. + if (backend) + { + backend->Close(); + backend->SetWriteCallback(nullptr); + backend->SetStateCallback(nullptr); + backend = nullptr; + } return; } diff --git a/rpcs3/rpcs3qt/qt_music_handler.cpp b/rpcs3/rpcs3qt/qt_music_handler.cpp index f17e0e6d92..a7ce6b6417 100644 --- a/rpcs3/rpcs3qt/qt_music_handler.cpp +++ b/rpcs3/rpcs3qt/qt_music_handler.cpp @@ -66,15 +66,24 @@ void fmt_class_string::format(std::string& out, u64 qt_music_handler::qt_music_handler() { - music_log.notice("Constructing Qt music handler..."); + // Construct the QMediaPlayer on the GUI thread, the same thread on which it is destroyed + // (see ~qt_music_handler). cellMusic creates this handler from an emulated thread, but Qt's + // Windows multimedia backend balances its COM init/teardown per calling thread: constructing + // off the GUI thread and destroying on it left an unmatched CoUninitialize on the GUI thread, + // draining the OLE reference that Qt's startup OleInitialize set up until file drag&drop on + // the main window silently broke. Keeping both on the GUI thread keeps them balanced. + Emu.BlockingCallFromMainThread([this]() + { + music_log.notice("Constructing Qt music handler..."); - m_media_player = std::make_unique(); - m_media_player->setAudioOutput(new QAudioOutput(m_media_player.get())); + m_media_player = std::make_unique(); + m_media_player->setAudioOutput(new QAudioOutput(m_media_player.get())); - connect(m_media_player.get(), &QMediaPlayer::mediaStatusChanged, this, &qt_music_handler::handle_media_status); - connect(m_media_player.get(), &QMediaPlayer::playbackStateChanged, this, &qt_music_handler::handle_music_state); - connect(m_media_player.get(), &QMediaPlayer::errorOccurred, this, &qt_music_handler::handle_music_error); - connect(m_media_player->audioOutput(), &QAudioOutput::volumeChanged, this, &qt_music_handler::handle_volume_change); + connect(m_media_player.get(), &QMediaPlayer::mediaStatusChanged, this, &qt_music_handler::handle_media_status); + connect(m_media_player.get(), &QMediaPlayer::playbackStateChanged, this, &qt_music_handler::handle_music_state); + connect(m_media_player.get(), &QMediaPlayer::errorOccurred, this, &qt_music_handler::handle_music_error); + connect(m_media_player->audioOutput(), &QAudioOutput::volumeChanged, this, &qt_music_handler::handle_volume_change); + }); } qt_music_handler::~qt_music_handler() From 3fd8fd0e34452fbfc2c1aec34046c53046f3297b Mon Sep 17 00:00:00 2001 From: Vishrut Sachan Date: Sat, 13 Jun 2026 11:29:18 +0530 Subject: [PATCH 12/64] gui: Move download database actions from game list to Manage -> Database submenu (#18870) Closes #18856 Moved the three download database actions from the game list context menu to Manage -> Databases submenu, since they are not related to a specific game entry. --- rpcs3/rpcs3qt/game_list_context_menu.cpp | 31 ------------------------ rpcs3/rpcs3qt/main_window.cpp | 15 ++++++++++++ rpcs3/rpcs3qt/main_window.ui | 24 ++++++++++++++++++ 3 files changed, 39 insertions(+), 31 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_context_menu.cpp b/rpcs3/rpcs3qt/game_list_context_menu.cpp index 402286e2f1..e17dc9cdca 100644 --- a/rpcs3/rpcs3qt/game_list_context_menu.cpp +++ b/rpcs3/rpcs3qt/game_list_context_menu.cpp @@ -628,19 +628,10 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& { check_integrity->setEnabled(false); } - - QAction* download_integrity = addAction(tr("&Download Integrity Database")); - connect(download_integrity, &QAction::triggered, m_game_list_frame, [this] - { - ensure(m_game_list_frame->GetIsoIntegrity())->download(); - }); } } QAction* check_compat = addAction(tr("&Check Game Compatibility")); - QAction* download_compat = addAction(tr("&Download Compatibility Database")); - QAction* download_config_db = addAction(tr("&Download Config Database")); - addSeparator(); // Disk usage @@ -734,14 +725,6 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& const QString link = "https://rpcs3.net/compatibility?g=" + serial; QDesktopServices::openUrl(QUrl(link)); }); - connect(download_compat, &QAction::triggered, m_game_list_frame, [this] - { - m_game_list_frame->GetGameCompatibility()->RequestCompatibility(true); - }); - connect(download_config_db, &QAction::triggered, m_game_list_frame, [this] - { - m_game_list_frame->GetConfigDatabase()->request_config_database(true); - }); connect(rename_title, &QAction::triggered, m_game_list_frame, [this, name, serial = QString::fromStdString(serial), global_pos] { const QString custom_title = m_persistent_settings->GetValue(gui::persistent::titles, serial, "").toString(); @@ -1001,20 +984,6 @@ void game_list_context_menu::show_multi_selection_context_menu(const std::vector addSeparator(); - QAction* download_compat = addAction(tr("&Download Compatibility Database")); - connect(download_compat, &QAction::triggered, m_game_list_frame, [this] - { - m_game_list_frame->GetGameCompatibility()->RequestCompatibility(true); - }); - - QAction* download_config_db = addAction(tr("&Download Config Database")); - connect(download_config_db, &QAction::triggered, m_game_list_frame, [this] - { - m_game_list_frame->GetConfigDatabase()->request_config_database(true); - }); - - addSeparator(); - // Disk usage QAction* disk_usage = addAction(tr("&Disk Usage")); connect(disk_usage, &QAction::triggered, this, [this]() diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 3ea7d44508..4f3bd4b467 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -3541,6 +3541,21 @@ void main_window::CreateConnects() #endif }); + connect(ui->downloadIntegrityDbAct, &QAction::triggered, this, [this]() + { + ensure(m_game_list_frame->GetIsoIntegrity())->download(); + }); + + connect(ui->downloadCompatDbAct, &QAction::triggered, this, [this]() + { + m_game_list_frame->GetGameCompatibility()->RequestCompatibility(true); + }); + + connect(ui->downloadConfigDbAct, &QAction::triggered, this, [this]() + { + m_game_list_frame->GetConfigDatabase()->request_config_database(true); + }); + connect(ui->welcomeAct, &QAction::triggered, this, [this]() { welcome_dialog* welcome = new welcome_dialog(m_gui_settings, true, this); diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index 7a7c965ce8..12fc9d8a79 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -315,6 +315,14 @@ + + + Databases + + + + + @@ -328,6 +336,7 @@ + @@ -850,6 +859,21 @@ Check for Updates + + + Download Integrity Database + + + + + Download Compatibility Database + + + + + Download Config Database + + View Welcome Dialog From 32a52c0e357d66ad896fcb6959b2fc6b1ce50eb7 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 12 Jun 2026 23:55:01 +0200 Subject: [PATCH 13/64] rsxaudio: fix some windows warnings stumbled upon some warnings. ensure() does not tell VS that an index is suffently checked for OOB. --- rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp | 43 +++++++++++++---------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp b/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp index cb597d3645..95ce7803e2 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp @@ -1240,7 +1240,9 @@ bool rsxaudio_data_thread::enqueue_data(RsxaudioPort dst, bool silence, const vo { auto& backend_thread = g_fxo->get(); - if (dst == RsxaudioPort::SERIAL) + switch (dst) + { + case RsxaudioPort::SERIAL: { if (!silence) { @@ -1258,7 +1260,7 @@ bool rsxaudio_data_thread::enqueue_data(RsxaudioPort dst, bool silence, const vo backend_thread.add_data(cont); return cont.data_was_used(); } - else if (dst == RsxaudioPort::SPDIF_0) + case RsxaudioPort::SPDIF_0: { if (!silence) { @@ -1273,7 +1275,7 @@ bool rsxaudio_data_thread::enqueue_data(RsxaudioPort dst, bool silence, const vo backend_thread.add_data(cont); return cont.data_was_used(); } - else if (dst == RsxaudioPort::SPDIF_1) + case RsxaudioPort::SPDIF_1: { if (!silence) { @@ -1288,6 +1290,11 @@ bool rsxaudio_data_thread::enqueue_data(RsxaudioPort dst, bool silence, const vo backend_thread.add_data(cont); return cont.data_was_used(); } + case RsxaudioPort::INVALID: + { + break; + } + } return false; } @@ -1361,7 +1368,7 @@ u8 rsxaudio_backend_thread::get_channel_count() const rsxaudio_backend_thread::emu_audio_cfg rsxaudio_backend_thread::get_emu_cfg() { // Get max supported channel count - AudioChannelCnt out_ch_cnt = AudioBackend::get_max_channel_count(0); // CELL_AUDIO_OUT_PRIMARY + const AudioChannelCnt out_ch_cnt = AudioBackend::get_max_channel_count(0); // CELL_AUDIO_OUT_PRIMARY emu_audio_cfg cfg = { @@ -2285,9 +2292,9 @@ void rsxaudio_periodic_tmr::cancel_wait() void rsxaudio_periodic_tmr::enable_vtimer(u32 vtimer_id, u32 rate, u64 crnt_time) { - ensure(vtimer_id < VTIMER_MAX && rate); + ensure(rate); - vtimer& vtimer = vtmr_pool[vtimer_id]; + vtimer& vtimer = ::at32(vtmr_pool, vtimer_id); const f64 new_blk_time = get_blk_time(rate); // Avoid timer reset when possible @@ -2302,26 +2309,20 @@ void rsxaudio_periodic_tmr::enable_vtimer(u32 vtimer_id, u32 rate, u64 crnt_time void rsxaudio_periodic_tmr::disable_vtimer(u32 vtimer_id) { - ensure(vtimer_id < VTIMER_MAX); - - vtimer& vtimer = vtmr_pool[vtimer_id]; + vtimer& vtimer = ::at32(vtmr_pool, vtimer_id); vtimer.active = false; } bool rsxaudio_periodic_tmr::is_vtimer_behind(u32 vtimer_id, u64 crnt_time) const { - ensure(vtimer_id < VTIMER_MAX); - - const vtimer& vtimer = vtmr_pool[vtimer_id]; + const vtimer& vtimer = ::at32(vtmr_pool, vtimer_id); return is_vtimer_behind(vtimer, crnt_time); } void rsxaudio_periodic_tmr::vtimer_skip_periods(u32 vtimer_id, u64 crnt_time) { - ensure(vtimer_id < VTIMER_MAX); - - vtimer& vtimer = vtmr_pool[vtimer_id]; + vtimer& vtimer = ::at32(vtmr_pool, vtimer_id); if (is_vtimer_behind(vtimer, crnt_time)) { @@ -2331,9 +2332,7 @@ void rsxaudio_periodic_tmr::vtimer_skip_periods(u32 vtimer_id, u64 crnt_time) void rsxaudio_periodic_tmr::vtimer_incr(u32 vtimer_id, u64 crnt_time) { - ensure(vtimer_id < VTIMER_MAX); - - vtimer& vtimer = vtmr_pool[vtimer_id]; + vtimer& vtimer = ::at32(vtmr_pool, vtimer_id); if (is_vtimer_behind(vtimer, crnt_time)) { @@ -2343,18 +2342,14 @@ void rsxaudio_periodic_tmr::vtimer_incr(u32 vtimer_id, u64 crnt_time) bool rsxaudio_periodic_tmr::is_vtimer_active(u32 vtimer_id) const { - ensure(vtimer_id < VTIMER_MAX); - - const vtimer& vtimer = vtmr_pool[vtimer_id]; + const vtimer& vtimer = ::at32(vtmr_pool, vtimer_id); return vtimer.active; } u64 rsxaudio_periodic_tmr::vtimer_get_sched_time(u32 vtimer_id) const { - ensure(vtimer_id < VTIMER_MAX); - - const vtimer& vtimer = vtmr_pool[vtimer_id]; + const vtimer& vtimer = ::at32(vtmr_pool, vtimer_id); return static_cast(vtimer.blk_cnt * vtimer.blk_time); } From 27b13dff20daa7022e55b2b1c0b296ba797b677e Mon Sep 17 00:00:00 2001 From: thephilcoulson Date: Sat, 13 Jun 2026 23:52:50 +0800 Subject: [PATCH 14/64] gui: Play preview videos on row selection, not just hover --- rpcs3/rpcs3qt/game_list.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/rpcs3/rpcs3qt/game_list.cpp b/rpcs3/rpcs3qt/game_list.cpp index 70089d650e..846ab5863e 100644 --- a/rpcs3/rpcs3qt/game_list.cpp +++ b/rpcs3/rpcs3qt/game_list.cpp @@ -12,6 +12,27 @@ game_list::game_list() : QTableWidget(), game_list_base() { Q_EMIT IconReady(game, item); }; + + // Activate video/music preview on selection change (keyboard/pad navigation) + connect(this, &QTableWidget::currentCellChanged, this, [this](int row, int /*column*/, int prev_row, int /*prev_column*/) + { + if (row == prev_row) + return; + + if (m_last_hover_item) + { + m_last_hover_item->set_active(false); + } + + movie_item* new_item = static_cast(item(row, 0)); + + if (new_item) + { + new_item->set_active(true); + } + + m_last_hover_item = new_item; + }); } void game_list::sync_header_actions(std::map& actions, std::function get_visibility) From 5252f47a332e2b82daf8818bdf2bd72aacb5b39c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 10 Jun 2026 02:15:16 +0200 Subject: [PATCH 15/64] Use more std::move --- Utilities/stack_trace.cpp | 8 +- Utilities/transactional_storage.h | 2 +- rpcs3/Emu/CPU/Backends/AArch64/AArch64ASM.cpp | 20 ++-- rpcs3/Emu/Cell/Modules/libmixer.cpp | 97 ++++++++++--------- rpcs3/Emu/Cell/Modules/libmixer.h | 16 +-- rpcs3/Emu/Io/RB3MidiDrums.cpp | 4 +- rpcs3/Emu/RSX/Common/TextureUtils.cpp | 3 +- rpcs3/Emu/RSX/Common/surface_store.h | 2 +- rpcs3/Emu/RSX/Common/texture_cache.h | 4 +- .../Emu/RSX/Overlays/overlay_perf_metrics.cpp | 2 +- rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.h | 2 +- rpcs3/Emu/RSX/Program/Assembler/IR.h | 4 +- .../Passes/FP/RegisterDependencyPass.cpp | 4 +- rpcs3/Emu/RSX/Program/GLSLCommon.cpp | 2 +- rpcs3/Emu/RSX/Program/ShaderParam.h | 2 +- rpcs3/Emu/RSX/RSXThread.cpp | 2 +- rpcs3/Emu/RSX/VK/VKCompute.cpp | 10 +- rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 5 +- rpcs3/Emu/RSX/VK/VKOverlays.cpp | 15 ++- rpcs3/Emu/RSX/VK/VKProgramPipeline.h | 19 ++++ rpcs3/Emu/RSX/VK/VKRenderPass.cpp | 4 +- rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp | 29 +++--- rpcs3/Emu/RSX/VK/VKTextureCache.cpp | 2 +- rpcs3/Emu/RSX/VK/VKVertexProgram.cpp | 21 ++-- rpcs3/Emu/RSX/VK/vkutils/device.cpp | 6 +- rpcs3/Emu/RSX/VK/vkutils/sync.cpp | 4 +- rpcs3/Emu/System.cpp | 12 +-- rpcs3/Loader/TROPUSR.cpp | 8 +- rpcs3/main_application.cpp | 2 +- rpcs3/rpcs3qt/curl_handle.cpp | 4 - rpcs3/rpcs3qt/curl_handle.h | 2 +- rpcs3/rpcs3qt/infinity_dialog.cpp | 4 +- rpcs3/rpcs3qt/pkg_install_dialog.cpp | 4 +- 33 files changed, 168 insertions(+), 157 deletions(-) diff --git a/Utilities/stack_trace.cpp b/Utilities/stack_trace.cpp index ef188db614..0a95269848 100644 --- a/Utilities/stack_trace.cpp +++ b/Utilities/stack_trace.cpp @@ -119,18 +119,18 @@ namespace utils if (sym->NameLen) { - const auto function_name = wstr_to_utf8(sym->Name, static_cast(sym->NameLen)); + std::string function_name = wstr_to_utf8(sym->Name, static_cast(sym->NameLen)); // Attempt to get file and line information if available DWORD unused2; if (SymGetLineFromAddrW64(hProcess, reinterpret_cast(pointer), &unused2, &line_info)) { - const auto full_path = fmt::format("%s:%u %s", wstr_to_utf8(line_info.FileName, -1), line_info.LineNumber, function_name); - result.push_back(full_path); + std::string full_path = fmt::format("%s:%u %s", wstr_to_utf8(line_info.FileName, -1), line_info.LineNumber, function_name); + result.push_back(std::move(full_path)); } else { - result.push_back(function_name); + result.push_back(std::move(function_name)); } } else diff --git a/Utilities/transactional_storage.h b/Utilities/transactional_storage.h index 1be923233e..87b9d63aac 100644 --- a/Utilities/transactional_storage.h +++ b/Utilities/transactional_storage.h @@ -33,7 +33,7 @@ public: std::lock_guard lock(mutex); if (std::shared_ptr new_val = std::invoke(func); new_val) { - storage.push_back(new_val); + storage.push_back(std::move(new_val)); } delete_unused(); } diff --git a/rpcs3/Emu/CPU/Backends/AArch64/AArch64ASM.cpp b/rpcs3/Emu/CPU/Backends/AArch64/AArch64ASM.cpp index 4c8a01e0e2..5ca0e77e95 100644 --- a/rpcs3/Emu/CPU/Backends/AArch64/AArch64ASM.cpp +++ b/rpcs3/Emu/CPU/Backends/AArch64/AArch64ASM.cpp @@ -46,26 +46,26 @@ namespace aarch64 { compiled_instruction_t i{}; i.asm_ = inst; - m_instructions.push_back(i); + m_instructions.push_back(std::move(i)); } void UASM::emit1(const char* inst, const Arg& arg0, const std::vector& clobbered) { int arg_id = 0; - fmt_replacement_list_t repl = { + const fmt_replacement_list_t repl = { { "{0}", arg0.to_string(&arg_id) } }; compiled_instruction_t i{}; i.asm_ = fmt::replace_all(inst, repl); embed_args(i, { arg0 }, clobbered); - m_instructions.push_back(i); + m_instructions.push_back(std::move(i)); } void UASM::emit2(const char* inst, const Arg& arg0, const Arg& arg1, const std::vector& clobbered) { int arg_id = 0; - fmt_replacement_list_t repl = { + const fmt_replacement_list_t repl = { { "{0}", arg0.to_string(&arg_id) }, { "{1}", arg1.to_string(&arg_id) }, }; @@ -73,13 +73,13 @@ namespace aarch64 compiled_instruction_t i{}; i.asm_ = fmt::replace_all(inst, repl); embed_args(i, { arg0, arg1 }, clobbered); - m_instructions.push_back(i); + m_instructions.push_back(std::move(i)); } void UASM::emit3(const char* inst, const Arg& arg0, const Arg& arg1, const Arg& arg2, const std::vector& clobbered) { int arg_id = 0; - fmt_replacement_list_t repl = { + const fmt_replacement_list_t repl = { { "{0}", arg0.to_string(&arg_id) }, { "{1}", arg1.to_string(&arg_id) }, { "{2}", arg2.to_string(&arg_id) }, @@ -88,13 +88,13 @@ namespace aarch64 compiled_instruction_t i{}; i.asm_ = fmt::replace_all(inst, repl); embed_args(i, { arg0, arg1, arg2 }, clobbered); - m_instructions.push_back(i); + m_instructions.push_back(std::move(i)); } void UASM::emit4(const char* inst, const Arg& arg0, const Arg& arg1, const Arg& arg2, const Arg& arg3, const std::vector& clobbered) { int arg_id = 0; - fmt_replacement_list_t repl = { + const fmt_replacement_list_t repl = { { "{0}", arg0.to_string(&arg_id) }, { "{1}", arg1.to_string(&arg_id) }, { "{2}", arg2.to_string(&arg_id) }, @@ -104,14 +104,14 @@ namespace aarch64 compiled_instruction_t i{}; i.asm_ = fmt::replace_all(inst, repl); embed_args(i, { arg0, arg1, arg2, arg3 }, clobbered); - m_instructions.push_back(i); + m_instructions.push_back(std::move(i)); } void UASM::insert(llvm::IRBuilder<>* irb, llvm::LLVMContext& ctx) const { for (const auto& inst : m_instructions) { - auto constraints = fmt::merge(inst.constraints, ","); + const auto constraints = fmt::merge(inst.constraints, ","); llvm_asm(irb, inst.asm_, inst.args, constraints, ctx); } } diff --git a/rpcs3/Emu/Cell/Modules/libmixer.cpp b/rpcs3/Emu/Cell/Modules/libmixer.cpp index e92b5c6cf4..74b05b8d0b 100644 --- a/rpcs3/Emu/Cell/Modules/libmixer.cpp +++ b/rpcs3/Emu/Cell/Modules/libmixer.cpp @@ -35,49 +35,49 @@ struct SurMixerConfig { std::mutex mutex; - u32 audio_port; - s32 priority; - u32 ch_strips_1; - u32 ch_strips_2; - u32 ch_strips_6; - u32 ch_strips_8; + u32 audio_port = 0; + s32 priority = 0; + u32 ch_strips_1 = 0; + u32 ch_strips_2 = 0; + u32 ch_strips_6 = 0; + u32 ch_strips_8 = 0; - vm::ptr cb; - vm::ptr cb_arg; + vm::ptr cb {}; + vm::ptr cb_arg {}; - f32 mixdata[8 * 256]; - u64 mixcount; + f32 mixdata[8 * 256] {}; + u64 mixcount = 0; }; struct SSPlayer { - bool m_created; // SSPlayerCreate/Remove - bool m_connected; // AANConnect/Disconnect - bool m_active; // SSPlayerPlay/Stop - u32 m_channels; // 1 or 2 - u32 m_addr; - u32 m_samples; - u32 m_loop_start; - u32 m_loop_mode; - u32 m_position; - float m_level; - float m_speed; - float m_x; - float m_y; - float m_z; + bool m_created = false; // SSPlayerCreate/Remove + bool m_connected = false; // AANConnect/Disconnect + bool m_active = false; // SSPlayerPlay/Stop + u32 m_channels = 0; // 1 or 2 + u32 m_addr = 0; + u32 m_samples = 0; + u32 m_loop_start = 0; + u32 m_loop_mode = 0; + u32 m_position = 0; + f32 m_level = 0.0f; + f32 m_speed = 0.0f; + f32 m_x = 0.0f; + f32 m_y = 0.0f; + f32 m_z = 0.0f; }; // TODO: use fxm -SurMixerConfig g_surmx; +SurMixerConfig g_surmx {}; std::vector g_ssp; -s32 cellAANAddData(u32 aan_handle, u32 aan_port, u32 offset, vm::ptr addr, u32 samples) +s32 cellAANAddData(u32 aan_handle, u32 aan_port, u32 offset, vm::ptr addr, u32 samples) { libmixer.trace("cellAANAddData(aan_handle=0x%x, aan_port=0x%x, offset=0x%x, addr=*0x%x, samples=%d)", aan_handle, aan_port, offset, addr, samples); u32 type = aan_port >> 16; - u32 port = aan_port & 0xffff; + const u32 port = aan_port & 0xffff; switch (type) { @@ -94,7 +94,8 @@ s32 cellAANAddData(u32 aan_handle, u32 aan_port, u32 offset, vm::ptr addr if (port >= g_surmx.ch_strips_8) type = 0; break; default: - type = 0; break; + type = 0; + break; } if (aan_handle != 0x11111111 || samples != 256 || !type || offset != 0) @@ -110,7 +111,7 @@ s32 cellAANAddData(u32 aan_handle, u32 aan_port, u32 offset, vm::ptr addr // mono upmixing for (u32 i = 0; i < samples; i++) { - const float center = addr[i]; + const f32 center = addr[i]; g_surmx.mixdata[i * 8 + 0] += center; g_surmx.mixdata[i * 8 + 1] += center; } @@ -120,8 +121,8 @@ s32 cellAANAddData(u32 aan_handle, u32 aan_port, u32 offset, vm::ptr addr // stereo upmixing for (u32 i = 0; i < samples; i++) { - const float left = addr[i * 2 + 0]; - const float right = addr[i * 2 + 1]; + const f32 left = addr[i * 2 + 0]; + const f32 right = addr[i * 2 + 1]; g_surmx.mixdata[i * 8 + 0] += left; g_surmx.mixdata[i * 8 + 1] += right; } @@ -131,12 +132,12 @@ s32 cellAANAddData(u32 aan_handle, u32 aan_port, u32 offset, vm::ptr addr // 5.1 upmixing for (u32 i = 0; i < samples; i++) { - const float left = addr[i * 6 + 0]; - const float right = addr[i * 6 + 1]; - const float center = addr[i * 6 + 2]; - const float low_freq = addr[i * 6 + 3]; - const float rear_left = addr[i * 6 + 4]; - const float rear_right = addr[i * 6 + 5]; + const f32 left = addr[i * 6 + 0]; + const f32 right = addr[i * 6 + 1]; + const f32 center = addr[i * 6 + 2]; + const f32 low_freq = addr[i * 6 + 3]; + const f32 rear_left = addr[i * 6 + 4]; + const f32 rear_right = addr[i * 6 + 5]; g_surmx.mixdata[i * 8 + 0] += left; g_surmx.mixdata[i * 8 + 1] += right; g_surmx.mixdata[i * 8 + 2] += center; @@ -205,13 +206,13 @@ s32 cellSSPlayerCreate(vm::ptr handle, vm::ptr config) std::lock_guard lock(g_surmx.mutex); - SSPlayer p; + SSPlayer p {}; p.m_created = true; p.m_connected = false; p.m_active = false; p.m_channels = config->channels; - g_ssp.push_back(p); + g_ssp.push_back(std::move(p)); *handle = ::size32(g_ssp) - 1; return CELL_OK; } @@ -366,7 +367,7 @@ struct surmixer_thread : ppu_thread { //u64 stamp0 = get_guest_system_time(); - memset(g_surmx.mixdata, 0, sizeof(g_surmx.mixdata)); + std::memset(g_surmx.mixdata, 0, sizeof(g_surmx.mixdata)); if (g_surmx.cb) { g_surmx.cb(*this, g_surmx.cb_arg, static_cast(g_surmx.mixcount), 256); @@ -381,10 +382,10 @@ struct surmixer_thread : ppu_thread for (auto& p : g_ssp) if (p.m_active && p.m_created) { auto v = vm::ptrl::make(p.m_addr); // 16-bit LE audio data - float left = 0.0f; - float right = 0.0f; - float speed = std::fabs(p.m_speed); - float fpos = 0.0f; + f32 left = 0.0f; + f32 right = 0.0f; + f32 speed = std::fabs(p.m_speed); + f32 fpos = 0.0f; for (s32 i = 0; i < 256; i++) if (p.m_active) { u32 pos = p.m_position; @@ -454,7 +455,7 @@ struct surmixer_thread : ppu_thread //u64 stamp2 = get_guest_system_time(); - auto buf = vm::_ptr(port.addr.addr() + (g_surmx.mixcount % port.num_blocks) * port.num_channels * AUDIO_BUFFER_SAMPLES * sizeof(float)); + auto buf = vm::_ptr(port.addr.addr() + (g_surmx.mixcount % port.num_blocks) * port.num_channels * AUDIO_BUFFER_SAMPLES * sizeof(f32)); for (auto& mixdata : g_surmx.mixdata) { @@ -497,7 +498,7 @@ s32 cellSurMixerCreate(vm::cptr config) port->num_channels = 8; port->num_blocks = 16; port->attr = 0; - port->size = port->num_channels * port->num_blocks * AUDIO_BUFFER_SAMPLES * sizeof(float); + port->size = port->num_channels * port->num_blocks * AUDIO_BUFFER_SAMPLES * sizeof(f32); port->level = 1.0f; port->level_set.store({ 1.0f, 0.0f }); @@ -574,7 +575,7 @@ s32 cellSurMixerStart() return CELL_OK; } -s32 cellSurMixerSetParameter(u32 param, float value) +s32 cellSurMixerSetParameter(u32 param, f32 value) { libmixer.todo("cellSurMixerSetParameter(param=0x%x, value=%f)", param, value); return CELL_OK; @@ -596,7 +597,7 @@ s32 cellSurMixerFinalize() return CELL_OK; } -s32 cellSurMixerSurBusAddData(u32 busNo, u32 offset, vm::ptr addr, u32 samples) +s32 cellSurMixerSurBusAddData(u32 busNo, u32 offset, vm::ptr addr, u32 samples) { if (busNo < 8 && samples == 256 && offset == 0) { diff --git a/rpcs3/Emu/Cell/Modules/libmixer.h b/rpcs3/Emu/Cell/Modules/libmixer.h index 724ca121f3..f311a65ea0 100644 --- a/rpcs3/Emu/Cell/Modules/libmixer.h +++ b/rpcs3/Emu/Cell/Modules/libmixer.h @@ -41,8 +41,8 @@ enum CELL_SURMIXER_PARAM_REVERBLEVEL = 41, // in dB }; -static const float CELL_SURMIXER_CONT_MUTEON = 1.0; -static const float CELL_SURMIXER_CONT_MUTEOFF = 0.0; +static constexpr f32 CELL_SURMIXER_CONT_MUTEON = 1.0f; +static constexpr f32 CELL_SURMIXER_CONT_MUTEOFF = 0.0f; enum { @@ -137,15 +137,15 @@ struct CellSSPlayerCommonParam struct CellSurMixerPosition { - be_t x; - be_t y; - be_t z; + be_t x; + be_t y; + be_t z; }; struct CellSSPlayerRuntimeInfo { - be_t level; - be_t speed; + be_t level; + be_t speed; CellSurMixerPosition position; }; @@ -163,6 +163,6 @@ struct CellSurMixerChStripParam be_t param; be_t attribute_addr; be_t dBSwitch; - be_t floatVal; + be_t floatVal; be_t intVal; }; diff --git a/rpcs3/Emu/Io/RB3MidiDrums.cpp b/rpcs3/Emu/Io/RB3MidiDrums.cpp index 4bdc253c69..efb1283c1c 100644 --- a/rpcs3/Emu/Io/RB3MidiDrums.cpp +++ b/rpcs3/Emu/Io/RB3MidiDrums.cpp @@ -563,8 +563,8 @@ void usb_device_rb3_midi_drums::interrupt_transfer(u32 buf_size, u8* buf, u32 /* } else { - bool is_cancel = kit_state.snare >= midi::min_velocity(); - bool is_accept = kit_state.floor_tom >= midi::min_velocity(); + const bool is_cancel = kit_state.snare >= midi::min_velocity(); + const bool is_accept = kit_state.floor_tom >= midi::min_velocity(); if (hold_kick && (is_cancel || is_accept)) { // Hold kick brings up the song category selector menu, which can be dismissed using accept/cancel buttons. diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.cpp b/rpcs3/Emu/RSX/Common/TextureUtils.cpp index 3cfc3aad3b..96b9e3e8bb 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.cpp +++ b/rpcs3/Emu/RSX/Common/TextureUtils.cpp @@ -595,8 +595,7 @@ namespace for (int row = 0; row < row_count; ++row) { - rsx::memory_transfer_cmd cmd{ dst_, src_, width_in_bytes }; - result.push_back(cmd); + result.push_back(rsx::memory_transfer_cmd{ dst_, src_, width_in_bytes }); src_ += src_pitch_in_bytes; dst_ += dst_pitch_in_bytes; } diff --git a/rpcs3/Emu/RSX/Common/surface_store.h b/rpcs3/Emu/RSX/Common/surface_store.h index 4b3aaa0605..7dce727402 100644 --- a/rpcs3/Emu/RSX/Common/surface_store.h +++ b/rpcs3/Emu/RSX/Common/surface_store.h @@ -1197,7 +1197,7 @@ namespace rsx info.src_area.width = width; } - result.push_back(info); + result.push_back(std::move(info)); } }; diff --git a/rpcs3/Emu/RSX/Common/texture_cache.h b/rpcs3/Emu/RSX/Common/texture_cache.h index 295090a5bc..81ff75b9a8 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache.h +++ b/rpcs3/Emu/RSX/Common/texture_cache.h @@ -3180,7 +3180,7 @@ namespace rsx subres.pitch_in_block = full_width; subres.depth = 1; subres.data = { vm::_ptr(image_base), static_cast::size_type>(src.pitch * image_height) }; - subresource_layout.push_back(subres); + subresource_layout.push_back(std::move(subres)); const u32 gcm_format = helpers::get_sized_blit_format(src_is_argb8, dst_is_depth_surface, is_format_convert); const auto rsx_range = address_range32::start_length(image_base, src.pitch * image_height); @@ -3321,7 +3321,7 @@ namespace rsx subres.pitch_in_block = pitch_in_block; subres.depth = 1; subres.data = { vm::get_super_ptr(dst_base_address), static_cast::size_type>(dst.pitch * dst_dimensions.height) }; - subresource_layout.push_back(subres); + subresource_layout.push_back(std::move(subres)); cached_dest = upload_image_from_cpu(cmd, rsx_range, dst_dimensions.width, dst_dimensions.height, 1, 1, dst.pitch, preferred_dst_format, rsx::texture_upload_context::blit_engine_dst, subresource_layout, diff --git a/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp b/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp index afaf7eb772..a3a53dc868 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp @@ -806,7 +806,7 @@ namespace rsx // Make sure min/max reflects the data being displayed, not the entire datapoints vector for (usz i = m_datapoints.size() - m_datapoint_count; i < m_datapoints.size(); i++) { - const f32& dp = m_datapoints[i]; + const f32 dp = m_datapoints[i]; if (dp < 0) continue; // Skip initial negative values. They don't count. diff --git a/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.h b/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.h index 636ac06082..ba3b6638d1 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.h +++ b/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.h @@ -130,7 +130,7 @@ namespace rsx::assembler rsx::simple_array get_register_file_range(const RegisterRef& reg); // Compile a register file annotated blob to register references - std::vector compile_register_file(const std::array& file); + std::vector compile_register_file(const register_file_t& file); // Invert execution mask on an instruction void invert_conditional_execution_mask(Instruction* instruction); diff --git a/rpcs3/Emu/RSX/Program/Assembler/IR.h b/rpcs3/Emu/RSX/Program/Assembler/IR.h index 635aec7209..fc5281a623 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/IR.h +++ b/rpcs3/Emu/RSX/Program/Assembler/IR.h @@ -105,14 +105,14 @@ namespace rsx::assembler FlowEdge* insert_succ(BasicBlock* b, EdgeType type = EdgeType::NONE) { FlowEdge e{ .type = type, .from = this, .to = b }; - succ.push_back(e); + succ.push_back(std::move(e)); return &succ.back(); } FlowEdge* insert_pred(BasicBlock* b, EdgeType type = EdgeType::NONE) { FlowEdge e{ .type = type, .from = b, .to = this }; - pred.push_back(e); + pred.push_back(std::move(e)); return &pred.back(); } diff --git a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.cpp b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.cpp index de9f978f51..9b3632504d 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.cpp +++ b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.cpp @@ -182,7 +182,7 @@ namespace rsx::assembler::FP instruction.bytecode[2] = src1.HEX; Register src_reg{ .id = static_cast(src_reg_id), .f16 = true }; - instruction.srcs.push_back({ .reg = src_reg, .mask = 0xF }); + instruction.srcs.push_back({ .reg = std::move(src_reg), .mask = 0xF }); instruction.dsts.push_back({ .reg{ .id = reg_id, .f16 = false }, .mask = (1u << ch) }); result.push_back(std::move(instruction)); } @@ -250,7 +250,7 @@ namespace rsx::assembler::FP instruction.bytecode[1] = src0.HEX; Register src_reg{ .id = static_cast(src_reg_id), .f16 = true }; - instruction.srcs.push_back({ .reg = src_reg, .mask = 0xF }); + instruction.srcs.push_back({ .reg = std::move(src_reg), .mask = 0xF }); instruction.dsts.push_back({ .reg{.id = reg.reg.id, .f16 = false }, .mask = dst.write_mask }); result.push_back(std::move(instruction)); } diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index 4c6d8625fa..3330b4be9b 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -636,7 +636,7 @@ namespace glsl } } - varying_list.push_back({ reg_location, var_name, PT.type }); + varying_list.push_back({ reg_location, std::move(var_name), PT.type }); } } diff --git a/rpcs3/Emu/RSX/Program/ShaderParam.h b/rpcs3/Emu/RSX/Program/ShaderParam.h index 6131f36ae9..4cd98f2e34 100644 --- a/rpcs3/Emu/RSX/Program/ShaderParam.h +++ b/rpcs3/Emu/RSX/Program/ShaderParam.h @@ -326,7 +326,7 @@ public: new_swizzle += swizzle[p.second]; } - swizzles.push_back(new_swizzle); + swizzles.push_back(std::move(new_swizzle)); return *this; } diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 714ec14863..4ded77ff09 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -3222,7 +3222,7 @@ namespace rsx // capture first tile state with nop cmd rsx::frame_capture_data::replay_command replay_cmd; replay_cmd.rsx_command = std::make_pair(NV4097_NO_OPERATION, 0); - frame_capture.replay_commands.push_back(replay_cmd); + frame_capture.replay_commands.push_back(std::move(replay_cmd)); capture::capture_display_tile_state(this, frame_capture.replay_commands.back()); } else if (capture_current_frame) diff --git a/rpcs3/Emu/RSX/VK/VKCompute.cpp b/rpcs3/Emu/RSX/VK/VKCompute.cpp index 6803ce1f49..033e19ff07 100644 --- a/rpcs3/Emu/RSX/VK/VKCompute.cpp +++ b/rpcs3/Emu/RSX/VK/VKCompute.cpp @@ -13,20 +13,19 @@ namespace vk std::vector result; for (unsigned i = 0; i < ssbo_count; ++i) { - const auto input = glsl::program_input::make + result.push_back(glsl::program_input::make ( ::glsl::glsl_compute_program, "ssbo" + std::to_string(i), glsl::program_input_type::input_type_storage_buffer, 0, i - ); - result.push_back(input); + )); } if (use_push_constants && push_constants_size > 0) { - const auto input = glsl::program_input::make + result.push_back(glsl::program_input::make ( ::glsl::glsl_compute_program, "push_constants", @@ -34,8 +33,7 @@ namespace vk 0, 0, glsl::push_constant_ref{ .offset = 0, .size = push_constants_size } - ); - result.push_back(input); + )); } return result; diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index fda0690d33..03ad33ac07 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -253,14 +253,13 @@ void VKFragmentDecompilerThread::insertConstants(std::stringstream & OS) OS << "layout(set=" << vk::glsl::binding_set_index_fragment << ", binding=" << vk_prog->binding_table.frag_depth_input_location << ") uniform " << frag_depth_type << " frag_depth;\n"; - auto in = vk::glsl::program_input::make( + inputs.push_back(vk::glsl::program_input::make( glsl::glsl_fragment_program, "frag_depth", vk::glsl::input_type_texture, vk::glsl::binding_set_index_fragment, vk_prog->binding_table.frag_depth_input_location - ); - inputs.push_back(in); + )); } // Draw params are always provided by vertex program. Instead of pointer chasing, they're provided as varyings. diff --git a/rpcs3/Emu/RSX/VK/VKOverlays.cpp b/rpcs3/Emu/RSX/VK/VKOverlays.cpp index f879a62ddf..b3deb880df 100644 --- a/rpcs3/Emu/RSX/VK/VKOverlays.cpp +++ b/rpcs3/Emu/RSX/VK/VKOverlays.cpp @@ -67,23 +67,20 @@ namespace vk for (u32 n = 0; n < m_num_uniform_buffers; ++n, ++binding) { - const std::string name = std::string("static_data") + (n > 0 ? std::to_string(n) : ""); - const auto input = program_input::make(::glsl::program_domain::glsl_fragment_program, name, program_input_type::input_type_uniform_buffer, 0, 0); - fs_inputs.push_back(input); + std::string name = std::string("static_data") + (n > 0 ? std::to_string(n) : ""); + fs_inputs.push_back(program_input::make(::glsl::program_domain::glsl_fragment_program, std::move(name), program_input_type::input_type_uniform_buffer, 0, 0)); } for (u32 n = 0; n < m_num_usable_samplers; ++n, ++binding) { - const std::string name = "fs" + std::to_string(n); - const auto input = program_input::make(::glsl::program_domain::glsl_fragment_program, name, program_input_type::input_type_texture, 0, binding); - fs_inputs.push_back(input); + std::string name = "fs" + std::to_string(n); + fs_inputs.push_back(program_input::make(::glsl::program_domain::glsl_fragment_program, std::move(name), program_input_type::input_type_texture, 0, binding)); } for (u32 n = 0; n < m_num_input_attachments; ++n, ++binding) { - const std::string name = "sp" + std::to_string(n); - const auto input = program_input::make(::glsl::program_domain::glsl_fragment_program, name, program_input_type::input_type_texture, 0, binding); - fs_inputs.push_back(input); + std::string name = "sp" + std::to_string(n); + fs_inputs.push_back(program_input::make(::glsl::program_domain::glsl_fragment_program, std::move(name), program_input_type::input_type_texture, 0, binding)); } return fs_inputs; diff --git a/rpcs3/Emu/RSX/VK/VKProgramPipeline.h b/rpcs3/Emu/RSX/VK/VKProgramPipeline.h index dba619ec88..bbf82bf26e 100644 --- a/rpcs3/Emu/RSX/VK/VKProgramPipeline.h +++ b/rpcs3/Emu/RSX/VK/VKProgramPipeline.h @@ -89,6 +89,25 @@ namespace vk .name = name }; } + + static program_input make( + ::glsl::program_domain domain, + std::string&& name, + program_input_type type, + u32 set, + u32 location, + const bound_data_t& data = bound_buffer{}) + { + return program_input + { + .domain = domain, + .type = type, + .bound_data = data, + .set = set, + .location = location, + .name = std::move(name) + }; + } }; class shader diff --git a/rpcs3/Emu/RSX/VK/VKRenderPass.cpp b/rpcs3/Emu/RSX/VK/VKRenderPass.cpp index 0f6ef23458..9dc578ef66 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderPass.cpp +++ b/rpcs3/Emu/RSX/VK/VKRenderPass.cpp @@ -301,7 +301,7 @@ namespace vk color_attachment_description.initialLayout = layout; color_attachment_description.finalLayout = layout; - attachments.push_back(color_attachment_description); + attachments.push_back(std::move(color_attachment_description)); attachment_references.push_back({ attachment_count++, layout }); } @@ -316,7 +316,7 @@ namespace vk depth_attachment_description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; depth_attachment_description.initialLayout = dsv_layout; depth_attachment_description.finalLayout = dsv_layout; - attachments.push_back(depth_attachment_description); + attachments.push_back(std::move(depth_attachment_description)); attachment_references.push_back({ attachment_count, dsv_layout }); } diff --git a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp index fef2851477..976f80086f 100644 --- a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp @@ -257,13 +257,14 @@ namespace vk // Declare local inputs auto vs_inputs = comp.get_inputs(); - vk::glsl::program_input in; - in.set = 0; - in.domain = ::glsl::glsl_vertex_program; - in.location = vertex_instruction_start; - in.type = glsl::input_type_storage_buffer; - in.name = "VertexInstructionBlock"; - vs_inputs.push_back(in); + vs_inputs.push_back(vk::glsl::program_input::make + ( + ::glsl::glsl_vertex_program, + "VertexInstructionBlock", + glsl::input_type_storage_buffer, + 0, + vertex_instruction_start + )); vk_prog->SetInputs(vs_inputs); @@ -426,12 +427,14 @@ namespace vk // Declare local inputs auto inputs = comp.get_inputs(); - vk::glsl::program_input in; - in.set = 1; - in.domain = ::glsl::glsl_fragment_program; - in.location = fragment_instruction_start; - in.type = glsl::input_type_storage_buffer; - in.name = "FragmentInstructionBlock"; + vk::glsl::program_input in = vk::glsl::program_input::make + ( + ::glsl::glsl_fragment_program, + "FragmentInstructionBlock", + glsl::input_type_storage_buffer, + 1, + fragment_instruction_start + ); inputs.push_back(in); if (compiler_options & COMPILER_OPT_ENABLE_TEXTURES) diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp index 671529f87d..bf990010c8 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp @@ -1265,7 +1265,7 @@ namespace vk upload_command_flags |= source_is_gpu_resident; heap_align = width * bpp; - tmp.push_back(subres); + tmp.push_back(std::move(subres)); p_subresource_layout = &tmp; } } diff --git a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp index 35e5f80265..41faf3ca1e 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp @@ -95,7 +95,7 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS) " vertex_context_t vertex_contexts[];\n" "};\n\n"; - const vk::glsl::program_input context_input + vk::glsl::program_input context_input { .domain = glsl::glsl_vertex_program, .type = vk::glsl::input_type_uniform_buffer, @@ -103,7 +103,7 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS) .location = vk_prog->binding_table.context_buffer_location, .name = "VertexContextBuffer" }; - inputs.push_back(context_input); + inputs.push_back(std::move(context_input)); if (m_device_props.emulate_conditional_rendering) { @@ -113,7 +113,7 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS) " uint cr_predicate_value;\n" "};\n\n"; - const vk::glsl::program_input predicate_input + vk::glsl::program_input predicate_input { .domain = glsl::glsl_vertex_program, .type = vk::glsl::input_type_storage_buffer, @@ -121,7 +121,7 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS) .location = vk_prog->binding_table.cr_pred_buffer_location, .name = "EXT_Conditional_Rendering" }; - inputs.push_back(predicate_input); + inputs.push_back(std::move(predicate_input)); } OS << @@ -130,7 +130,7 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS) " draw_parameters_t draw_parameters[];\n" "};\n\n"; - const vk::glsl::program_input layouts_input + vk::glsl::program_input layouts_input { .domain = glsl::glsl_vertex_program, .type = vk::glsl::input_type_storage_buffer, @@ -138,7 +138,7 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS) .location = vk_prog->binding_table.vertex_buffers_location + 2, .name = "DrawParametersBuffer" }; - inputs.push_back(layouts_input); + inputs.push_back(std::move(layouts_input)); OS << "layout(push_constant) uniform push_constants_block\n" @@ -146,7 +146,7 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS) " uint draw_parameters_offset;\n" "};\n\n"; - const vk::glsl::program_input push_constants + vk::glsl::program_input push_constants { .domain = glsl::glsl_vertex_program, .type = vk::glsl::input_type_push_constant, @@ -155,7 +155,7 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS) .location = umax, .name = "push_constants_block" }; - inputs.push_back(push_constants); + inputs.push_back(std::move(push_constants)); } void VKVertexDecompilerThread::insertInputs(std::stringstream& OS, const std::vector& /*inputs*/) @@ -171,15 +171,14 @@ void VKVertexDecompilerThread::insertInputs(std::stringstream& OS, const std::ve { OS << "layout(set=0, binding=" << location << ") uniform usamplerBuffer " << stream << ";\n"; - const vk::glsl::program_input input + this->inputs.push_back(vk::glsl::program_input { .domain = glsl::glsl_vertex_program, .type = vk::glsl::input_type_texel_buffer, .set = vk::glsl::binding_set_index_vertex, .location = location++, .name = stream - }; - this->inputs.push_back(input); + }); } } diff --git a/rpcs3/Emu/RSX/VK/vkutils/device.cpp b/rpcs3/Emu/RSX/VK/vkutils/device.cpp index 2c37298440..58fcc6e70a 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/device.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/device.cpp @@ -1032,7 +1032,7 @@ namespace vk for (u32 i = 0; i < memory_properties.memoryTypeCount; i++) { - auto& type_info = memory_properties.memoryTypes[i]; + const auto& type_info = memory_properties.memoryTypes[i]; memory_heap_map[type_info.heapIndex].types.push_back({ i, type_info.propertyFlags, 0 }); } @@ -1040,9 +1040,9 @@ namespace vk { std::vector results; - for (auto& heap : memory_heap_map) + for (const auto& heap : memory_heap_map) { - for (auto &type : heap.types) + for (const auto& type : heap.types) { if (((type.flags & desired_flags) == desired_flags) && !(type.flags & excluded_flags)) { diff --git a/rpcs3/Emu/RSX/VK/vkutils/sync.cpp b/rpcs3/Emu/RSX/VK/vkutils/sync.cpp index 322e06460f..6d36283ca1 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/sync.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/sync.cpp @@ -454,13 +454,13 @@ namespace vk dst_stages |= VK_PIPELINE_STAGE_TRANSFER_BIT; if (memory_barriers.empty()) { - const VkMemoryBarrier signal_barrier = + VkMemoryBarrier signal_barrier = { .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, .srcAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT }; - memory_barriers.push_back(signal_barrier); + memory_barriers.push_back(std::move(signal_barrier)); } else { diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index fc44b8cabb..12013c7965 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -2212,11 +2212,11 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, for (auto&& entry : fs::dir{ins_dir}) { - const std::string pkg_file = ins_dir + entry.name; + std::string pkg_file = ins_dir + entry.name; if (!entry.is_directory && entry.name.ends_with(".PKG")) { - pkgs.push_back(pkg_file); + pkgs.push_back(std::move(pkg_file)); } } } @@ -2229,11 +2229,11 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, { if (entry.is_directory && entry.name.starts_with("PKG")) { - const std::string pkg_file = pkg_dir + entry.name + "/INSTALL.PKG"; + std::string pkg_file = pkg_dir + entry.name + "/INSTALL.PKG"; if (fs::is_file(pkg_file)) { - pkgs.push_back(pkg_file); + pkgs.push_back(std::move(pkg_file)); } } } @@ -2247,11 +2247,11 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, { if (entry.is_directory && entry.name[0] == 'D') { - const std::string pkg_file = extra_dir + entry.name + "/DATA000.PKG"; + std::string pkg_file = extra_dir + entry.name + "/DATA000.PKG"; if (fs::is_file(pkg_file)) { - pkgs.push_back(pkg_file); + pkgs.push_back(std::move(pkg_file)); } } } diff --git a/rpcs3/Loader/TROPUSR.cpp b/rpcs3/Loader/TROPUSR.cpp index dc47a643a1..b8549e7e1a 100644 --- a/rpcs3/Loader/TROPUSR.cpp +++ b/rpcs3/Loader/TROPUSR.cpp @@ -207,8 +207,8 @@ bool TROPUSRLoader::Generate(std::string_view filepath, std::string_view configp TROPUSREntry4 entry4 = { 4, u32{sizeof(TROPUSREntry4)} - 0x10, ::size32(m_table4), 0, trophy_id, trophy_grade, trophy_pid }; TROPUSREntry6 entry6 = { 6, u32{sizeof(TROPUSREntry6)} - 0x10, ::size32(m_table6), 0, trophy_id }; - m_table4.push_back(entry4); - m_table6.push_back(entry6); + m_table4.push_back(std::move(entry4)); + m_table6.push_back(std::move(entry6)); } } @@ -219,8 +219,8 @@ bool TROPUSRLoader::Generate(std::string_view filepath, std::string_view configp offset += m_table6.size() * sizeof(TROPUSREntry6); m_tableHeaders.clear(); - m_tableHeaders.push_back(table4header); - m_tableHeaders.push_back(table6header); + m_tableHeaders.push_back(std::move(table4header)); + m_tableHeaders.push_back(std::move(table6header)); std::memset(&m_header, 0, sizeof(m_header)); m_header.magic = TROPUSR_MAGIC; diff --git a/rpcs3/main_application.cpp b/rpcs3/main_application.cpp index 8d5c44c5e3..b998427e2d 100644 --- a/rpcs3/main_application.cpp +++ b/rpcs3/main_application.cpp @@ -394,7 +394,7 @@ EmuCallbacks main_application::CreateCallbacks() { font_dir += '/'; } - font_dirs.push_back(font_dir); + font_dirs.push_back(std::move(font_dir)); } return font_dirs; }; diff --git a/rpcs3/rpcs3qt/curl_handle.cpp b/rpcs3/rpcs3qt/curl_handle.cpp index cb91311d26..56b02dd9e6 100644 --- a/rpcs3/rpcs3qt/curl_handle.cpp +++ b/rpcs3/rpcs3qt/curl_handle.cpp @@ -13,8 +13,6 @@ namespace rpcs3::curl curl_handle::curl_handle() { - reset_error_buffer(); - m_curl = curl_easy_init(); CURLcode err = curl_easy_setopt(m_curl, CURLOPT_ERRORBUFFER, m_error_buffer.data()); @@ -44,7 +42,6 @@ CURL* curl_handle::get_curl() const void curl_handle::reset_error_buffer() { - ensure(m_error_buffer.size() == CURL_ERROR_SIZE); m_error_buffer[0] = 0; } @@ -52,7 +49,6 @@ std::string curl_handle::get_verbose_error(CURLcode code) const { if (m_uses_error_buffer) { - ensure(m_error_buffer.size() == CURL_ERROR_SIZE); if (m_error_buffer[0]) { return fmt::format("Curl error (%d): %s\nDetails: %s", static_cast(code), curl_easy_strerror(code), m_error_buffer.data()); diff --git a/rpcs3/rpcs3qt/curl_handle.h b/rpcs3/rpcs3qt/curl_handle.h index 090c198215..3415e9ee57 100644 --- a/rpcs3/rpcs3qt/curl_handle.h +++ b/rpcs3/rpcs3qt/curl_handle.h @@ -27,7 +27,7 @@ public: private: CURL* m_curl = nullptr; bool m_uses_error_buffer = false; - std::array m_error_buffer; + std::array m_error_buffer {}; }; } diff --git a/rpcs3/rpcs3qt/infinity_dialog.cpp b/rpcs3/rpcs3qt/infinity_dialog.cpp index 7aa00e5819..0e37bb594f 100644 --- a/rpcs3/rpcs3qt/infinity_dialog.cpp +++ b/rpcs3/rpcs3qt/infinity_dialog.cpp @@ -626,7 +626,7 @@ bool figure_creator_dialog::create_blank_figure(u32 character, u8 series) std::array uid_data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x44, 0x00, 0xC2}; for (u8 i = 0; i < 7; i++) { - u8 random = rand() % 255; + const u8 random = rand() % 255; sha1_calc.push_back(random); uid_data[i] = random; } @@ -659,7 +659,7 @@ bool figure_creator_dialog::create_blank_figure(u32 character, u8 series) figure_data[6] = 0x1C; } - u32 checksum = infinity_crc32(0, figure_data.data(), 12); + const u32 checksum = infinity_crc32(0, figure_data.data(), 12); for (s8 i = 0; i < 4; i++) { figure_data[12 + i] = u8((checksum >> (3 - i) * 8) & 0xFF); diff --git a/rpcs3/rpcs3qt/pkg_install_dialog.cpp b/rpcs3/rpcs3qt/pkg_install_dialog.cpp index c93b9dec01..df3250437f 100644 --- a/rpcs3/rpcs3qt/pkg_install_dialog.cpp +++ b/rpcs3/rpcs3qt/pkg_install_dialog.cpp @@ -297,13 +297,13 @@ std::vector pkg_install_dialog::get_paths_to_install() con const QListWidgetItem* item = m_dir_list->item(i); if (item && (m_dir_list->count() == 1 || item->checkState() == Qt::Checked)) { - compat::package_info info; + compat::package_info info {}; info.path = item->data(Roles::FullPathRole).toString(); info.title = item->data(Roles::TitleRole).toString(); info.title_id = item->data(Roles::TitleIdRole).toString(); info.changelog = item->data(Roles::ChangelogRole).toString(); info.version = item->data(Roles::VersionRole).toString(); - result.push_back(info); + result.push_back(std::move(info)); } } From 23b414ac84751382d54c2993fd09865315d7d13c Mon Sep 17 00:00:00 2001 From: Antonino Di Guardo <64427768+digant73@users.noreply.github.com> Date: Sun, 14 Jun 2026 07:35:49 +0200 Subject: [PATCH 16/64] Add integrity check to PSN Content, DLC and Game Update files (#18669) --- rpcs3/Emu/CMakeLists.txt | 2 +- rpcs3/Emu/system_utils.cpp | 30 +++ rpcs3/Emu/system_utils.hpp | 6 + rpcs3/Loader/content_validation.cpp | 187 ++++++++++++++++++ rpcs3/Loader/content_validation.h | 57 ++++++ rpcs3/Loader/iso_validation.cpp | 162 --------------- rpcs3/Loader/iso_validation.h | 42 ---- rpcs3/emucore.vcxproj | 5 +- rpcs3/emucore.vcxproj.filters | 10 +- rpcs3/rpcs3.vcxproj | 12 +- rpcs3/rpcs3.vcxproj.filters | 8 +- rpcs3/rpcs3qt/CMakeLists.txt | 2 +- rpcs3/rpcs3qt/content_integrity.cpp | 134 +++++++++++++ .../{iso_integrity.h => content_integrity.h} | 13 +- rpcs3/rpcs3qt/game_list_actions.cpp | 186 +++++++++++++---- rpcs3/rpcs3qt/game_list_actions.h | 6 +- rpcs3/rpcs3qt/game_list_context_menu.cpp | 22 +-- rpcs3/rpcs3qt/game_list_frame.cpp | 5 +- rpcs3/rpcs3qt/game_list_frame.h | 12 +- rpcs3/rpcs3qt/iso_integrity.cpp | 113 ----------- rpcs3/rpcs3qt/main_window.cpp | 11 ++ rpcs3/rpcs3qt/main_window.ui | 12 ++ 22 files changed, 640 insertions(+), 397 deletions(-) create mode 100644 rpcs3/Loader/content_validation.cpp create mode 100644 rpcs3/Loader/content_validation.h delete mode 100644 rpcs3/Loader/iso_validation.cpp delete mode 100644 rpcs3/Loader/iso_validation.h create mode 100644 rpcs3/rpcs3qt/content_integrity.cpp rename rpcs3/rpcs3qt/{iso_integrity.h => content_integrity.h} (57%) delete mode 100644 rpcs3/rpcs3qt/iso_integrity.cpp diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index a0322da814..3a3d202a2e 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -128,7 +128,7 @@ target_sources(rpcs3_emu PRIVATE ../Loader/TAR.cpp ../Loader/ISO.cpp ../Loader/iso_cache.cpp - ../Loader/iso_validation.cpp + ../Loader/content_validation.cpp ../Loader/TROPUSR.cpp ../Loader/TRP.cpp ) diff --git a/rpcs3/Emu/system_utils.cpp b/rpcs3/Emu/system_utils.cpp index b1235dabf6..dd3f414938 100644 --- a/rpcs3/Emu/system_utils.cpp +++ b/rpcs3/Emu/system_utils.cpp @@ -256,6 +256,36 @@ namespace rpcs3::utils return get_data_dir() + "redump/"; } + std::string get_psn_content_db_path() + { + return fs::get_config_dir(true) + "psn_content.dat"; + } + + std::string get_psn_content_db_download_url() + { + return "https://api.rpcs3.net/nointro/content/?api=v1"; + } + + std::string get_psn_dlc_db_path() + { + return fs::get_config_dir(true) + "psn_dlc.dat"; + } + + std::string get_psn_dlc_db_download_url() + { + return "https://api.rpcs3.net/nointro/dlc/?api=v1"; + } + + std::string get_psn_update_db_path() + { + return fs::get_config_dir(true) + "psn_update.dat"; + } + + std::string get_psn_update_db_download_url() + { + return "https://api.rpcs3.net/nointro/updates/?api=v1"; + } + std::string get_data_dir() { return fs::get_config_dir() + "data/"; diff --git a/rpcs3/Emu/system_utils.hpp b/rpcs3/Emu/system_utils.hpp index 1545cbf829..8745b7d3b0 100644 --- a/rpcs3/Emu/system_utils.hpp +++ b/rpcs3/Emu/system_utils.hpp @@ -49,6 +49,12 @@ namespace rpcs3::utils std::string get_redump_db_path(); std::string get_redump_db_download_url(); std::string get_redump_key_dir(); + std::string get_psn_content_db_path(); + std::string get_psn_content_db_download_url(); + std::string get_psn_dlc_db_path(); + std::string get_psn_dlc_db_download_url(); + std::string get_psn_update_db_path(); + std::string get_psn_update_db_download_url(); std::string get_data_dir(); std::string get_icons_dir(); diff --git a/rpcs3/Loader/content_validation.cpp b/rpcs3/Loader/content_validation.cpp new file mode 100644 index 0000000000..818bab63ad --- /dev/null +++ b/rpcs3/Loader/content_validation.cpp @@ -0,0 +1,187 @@ +#include "stdafx.h" + +#include "content_validation.h" +#include "ISO.h" + +#include "Emu/system_utils.hpp" +#include "Utilities/File.h" +#include "Utilities/rXml.h" +#include "Crypto/md5.h" +#include "Crypto/utils.h" + +LOG_CHANNEL(sys_log, "VALIDATION"); + +content_integrity_status content_validation::check_integrity(content_file_type file_type, const std::string& hash, std::string* game_name) +{ + // + // Check for Redump db + // + + std::string db_path; + + switch (file_type) + { + case content_file_type::ISO: + db_path = rpcs3::utils::get_redump_db_path(); + break; + case content_file_type::PSN_CONTENT: + db_path = rpcs3::utils::get_psn_content_db_path(); + break; + case content_file_type::PSN_DLC: + db_path = rpcs3::utils::get_psn_dlc_db_path(); + break; + case content_file_type::PSN_UPDATE: + db_path = rpcs3::utils::get_psn_update_db_path(); + break; + } + + fs::file db_file(db_path); + + // If no db file exists + if (!db_file) + { + // An empty hash is used to simply test the presence (without any logging) of the Redump db + if (!hash.empty()) + { + sys_log.error("check_integrity: Failed to open file: %s", db_path); + } + + return content_integrity_status::ERROR_OPENING_DB; + } + + if (hash.empty()) + { + return content_integrity_status::NO_MATCH; + } + + rXmlDocument db; + + if (!db.Read(db_file.to_string())) + { + sys_log.error("check_integrity: Failed to process file: %s", db_path); + return content_integrity_status::ERROR_PARSING_DB; + } + + // Close the file and work with the data loaded into the "db" document + db_file.close(); + + std::shared_ptr db_base = db.GetRoot(); + + if (!db_base) + { + sys_log.error("check_integrity: Failed to get 'root' node on file: %s", db_path); + return content_integrity_status::ERROR_PARSING_DB; + } + + if (db_base = db_base->GetChild(std::string_view("datafile")); !db_base) + { + sys_log.error("check_integrity: Failed to get 'datafile' node on file: %s", db_path); + return content_integrity_status::ERROR_PARSING_DB; + } + + // + // Check for a match on Redump db + // + + for (auto node = db_base->GetChildren(); node; node = node->GetNext()) + { + if (node->GetName() == "game") + { + for (auto child = node->GetChildren(); child; child = child->GetNext()) + { + // If a match is found, fill in "game_desc" (if requested) and return FOUND_MATCH + if (child->GetName() == "rom" && hash == child->GetAttribute(std::string_view("md5"))) + { + if (game_name) + { + *game_name = node->GetAttribute(std::string_view("name")); + } + + return content_integrity_status::FOUND_MATCH; + } + } + } + } + + // No match found + return content_integrity_status::NO_MATCH; +} + +bool content_validation::init_hash(const std::string& path) +{ + std::string new_path = path; + + fs::get_optical_raw_device(path, &new_path); + + iso_file file(new_path); + + // If no file exists + if (!file) + { + sys_log.error("init_hash: Failed to open file: %s", new_path); + m_status = content_hash_status::ABORTED; + return false; + } + + m_path = new_path; + m_name = new_path.find_last_of(fs::delim) != umax ? new_path.substr(new_path.find_last_of(fs::delim) + 1) : new_path; + m_size = file.size(); + m_bytes_read = 0; + m_status = content_hash_status::INITIALIZED; + return true; +} + +content_hash_status content_validation::calculate_hash(std::string& hash) +{ + if (m_status != content_hash_status::INITIALIZED) + { + sys_log.error("calculate_hash: MD5 hash calculation already performed: %s", m_path); + m_status = content_hash_status::ABORTED; + return m_status; + } + + iso_file file(m_path); + + // If no file exists + if (!file) + { + sys_log.error("calculate_hash: Failed to open file: %s", m_path); + m_status = content_hash_status::ABORTED; + return m_status; + } + + constexpr u64 block_size = 4096; + std::array buf; + u64 bytes_read; + mbedtls_md5_context md5_ctx; + unsigned char md5_hash[16]; + + mbedtls_md5_starts_ret(&md5_ctx); + + do + { + bytes_read = file.read(buf.data(), block_size); + mbedtls_md5_update_ret(&md5_ctx, buf.data(), bytes_read); + + m_bytes_read += bytes_read; + } while (bytes_read == block_size && m_status != content_hash_status::ABORTED); + + if (m_status == content_hash_status::ABORTED) + { + sys_log.warning("calculate_hash: MD5 hash calculation aborted by user: %s", m_path); + return m_status; + } + + if (mbedtls_md5_finish_ret(&md5_ctx, md5_hash) != 0) + { + sys_log.error("calculate_hash: Failed to calculate MD5 hash on file: %s", m_path); + m_status = content_hash_status::ABORTED; + return m_status; + } + + // Convert the MD5 hash to hex string + bytes_to_hex(hash, md5_hash, 16); + + m_status = content_hash_status::COMPLETED; + return m_status; +} diff --git a/rpcs3/Loader/content_validation.h b/rpcs3/Loader/content_validation.h new file mode 100644 index 0000000000..4540ae6b3e --- /dev/null +++ b/rpcs3/Loader/content_validation.h @@ -0,0 +1,57 @@ +#pragma once + +#include "util/types.hpp" + +// Enum identifying the content file type +enum class content_file_type +{ + ISO, + PSN_CONTENT, + PSN_DLC, + PSN_UPDATE +}; + +// Enum returned by calculating hash +enum class content_hash_status +{ + INITIALIZED, + COMPLETED, + ABORTED +}; + +// Enum returned by checking integrity +enum class content_integrity_status +{ + NO_MATCH, + FOUND_MATCH, + ERROR_OPENING_DB, + ERROR_PARSING_DB +}; + +// Content validation class +class content_validation +{ +private: + std::string m_path; + std::string m_name; + u64 m_size = 0; + u64 m_bytes_read = 0; + u16 m_count = 0; // Set only by set_count() + content_hash_status m_status = content_hash_status::INITIALIZED; + +public: + static content_integrity_status check_integrity(content_file_type file_type, const std::string& hash, std::string* game_name = nullptr); + + const std::string& get_path() const { return m_path; } + const std::string& get_name() const { return m_name; } + u64 get_size() const { return m_size; } + u64 get_bytes_read() const { return m_bytes_read; } + u16 get_count() const { return m_count; } + content_hash_status get_status() const { return m_status; } + + void set_count(u16 count) { m_count = count; } + void abort_hash() { m_status = content_hash_status::ABORTED; } + + bool init_hash(const std::string& path); + content_hash_status calculate_hash(std::string& hash); +}; diff --git a/rpcs3/Loader/iso_validation.cpp b/rpcs3/Loader/iso_validation.cpp deleted file mode 100644 index 31a82beaa7..0000000000 --- a/rpcs3/Loader/iso_validation.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include "stdafx.h" - -#include "iso_validation.h" -#include "ISO.h" - -#include "Emu/system_utils.hpp" -#include "Utilities/File.h" -#include "Utilities/rXml.h" -#include "Crypto/md5.h" -#include "Crypto/utils.h" - -LOG_CHANNEL(iso_log, "ISO"); - -iso_integrity_status iso_file_validation::check_integrity(const std::string& hash, std::string* game_name) -{ - // - // Check for Redump db - // - - const std::string db_path = rpcs3::utils::get_redump_db_path(); - fs::file db_file(db_path); - - // If no db file exists - if (!db_file) - { - // An empty hash is used to simply test the presence (without any logging) of the Redump db - if (!hash.empty()) - { - iso_log.error("check_integrity: Failed to open file: %s", db_path); - } - - return iso_integrity_status::ERROR_OPENING_DB; - } - - if (hash.empty()) - { - return iso_integrity_status::NO_MATCH; - } - - rXmlDocument db; - - if (!db.Read(db_file.to_string())) - { - iso_log.error("check_integrity: Failed to process file: %s", db_path); - return iso_integrity_status::ERROR_PARSING_DB; - } - - std::shared_ptr db_base = db.GetRoot(); - - if (!db_base) - { - iso_log.error("check_integrity: Failed to get 'root' node on file: %s", db_path); - return iso_integrity_status::ERROR_PARSING_DB; - } - - if (db_base = db_base->GetChild(std::string_view("datafile")); !db_base) - { - iso_log.error("check_integrity: Failed to get 'datafile' node on file: %s", db_path); - return iso_integrity_status::ERROR_PARSING_DB; - } - - // - // Check for a match on Redump db - // - - for (auto node = db_base->GetChildren(); node; node = node->GetNext()) - { - if (node->GetName() == "game") - { - if (const auto child = node->GetChild(std::string_view("rom"))) - { - // If a match is found, fill in "game_desc" (if requested) and return FOUND_MATCH - if (hash == child->GetAttribute(std::string_view("md5"))) - { - if (game_name) - { - *game_name = node->GetAttribute(std::string_view("name")); - } - - return iso_integrity_status::FOUND_MATCH; - } - } - } - } - - // No match found - return iso_integrity_status::NO_MATCH; -} - -bool iso_file_validation::init_hash(const std::string& path) -{ - fs::file iso_file(path); - - // If no ISO file exists - if (!iso_file) - { - iso_log.error("init_hash: Failed to open file: %s", path); - m_status = iso_hash_status::ABORTED; - return false; - } - - m_path = path; - m_size = iso_file.size(); - m_bytes_read = 0; - m_status = iso_hash_status::INITIALIZED; - return true; -} - -iso_hash_status iso_file_validation::calculate_hash(std::string& hash) -{ - if (m_status != iso_hash_status::INITIALIZED) - { - iso_log.error("calculate_hash: MD5 hash calculation already performed: %s", m_path); - m_status = iso_hash_status::ABORTED; - return m_status; - } - - fs::file iso_file(m_path); - - // If no ISO file exists - if (!iso_file) - { - iso_log.error("calculate_hash: Failed to open file: %s", m_path); - m_status = iso_hash_status::ABORTED; - return m_status; - } - - constexpr u64 block_size = ISO_SECTOR_SIZE * 2; - std::array buf; - u64 bytes_read; - mbedtls_md5_context md5_ctx; - unsigned char md5_hash[16]; - - mbedtls_md5_starts_ret(&md5_ctx); - - do - { - bytes_read = iso_file.read(buf.data(), block_size); - mbedtls_md5_update_ret(&md5_ctx, buf.data(), bytes_read); - - m_bytes_read += bytes_read; - } while (bytes_read == block_size && m_status != iso_hash_status::ABORTED); - - if (m_status == iso_hash_status::ABORTED) - { - iso_log.warning("calculate_hash: MD5 hash calculation aborted by user: %s", m_path); - return m_status; - } - - if (mbedtls_md5_finish_ret(&md5_ctx, md5_hash) != 0) - { - iso_log.error("calculate_hash: Failed to calculate MD5 hash on file: %s", m_path); - m_status = iso_hash_status::ABORTED; - return m_status; - } - - // Convert the MD5 hash to hex string - bytes_to_hex(hash, md5_hash, 16); - - m_status = iso_hash_status::COMPLETED; - return m_status; -} diff --git a/rpcs3/Loader/iso_validation.h b/rpcs3/Loader/iso_validation.h deleted file mode 100644 index 56ac659ce8..0000000000 --- a/rpcs3/Loader/iso_validation.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "util/types.hpp" - -// Enum returned by calculating hash -enum class iso_hash_status -{ - INITIALIZED, - COMPLETED, - ABORTED -}; - -// Enum returned by checking integrity -enum class iso_integrity_status -{ - NO_MATCH, - FOUND_MATCH, - ERROR_OPENING_DB, - ERROR_PARSING_DB -}; - -// ISO file validation class -class iso_file_validation -{ -private: - std::string m_path; - u64 m_size = 0; - u64 m_bytes_read = 0; - iso_hash_status m_status = iso_hash_status::INITIALIZED; - -public: - static iso_integrity_status check_integrity(const std::string& hash, std::string* game_name = nullptr); - - const std::string& get_path() const { return m_path; } - u64 get_size() const { return m_size; } - u64 get_bytes_read() const { return m_bytes_read; } - iso_hash_status get_status() const { return m_status; } - void abort_hash() { m_status = iso_hash_status::ABORTED; } - - bool init_hash(const std::string& path); - iso_hash_status calculate_hash(std::string& hash); -}; diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index cd4ee9a32e..9d79366ee2 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -207,7 +207,7 @@ - + NotUsing @@ -782,8 +782,8 @@ + - @@ -1067,6 +1067,7 @@ + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index f944c85349..5869d5e42f 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1414,6 +1414,9 @@ Loader + + Loader + Emu\GPU\RSX\Overlays @@ -1432,7 +1435,7 @@ Emu\GPU\RSX\Overlays - + Loader @@ -2887,6 +2890,9 @@ Loader + + Loader + Emu\GPU\RSX\Overlays @@ -2911,7 +2917,7 @@ Emu\GPU\RSX\Common - + Loader diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 0aeb999181..c4338d2acb 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -344,7 +344,7 @@ true - + true @@ -656,7 +656,7 @@ true - + true @@ -929,7 +929,7 @@ - + @@ -1924,13 +1924,13 @@ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" - + $(QTDIR)\bin\moc.exe;%(FullPath) - Moc%27ing iso_integrity.h... + Moc%27ing content_integrity.h... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) - Moc%27ing iso_integrity.h... + Moc%27ing content_integrity.h... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 5358f6e372..b8af6799f1 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1302,13 +1302,13 @@ Gui\settings - + Generated Files\Debug - + Generated Files\Release - + Gui\game list @@ -2083,7 +2083,7 @@ - + Gui\game list diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index 160aa4fb05..5dd092d074 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -13,6 +13,7 @@ add_library(rpcs3_ui STATIC config_adapter.cpp config_checker.cpp config_database.cpp + content_integrity.cpp curl_handle.cpp custom_dialog.cpp custom_table_widget_item.cpp @@ -51,7 +52,6 @@ add_library(rpcs3_ui STATIC input_dialog.cpp instruction_editor_dialog.cpp ipc_settings_dialog.cpp - iso_integrity.cpp kamen_rider_dialog.cpp kernel_explorer.cpp localized.cpp diff --git a/rpcs3/rpcs3qt/content_integrity.cpp b/rpcs3/rpcs3qt/content_integrity.cpp new file mode 100644 index 0000000000..16b68f316f --- /dev/null +++ b/rpcs3/rpcs3qt/content_integrity.cpp @@ -0,0 +1,134 @@ +#include "content_integrity.h" +#include "gui_settings.h" + +#include "Emu/system_utils.hpp" + +#include +#include + +LOG_CHANNEL(sys_log, "INTEGRITY"); + +content_integrity::content_integrity(QWidget* parent, content_file_type file_type) + : QObject(parent), m_file_type(file_type) +{ + switch (m_file_type) + { + case content_file_type::ISO: + m_file_path = QString::fromStdString(rpcs3::utils::get_redump_db_path()); + m_url = rpcs3::utils::get_redump_db_download_url(); + m_data_prefix = "redump"; + break; + case content_file_type::PSN_CONTENT: + m_file_path = QString::fromStdString(rpcs3::utils::get_psn_content_db_path()); + m_url = rpcs3::utils::get_psn_content_db_download_url(); + m_data_prefix = "nointro"; + break; + case content_file_type::PSN_DLC: + m_file_path = QString::fromStdString(rpcs3::utils::get_psn_dlc_db_path()); + m_url = rpcs3::utils::get_psn_dlc_db_download_url(); + m_data_prefix = "nointro"; + break; + case content_file_type::PSN_UPDATE: + m_file_path = QString::fromStdString(rpcs3::utils::get_psn_update_db_path()); + m_url = rpcs3::utils::get_psn_update_db_download_url(); + m_data_prefix = "nointro"; + break; + } + + m_downloader = new downloader(parent); + + connect(m_downloader, &downloader::signal_download_finished, this, &content_integrity::handle_download_finished); + connect(m_downloader, &downloader::signal_download_canceled, this, &content_integrity::handle_download_canceled); + connect(m_downloader, &downloader::signal_download_error, this, &content_integrity::handle_download_error); +} + +void content_integrity::download() +{ + sys_log.notice("Starting database download from: %s", m_url); + + m_downloader->start(m_url, true, true, true, tr("Downloading database")); +} + +void content_integrity::handle_download_finished(const QByteArray& content) +{ + sys_log.notice("Database download finished"); + + // Write database to file + if (QByteArray data = read_json(content, true); !data.isEmpty()) + { + QFile file(m_file_path); + + if (file.exists()) + { + sys_log.notice("Database file found: %s", m_file_path); + } + + if (!file.open(QIODevice::WriteOnly)) + { + sys_log.error("Failed to write database to file: %s", m_file_path); + return; + } + + file.write(data); + file.close(); + + sys_log.success("Database written to file: %s", m_file_path); + } +} + +void content_integrity::handle_download_canceled() +{ + sys_log.notice("Database download canceled"); +} + +void content_integrity::handle_download_error(const QString& error) +{ + sys_log.error("", error.toStdString().c_str()); +} + +QByteArray content_integrity::read_json(const QByteArray& data, bool after_download) +{ + QJsonParseError error{}; + const QJsonDocument json_document = QJsonDocument::fromJson(data, &error); + + if (!json_document.isObject()) + { + sys_log.error("Integrity database error - Invalid JSON: '%s'", error.errorString()); + return {}; + } + + const QJsonObject json_data = json_document.object(); + const int return_code = json_data["return_code"].toInt(-255); + + if (return_code < 0) + { + if (after_download) + { + std::string error_message; + + switch (return_code) + { + case -1: error_message = "Server Error - Internal Error"; break; + case -2: error_message = "Server Error - Maintenance Mode"; break; + case -255: error_message = "Server Error - Return code not found"; break; + default: error_message = "Server Error - Unknown Error"; break; + } + + sys_log.error("%s: return code %d", error_message, return_code); + } + else + { + sys_log.error("Integrity database error - Invalid: return code %d", return_code); + } + + return {}; + } + + if (!json_data[m_data_prefix.c_str()].isString()) + { + sys_log.error("Integrity database error - Unusable string"); + return {}; + } + + return QByteArray().fromStdString(json_data[m_data_prefix.c_str()].toString().toStdString()); +}; diff --git a/rpcs3/rpcs3qt/iso_integrity.h b/rpcs3/rpcs3qt/content_integrity.h similarity index 57% rename from rpcs3/rpcs3qt/iso_integrity.h rename to rpcs3/rpcs3qt/content_integrity.h index a4225770de..d7d51b9a55 100644 --- a/rpcs3/rpcs3qt/iso_integrity.h +++ b/rpcs3/rpcs3qt/content_integrity.h @@ -2,13 +2,15 @@ #include "downloader.h" -class iso_integrity : public QObject +#include "Loader/content_validation.h" + +class content_integrity : public QObject { Q_OBJECT public: - // Handles download for the ISO integrity database - iso_integrity(QWidget* parent); + // Handles download for the content integrity database + content_integrity(QWidget* parent, content_file_type file_type); // Downloads and writes the database to file void download(); @@ -21,6 +23,9 @@ private Q_SLOTS: private: QByteArray read_json(const QByteArray& data, bool after_download); - QString m_filepath; + content_file_type m_file_type; + QString m_file_path; + std::string m_url; + std::string m_data_prefix; downloader* m_downloader = nullptr; }; diff --git a/rpcs3/rpcs3qt/game_list_actions.cpp b/rpcs3/rpcs3qt/game_list_actions.cpp index 5e0b77a802..a8db41f42c 100644 --- a/rpcs3/rpcs3qt/game_list_actions.cpp +++ b/rpcs3/rpcs3qt/game_list_actions.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -367,67 +368,167 @@ void game_list_actions::ShowGameInfoDialog(const std::vector& games) QMessageBox::information(m_game_list_frame, tr("Game Info"), GetContentInfo(games).info); } -void game_list_actions::ShowGameIntegrityDialog(const game_info& game) +void game_list_actions::ShowGameIntegrityDialog(content_file_type file_type, const std::string& game_path) { if (m_game_integrity_future.isRunning()) // Still running the last request return; - // Initialize the validator (set also file size etc.) - m_iso_validator->init_hash(game->info.path); + QStringList path_list; + + switch (file_type) + { + case content_file_type::ISO: + path_list.push_back(QString::fromStdString(game_path)); + break; + default: // Auto-detect the file type + const QString path_last_pkg = m_gui_settings->GetValue(gui::fd_install_pkg).toString(); + + path_list = QFileDialog::getOpenFileNames(nullptr, tr("Select package or rap file to check"), + path_last_pkg, tr("All relevant (*.pkg *.PKG *.rap *.RAP *.edat *.EDAT);;Package files (*.pkg *.PKG);;Rap files (*.rap *.RAP);;Edat files (*.edat *.EDAT);;All files (*.*)")); + + if (path_list.isEmpty()) + { + return; + } + + break; + } + + // Tell the progress bar thread how many hash will be checked + m_game_validator->set_count(path_list.size()); // Game integrity check can take a while (in particular on non ssd/m.2 disks) // so run it on a concurrent thread avoiding to block the entire GUI - m_game_integrity_future = QtConcurrent::run([this]() + m_game_integrity_future = QtConcurrent::run([this, type = file_type, path_list]() { thread_base::set_name("Game Integrity"); - QString text; - std::string hash, game_name; - bool info_dialog = false; + content_file_type file_type = type; + QString text_result; + std::string db_id, hash, game_name; + bool info_dialog = true; - if (m_iso_validator->calculate_hash(hash) != iso_hash_status::COMPLETED) + for (int i = 0; i < path_list.size(); i++) { - text = "Hash calculation failed!\n\nIntegrity check aborted"; - } - else - { - text = "Integrity check completed!\n\n"; + bool use_fallback_db = false; // Set to "true" only for ".rap" and ".edat" - switch (m_iso_validator->check_integrity(hash, &game_name)) + if (file_type == content_file_type::ISO) { - case iso_integrity_status::NO_MATCH: - text += tr("Game check NOT PASSED\n\nNo match found on DB or game corrupted:\n - Hash: %0") - .arg(QString::fromStdString(hash)); - break; - case iso_integrity_status::FOUND_MATCH: - text += tr("Game check PASSED\n\nMatch found on DB:\n - Game: %0\n - Hash: %1") - .arg(QString::fromStdString(game_name)) - .arg(QString::fromStdString(hash)); - - info_dialog = true; - break; - default: - text += tr("Error parsing DB"); - break; + db_id = "REDUMP"; } - } - - Emu.CallFromMainThread([this, text, info_dialog]() - { - if (info_dialog) + else if (path_list[i].endsWith(".rap", Qt::CaseInsensitive) || path_list[i].endsWith(".edat", Qt::CaseInsensitive)) { - sys_log.success("%s", text.toStdString()); - QMessageBox::information(m_game_list_frame, tr("Game Integrity"), text); + // NOTE: This is the default type for any ".rap" and ".edat" due to it's not possible to detect the type by file parsing. + // If no match for ".rap" or ".edat" will be found on default "PSN Content" DB, we will try on "PSN DLC" DB + file_type = content_file_type::PSN_CONTENT; + db_id = "PSN CONTENT"; + use_fallback_db = true; } else { - sys_log.error("%s", text.toStdString()); - QMessageBox::critical(m_game_list_frame, tr("Game Integrity"), text); + const compat::package_info info = game_compatibility::GetPkgInfo(path_list[i], m_game_list_frame->GetGameCompatibility()); + + switch (info.type) + { + case compat::package_type::update: + file_type = content_file_type::PSN_UPDATE; + db_id = "PSN UPDATE"; + break; + case compat::package_type::dlc: + file_type = content_file_type::PSN_DLC; + db_id = "PSN DLC"; + break; + case compat::package_type::other: + file_type = content_file_type::PSN_CONTENT; + db_id = "PSN CONTENT"; + break; + } + } + + // Initialize the validator (set also file size etc.) + m_game_validator->init_hash(path_list[i].toStdString()); + + if (m_game_validator->calculate_hash(hash) == content_hash_status::COMPLETED) + { + content_integrity_status integrity_status = m_game_validator->check_integrity(file_type, hash, &game_name); + + // If no match for ".rap" or ".edat" is found on default "PSN Content" DB, try on "PSN DLC" DB + if (integrity_status == content_integrity_status::NO_MATCH && use_fallback_db) + { + db_id += " -> PSN DLC"; + integrity_status = m_game_validator->check_integrity(content_file_type::PSN_DLC, hash, &game_name); + } + + switch (integrity_status) + { + case content_integrity_status::NO_MATCH: + text_result += tr("Game check NOT PASSED\n\nNo match found on '%0' DB or game corrupted:\n - File: %1\n - Hash: %2") + .arg(QString::fromStdString(db_id)) + .arg(QString::fromStdString(m_game_validator->get_name())) + .arg(QString::fromStdString(hash)); + + info_dialog = false; + break; + case content_integrity_status::FOUND_MATCH: + text_result += tr("Game check PASSED\n\nMatch found on '%0' DB:\n - File: %1\n - Hash: %2\n - Game: %3") + .arg(QString::fromStdString(db_id)) + .arg(QString::fromStdString(m_game_validator->get_name())) + .arg(QString::fromStdString(hash)) + .arg(QString::fromStdString(game_name)); + break; + default: + text_result += tr("Error parsing '%0' DB or DB not existing:\n - File: %1\n - Hash: %2") + .arg(QString::fromStdString(db_id)) + .arg(QString::fromStdString(m_game_validator->get_name())) + .arg(QString::fromStdString(hash)); + + info_dialog = false; + break; + } + + if (i < path_list.size() - 1) // If it's not the last processed entry, add empty lines as separator + { + text_result += "\n\n\n"; + } + } + + if (m_game_validator->get_status() == content_hash_status::ABORTED) + { + break; + } + } + + QString text_dialog; + + if (m_game_validator->get_status() == content_hash_status::ABORTED) + { + text_dialog = tr("Hash calculation failed!\n\nIntegrity check aborted"); + info_dialog = false; + } + else + { + text_dialog = tr("Integrity check completed!\n\n%0").arg(text_result); + } + + // Tell the progress bar thread to terminate + m_game_validator->set_count(0); + + Emu.CallFromMainThread([this, text_dialog, info_dialog]() + { + if (info_dialog) + { + sys_log.success("%s", text_dialog.toStdString()); + QMessageBox::information(m_game_list_frame, tr("Game Integrity"), text_dialog); + } + else + { + sys_log.error("%s", text_dialog.toStdString()); + QMessageBox::critical(m_game_list_frame, tr("Game Integrity"), text_dialog); } }, nullptr, false); }); - progress_dialog* pdlg = new progress_dialog(tr("ISO File Hash Calculation"), tr("Calculating hash"), tr("Cancel"), + progress_dialog* pdlg = new progress_dialog(tr("File Hash Calculation"), "", tr("Cancel"), 0, 100, false, m_game_list_frame); pdlg->setAutoClose(false); @@ -436,21 +537,22 @@ void game_list_actions::ShowGameIntegrityDialog(const game_info& game) connect(pdlg, &progress_dialog::canceled, m_game_list_frame, [this]() { - m_iso_validator->abort_hash(); + m_game_validator->abort_hash(); }); QTimer* update_timer = new QTimer(m_game_list_frame); connect(update_timer, &QTimer::timeout, m_game_list_frame, [this, pdlg, update_timer]() { - if (m_iso_validator->get_status() == iso_hash_status::INITIALIZED) + if (m_game_validator->get_count()) { // Set progress in range 0-100 - const int progress = m_iso_validator->get_size() ? - (static_cast(m_iso_validator->get_bytes_read()) / m_iso_validator->get_size()) * 100 : + const int progress = m_game_validator->get_size() ? + (static_cast(m_game_validator->get_bytes_read()) / m_game_validator->get_size()) * 100 : 0; pdlg->setValue(progress); + pdlg->setLabelText(tr("Calculating hash: %0").arg(m_game_validator->get_name())); } else { diff --git a/rpcs3/rpcs3qt/game_list_actions.h b/rpcs3/rpcs3qt/game_list_actions.h index 0b9fa8f8ac..bc54352836 100644 --- a/rpcs3/rpcs3qt/game_list_actions.h +++ b/rpcs3/rpcs3qt/game_list_actions.h @@ -2,7 +2,7 @@ #include "gui_game_info.h" #include "shortcut_utils.h" -#include "Loader/iso_validation.h" +#include "Loader/content_validation.h" #include #include @@ -55,7 +55,7 @@ public: void ShowRemoveGameDialog(const std::vector& games); void ShowGameInfoDialog(const std::vector& games); - void ShowGameIntegrityDialog(const game_info& game); + void ShowGameIntegrityDialog(content_file_type file_type, const std::string& game_path); void ShowDiskUsageDialog(); // NOTES: @@ -100,7 +100,7 @@ private: std::shared_ptr m_gui_settings; QFuture m_disk_usage_future; QFuture m_game_integrity_future; - std::shared_ptr m_iso_validator = std::make_shared(); + std::shared_ptr m_game_validator = std::make_shared(); // NOTE: // m_content_info is used by: diff --git a/rpcs3/rpcs3qt/game_list_context_menu.cpp b/rpcs3/rpcs3qt/game_list_context_menu.cpp index e17dc9cdca..5d461d11d2 100644 --- a/rpcs3/rpcs3qt/game_list_context_menu.cpp +++ b/rpcs3/rpcs3qt/game_list_context_menu.cpp @@ -17,7 +17,7 @@ #include "Utilities/File.h" #include "Emu/system_utils.hpp" #include "Loader/ISO.h" -#include "Loader/iso_validation.h" +#include "Loader/content_validation.h" #include "QApplication" #include "QClipboard" @@ -339,7 +339,7 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& manage_game_menu->addSeparator(); // Remove game - QAction* remove_game = manage_game_menu->addAction(tr("&Remove %1").arg(gameinfo->localized_category)); + QAction* remove_game = manage_game_menu->addAction(tr("&Remove %0").arg(gameinfo->localized_category)); remove_game->setEnabled(!is_current_running_game); // Custom Images menu @@ -602,31 +602,31 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& addSeparator(); - // Check integrity + // Check disc game integrity if (QString::fromStdString(current_game.category) == cat::cat_disc_game) { + const bool raw_archive = is_iso_file(current_game.path); const iso_type_status iso_type = iso_file_decryption::check_type(current_game.path); // If it's an ISO file (e.g. even a decrypted ISO), always provide the entry on the context menu but disable // it if the ISO does not support integrity check (e.g. non Redump ISO) or no integrity DB is found. // That is to highlight a Redump ISO from a non Redump ISO - if (iso_type != iso_type_status::NOT_ISO) + if (raw_archive || iso_type != iso_type_status::NOT_ISO) { - const iso_integrity_status iso_integrity = iso_file_validation::check_integrity(""); - - QAction* check_integrity = addAction(tr("&Check ISO Integrity")); + QAction* check_iso_integrity = addAction(tr("&Check ISO Integrity")); // If it's a Redump ISO and the integrity DB exists - if (iso_type == iso_type_status::REDUMP_ISO && iso_integrity != iso_integrity_status::ERROR_OPENING_DB) + if ((raw_archive || iso_type == iso_type_status::REDUMP_ISO) && + content_validation::check_integrity(content_file_type::ISO, "") != content_integrity_status::ERROR_OPENING_DB) { - connect(check_integrity, &QAction::triggered, this, [this, gameinfo]() + connect(check_iso_integrity, &QAction::triggered, this, [this, gameinfo]() { - m_game_list_actions->ShowGameIntegrityDialog(gameinfo); + m_game_list_actions->ShowGameIntegrityDialog(content_file_type::ISO, gameinfo->info.path); }); } else { - check_integrity->setEnabled(false); + check_iso_integrity->setEnabled(false); } } } diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 5750e4220d..5308412072 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -75,7 +75,10 @@ game_list_frame::game_list_frame(std::shared_ptr gui_settings, std m_game_list->installEventFilter(this); m_game_list->verticalScrollBar()->installEventFilter(this); - m_iso_integrity = new iso_integrity(this); + m_iso_integrity = new content_integrity(this, content_file_type::ISO); + m_psn_content_integrity = new content_integrity(this, content_file_type::PSN_CONTENT); + m_psn_dlc_integrity = new content_integrity(this, content_file_type::PSN_DLC); + m_psn_update_integrity = new content_integrity(this, content_file_type::PSN_UPDATE); m_game_compat = new game_compatibility(this); m_config_db = new config_database(this); diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h index 55569aa950..0659b350c8 100644 --- a/rpcs3/rpcs3qt/game_list_frame.h +++ b/rpcs3/rpcs3qt/game_list_frame.h @@ -3,7 +3,7 @@ #include "game_list.h" #include "game_list_actions.h" #include "custom_dock_widget.h" -#include "iso_integrity.h" +#include "content_integrity.h" #include "Utilities/lockless.h" #include "Utilities/mutex.h" @@ -56,7 +56,10 @@ public: void SetShowHidden(bool show); - iso_integrity* GetIsoIntegrity() const { return m_iso_integrity; } + content_integrity* GetIsoIntegrity() const { return m_iso_integrity; } + content_integrity* GetPsnContentIntegrity() const { return m_psn_content_integrity; } + content_integrity* GetPsnDlcIntegrity() const { return m_psn_dlc_integrity; } + content_integrity* GetPsnUpdateIntegrity() const { return m_psn_update_integrity; } game_compatibility* GetGameCompatibility() const { return ensure(m_game_compat); } config_database* GetConfigDatabase() const { return ensure(m_config_db); } const std::vector& GetGameInfo() const { return m_game_data; } @@ -156,7 +159,10 @@ private: // Game List game_list_table* m_game_list = nullptr; - iso_integrity* m_iso_integrity = nullptr; + content_integrity* m_iso_integrity = nullptr; + content_integrity* m_psn_content_integrity = nullptr; + content_integrity* m_psn_dlc_integrity = nullptr; + content_integrity* m_psn_update_integrity = nullptr; game_compatibility* m_game_compat = nullptr; config_database* m_config_db = nullptr; progress_dialog* m_progress_dialog = nullptr; diff --git a/rpcs3/rpcs3qt/iso_integrity.cpp b/rpcs3/rpcs3qt/iso_integrity.cpp deleted file mode 100644 index ee0f433653..0000000000 --- a/rpcs3/rpcs3qt/iso_integrity.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "iso_integrity.h" -#include "gui_settings.h" - -#include "Emu/system_utils.hpp" - -#include -#include - -LOG_CHANNEL(iso_log, "ISO"); - -iso_integrity::iso_integrity(QWidget* parent) - : QObject(parent) -{ - m_filepath = QString::fromStdString(rpcs3::utils::get_redump_db_path()); - m_downloader = new downloader(parent); - - connect(m_downloader, &downloader::signal_download_finished, this, &iso_integrity::handle_download_finished); - connect(m_downloader, &downloader::signal_download_canceled, this, &iso_integrity::handle_download_canceled); - connect(m_downloader, &downloader::signal_download_error, this, &iso_integrity::handle_download_error); -} - -void iso_integrity::download() -{ - const std::string url = rpcs3::utils::get_redump_db_download_url(); - - iso_log.notice("Starting database download from: %s", url); - - m_downloader->start(url, true, true, true, tr("Downloading database")); -} - -void iso_integrity::handle_download_finished(const QByteArray& content) -{ - iso_log.notice("Database download finished"); - - // Write database to file - if (QByteArray data = read_json(content, true); !data.isEmpty()) - { - QFile file(m_filepath); - - if (file.exists()) - { - iso_log.notice("Database file found: %s", m_filepath); - } - - if (!file.open(QIODevice::WriteOnly)) - { - iso_log.error("Failed to write database to file: %s", m_filepath); - return; - } - - file.write(data); - file.close(); - - iso_log.success("Database written to file: %s", m_filepath); - } -} - -void iso_integrity::handle_download_canceled() -{ - iso_log.notice("Database download canceled"); -} - -void iso_integrity::handle_download_error(const QString& error) -{ - iso_log.error("", error.toStdString().c_str()); -} - -QByteArray iso_integrity::read_json(const QByteArray& data, bool after_download) -{ - QJsonParseError error{}; - const QJsonDocument json_document = QJsonDocument::fromJson(data, &error); - - if (!json_document.isObject()) - { - iso_log.error("ISO Integrity database error - Invalid JSON: '%s'", error.errorString()); - return {}; - } - - const QJsonObject json_data = json_document.object(); - const int return_code = json_data["return_code"].toInt(-255); - - if (return_code < 0) - { - if (after_download) - { - std::string error_message; - - switch (return_code) - { - case -1: error_message = "Server Error - Internal Error"; break; - case -2: error_message = "Server Error - Maintenance Mode"; break; - case -255: error_message = "Server Error - Return code not found"; break; - default: error_message = "Server Error - Unknown Error"; break; - } - - iso_log.error("%s: return code %d", error_message, return_code); - } - else - { - iso_log.error("ISO Integrity database error - Invalid: return code %d", return_code); - } - - return {}; - } - - if (!json_data["redump"].isString()) - { - iso_log.error("ISO Integrity database error - Unusable Redump string"); - return {}; - } - - return QByteArray().fromStdString(json_data["redump"].toString().toStdString()); -}; diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 4f3bd4b467..b5505592b2 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -3544,6 +3544,9 @@ void main_window::CreateConnects() connect(ui->downloadIntegrityDbAct, &QAction::triggered, this, [this]() { ensure(m_game_list_frame->GetIsoIntegrity())->download(); + ensure(m_game_list_frame->GetPsnContentIntegrity())->download(); + ensure(m_game_list_frame->GetPsnDlcIntegrity())->download(); + ensure(m_game_list_frame->GetPsnUpdateIntegrity())->download(); }); connect(ui->downloadCompatDbAct, &QAction::triggered, this, [this]() @@ -3556,6 +3559,14 @@ void main_window::CreateConnects() m_game_list_frame->GetConfigDatabase()->request_config_database(true); }); + // Check integrity for the content categories based on .PKG, .RAP and .EDAT (e.g. HDD game, DLC, Update) + connect(ui->checkPackageIntegrityAct, &QAction::triggered, this, [this]() + { + // File type different than ISO as passed here (PSN_CONTENT) will be properly detected in + // ShowGameIntegrityDialog() based on the selected package file + m_game_list_frame->actions()->ShowGameIntegrityDialog(content_file_type::PSN_CONTENT, ""); + }); + connect(ui->welcomeAct, &QAction::triggered, this, [this]() { welcome_dialog* welcome = new welcome_dialog(m_gui_settings, true, this); diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index 12fc9d8a79..14f23f5a1a 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -323,6 +323,12 @@ + + + Packages/Raps/Edats + + + @@ -337,6 +343,7 @@ + @@ -874,6 +881,11 @@ Download Config Database + + + Check Integrity + + View Welcome Dialog From 9373461d094f0da415cadae0bb21ee9f442493c7 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 13 Jun 2026 14:58:49 +0200 Subject: [PATCH 17/64] patch_manager: tiny optimizations --- rpcs3/rpcs3qt/patch_manager_dialog.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/rpcs3/rpcs3qt/patch_manager_dialog.cpp b/rpcs3/rpcs3qt/patch_manager_dialog.cpp index de6db736e4..f86d4a9ebe 100644 --- a/rpcs3/rpcs3qt/patch_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/patch_manager_dialog.cpp @@ -458,15 +458,14 @@ void patch_manager_dialog::filter_patches(const QString& term) const node_level level = static_cast(item->data(0, node_level_role).toInt()); // Hide nodes that aren't in the game list - if (m_show_owned_games_only) + if (m_show_owned_games_only && level == node_level::serial_level) { - if (level == node_level::serial_level) + const std::string serial = item->data(0, serial_role).toString().toStdString(); + if (serial != patch_key::all) { - const std::string serial = item->data(0, serial_role).toString().toStdString(); const std::string app_version = item->data(0, app_version_role).toString().toStdString(); - if (serial != patch_key::all && - (!m_owned_games.contains(serial) || (app_version != patch_key::all && !::at32(m_owned_games, serial).contains(app_version)))) + if (!m_owned_games.contains(serial) || (app_version != patch_key::all && !::at32(m_owned_games, serial).contains(app_version))) { item->setHidden(true); return 0; @@ -745,15 +744,15 @@ void patch_manager_dialog::handle_item_changed(QTreeWidgetItem* item, int /*colu if (const auto node = item->parent(); node && enabled) { const node_level level = static_cast(item->data(0, node_level_role).toInt()); - const std::string patch_group = item->data(0, patch_group_role).toString().toStdString(); + const QString patch_group = item->data(0, patch_group_role).toString(); - if (!patch_group.empty() && level == node_level::patch_level) + if (!patch_group.isEmpty() && level == node_level::patch_level) { for (int i = 0; i < node->childCount(); i++) { if (const auto other = node->child(i); other && other != item) { - const std::string other_patch_group = other->data(0, patch_group_role).toString().toStdString(); + const QString other_patch_group = other->data(0, patch_group_role).toString(); if (other_patch_group == patch_group) { @@ -844,7 +843,8 @@ void patch_manager_dialog::handle_config_value_changed(double value) for (const QString& q_key : q_config_values.keys()) { - if (const std::string s_key = q_key.toStdString(); key == q_key && patch.default_config_values.contains(s_key)) + if (key != q_key) continue; + if (const std::string s_key = q_key.toStdString(); patch.default_config_values.contains(s_key)) { config_values[s_key].value = value; } From f1a1f5616c5a8188e7317ae9e535d73b95fc844e Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 05:58:21 +0200 Subject: [PATCH 18/64] Fix VS project --- rpcs3/emucore.vcxproj | 1 - rpcs3/emucore.vcxproj.filters | 6 ------ 2 files changed, 7 deletions(-) diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 9d79366ee2..770028936f 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -1067,7 +1067,6 @@ - diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 5869d5e42f..7280166c33 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1465,9 +1465,6 @@ Emu\Cell\Modules - - Loader - Emu\Io @@ -2950,9 +2947,6 @@ Emu\Cell\Modules - - Loader - From 4fed5e7b88d78c03359009377b740a3c826505a7 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 06:08:11 +0200 Subject: [PATCH 19/64] Fix iso integrity log message --- rpcs3/Loader/content_validation.cpp | 2 +- rpcs3/Loader/content_validation.h | 2 +- rpcs3/Loader/iso_cache.cpp | 4 ++-- rpcs3/Loader/iso_cache.h | 4 ++-- rpcs3/rpcs3qt/content_integrity.cpp | 2 +- rpcs3/rpcs3qt/game_list_actions.cpp | 2 +- rpcs3/rpcs3qt/game_list_actions.h | 2 +- rpcs3/util/logs.hpp | 4 ++-- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/rpcs3/Loader/content_validation.cpp b/rpcs3/Loader/content_validation.cpp index 818bab63ad..773ee276be 100644 --- a/rpcs3/Loader/content_validation.cpp +++ b/rpcs3/Loader/content_validation.cpp @@ -11,7 +11,7 @@ LOG_CHANNEL(sys_log, "VALIDATION"); -content_integrity_status content_validation::check_integrity(content_file_type file_type, const std::string& hash, std::string* game_name) +content_integrity_status content_validation::check_integrity(content_file_type file_type, std::string_view hash, std::string* game_name) { // // Check for Redump db diff --git a/rpcs3/Loader/content_validation.h b/rpcs3/Loader/content_validation.h index 4540ae6b3e..dc5d4ac5d9 100644 --- a/rpcs3/Loader/content_validation.h +++ b/rpcs3/Loader/content_validation.h @@ -40,7 +40,7 @@ private: content_hash_status m_status = content_hash_status::INITIALIZED; public: - static content_integrity_status check_integrity(content_file_type file_type, const std::string& hash, std::string* game_name = nullptr); + static content_integrity_status check_integrity(content_file_type file_type, std::string_view hash, std::string* game_name = nullptr); const std::string& get_path() const { return m_path; } const std::string& get_name() const { return m_name; } diff --git a/rpcs3/Loader/iso_cache.cpp b/rpcs3/Loader/iso_cache.cpp index a37927cf39..8360ebde7f 100644 --- a/rpcs3/Loader/iso_cache.cpp +++ b/rpcs3/Loader/iso_cache.cpp @@ -40,7 +40,7 @@ namespace namespace iso_cache { - bool load(const std::string& iso_path, const std::string& cache_key, iso_metadata_cache_entry& out_entry) + bool load(const std::string& iso_path, std::string_view cache_key, iso_metadata_cache_entry& out_entry) { fs::stat_t iso_stat{}; if (!fs::get_stat(iso_path, iso_stat) || iso_stat.is_directory) @@ -95,7 +95,7 @@ namespace iso_cache return true; } - void save(const std::string& iso_path, const std::string& cache_key, const iso_metadata_cache_entry& entry) + void save(std::string_view iso_path, std::string_view cache_key, const iso_metadata_cache_entry& entry) { const std::string stem = get_cache_stem(cache_key); const std::string dir = get_cache_dir(); diff --git a/rpcs3/Loader/iso_cache.h b/rpcs3/Loader/iso_cache.h index 88b080b1df..04f4c3a402 100644 --- a/rpcs3/Loader/iso_cache.h +++ b/rpcs3/Loader/iso_cache.h @@ -23,10 +23,10 @@ struct iso_metadata_cache_entry namespace iso_cache { // Returns false if no valid cache entry exists or mtime has changed. - bool load(const std::string& iso_path, const std::string& cache_key, iso_metadata_cache_entry& out_entry); + bool load(const std::string& iso_path, std::string_view cache_key, iso_metadata_cache_entry& out_entry); // Persists a populated cache entry to disk. - void save(const std::string& iso_path, const std::string& cache_key, const iso_metadata_cache_entry& entry); + void save(std::string_view iso_path, std::string_view cache_key, const iso_metadata_cache_entry& entry); bool load_index(const std::string& iso_path, std::vector& out_subdirs); void save_index(const std::string& iso_path, const std::vector& subdirs); diff --git a/rpcs3/rpcs3qt/content_integrity.cpp b/rpcs3/rpcs3qt/content_integrity.cpp index 16b68f316f..97aabc88c9 100644 --- a/rpcs3/rpcs3qt/content_integrity.cpp +++ b/rpcs3/rpcs3qt/content_integrity.cpp @@ -83,7 +83,7 @@ void content_integrity::handle_download_canceled() void content_integrity::handle_download_error(const QString& error) { - sys_log.error("", error.toStdString().c_str()); + sys_log.error("Database download failed: %s", error); } QByteArray content_integrity::read_json(const QByteArray& data, bool after_download) diff --git a/rpcs3/rpcs3qt/game_list_actions.cpp b/rpcs3/rpcs3qt/game_list_actions.cpp index a8db41f42c..97cb37e7ce 100644 --- a/rpcs3/rpcs3qt/game_list_actions.cpp +++ b/rpcs3/rpcs3qt/game_list_actions.cpp @@ -605,7 +605,7 @@ void game_list_actions::ShowDiskUsageDialog() }); } -bool game_list_actions::IsGameRunning(const std::string& serial) +bool game_list_actions::IsGameRunning(std::string_view serial) { return !Emu.IsStopped(true) && (serial == Emu.GetTitleID() || (serial == "vsh.self" && Emu.IsVsh())); } diff --git a/rpcs3/rpcs3qt/game_list_actions.h b/rpcs3/rpcs3qt/game_list_actions.h index bc54352836..ff0b4a0be7 100644 --- a/rpcs3/rpcs3qt/game_list_actions.h +++ b/rpcs3/rpcs3qt/game_list_actions.h @@ -49,7 +49,7 @@ public: std::set removed_disc_list; // Filled in by RemoveContentList() }; - static bool IsGameRunning(const std::string& serial); + static bool IsGameRunning(std::string_view serial); void CreateShortcuts(const std::vector& games, const std::set& locations); diff --git a/rpcs3/util/logs.hpp b/rpcs3/util/logs.hpp index a2fcc863b2..459e35f167 100644 --- a/rpcs3/util/logs.hpp +++ b/rpcs3/util/logs.hpp @@ -175,10 +175,10 @@ namespace logs void silence(); // Log level control: register channel if necessary, set channel level - void set_level(const std::string&, level); + void set_level(const std::string& ch_name, level value); // Log level control: get channel level - level get_level(const std::string&); + level get_level(const std::string& ch_name); // Log level control: set specific channels to level::fatal void set_channel_levels(const std::map>& map); From 4f321eb31958df9604fe302aa5509327108b200e Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 08:24:56 +0200 Subject: [PATCH 20/64] Do not throw on hex_to_bytes error in iso get_key Just treat it as a regular key processing error --- rpcs3/Crypto/utils.cpp | 23 ++++++++++++++++------- rpcs3/Crypto/utils.h | 4 ++-- rpcs3/Loader/ISO.cpp | 21 ++++++++++++++------- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/rpcs3/Crypto/utils.cpp b/rpcs3/Crypto/utils.cpp index 7c1d1df309..514bf08580 100644 --- a/rpcs3/Crypto/utils.cpp +++ b/rpcs3/Crypto/utils.cpp @@ -24,13 +24,13 @@ // Auxiliary functions (endian swap, xor). // Bytes conversion auxiliary function. -void bytes_to_hex(std::string& hex_str, const unsigned char* data, unsigned int data_length) +void bytes_to_hex(std::string& hex_str, const unsigned char* data, usz data_length) { - size_t str_length = data_length * 2; + const usz str_length = data_length * 2; hex_str.resize(str_length); - for (size_t i = 0; i < str_length; i += 2) + for (usz i = 0; i < str_length; i += 2) { const auto [ptr, err] = std::to_chars(hex_str.data() + i, hex_str.data() + i + 2, *data++, 16); if (err != std::errc()) @@ -49,19 +49,28 @@ void bytes_to_hex(std::string& hex_str, const unsigned char* data, unsigned int } // Hex string conversion auxiliary function. -void hex_to_bytes(unsigned char* data, std::string_view hex_str, unsigned int str_length) +void hex_to_bytes(unsigned char* data, std::string_view hex_str, usz str_length, std::string* error) { - const auto strn_length = (str_length > 0) ? str_length : hex_str.size(); + const usz strn_length = (str_length > 0) ? str_length : hex_str.size(); // Don't convert if the string length is odd. if ((strn_length % 2) == 0) { - for (size_t i = 0; i < strn_length; i += 2) + for (usz i = 0; i < strn_length; i += 2) { const auto [ptr, err] = std::from_chars(hex_str.data() + i, hex_str.data() + i + 2, *data++, 16); if (err != std::errc()) { - fmt::throw_exception("Failed to read hex string: %s", std::make_error_code(err).message()); + std::string msg = fmt::format("Failed to read hex string: %s (hex='%s')", std::make_error_code(err).message(), hex_str); + + if (error) + { + *error = std::move(msg); + } + else + { + fmt::throw_exception("%s", msg); + } } } } diff --git a/rpcs3/Crypto/utils.h b/rpcs3/Crypto/utils.h index 6e8dab9734..88f0d8ce6f 100644 --- a/rpcs3/Crypto/utils.h +++ b/rpcs3/Crypto/utils.h @@ -16,10 +16,10 @@ char* extract_file_name(const char* file_path, char real_file_name[CRYPTO_MAX_PA std::string sha256_get_hash(const char* data, usz size, bool lower_case); // Bytes conversion auxiliary function. -void bytes_to_hex(std::string& hex_str, const unsigned char* data, unsigned int data_length); +void bytes_to_hex(std::string& hex_str, const unsigned char* data, usz data_length); // Hex string conversion auxiliary function. -void hex_to_bytes(unsigned char* data, std::string_view hex_str, unsigned int str_length); +void hex_to_bytes(unsigned char* data, std::string_view hex_str, usz str_length, std::string* error = nullptr); // Crypto functions (AES128-CBC, AES128-ECB, SHA1-HMAC and AES-CMAC). void aescbc128_decrypt(unsigned char *key, unsigned char *iv, unsigned char *in, unsigned char *out, usz len); diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index 96d196d670..4bd2050638 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -213,25 +213,32 @@ iso_type_status iso_file_decryption::get_key(const std::string& key_path, aes_co return iso_type_status::ERROR_OPENING_KEY; } - char key_str[32]; + std::array key_str {}; std::array key {}; - const u64 key_len = key_file.read(key_str, sizeof(key_str)); + const u64 key_len = key_file.read(key_str.data(), key_str.size()); - if (key_len == sizeof(key_str) || key_len == sizeof(key)) + if (key_len == key_str.size() || key_len == key.size()) { // If the key read from the key file is 16 bytes long instead of 32, consider the file as // binary (".key") and so not needing any further conversion from hex string to bytes - if (key_len == sizeof(key)) + if (key_len == key.size()) { - std::memcpy(key.data(), key_str, sizeof(key)); + std::memcpy(key.data(), key_str.data(), key.size()); } else { - hex_to_bytes(key.data(), std::string_view(key_str, key_len), static_cast(key_len)); + std::string error; + hex_to_bytes(key.data(), std::string_view(key_str.data(), key_str.size()), key_str.size(), &error); + + if (!error.empty()) + { + iso_log.error("get_key(%s): %s", key_path, error); + return iso_type_status::ERROR_PROCESSING_KEY; + } } - aes_context aes_dec; + aes_context aes_dec {}; // If "aes_ctx" not requested if (!aes_ctx) From 0fda2dd60f2293750cc9cae210c4fdf703f2e716 Mon Sep 17 00:00:00 2001 From: Jakub Marcowski Date: Wed, 3 Jun 2026 11:36:58 +0200 Subject: [PATCH 21/64] Optimise PNGs across the repo --- bin/GuiConfigs/check_mark_white.png | Bin 5429 -> 999 bytes bin/GuiConfigs/list_arrow_blue.png | Bin 3281 -> 484 bytes bin/GuiConfigs/list_arrow_down_blue.png | Bin 3063 -> 504 bytes bin/GuiConfigs/list_arrow_down_green.png | Bin 3326 -> 503 bytes bin/GuiConfigs/list_arrow_down_white.png | Bin 2749 -> 399 bytes bin/GuiConfigs/list_arrow_green.png | Bin 3342 -> 477 bytes bin/GuiConfigs/list_arrow_white.png | Bin 2967 -> 380 bytes bin/Icons/ui/L1.png | Bin 2829 -> 1376 bytes bin/Icons/ui/L2.png | Bin 2224 -> 1181 bytes bin/Icons/ui/R1.png | Bin 2704 -> 1450 bytes bin/Icons/ui/R2.png | Bin 2569 -> 1281 bytes bin/Icons/ui/circle.png | Bin 4307 -> 1815 bytes bin/Icons/ui/cross.png | Bin 3560 -> 1674 bytes bin/Icons/ui/dpad.png | Bin 3474 -> 1579 bytes bin/Icons/ui/dpad_down.png | Bin 3618 -> 1669 bytes bin/Icons/ui/dpad_left.png | Bin 3641 -> 1652 bytes bin/Icons/ui/dpad_right.png | Bin 3706 -> 1632 bytes bin/Icons/ui/dpad_up.png | Bin 3655 -> 1696 bytes bin/Icons/ui/fade_bottom.png | Bin 43214 -> 31267 bytes bin/Icons/ui/fade_top.png | Bin 43606 -> 31322 bytes bin/Icons/ui/home/256/bug-solid.png | Bin 5035 -> 3110 bytes bin/Icons/ui/home/256/circle-left-solid.png | Bin 8599 -> 4650 bytes bin/Icons/ui/home/256/display-solid.png | Bin 2151 -> 1423 bytes bin/Icons/ui/home/256/floppy-disk-solid.png | Bin 3989 -> 2623 bytes bin/Icons/ui/home/256/gamepad-solid.png | Bin 4391 -> 2522 bytes bin/Icons/ui/home/256/gauge-solid.png | Bin 5601 -> 3323 bytes bin/Icons/ui/home/256/headphones-solid.png | Bin 4024 -> 2774 bytes bin/Icons/ui/home/256/home.png | Bin 2700 -> 2122 bytes bin/Icons/ui/home/256/maximize-solid.png | Bin 5722 -> 3427 bytes .../ui/home/256/play-button-arrowhead.png | Bin 3665 -> 2625 bytes bin/Icons/ui/home/256/power-off-solid.png | Bin 8210 -> 5039 bytes bin/Icons/ui/home/256/rotate-left-solid.png | Bin 8216 -> 5168 bytes bin/Icons/ui/home/256/screenshot.png | Bin 3609 -> 2320 bytes bin/Icons/ui/home/256/settings.png | Bin 6000 -> 3551 bytes bin/Icons/ui/home/256/sliders-solid.png | Bin 3845 -> 1614 bytes bin/Icons/ui/home/256/trophy-solid.png | Bin 7133 -> 5082 bytes bin/Icons/ui/home/256/user-group-solid.png | Bin 7090 -> 4556 bytes bin/Icons/ui/home/256/video-camera.png | Bin 2215 -> 1599 bytes bin/Icons/ui/home/32/bug-solid.png | Bin 618 -> 402 bytes bin/Icons/ui/home/32/circle-left-solid.png | Bin 497 -> 299 bytes bin/Icons/ui/home/32/display-solid.png | Bin 360 -> 237 bytes bin/Icons/ui/home/32/floppy-disk-solid.png | Bin 561 -> 334 bytes bin/Icons/ui/home/32/gamepad-solid.png | Bin 472 -> 290 bytes bin/Icons/ui/home/32/gauge-solid.png | Bin 473 -> 345 bytes bin/Icons/ui/home/32/headphones-solid.png | Bin 489 -> 337 bytes bin/Icons/ui/home/32/home.png | Bin 384 -> 253 bytes bin/Icons/ui/home/32/maximize-solid.png | Bin 721 -> 435 bytes .../ui/home/32/play-button-arrowhead.png | Bin 509 -> 270 bytes bin/Icons/ui/home/32/power-off-solid.png | Bin 702 -> 497 bytes bin/Icons/ui/home/32/rotate-left-solid.png | Bin 672 -> 446 bytes bin/Icons/ui/home/32/screenshot.png | Bin 447 -> 276 bytes bin/Icons/ui/home/32/settings.png | Bin 587 -> 365 bytes bin/Icons/ui/home/32/sliders-solid.png | Bin 332 -> 228 bytes bin/Icons/ui/home/32/trophy-solid.png | Bin 668 -> 423 bytes bin/Icons/ui/home/32/user-group-solid.png | Bin 659 -> 440 bytes bin/Icons/ui/home/32/video-camera.png | Bin 354 -> 201 bytes bin/Icons/ui/left_stick.png | Bin 3888 -> 1752 bytes bin/Icons/ui/loading.png | Bin 366947 -> 20594 bytes bin/Icons/ui/new.png | Bin 19960 -> 6345 bytes bin/Icons/ui/right_stick.png | Bin 4178 -> 1990 bytes bin/Icons/ui/save.png | Bin 26456 -> 7626 bytes bin/Icons/ui/select.png | Bin 1813 -> 873 bytes bin/Icons/ui/spinner-24.png | Bin 34763 -> 4606 bytes bin/Icons/ui/square.png | Bin 3385 -> 1560 bytes bin/Icons/ui/start.png | Bin 2606 -> 1357 bytes bin/Icons/ui/triangle.png | Bin 3784 -> 1737 bytes rpcs3/Icons/combo_config_bordered.png | Bin 30346 -> 10158 bytes rpcs3/Icons/configure.png | Bin 9102 -> 5788 bytes rpcs3/Icons/controllers.png | Bin 24754 -> 8058 bytes rpcs3/Icons/custom_config.png | Bin 17016 -> 5046 bytes rpcs3/Icons/exit_fullscreen.png | Bin 4303 -> 1452 bytes rpcs3/Icons/fullscreen.png | Bin 3961 -> 1143 bytes rpcs3/Icons/grid.png | Bin 9395 -> 4807 bytes rpcs3/Icons/list.png | Bin 4445 -> 2683 bytes rpcs3/Icons/open.png | Bin 11299 -> 6160 bytes rpcs3/Icons/pause.png | Bin 7524 -> 2972 bytes rpcs3/Icons/play.png | Bin 8029 -> 5049 bytes rpcs3/Icons/refresh.png | Bin 13725 -> 8218 bytes rpcs3/Icons/restart.png | Bin 11633 -> 6009 bytes rpcs3/Icons/rpcn.png | Bin 15262 -> 6614 bytes rpcs3/Icons/stop.png | Bin 4405 -> 2102 bytes rpcs3/rpcs3.png | Bin 1596 -> 1187 bytes 82 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/GuiConfigs/check_mark_white.png b/bin/GuiConfigs/check_mark_white.png index f9b94ccb8791bb478c9be7f6af7ea177dcdf3438..dd1b888dd6ab64cdf34b6aac8db54266dc2bdd6f 100644 GIT binary patch delta 988 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 Ef?yrw;Q#;t delta 3039 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 OB<|_z=d#Wzp$Pzh{@I2A delta 3304 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 LNkvXXu0mjfC|#ru delta 2732 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 xF8^k?Nhq@y%l@zh0)apv5C{YUfj}VeU|= diff --git a/bin/Icons/ui/R1.png b/bin/Icons/ui/R1.png index 722e405c60db46cad3d4c00ea98c6b2df98900a6..0bd24e92bcb32d9684efd4e6a59866fad98c9325 100644 GIT binary patch delta 1443 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 i6pVsVFbYP&C;$MpS|8*@uqj~x0000 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 diff --git a/bin/Icons/ui/circle.png b/bin/Icons/ui/circle.png index 6ed88bb0a6c56106b9417aee086b6fea70677412..efe90784815ffe943f34e451046c0b39f2178ab2 100644 GIT binary patch delta 1811 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 diff --git a/bin/Icons/ui/cross.png b/bin/Icons/ui/cross.png index f74e38379c48fd6edf1d179dcae4d5d22113b65c..2a4a9855d59fe0c429375313c0de1ae7e19d004e 100644 GIT binary patch delta 1668 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 XawD;JM0QB^00000NkvXXu0mjflxVP7 diff --git a/bin/Icons/ui/dpad.png b/bin/Icons/ui/dpad.png index 5a31103da50012faf6417cecc272959621ef1279..4752c94477717e53ce5fe001d1f99d4bc1510505 100644 GIT binary patch delta 1573 zcmV+=2HN?O8>;E zQBqP;G&D3-RaHz(Oh74!AMY=(Z;z*pSzZ7D1rtd`K~#9!?U@IA z>N*UDTQ+p>W`A^-aTcTrBoX5O|E?=x#8ojQJm5P|-)EeW#4lJLU(A7PzBq0k%{Fk< zJa**J3R`pR-r?RNj=$VepAm2GxR&=fzIw8^#CF&gClYpyrWPZgEKVfcT~CM+tRX{u zrOWlbB@H9_fOQ}~(dC9K3H)7>t6bw!(xg`Uh}>qHDSuJ`2oQhL<>ua!Ln8?`Ncwd7 z@Jq6!LalU-iq9ut#iEJppfXH=8h*-80SIck+dOF?$kvUp~i4)%B z5qG29R)1>C=jpLFmI+re5s4dFkFEh)B|9`n4oq3~$3055TO_k4OiA55BE=Xl# z1IMKfqS^XXmLV|7@KZrr%`MXS$vp2qJw5e_E-_QIk9AoDDTt}(OwlF!1T`mVd~>Fz zo1R}xm+7(yQV{8?muGsQAdO3=wt4TGE?bsm&|ffE7Q}Q_cm4A#5=4vwCYut&5#b|; z5r3xLF=f%1f^^LP_7Tw^5yL5w1q{^Trps!kEE+CI&2$y_Q}H z1cn&<$KFuNB@wLR`I04gV{B2Ans$q~MoAIA2dhN3L~hFi zBAgNOQV}CtMvJM?qDl?+jU(lNo6&+V>Y{~b6*wvCK+r=ea ziJ+~5;PqWe+G2U66!?QbCq>N{ow-dxUQ|QxFQzOyZNJcC{9S)gGmqks_m|qtMn_>O z2=#m%K%RpaQ?;ZlIt*K=m%U0^sIM&g-A`an;xFn|DU0=VLy4u$x9EZduzw)XWg%*f zQU_V;^F|wu#u-iL8oiUXn_2#Q{ zIz}&}#u78%uUF%KhS+m(2q}^G>*uB|IV+a@;CSh35e8zCE3SBj{4f42oBXAcw*2U@ zh728TC~`nKoLWSZshvo^<3_$ak<<$;lBpf6U8U4qWV;e7ZW82Q?;emeZX=o6EnoZr XuY&Feo+4Yu00000NkvXXu0mjfwbZrS literal 3474 zcmV;D4Q=v?P)v8N$gukYa28o5?>)KSTc&mB8tW0O0M1O^BF`l*q=Aq?WV6|%rw}{RV6q~^FbtlVnF~cx)-ap(APs~Nx?!3oGMNkj zU@#bXZsuq-f@zuyU0jyEU$NWmy014Tiw_d?2D49CIW~lBFc%v_Qie1TLg+@Aj}U~_ zrrtItiw_d?hG7_^m;w_^@flIv2LfHMx>gMKOzz*L=Xf*w-?=KJO`}F zV&{?s5+|hDY~Dou+htPnY#>0JL6(q3=CUp%PDmJN2MmB$znBX)5MTp^v?0}muvjMS zU3I9uZlr|}LN~_aF@S0AiiRx9$mjEsFPhKieJjK+VS!lIdo^aT?;XMB!2m(r_k|!cFO%ttF%QaJj!GLG7&e)D5uz1+A z2I#teQ>|930RH6kS(XJ!k|0SEOw+`0IK+z=FWk?Fq6k3{Tz})BP$*z)Ys=F|2yr8} z(P+e59cP4)zpwO5Es0bR0sy+M|GQeP9s#I1eNM4T6h#b&LjXXjRB}Hf%Q9@+c2`d> zm-G3J`}=$R_Sg0Nc)X`zt5I{bwLo8)?#Uz_S&{>mFiOA z)tT|yL=c3NAcZ71NMEtMlYk*m5QNhp(o|Lb8o&kJm(6C~U%n(sI5;?%D}WddhxqW} zgU4?;tBk@CA>=LZ^Rt_Mitrn}ECOY#K0;#B+UfvK2q8c4-c(ifZval{KH4|r^Lc#n z#TTIiTwPtczG5^Q@l4ejA>_M&@xQ^;$*=Vu@JR6xl7R5}TolEVj~_q!IfV>TN*uN?uGf*>5Tzm%EDaQ%rh7ssDOMW@qYLtI@DghSS3 zQa{uYr^LFlX-~hH-b!*AP7(t z#k1duk|hX2fa)HE5O;u3LMoNY%2nu-$prm=KWHVL6GFaa=H&Ay*=%-h($KbT9vMEr zp{nXXz%fy>ETd2;tmXT&0`JI#&>OLxogGvv72g1((a4ts9@<#HY~&6;fh*xK6iZ9sW_0Pyhe;QBNGczk^HyiXGnNi|TZ zRGzIuH%$|FcX#e4&B?@a_6CQxZC|RYdhD1Mc7L)2Jo^n*Rllb8SS|!XK%r3Zn5CVa z9n@;Ir34lZN~ID;qmi$^!$YL?xJb%72(m0=Z*LFvdfknbGMNm@h(JI_V%7dhJ&bQTw>SuzI^!-`FtL&Rtttm zXB8-lg8lt{v|26K!6}LYS(bTG*r9FPmzt&>Hk-}20JuBrFz`ZX;Qvt+ZTBmc3hMPb zx3I<5P}syK-IvW~k;~;4o$7LgOePaIO5#OJY&O-|)X_xAvW!NffnR?41$TFM0H#h+ zk|gx|ecpl0V*uYTGhf@beGej#BngE=!Sh3@)oOV4>Xq;F2!RBCIEQ#>J|3)_uU)A+VT~_Lk8=+BuT>l{yvwC!C-(+r?b?#lw}ZWfyyupbUGd1 z(l3=tI5;@)g_`REeeHZckAs5)PX-y7T7gcd6MJPb_KM+nJVvL}@tL}8HVaMD;+_ub z^|~)}Y?>xIoetMWtQ(1xa4pM1r_=Fm43juh$VO66Pfxu3S8PbErtTD<(gw~(HC7}p za!6X?&e{7UibM&?X0vN`-cjce){YyA5aQ&F*mOdi%6A9s3Mm$gC=?2bNl;@a#7UL# zcCpSQFX99(f^d+_2Wa}4q=+6o6oW= z3)k1z*xlX5XPuM5MWwm45_ytH=E6$XIa}f zh^~zyq9|T`{P^)^mbyO&mDh3UC49$*+oA~lgnK4ev!H(l3peSPgY zqtWelgUC1|gnZR(Hg6h@Muk^$jfkpk+vkl&qta|PZ)SCMpVECe9HQIpx`|K2FmQc+ z4PDpSKV1q@?_s1B^6>D0VzG#+K-~+Tw4bLx>h*e_n(}x&4oXw#0FG&?&P=@a9FfD} z>>A$!03qZ%RaM`CF=0+p(W$FjmW5`siLI?IY;SLSF31x;NRq@|QSEly)e_7@WYx(k zv7qAQ8%%GUi%cdncZY9T7B5?SOl!XuQJ$<4VXBi*LbkTHP$(2uHj#OnELK*^^Bb}( z`)U_K=ytp8SU%}yn0#~{+N^%R?~_P{5#rN7v80%$=`k~wWi8a^fU8=Z-Kck9^u3Gh zpq(NUtLqg-@eQjdjv}xY1i`a1qqONrjYkF;y%_65PQgewd7`%!f~)HV_pJf4?p#Gnp-^D;P#%BcfDrP7rfHX9`d;4NV+BR5Q@Y_X#JaA3 zs8*{4@jOuYTolE>@Xm?Meyyi;UoMw(GqKJY5y!@7G8wl9pUdS?tya-)w_)41`-^36 zqPQE+OeO=1ndlpu`+Iw%&4Zuq;1KS>IyAVkx&*O*3k zT)!bn5;RTolve{x5XR%N=lqD{Pjp>}ZQEh~Y5In?oB62BGo4X_`LSYPDK* zAMWq0ny@(}g|rajQ>6n_Q&p?gJbxJQXbc|=!|-irYqgr|M>xCvr2pj-fb|ByS;)JmH zy*)*A)kqy7e{`gQkihtV6;6E-9}+f~xR3@y0)5CToO)Q4#qn1gAHrheLpDei(m+UJ zb~}weBn|(^Fwlpv`m1aUcdgDX*2=pP&;h9xsXf4a~sL<0`6G;Oh9vFtcnbB(5hQ$G`@nOMh81#xcm>{JI89#3JyX z2d?lr38aD$z(dL*;tM|sLjFs`1{-X!!3LrDA5Y!~4ayfo;Q#;t07*qoM6N<$f+QKF A7XSbN diff --git a/bin/Icons/ui/dpad_down.png b/bin/Icons/ui/dpad_down.png index dddcc0d479f410730f8b7c96cbf69278eb997c54..ac3ed664c32948acdc6fa6b8ec19892fb1aa128c 100644 GIT binary patch delta 1663 zcmV-_27vjZ9EA;#8Gi%-007$SUEcrz224prK~#9!?U^x58%Y#~uW#H}UI&vHVPc)+ z%974X)Xgpd&O3CZD(ki6q&$G@KE zJe%<@*kftuuW%+a@3Y^(^XBbu$w-FPBU5miPS>Fk)peSgf`3&Q5g-7=QS8UC9|aiG zj^dp3!X~;(tT?J8JW@4bV!MQ;M`p2a0y7sBs6rj)q*l9l6m840ClIKg=mOQ=n3)I~;$6 z2!Ik318TlV>7BAP(8pTRxI?B;Gj{u1ZAIsW<|rpLOIe|eHr23{>J(L4cVr5>RLaQR zXJs^VGCJ1&K8e_hUJwh-OE9FE#wn^)cOaz@_lyJ3?ifnEU>z1Wl?9C(c~aAwUw8fdZ# z6;WVf*Rg=$+Pcq*!IILFHg9{E*i&jB*MH-2fIu5mXDCrYwwdE_H69xX+=6>wWDwjX z;f%3@Ku-qZK@$S;V}k730rKw2evx;R1K|#-$NNR#k_mvU2hS`iH!_GjaEn|YH%N{4 z+4iWp3_;WytIkf6+BiYfa~&AQAV4ua+v9`OAQX>m(^a+73Vr{CqLKbzZLP9ZQGYD5 z-D800g}#Vd`{H`_ChhueV~G6a6s}ZC{kuf62h#LmGFByR-i|w*Ye^siiyRnPmHgyP)=(*@_?Pcua zVQ+SiH*Y?eNZ&(o{eHNIbfoBzfPdoa`Y7fK1$h~%tA)lXbH_(I8={ZgDQK2P>1@5! zfV5SVyi`sqE2VE`b9Yqf%TSOnROL?5x396E+#m4(1G%7ieKwNN`BmL&NWHGj|+`kk9FX_;{dm@%a&RO6-0-R)~($!GCw5aYv8T z(bGBwdC`f90hA64RKDVpjWs`b38wU{wC=c}VdF;c6t#@02>Eh%`AU$**9J!Xp?Alh z2>miH|pFxI>!!P6qvxz5(PL{iI;r(YeMc z6CFq^xZ{@k<8KKe1U#Z!)qg1`c7U{ka6XIht`P1$^%ULX->$^m&wY@VRUoH0J797y z#q@u0%XjPmAtCV{e^pHmsiyxb=DSkXf;?zJ9;O52Qb{a*a$VUCa;+L&YxwH{kT>ax zV=Pv1hKvq^vt+T7fP{_&q(s&yz9UBSA^ME8E zO{+@AGZY~ATA^$lyeYOU12G>7$ap|{#uzt)ARU`ZMtMWLHqa&JyHeJGe4?`m`eYGE z8z?a_-1g*aEzhO+TJ$Vw&&8B)U8ix1F@VyE1knM8og*2^_!khCFD3ek)tvwU002ov JPDHLkV1gKu8SnrA literal 3618 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 diff --git a/bin/Icons/ui/dpad_left.png b/bin/Icons/ui/dpad_left.png index 78beb6350ce0550f0d28dfd1c59ab6b6d6db1e64..4582cc1eea6e30f559949b1636cac45390092af7 100644 GIT binary patch delta 1646 zcmV-!29f!>9P|v38Gi%-007$SUEcrz20KYaK~#9!?VB-Z8%Y#~uW!^>S;?}aoRx@x z;6PxsIt78iu#OZZifwCyA$8j81lPJybG^zdjoWM7TpLs#ZcYS48e<74NqA}03xtoe7|do%l8JmO*WNan1rHLz$(4S%d|GG`P9Afjl%DCT3B zkHQ%D9>wZ=;jB=Oo=%}0tuV^r@fV4!Ama!mOMe+mf zLruvcP{FKfM9+V*lZcz*3ofh7%6$QHh^k!$m-qkbZ-1z!VLYcd-nWH9cf~M}BEq4E zD!hX4gBET17+Zl)3u@j&vOGCUhX6{)3u#@2Xd~p{V|d&D%vN*O8KYwa1W=Z`H=mLiBj^L6?PtnoOO$0%Z=XBxgoX((A`T%(_2ig+* z@c}#K4)y${h`H#)KpT)vRcMnMz8uWD6XcZc9%n!~(w11sVW&u9cUVqvNo5gUB}5~< z5`PZljKYjhbb=+eOE#;+P7&qkOOOwV^5jfLfU5HZA-beL@xA;!vcwchTToG7Qv6sb zAa9;K$TeMl)!%dlUDHtM#zz^_DNyvM7~CSJGul%M7|L0 z5HuX)mfwR*Y+?h{dgm`GY@A3kp*`A?I)5;81c9!I#|51L=3O`tbc>=HOXLNB zKwsz|ALR;eIhYD0184A4>J7@{MS(zn(G8}rdQ=EfP%o7j ztr63HjaUl-QVs`lLZ68TTmBQBL4O~lik%0O9&F~**+lpLEPi95fVJF<8RHE18#|7z&PXLYB@-QUTQkALlKcjjKa ztFQI^$iC3R=}1O%O7wm_|Ag64`rcDYaz_IItcK(iZh`k_#sEs61I5Wy*KRAhw?}Y# z&q{I!ryROAWv7g$F-0XWKj`8li$QygG4qh!F?z1M&6}Cv6a$9l4&kI-J7pJ~V!(|p zcE{-5hvyUSJ)}pv^M+huW`B3ogxe@}|MS|YQ@SQyszEwlnNT1#M@~4_4ZDldW1I8d zv8zKsyV{=eSlgWqdKHE*p1DFtWQ*K|UObDh0#+t1ENw?An+B3f%yM1Udv2u?##}pF ziEm=ZAae$Bf*>`%Hz(+&)VjTx=@ z71xD;wC*uTF9@_Q2LP|`oJ)C#3LU60(#UiPCOCRGXMYp07*qoM6N<$f_tL^+5i9m literal 3641 zcmV-94#x3`P)f&q8h%EktS{P9oH}q|SD}nF=`HRpN2TWi%^m{mE$%;X&bf4fUfX(4^=+M=y69mY zpgk;5*zPY__fjOOYfoGo&bqOySTZG9{Mds;?#ytgFH0hW>H!RRh7w8f(Y)_F@B7RM z7-Nhv#&~N$!oC3(g+k$u<2cIz?gPjT`En%y>x7V%y}iAkhJ3BA5g9^SWNcyhM2IL6 zLW)r#B@%>$NQR5ZkP|7|ti|4LaKxHW>gAi^ZU68Wcql58WTyMY}}kBSeHqhNfxIG;JW~ zu2d?hR;#cq%OmB@n>PbF_n;63LMWI~;yx?@n3>? zQ7~CF=)la(%)l>p_3Bmcf7`aZzL!xU3WNkAkw}Dn3nNDqOjg&ZR;w~I(-G-(dI)zj z97KT-$~H{XL_8h`02qeBJ%@5#xDXR@L=2LYl(NQrH*cK+3?S1=5NdvQQL z+=E-5WnmZw4i68d*N76LLdXi+uq?|X!Llsu@9%Tru=~Je{(%sJ$;nABA~Q`B`}_Nz znKBGRX0leqjxf-B*fIo^N~M>%TrLOTuG?o>78FH+q9`y;6ZLu>SFT*~-V=+(KnU^t zjf+esgNca=u8&gcMQj%r7qZc@LMi?GKtEKUhy)=3P%4%Foy+C!1DJLD++tNM7DK&W z2LMb?PI~WARTYloc%vtoO#1xB@$oT!|NVCWO_I;g&&5k`Q%XbCVzCI!*4?{z&lNuF z!l7+2HlGl}wG~C#{^5ro`qI`ALhd_`vyGN;&T$-^pPyrDY6?KppJ`Es^Ye4D1Y9D7^sU8OSXju~w!O%7$?6ifOWPnkw|#od__@k`}XaQ0*HFOj_1#xbAH1eWeo09N}tN!UnmrAIF7Rf zpvZK~9&kShl&$&*888`vHw0jLYisL??4YjeUjkTW`&i$QN~Q4r`|r2Cz_Vx1JYR8f zaUnBRE0oel0oQ+srjsA)Gmw$O5i%k&Sgfh4x-2tsx~~5R%(u~vp4@PEdU_f+Zrt#l z&@@dP9vG7VJbwZ-&6VpMQU6YuBzJ znN0dFP^;B^c_CS!nEv?gyYKM*_utFzc{>)1-QU>Q@Jx#6Px=JsH(DlfU3T7NGU-cV zim4byQGBnF^#RSG!WDP}z#o77!5wD_>1zCGnuh7=Y3Z?EM$qfmukrfzYXHDUAAN*d zw{Br|byYNBi?(fV-@A8jX>)V)Dd3-<^Z{((uN_St8$B?mdjan_5);+KF|$y>U_rI%bM z-ZFvGRa;Y2Qyv+Lq9C8oV}5>qAfoSXi)$m-_GYtLBoYZ69UY-wuOppK?WfkG;kLO!1lMWo#qA*N}1`6D;U$AS>T z^$|ii=a@_;kh-!WRSq=$N%I?{PNz{Q6gcNO=(U9`*in&6rEvT9Z7zchG)Ml~+1bb| zizBZXT9zf9r^Ms&p^^}Ud_M1sqD<4o+1Z(NL=PLGlyDu#L9JHvImLeM?qwiGQngx5 zmj4I~kl6+UF2$c{;QHHvOMmG@sN7zfTLwgz%6BE7< zABNo)M~J3r$Ye61Nl-^l2q6T?WKvpJI668S_3dyX2p7p@5>r!Cp^V;42 zKB#3`*xTFV)b7KK|5>N~=FJ;Cd-lv1@u{kcY&LtTf>b{k86oj_9LZ$TX9^6%z^}jl z%9)OUMB~6vuh+TyOto6Y&p-dnZ7KjXzd+e+wkLu2WpQcxWy4xbH3yYGPft%dG4;vG zi7b!ho@3qD*(C@eYpu=6Jk;xTn5OCFvn2w;Zs`^HeY~py? z6<~c45|76(HHot<3&+RDTq$#Vdpoe+?usB_4m2>;uo6)xIQlU^N?(OY8 zEffliVok(VN1CST&Du{-Pf@K_L#c^$MaZCXI^}X1M@L8AWUzzaVP$J;>k;7TrPk12 z2{-3B&f3DlLUDI@_a%T2WWtGhy$;K=JYhq%TE))J4)XatnmX{yq1&uPSA>+yWuK#pfKq-Bs>-rW16Xqrr-MYFP z{mHf&l$kKu+zM#=MpwAk30)Cl+qN`b?-xBPP98$2r^n;*jx}n_vcxaNlCJApl+q^v zKq(D0VU1JAWdG{zi6U6xP(bocIEJbd`j zYrlB$f;&N{c7T6iAyqB5{KggpeQz%_Xt&5D>Uv|bSaElEms6{CE3g(x?$lXf$Nz zW{pz%iP+hXzIOoNq^+DGrj$O{b)8}~8w#(fs`^*fM7d~vTR&y{lF6j!Fx@pGu8n8s zMag6mxm*q>CnsDPh9A_4zA!UhD`cJk)n$j#5 ziw_~Os{;Zhge_vyY_>&;CG6g!*rGtMy zo!UTiMcIms3?Kr(j=-Xm-^gaOSXfx#-czg9yvQY!$@s)+FJHd&<^a9;lduq(Rk)q} zMkyK2{krfHtJ>cyXgg-8%mC=_m>DS-CA-tPJgpy|X#-By4JLZi{( z){n$uF)#XZ90&1u9HwcC^NZq@D_6cLl}e%S%pbbQ0RUR5anFgn%K}`;l6;j)MLKD- zZQEDZNT<`t=ks1$Qlia?>G`k_2|^$^zH~ax{X&A6+%pWLZNk$uP2U2cTrTHr?(dG8 zcJ~k#qC$vIl@2sb)$Hsn_rid!F?^_2tG-$B?Ch-PMb>}ocK0$WM1hb%A2JB1-Y&|L_^YuG5i#~5V?+v3AS5)q9Yr4! zh2Jp@^dVy1JdsHBEb9N-L)8Gi%-007$SUEcrz1}8~GK~#9!?VB-Z8_5^O|9#`W(ynbM3U(s? zAUF^htbr9{KP~-q4$PbbmojyrExm3&RXygaL|6 z7}-(W$8aCTJ4(V?qZ0l90xHqkIm&4HAZ83}6jwkbMui#{+LkEpfW)&vZi>J{dSt1F zn155cWceVYStwf~u%0zYPt4z99&rlfk-e@4NLQS9MN(mDqsAdn#f56bkpHsM>dxmjLnw4D_kZOeYa+O^eCiLWrC{8qhw^Qe z#oRT=KthB=*HN|iq*Hb!#xDEUikNquyhNcBAgD=%HbsbmTtfHxXBP^@oXvBLfg>2) z@IKv2Hb!VqVC>N&CC9o&eu5ESPS-H@#@W+!|?|*(9nzx2 zeo5~XCWAX_r6AUY`WSiw{VcS9KI14|D;k)a>PUsufOcpbDq~(zU1A096r*DKm10Zk z2||2E&!Lxe485VL)Jx3!B1mA-fUe7hrYy0LIYlqHqZYCyB^T2xI-@U*=XM|sGX@k= zS${dKfdIb}wKj?($GC=NA z`-8et2T;V8SO64!#VpefxWO=r-l)X4|EPXS`+gzVCRdh#T6i!Cv812i~1 zUsAsUZI*>OdX&72B`_>3`1xIFw(hDZ@CW>B2xzwmxLZV1<8M@kGAScWjZ)v(<5NMaxeQ80G@gBi09t8SYAk$@oL>WO&-2l1! z)!xXv<$-XA^fJE@xMcAlx0PECL28f}MEtw8XplDBMS48vvIgNf)*0JLP8I}W*nii7 zVGRNl`@KCINQ>Ig9+Jm>hS5|rEq?xFN*d|YZ0j{cd5=W#FFJwVW&tsZ^+o1$UoRBJ zRrJ{;K3ZMjB^A$qU((qnr14p*5p#2C;+L{kB$gm`3yc<(Ki7g7;CM7PSL~}R^EKjQ zStI^w0rJWYq)aX4$#Wx+N!A9mDN|gND z1{GDIUJ;56eH2R>L9V6jYN2t;+_8?Cs@Azv&@4^Y+4^1s63?UDL{IUCe46V*zP^>s z+~HG6^8kGA6m9#ufkx>e8l^v?|M&~TfMU(@nMvl(FL%cl`tcp%vaa|%RDa+r?i8Eu zuUWN_VPI`%>c#WFP{c>0H@EMU=e-qW?#JUVWI>5#7#err%!;X_b&C9ojWS~ZWy}H{ z2@S9(hqEI%yaNoqJDMs4)HFB+1MjC+6$)|WHo!?%EFs1mBm2;}WA0p+RW3Ukr#LZ~ zJ2WTl$|<|SDN7xGfxAP!`+soTaPL8JiVMRVs_tlMZlknWrZ(r4Bd6}7Y|f>eT|+@u zNBZyNrJ5~e@7PxmAXb!p!!18{_TpJYyPD2Rw9t!Z`BlIjzIzxKSKV2VRM%xa$S>p< zm~)W-21tl7?`lEz*zV3iqWp(2#*u^MAVWug;(Cv|8nJWW{3ovVBU1XdVQvS<&#wm2oA&@vF3NWD9jbD#sSLjH4E~6rcI*nH!gSEd?XbcQjM?UiL YFDD}~(jzJwvj6}907*qoM6N<$g6d)ea{vGU literal 3706 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 Z{{x4QCvM-0NZ|kg002ovPDHLkV1nP)8UO$Q diff --git a/bin/Icons/ui/fade_bottom.png b/bin/Icons/ui/fade_bottom.png index dbb7d04b4cf63a93382439116ec1644446130eaa..9430ff5f52a82043db05c2ff9600bbddf644fb39 100644 GIT binary patch literal 31267 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⋙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 Lwc#HduMafC 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 diff --git a/bin/Icons/ui/home/256/bug-solid.png b/bin/Icons/ui/home/256/bug-solid.png index 2c8898060355466d650d6491067ff4251ff86f93..f25f0cf696c06018812b1a6c987cf888dd6e01f1 100644 GIT binary patch literal 3110 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 Fe*!zb4kZ8p literal 5035 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 JDpIh<{Rh;5@)H06 literal 8599 zcmW++2{=^m_rJ4X%wPuDcO_f4ED<7EO0s6(DJpB$5sevHvsILRX%S_KWNmOQDIrus zmKpmuks0e?@SorRxzByx`@HAe_ul86^PJ^#PKu?u2|H2{2><~5mCJ_K003b;LI4Ca zV{r+o@L?>>URO;Ff#d&OrETR|j2+hC%Z{M{fa3n&4FU2C`5BumVOOphv8=$5CuC6t z)kb;%AP!tHym%e^d#xxsd)oHtvff9xDCu|%6!C;FXhCY6xazt6LBkYgCjY&{z(00juYFrA;qZ&1>BC(gDw70wpL{@E6yF#?5gx$}4BVdHd-aW8 zx2v=_I#_KwT77VIU(au}wdtW`i&jT{hwu9Roe37h{wLOwW!J|$+|7i4VAMJu!*VAa za7`@#L0SoY)ZZ{O==qQ#qI~;%JvGP!>Ql!p%rMIq3$8LlfVQ)h33O`Dca-)T97kg5In6qdA+)hlM5f=G^)U+t~w(N>X3`T6!0!M zM{_j!_B7~sYzP+pm%sxC5u^#9=Y89>I0cmJPhETjoG=9>FMPB6a~os@1;CGlEbq~# zDSP<~mD$mQ?HVu(01dlJC=Yr5$)n}&6W}uNyN`l~b3ikaM-N{)OqVAK=_$P@5X}Tu`XV{_f?$8GOBm@)?GryqdX@PQIWUe+|6j5f!70t~y)K^Hc{d z0jbzFB@u%9*2EHV7bp;q_FilkTLM2_xcS^n2dlqIy+jl<7rs^KewAjT?}9We3CahE zedfORB0`603QA|gO6ep@h(En>GKByywSx|`3&RST3zMWbm*$)qQm@N@k0P1Ih>)zB z#c1l3syz0~z$u_Xjot$0QNz7@_L9f~F;=mS^F}7}RHp}0AeU;itARMA!Zb!q&mAaa zDufbI7XL&_IsN2jz^sH!Xg}U$z<=AJqz+z6PDE$d?1*6d*0k|@4{1l@>2_CZ6*u6= z2px9+FVbuce&P@rZO#y$dq42qgdwO{cm2VOZ7es9m2#h4h7e%BS{(U2K_9B@0=!O4 zjlDp5oV9ePszK|N@;0e+08k$f6&xQ7}-hm9-m#{|(P z_J82}DQ$Go3FGJgeXc|W_5MY;4T@b;d}!}sboMBCJDL(e?8hthalnHE5S^RY{`#(X zW+QHVx8%1DVZBHt!``#x)8s(aXh-NUPX4$IOaR}2oocbZB3AAZv$hGDut=DmVw|+c zn$K3P{gZVEGB;Lbh!fk^jyXA!dhT=-Kzp30d+s;=37|InP>i$-_$E=^<5#vn(Z(~z zIHuxrcy=?@#!dl)i~l0$qG{zY_fAxFd_{IF^O3fj9>w@qQH84^=rm2)RCE;n;R=rt zRGKe(vnT%+pj}e=Fxyvw{LgD7 zG>wfSOWgBmTB@voz_9h-#h_ya6H9hzma3=hdhL3m&HSXLf_GYSE1)3xGq~o{81t${ z7E*Da7|RwcZYeJVq|QpSr?85}l@jZfhqlK^`ZJfOn-6_F5Lf{kXRvL=+gctX;3qM! zhoM1>|CE$#N#{Qb$5w;k6Nia|iqKy@%q6iMz|fX^`tB8#p}paNQj`0KENMy<`C;z-N2Aga zgW-|O^XKZn-#<#VYIOe~J+0EDl+n^2eRR$mo-YOeuPZgC<{33rgO5;2koUGP&6Uv4 zJN0FZg4E;LOO7Zp?val;XhjQyYMzi8%ZrQTT-o9UnYsjCj zz}d3YO}g)Vx;FYpA%rDB&~(Z1-7JxTZZ%mT(lji4raKfj*jCU++{}p`U53 zxte@m<)r^&+8Hs+e&zp>Y-*~;P58o*DjGh}V@}P=UvB!NOycfe9$B9kY!-GMQRu;H zi8Sl@SNJd)h>U6+O>utaAam2CL=BRuo1F9keUs`8j>zkiv``l$5uN*bS;o-F3?n8P zwyq^bVQN&F?$UOgg#WlrjIR(7J6j+9b;AA9C4BbxyxDz}#GTJPo_^`29Dn2VS5Mmb`e6Cn3*>5r6*J<=z97czxNc?Z`?PDn!6q|xenJAl33|t1&w6O zWTTv`;vYK2Ek5CJ#TFg^0ng~>y!PO$73s)}P{#dYHG{tHzv_qbf%wL+=|b7;@)3o% z5X$VDCFA)Rc3%uuw3!);4n9?@4BtnAmq1>28|Pp|Fa)>m@##7-7L(F3Pdykyk8a-5 ztRx8G#b5;l1)oNF)P&b|353WOq`Q3}`2N{4kIvpvTAu9*SeUH`%@GkSKGUpU89VRD z?1G-U=_6!}m}rDdTAS)I?O&pks-OEsDUnI>pPOo)n0L){Ktf_WweguMonDeEp2hGQ zSfEBddy5-eG;5^UBR8_|tnBJAr9q9^#o!cKz7Lk>2$%}qKLZ>g#@(UA!A-{jUqdP)joD3$UvVU2)ZA3 z3&p`?epPm``U=8w&ickd<_ncGup_y&Sn=o!JpW)p@F$5M6tH~3O9&0;79jij;dYOE zNOtc>2_5DbmgXM=joB@CqpI9ob|P{TKLltBYRZ@WR4rZssqp}BY+ni}oE|yt$i#4K zx@n|dq4mY7W4bEOT4!PHpm*=4i*~Py<9YlK%Ga}2?!U+rM+XB{K~=1JR+_wXYu)Ef z{hQ=O!5d_q>ol7nJHvt4)I3>lCF6MydNXC=Z4|(%8bQwM&C2yytK;Xh0Af@4_Sk%= z(YpWA`4sxph$5t1ZA9d1H>JKwm4JqZs`rM^+k>RJ#kNVgYqXRum2>{#J}K;(?m$RZ z0EZjxr3Ptx)`;vxF6aJ#vXp=LH-`dCvMiTxZC1RT`dVU>c9L47m!HxwuSM56F7j!# zoxoX1otNYbz9H~YlwmRN2R{R!Z=dn&y^4)mZ}VwXjU9`_*pi!TXE~Qg+nwSRIP49s zm#D95eb+9vb^j^D=0H?B_x#M=f3XtE&hrl8&tN2=W+-C|X$9MX@iLr;a2Al=gJ6Lq zsb;i#shoZW9J5={wr|eYjJp5C%Yu`HsFUNgV91y04OIK#ISX%x?Wf1FKx8G+{%6Vq zywS<&Q##g&;RG?d)mrSf_tBZz@(njD^wQjYXshwrt&pvF;0vsRLn(nudd(pCEYYhw7W zi0v)1tYMkiXC?H6-$f;9AdAv|e21>0QVc(m4$jP5v+S}^d-Mi-ZvDzhq<&zu2N%wF zDlFakQx&wGoo>d1dvQevAL$EyL_$s#!MI{4ZIkral0)=_NV_=QgEDKwg>IK7ssM-BmVr9 zZ?#lTUHoD9;aHW3m<5>!x9d|BlRrTVRVjTwT`b88vSt^q{gKP7svq7vroM;L6pJZ; zh2AW@f8*0tJoJmNa zSp_*_CM}bA7uyu9X8B4Q_-J0*I?37JCBQoD`@e8HZ{?+th=}5o-MvZCKnss2GPqO+ zuTqEXsQJsQD&$|bG4p-s_uH0-#HO1*euM^4uPl29%}G0jv-t+euW=aP$tDg)E;82( zVTI;DDppnKBK`|Ebe&+whm$1GW_i!~62ki1Nt*UfSZluRu*8HOZ?v`P2G9#; zfhF@3xT57C&rEP2QBs;>Nl5Z)0)Vgum+{-ThCXCVQ{-EZFD|xKU%hg2U=i#6s|k5t z*rxlJO1-Bj7#4OIS?o*Qq(>Gwc5vaUOVG)?lLTK%d?07u*#Q_Lq40zj&;UfbdC#%^h}~M_sTeh8%I@-Uj6iybk!};ca?bYDTK*R%p9?T8H*J#Eb)7`o$HGd$7Jq z$`R=BI%-_HMpyHcxP(75HS`2OO?~j95faO6L7Oh~k3Cq1#&sef4~-+^fo>gqF$R#Y zpt|$*c2x6x+f04C0Iez&)&HgUy!<-wu$ieDNs}k0kA1T{Kcw{5ht24Q=^G&I?1sAM z+E*l59wasWj>1WtzHC1p#pz36uGe^UI>KvR89Zt6WS1687`hA{m+$ zaL998VBl-<;(n@R)`qD5NGnL*VveRUOFPgr&x_R-$(+umJQvEZ%?{@dGrnf_|kgv#x zlC|0kLv|gw(k48t4nsqEgqZ%}P>r_vOfZ7{$6i2MgKW(+oi$>M&t$5BE1Jq)8_JKB zlOBHExn8{N^pmBq>sJyhs86r0;Byy7(LZ7c)Ap~g!hdHL`i>c?gnGbcA#9V(17E!l zkUHng9|n_QvSsEe`jhps7nw@YdYC3vCBV^Be?)s$6y<_)5sZ{d-eH3+kt5-}cUf*J zPaQL|BzG)um@j$;)MmPWw(LVm1j}#fouR1EBtY77K!fJk6>Gr(4(#I<@|?vrxh&Xl znq_L;15eC38gZ*7smIH(&wODr`}hDy)xsFI59wZkOc^~YST9OfwsmF%i&OOWP+JM_ z^BF59kqkEvznyC)fx(S1Z8g`#yJsou)c2li93LnvCG%LanTOrQByW}$9DkW8c=}pS zn05=q4CyQ*_53@;om_@%w-3!d)1b)kwVkwr>m`^|>Rgd68^cKR#AusO}4qAWbLC9+Vc~ z+4Il83^_q52R%&x?2PMLIa5!c-CxzZ@$T_fG@4@juz=QIuPC;%%tQ_+-}FFiBZbp# z@I$ak8`Ir9$Jl55{ydyAhgH>b9%U>|A;u+xYZD;TY)c>QP#Bc={M*eaw3w|;-S-SQ=kDHqlz#1n zQ0|^)Ehxha`1gz%sG))q0&MJn5c$z>2-v=w56@jqN*M+2^96;urY}}|#y@&IW>top zZwG?T(pDDl9W)@)7UEp`@3InZotW%;ePHU}=8qU=(TU4ow#eqD;-F$?ve#_&AS3z_ zz}5b!?Zw7eX384$W|H(b0ou{ltL*R9J{rS!Zg#&2(7~6>{Me3GLW{rcejir~NuQ3_ z%GXV~s4mE}{aVjI%DF{uG{fo%vxVhpKN-2XVDb&m`Ln6$qI^7 zghI*_d*buNB!h9Mm`5%2e?A!Ne#WvZ3rK~p$}d8$7tK>2cA~=B^BAw;pGujOMgFkm zI?g%DRGN)W%2Lm;oi`&&*+!cF(NO(s<7N3X*^L~zmp}~5NXPyo4g7*tTD}~1ih`1W z3ongdzDV?Ewkw!OE^6NyrFk>eI?X%O7lN^XV&4k<1TtB!{=7j{?-@WU<&7^jAFvYQ zU}+yH?kSaHHd1#io>;%U`L;6cZ^`iv6Z!Vf(^b!e)7>xqdTPC&mlrT7ni~T3g0dw5 zL`%gTF)LuB7@xOhDyu72(<7OFdr%V=Ye^j5V=KV8h7p% zysO|?eyAoc)-|c;Lmcq_NbKl-H8Srelv%?tT|) zY_01_?El_?-qnl#$kfb2;W^IKf-Bcc z&`qC{N{uD97j7^j%uQ3ahbpxqdY=wV$5(p{@LUmdd7l~tms{WG>ZWvxvM2E;jNuQu z?cO{D7VHWn$YVXf;wt1f3CC$%54^(cAejl(8GSawnJka+%an{xA@yJ3z7lR4F;qkD z2Q9}Yb%qDED*l@jRGqQ9pO95^ojgaqS~%8iei~!Wbi_srPS!WlBDi>6UYuU*4h5f3 z-Rwy!-&kQYu3J{=k=>e7A<&!~CMnX7_zNHW!~64ze)<@dQ$O)G9+(g#igsM^FX|B7cqi#nS9n-93mr%WTr#Ab07%}bOK3I;g zSHGb!BoDTLs*8$;6>or^SNS}5|GNo7?uoLOE9ul15MtS^#+iiK3b`wf1VA=++x|^s zo#mk1iD#zAk5Z8O_Eo1y5c6Tx+el_=KE-Xvg?WV442jmi(y>F9C7xc$@zHSjBWC@F z*P7RxW9}gHDm8Sqe#=GB++K%8H+5%GVdv*O+q3b7=86igs#oWOS%U4KC1VVJ-rVl! zABZsf5P74)^r9GC)GHo^NWj>>)bn5KyhHcoLFuUo`n|+WNj$;0h4*d&JPU)E8z*4`DJr*;%Xwv$pvYXiV-JiE@2v zef?GYw9Hdmy$$vL_5In?NksH1RVm?WvI(0^c|J zm~J9y9bmX8cX;{B3}bgEMLJusInd8@;)3igpQgFRuD|Nih8G=@ns!=8eZE$xj;5&{6+F4IA&Q^ddq#^JHy@nk1LLWPVZHB(r~bLUD~x2 z{H;sOUV$Xu(4u=md+J3jmaVFo$U;(b5a++)Le7A$jNBjR@+R_$lcdY@L9a35N>F*i z`s`T7`p+p&g>T<-`$?%S(-hl|Kk(8tL{&y1cz*+KnEH;s3n67_O<(Ut^UQF#uy87? zIzO?#$4*i@)ETbcJLPm{>Daw)t35YbzrN~a$%fuFE#`Z-HEx4f9C)$Nm}+&BhS?4X)?qYo58#6V~#lr1*R z)Fl2=BuoBoINu*^Txm*U2!T*zIVO+qzV+hNYZMZHk$RfK*E!A#Z_ z8pEV%EGeE3G89syQa@>&Uq5JCDL7OFKE>)mBn0~|fhDu{vkk((<3@!&4Cf5?Vaf32G^PZf!~O4!TKdBIWD8BLomUSIej7Z_XoY|>hO z+FYf6QMSw;-$W6K`&8kk|1%N700huf=Hh~@OD_!Y#tBR<@?YBFh46vl7#`aj^0?cd z8?b->9odEMPC5Z0Q3NBfoG|p_Bf=3V+X+Eoedae>tDWHbFU6XRE$V3>V%win$1U{8;IW;p`f1 zXKo6surCmg^SIx$^%qY{puU6SP{h)wZqQ-HIAydZX5AUfg*z3cqAZdt_%7>r%q>QB zhqd~qLEP&-OPpOYjTyo{U}JE9GXUJ~j&mEwLfw2R|1b%TtFjjxdGFiF?&jZb9I(xj>};Y1GIp^_KT#!bw+7z1PnH$F^a#Jf_i>j{O zl_V=6t~={$hV-nHz?zy(-ISpmH(>Ra*D$fViG&%3%>51KF!YNj?VJSh*fAmcpDBr(zd w4HXR8Pub3gq9o)_B*pL*yf{4cnxn^d{=D%)DS;)OF+u@cF)}x-G4P1{Ke5C{ZU6uP diff --git a/bin/Icons/ui/home/256/display-solid.png b/bin/Icons/ui/home/256/display-solid.png index 84cc043b072474281170964824a5582e66dead62..483c05992b516decae0239a0eb8c9fff2267129f 100644 GIT binary patch literal 1423 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo`_;1OBOz`!jG!i)^F=12fl zga!D7xB?~rj{<6kfRXSD1z^Y)l?3?(GnD-AzPlvo-+R-Kb9=U(`E)#E>xEhO&d!%t zPlK3iuqTijDAcv$xU_e8KU1Puz@myiylel`?v>NM&*6oI?~0ERhR^wK+C>sfP)sOvvL= zI+9-USifb)GHGcJM|Xh*p6;_wyyumzocu@HQShFW)nVB$#{2e^zvcP#`jMaAqD6K^ z>ak1NG8Qko#kGKeQuM)|HGqMtsA2Jn6^oa$-FW1ewo5y!&HAQO-TD_Nv}H53_VbrK zY3AE5p3soTqj2PU$>ZvlA8mPm8W_s@^5z(~R5+@~DRkH_6)tt2kzVpp(#duycQHqb z#A4?8hXqdDDp`=rQ9kLUb*Gct%pHLuNjDNMnI&i($qJvjVYR8VW7%7)$)$g1Ei^c6 zAZ*Ix%*j*!&d9O+{egf8)qeDKC#@~4xL2Le_dYyIqV@po9^eu{c?5^ z={x?#q;nbkd+>1a&gVDu+miZ>C))?~EL^p0#!0n3Np2rbs?EH(>EKe%v@I~h(s*2g>-2s;3 zs89PD*OeXEu>1bZ+aH(Q`@ZtL%&fOJk6IKkwSCuXQ04&)%LT z+of3fjAtEQ(IBRrrD*p1o3&fXs>F^r+HPNklcZBa?3K0!_q<9!a_oeN!nXaAS9Ox2 z6GP$^w%JQwo!*f*OVC%@%KA`8pTwi;^BMOR3$d|F96g}0>R{IQ_a6`3-5qZn(!%I3 nmtQKoVC`{#2In#*B=AXJWshC`(`9v*p#0?N>gTe~DWM4fdaneR literal 2151 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 Vsxfw3oCFtWaM;3*RDOt(@?X_W^Gg5# diff --git a/bin/Icons/ui/home/256/gamepad-solid.png b/bin/Icons/ui/home/256/gamepad-solid.png index fe08f1bc58b66f96b4f2bebc34f1f0658df02433..fbba1f473d9b7f6987a460bd7fa15e4955560ab5 100644 GIT binary patch literal 2522 zcmeHIdpOgJ8~<)*wz(~rZ4nv^xn!~(=|pbBlpQe#QAW|w%3&rFGgOi&myqP1<(N*1 z+_I6jF63UJqqEb+$Tekd`RVsOzdwF|pMTHidEV#qd7k%q|9C&o`@EktcZ#zjLIVK+ zfFjw&(E|WLn-T=TWHu@McOU8|!6RIJqX0l&^+$n#!XgX+fXVI$sie*3#=rR2fq(3P z^4MC~<}r0LJt&^Q+YM&=ck#RarDcVl+>*doO8ZM?p?3_o{MxO$$AcJdY}5I=ytVBN z{z}1sBJS^%IJVxGG}da&g_-KBlZ!doM>QL?qYavdUvfXRT!iy3Kc`@p zxB32S97HUcAl$0FyFJNb{TA)gXEn$Z&-Zo7<635a$<%AiK6hLAV;3??PS6z(!tT`t za?B=I0RT!TJK9mtjC>X(ZSDrJOV+t)F8GK1A3|oer8r?Tp1ptdptslPjQQxXT1IOF zgU7hS7@eLGFD?g7y$z}|j?QMDy0&3i{iOznma}SjG#4a(TKPO^{&}O-`^bF_Cnecw z=z!Okd~vp&YqD)0io8Cw$$zv2z{0kpOOZH7Zy4!l!Vb7|rHUT2;Ho2nf~2|m=JV8c z`N_aOkcB0O3I}^Ij8b=$XXyDO9Fp`h1|Vf+<>;gR0=bC=D=g5 z%+cs6bRf~XPNOj*%_aiwgd+vGz!h=^(9Z(j*{wX@mTU%`D-Uqzd#pH_EUYfr$ekJCB|Px`l}Nbs}Nu9(wA#8zWUW+!P7VVlH^d#{y_EGI)Bhy%lNMH zovI=Ng+w$(0!aThCpm_6X$l!%8K~-paX!y7+6x!Ff_$3DZ+F5<&u=G+#1HgpFNd*o zliz9Wt$=b4UW?Bm{hV4qKwZG!6X9;od&2IK7gSMGghxXzL`BX?Yi7sa$oELA&N8A{ z(~TM_)1)s+S>}LQ_kG-?(4qLt`_Lit5vS4VsdXYhY7{1x(woq(W;<;*m*;aI=7N2> zb3_@+D?Ex&@a!fmSd zAZy=M6l{_==R&G6m8&KKt9G;0L^sc#az{=uH8OCukIOCY3J>LuM!!)y-K@-pW%<|V zqb7I$W&8egkIqGtaT!6QlaOApK{IeW8!w5Aat=xyIb^3keqsB-n9A1 zAVrVhOaY%|q^v1$=1lN!^;H{|>5U)mUmh@|M-rfXsAW5XR!=b}WqKDP2j_iC9xQPQnf_w_@h z7PY;n81u}Z5)`(U7x_ME-CnHlVis2G?$7{ZESW)Va6r=5+2>f|ugRBs3!z z>m`)@Cal5Hc?kzG4QAFfD!v!J#<*As2jH%W;*VbJ92}XMQydk}X%wjmkz=tG=kIIB)dH zj<$tc%9=s>II&AL2cKnNZE4&zt-&W(;6A_f4!fGxH`viKc_X>ZrrZZd?q-%$mS^u8 zj(sEx{uz#UM^zc8K8FHHs#U5#p6_GAw%mQOx+-PHDY^!fj#x0^ML_SU(Dy5Smb0wL zrlClU=W=`+nXx7b%RgQ4zaq>tJ91r0_fxy|Ku-AI>_}d#jd@x6e=)LaQED2_aP8s|TTJ+&wR literal 4391 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 bZ!C~;97X72EpC(zV*yJuJJUK7O#J@=etkLu diff --git a/bin/Icons/ui/home/256/headphones-solid.png b/bin/Icons/ui/home/256/headphones-solid.png index feb015695dec7d6561dc0f7a427b182bd4b81bff..9c43b48cc9fcbe75a6329b44e3a7bfb9f8674621 100644 GIT binary patch literal 2774 zcmeHJdpOe#8~$xGhdH#Rg^g^(i>1h+KIe_e9Fp^)60wkC5^v6#l#vomDsq-{iW;Li zCyP{0wUkq6mBLVHwO4<9*LS_&_xJbT`&`%a+|P48f8F=>T-W`iIyzWO!%#2)0Hkfm zBxe8sZMGml9I^=~Ydl>yK_ZOobp`+=Wq&6KxRoal0APxvy{pycQut5&qrm@D0ka_V z$mX5(M>spU06=?!omtr`=rY~ZM!x-Ylr?;)(e2PfhC?3FD}MhE90F*?;H&twq1 zswh1}?|2Zb04D-H7uF?u^+Eae6>R^NZ*>P!(@dIcy&5muexmtX4?cF8R{6^199EFq z-9aiePi$++$|ompj7S-c{iq+W$=u;~L;ZHooqyRKxwR%aWL6~TEG^a=bw9Lp^CRQ# zEI%egOyXUL@o9s3>StePC)MMt(%BasVp~0lrtC%WM-|UMK$g`M9cNr8e=W2#L%&2$ z?K=BCLU<`cP*4B>Vgwr!(KYJLm$5T#s&>tfmmcmNV}>lhZhF$}KQ?#2mKiekdhU~) z!8dz~+w2v3O-(|pkUFf5EKuL+o4%(<-v2)Zj5hFnoo||A+|pvaWr3@As$Ju)mduJ7 zGwP|a+^P?Xnp?kiXaQ0|>9Q_hZ7{d8<5&B6Qx$}ra_Kv&i!Upg#;f6>v@t6C3n-gM z8w+JCVfa_%>#J=v4ZauwxF_O@W|cb(qvbLDRNhFulj)!LTjb~_8v?0lU4Ik)MfsHq zlb8rNU4V(%$7#4Tj^Wef!^*);X8=0idQuk3mmn|$YExXJj5gr}i(cppFMTJAw1hYxdTRU@r>vWX(-Z#|ike z?=uS4!lw0}x4kIa#+-OolOc4=4*HrtAlp3w$NUNyZZrz)cT3$L5GxbrUv2yH-h2^C zwJJKu>%8sDW=5~nx*f7^HP;dZPZjr_s&_{&T(YC5!_D1a9*vX0q*+Xs$+ zvQD;RX%%66Pl9;cF-w;2my{*ghP~~Yq>kX!Wlw5!P7&0aU^v)x)mAChq?_d;mZ{{X z0}^xCZJ`x8V@hayZEzZP)tTDHR8HibhgFmh729v7`5$WQ;Q_-3|41oj-c@ z4r{SiQVzbK)s?+@OEYIF^Ezmx*EO>ALc0jdGKZU5te}fr1!Cl~=0GSt zSo0MqVmm3g+iTV|F?3DXvJNXuC5IH_v5BJa%CJPdO1o#NKGOnRq0FYHaXb=R$z{~X zA}`qajgXn$?S7?;UtlmDc}=Oig@6UDsuW;5)qmfKZ$~obZLOd|M9v{Rp0Lk$G~|Ei zk$jdyH4)8m76g)46=xnWcMagv@OCbzs)>>(Bab=M*w8i?t7?@hD?THaYQ3SrM zQiJQka8?HgifpEBXo(C!ed*KPAXI+v+sHygVWvE=RvYoQdNiA$@B&t>W*fP@X zh90z%lD{Qc!Vj{Hx~=BN>Tvp}h#99&I3m6+K&EIy z3C=(tuc*)X=W}xt?2FO6Br1)Eo!+GuOoh<&-YoS$Lt=xrR@ugEaC{!?53 jZ%+4b&%2S^p$vM6?0?vyFq^&kBLFs54y3ylzDa)pvobXq literal 4024 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 diff --git a/bin/Icons/ui/home/256/home.png b/bin/Icons/ui/home/256/home.png index 622984c913fd32b025e5538ed53e46d956fc79a4..b2879b3492d411b000fcb2296226acfeb2b20a1e 100644 GIT binary patch literal 2122 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo`_;1OBOz`)uG!i>2YbAK@~ zFsTOkgt!7F|Br&v5WpJ(zjvy40Tar$k|4ie21X`k7FITP4o)s^9$r3v0YM>Q5m7O5 z2}x;Lc|{FPZ9RQMBV!X&Gjj_|Ya3fTdj}^MH+K(DFK-`T|B%qI@QA4B*tqzF#H8fZ zwDgS3tnA#p{DQ)g(z1%`+PeCN#-`@hw)Wn>{t1(&Or17;#>`ps<}X~dWcjMqYu9hw zv~}C|9XogJ*}HH5!9$0S9zS{d?D-29FI~QJ?bhu(_Z~ia{N(Ag7cXDEe)IO-`wt&K zeg69G`_Es$|NQ+o(P_R1Fzs`Cx;TbZ+6*Q#B+gk*kNAG~{D1B{TkEs$ z7GJB3*NHftHJk4%PpXmg@o4GyI_(jv{WY^plW+E|J$fNC^YDtf7cblk%9v7DaN*zP z`R}|P7kmnvy{%tMpl0>&oVF@$!3y*Kn?1c@iZ8N`37*%xdpyk-@fp0TXZ+f}U_YC*@2=V%rvQ%CK6_d}H0pL-xBek1Ube z#rQw#r@7jd@ad0xy5i2y@(5n9$CiA(be7BUYYDrq$DM4DN(Wa#?D|ku5EB!@1L1V!^NjF zio<(YI5r3h?y|ROSZAU%)kDZp^7OJH}o6GMgY$K8f34W=Fe?*Ev#D0;sB zB&SeqD^#j*pYfY=pS*o{kbq{o0#D0jZ5~1H_VxOYu-keR4>7e-1S>seC;N?>FwTj zd(sz1rScn-zWnrhvSYKH{DvE;VG2dz{!wp!$;Yk1B-PAPgg&ebxsLQ0E4#zy8r+H literal 2700 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 literal 5722 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 literal 3665 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 CD}}oN diff --git a/bin/Icons/ui/home/256/power-off-solid.png b/bin/Icons/ui/home/256/power-off-solid.png index cf0ab4483976dd842e3e922850db2de2db48eb1c..ea9ddaa9cf75d837efbf58182f9074a53be88ba5 100644 GIT binary patch literal 5039 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 FV1ikvF53VA literal 8210 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%0AFV(TlVzHc%Ac8#>mWk{4GE-Lz`P`@ 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 diff --git a/bin/Icons/ui/home/256/screenshot.png b/bin/Icons/ui/home/256/screenshot.png index 091e2bbc2eccc0c1adebcf8ecebd91a02b820ffd..f897d994495a033973705c3a8e1f6be75b8d06fb 100644 GIT binary patch literal 2320 zcmeHIc{JPk7XST{5c^Wn*h)H<3T0|+X`4Zb617CAGCdPUi&|b$oi;)wD4n*nMJ!Q+ z+PW~2wzQO5#!`ZVhbFBhT1)kfu@f|sm(DxyoOkB^^ZtMHJ?DP!y`RrL=brPq=X<|5 z2%avAa$0f#04U;JaYO(BB_RmNKqW4+#@|=sWMf)|9sl90#fFPz}pCXUNoD2z?Z6LV#dgENf~uDxOC{0RE)9d`>|}drn19#>su%h z|tc?@OsrA`^8;D5wws2#4&(~wGW8|LE!D}jxGJm?7CaLfb zJ;MvUZP>uf@HWqw8{f2@Y%eUHSS@>QoO25EL9BxKUw*_g7ls40t*L6!i?sI|ioJ#C^J2E(}con3^^YL>?V!Or3v zV#`zqQ@s)$Vqfz8fjN04L$t?DapILz2-FFiAB7+5 z@1eiNi+~;RX-pf9lmi%k9q7HkJ$c{Ox)$uGLH8FUSY5BdPUhe`95sLkWKp029d;Mk z=Kyj2pOWu&!l!cHXe=F1x3a9TPXByc-$OY(^L>k2L3PE?8{IMdfd18NtJg97Ai!R( z`Kw8b2`>NUGIb+IgjpIVeu5_EI#<{~|6E1vytCdiul8?&-BLR%%gUcclD~mD-|uCz ztjEh|)2MTHZD&ZhrBkI<0GXS zWXi)DUjuq!JOiPWN)Rj~59vUc(Ww8V7sP?+n?9z}L)kCOsdP{F%W5j!oc;0_D*Yl` z>y4cQ!e2354+Zn{m;kXfaaaNJ2yB`n<_3`f?P$K(x&YbMJuaXr&P%aZxAp>4c41_fHok3-_yk0C`t97QpG8;=Dd_U$Z}FU(+FK@6=;sB6>de~)R{=xOiB?do5Lr0;{w7KJG;DF3WIaA(Lk1_GjN&mDn^E1W0eS6Rv19iUla&I5IWiR zZ54c&<`&#xSd8zb-S1i70|}S2851dA4GJV+Byny3O^g7pv2y32L?yyzk-CCo?#Iti zvL4PRVLxC)!QQA$l$LJe8;2ba3Z~yzpLPrrB}gtrddE6q(PhA&+6TcYTeLceRAiKnCGwVssiiUsk0UiJbh zxqRb$E;HxK34{hytB5@Y+J8W3%RvlvCvg}x@HqN{ft9zlGjq5709^#}$RJc*omN&! zfS6%3y{l{q1YX~0x;b(Gk0e-Wx6$FosyK!-T3vn1u}g_#Bo&s}T{Bvfsvn6zea<3p zXs8j}`uzD>Cyv%T_W5E`#ZGgo+N&nl$?mbPW9EJ$0KVIk^$0FYW?i8vni*))pYnC} zuM7Le50iT+lwPk}GD-{wd^F#J<1~=gL@Pqi1l9&_3C6E3j}pwkthuamK_qvvY%uS? cH~GO92w>*MIi>8lDf!g^yt5~cBokc z#WKdEB=R?VCtKt^R8~$`pKrGy%~LA0C!Rb<9bKC6zU?~@!}%&XanAX7bb3b?@sL4{ z)2UO>z?6@0)tT#d&v)wo0wvmyKlvTZ%>Sj>&~2qRS#QZ97ohHBUlwRFs zMfLqVi^0r2I#*%G?nB>D5ltnJsVw~Boy9jihItU5BAk`P)yzK{5qpQkR}Zpi3J2`} z@&B<8wEQLAdkj7d5A%`T)UT}hD|yqJlg4??iN;R9dpJWeB`cBfN&>!ZV z7-8Gy;&?V6`$}Jpdt-i^z3Gm=21%Yd* zW8QAGLeMS|XDM+WMr^thHA*(pbiFY5a(*@zLAv3l9-??Avut&JYjd6g5ma;ocgw!# zgHWR04RF!Z`6=_{MBM)AqWC-rt+3#RHm^~hH51#z&Tt0sONx6}i#Tx> zqi?HG$4q{u1t!`{0|_c9{(@MMx3e+CGtfXgf7ONA{69s42mFWMz{x5T4=!(%%}>!X zbinYOTPcjhAqq+i4q4I}!01(q%v4qTYL?uS$1Jzj=<&Jl@8P}pb-T8~i|hkfQ`ipb zwwG)3XcUJr(ym|?X(=z3ZC8!TrDq{RiO(+&qB+^CXn_^U*Znbj@c@p~z@ewAfJs4=(hS|Vkv~860!`qn5C$NbqvLd6=oza(=sic^AO8*8 zxCbaJejV8|ZCGS4IRg@_wjlo+$-C{bWw=1_Q{F_NBx8%ð+Yd3FPLQ$d_3P1`YD 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 E0eW{Qx&QzG diff --git a/bin/Icons/ui/home/256/sliders-solid.png b/bin/Icons/ui/home/256/sliders-solid.png index cfb030721ef78978440f1e1b54891b96e49b6a50..29d609a51c1aed8551e62b029fa44307fd12b95c 100644 GIT binary patch literal 1614 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo`_;1OBOz`!jG!i)^F=12fl zlmz&MxB?~rj{^FJz=yIJ7ht&8lmz(&Gu-`u&-YIE=9()zKYfq;Cwu#woR#NIx(CgR&2SSs`t+8M7!|ekVAz5 z=Xk#qX+2{;y7u^mwx_FKtAyGLy-#?vl1Y)}l(Fi^RWtj}|1Ay_jMvcoAj$ffQB9pe zGA$*8fr0slr;B4q#jUq@9yi5g3$#8o&Ca>KtuJ@}jct=R?%JJaSO56Sx{O`>zQ#Bg zhhOEcG*?0emyGur?B5gQ|7k%@&X)D36FiR3{kogCCayMC`BFm0`e&pzHkC90%E6 zlnAzQu)QpmY@fmSbJnX{pEhmJ%v^Nc@n(BKTy*SYcAob~Hbk5h3X5c9{!=tNJ@V1K zoM#WVA7&_fkjmN?V6fxHKRxFgcg=UqNfY3IcgH(B1S|6aDg#Aa{nk}o~=X8V7=Wjwh)dY{bSS3!JjJT8A3 zzp`JE52$y*&WQ7bi9ay-!u-eX!mPQ!7+aYVFaa_`hR)*xh-Dj+Z^;iC@2mx$Qz)+RwD|d}Y1ECBpY#8S)t3TsvFm*oO{9 zrQKEYjz;ck@7T6}V}>Y)dU<`XWR9Z5@8aH>F^(E#pEQhj&39H=KI3Y0t+UMY8L_g5 zHdt1DQS9-n;_;PA+Tk}}t0iHF$8ttzmgz4|I}RVe$ZxSAJlOkY`!ZZ101cd90wpLR z01cA|%sg(_?9L@DVYu;7rnk1AgU5W5Twj*WyZ8w+42~qke#vl=sW;fY5g6ljdy_Nu zy`B|!9Qn0-a@um?!Unz`+JFz@Z`i(^(LZ6&hXc4zL(aLcH`gN z_1AAQUVfRwwJpwS-n)0P_uZ{{cCOoZQNG^F>(hhXSAWj0e|b<{6*b!`eG>V9e&STS TSFtyMWf6m?tDnm{r-UW|zOlOG literal 3845 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 Nu(5I^RGlDQ`6smBA!`5t diff --git a/bin/Icons/ui/home/256/trophy-solid.png b/bin/Icons/ui/home/256/trophy-solid.png index 1bd98a9ac9fbfba182a725a9586df8bbdff65693..66cf3c52b9c3abd9e905a344abe82ebad28f99c4 100644 GIT binary patch literal 5082 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 WI|?!xTYoyN0~p;hy;-X76#YNj7@rdW literal 7133 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 SX_1zQ15kz*$f~QZ5C0Dw^j^mR diff --git a/bin/Icons/ui/home/256/user-group-solid.png b/bin/Icons/ui/home/256/user-group-solid.png index a154fa5ba9e28c1c9d41c899c177e722200640c2..b157bf62ad0c1a90f5cbd79904aca32174cee122 100644 GIT binary patch literal 4556 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 diff --git a/bin/Icons/ui/home/256/video-camera.png b/bin/Icons/ui/home/256/video-camera.png index 9f5460fba6805c58d3d9773452e5cf7d507d4412..e15055e9a799dbebe0b49645eb2864a32b994d11 100644 GIT binary patch literal 1599 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo`_;1OBOz`&je!i-Z7@7M-Z z@gTq_#1$y{e-sSg5J)IrIT;wo3rd3gf*Dr*5B(~TbLk)Rn}vUu^SB1Fd@`T>j%~#p zM$M^DMHjh*)Gp~i&14%O_@so@s^4q+^*!UfKNFL&eusZ%iJd|A z$=W}GOD|=dj}AA|}T3-}<$Cb6nlmXfs#!`?cxc-)&C! z3yIzkWf`{ruu(*;<`vcTd*jj@rJmkA_ga4c4wvh{-Y#g}89MLnsk%R>@70}l5}A5x z^K<9E`jhHniyYV4ikJNH-WJgy{v_(D&xMcrw=x*xrsM}F9^b#>?k4F8`QnHA>H{~X zUe~&x1!A?QURS!Gbr{H+n!4R_pXd!y@9xv5(wzC2b^yiAB!7o{_14 z{%(e+lm4)OXk%beU|{5MU|+m$5aEuHn|BH>8TI-9KCG zut>e>dt&QL>6v$GOxzc*K5TBZ>sLfyS~>sy18?5-i#@5UEYql|sH{`;zkGZ3!OOSb z@6AuFn~?mqwDIw4-|bf;7u43DSpV+K=ikfE&-?wU`@DZ>^bX}utB)y3OpU&MN~f*& zQ`T)JvD5mIOu64rbw2$&?U>6#n;%(6f+Tmkz6=eCwzAHP z4~u%7Jnfoo=v1%efBy8Se*ZhM*em(=x2)oYFOHaB?pnKV_p&p8ZtQw`GJRgC%GAT{ y z2yF*Mo3YU(vWNmAkSN1LMG_Dnq7i|K5_};7Vn_mnO!zZ3Kf7wG=G?k>xP*q@BB_%7Dt#!gF5OMahC z?NRP(ySVNC&>pVS*$rLn{sS1FlM~Z94X+~nyqf$PUmcrLMrVzus_z>|w1&ZjT4FK6 zRL>tWPCH|=F!Zog{}TQP5uvMG_d%5l)Cq+_r6@4qLO776I9%|f=2Dl8E3gqVU7z)a zFrZh0(*hac6xO&6)LrbilB|6&A-h8*wRg$N=97Rdb~DkSlng$)2x>VS2>?VBDSuj9iz$ zV_-0MtOTv3;oUQ5X7k9gd8yLu!nnyB_L7R(XsA~m)QK!n#F&b8gIs@dPuTd;XQcRH^1yX5#sX_!w9CH2?Te)<7E>|@YQ#I z^;czPI19{JWA)cut?AJcs&A*Rm0e>Qv&I)@jB!(fjDT5kw zu6*6NyVzeZ?L{M{=#fBW8%wIck5)E2gwiUR`MFX(hAC~F`{!~if5oKf&fw68Dg!{> zry`2394jVKAca_MI0N@W7|^kVF}rTGys|_z^cs?-^i>}n<=1KLQJ#FI9deJ;i#`3+pax1mF zI#1Ku^@CCWkUbE3aQNk#s=cH^>(R$;pG!1s>AH|N#)8@kX2(f6VtT#OH z4-Z>5>lWb8DDa%znS(L0L;Wz9pB@#Hh?~9u?}PSsJ8HKY@_kiB%8F#H5m%{bONy{7 zLD{9im3*d~h)SWvwb#!#WL?{`Fa^^D`?2m$bkSsCCjDu_^ghU?qFnT(2Xw63Uer5; zz~=RtF7fFUOn^5)=j|sLlb(wt@@~g&UgEhXfSV$@0{KMtt{Em6UOIN3j`e5Q#A;?> z-|8dhQ`2YCCae=0taXL3pKv~Ja!Zsz=`;I5j0b9#$dY7XC)m4Yv6NfTNdUMw$w7Jc zF@+wK`aUoX@&byn3t0EH?q=4KaGcZ6{JDcnVN8iFNSvq?i;#nc2Mx@h-2~JR{~Eaq zcz-ut23JPPqUTdJCdm{#b(N)rsM$R-Ja|a-JBC3bM5`FHwxa1kf?SsmpB$5d@Zv# zzS+6uLF+&4^RKy(#>P$c$-2bl=Jh{GC{P6Cu9TCs4?Q7!I`0HtKjzp3xR_ovkx8*| zdc=U?eMi={wK@E9?I#5gw0VUC_7y>lul$s*CTj6%bxUtNJAfd(l^wqBHg!a5>7C;> zGlzL2C3PVQr*zwpX6)Zkfz2k_63xGcAH!aDA0ij17}_h=DNSM4JLKmQIxmVB31oR% zD{=dUQh}7Z*yD_h#?bn*GiR7dyqOgG@|WU|8D3=s9MTqX#qQ?$%MsBLG2ykl6VCn{ D5LV?V diff --git a/bin/Icons/ui/home/32/bug-solid.png b/bin/Icons/ui/home/32/bug-solid.png index 401fa0ea27c4212a813b1e18fba526601798c317..bce7ebd391e76c2a6fe121f46efcbb6e343f613d 100644 GIT binary patch delta 386 zcmV-|0e$}J1d;=g8Gi%-007x@vVQ;o010qNS#tmY3ljhU3ljkVnw%H_00BfvL_t(| z+TGQmZo)tu$MN5SZh{~|bTg=hcfdjLXbh?zO&LQ7yb&GF zU_26$k%)`{M4qzi%I0Jz>`hAp%lx9{JB{qbW=;*BR5-Q(d}>TD03I^rfB;z4LKQE1 z7>7Tn&Vd-|&~=c1cq0&b1n_9{&Vr)^59ZLs9QX>v@4lnPuQZt}2XEizO;bOxLGl?u zX^!1oN$K2h^#c{PALO;8dXT~JKug9vfNPQ!y&p)rKT5c+t>zmugrK4RwG;EvwD>nQ z#&Y6c#{)noAzRk|HC;(qur(kg_fr7apVFWd=5;@)lRVWV#-}9fzj{M5tnUBnI1_yV XqsBpOZb^Vk00000NkvXXu0mjfj&}q; diff --git a/bin/Icons/ui/home/32/circle-left-solid.png b/bin/Icons/ui/home/32/circle-left-solid.png index 1acf201d630600f3bbd9e9fbed9bb71610839ab2..917d012a06a5981d45a15987654e2fda7ed3f687 100644 GIT binary patch delta 283 zcmV+$0p$Mi1FHg%8Gi%-007x@vVQ;o010qNS#tmY3ljhU3ljkVnw%H_007-dL_t(| z+NIS+c?B^PhT(rT3JMykV60qllzm*pL6&7^@DLCE%8;jlnVxqY&H?>}BnH+v0+C3- zv1X7^7m`?VO35k9?jnpNS`uSxZ_gB7qB#AGsZL8voH56#a({T{^7?`p`HvBOB2o6p z6?N%r|0QMndPU0;z2cOTJqbzOr(~$@j^5BVh;@DU!UE6a*22|ym(Xu)a!1aIK<+?7 zWr!VeK}3Fgl29GnV2}lbSo2IgU3a`Af)}MP^z!F;NLg zTV8j8p_`L@bjz%wN*%6@t?ePqipE3gn&o?%;Kl}r^6l4fO2 zc%143c=4>gxv()TJM)7$$jh1D5f310r&=R zAJvZA79`z}WL**|rJa!F?OjYdaWy;l<&>e0oa%c10~0pB6-C`{asU7T07*qoM6N<$ Ef`9VR-2eap diff --git a/bin/Icons/ui/home/32/display-solid.png b/bin/Icons/ui/home/32/display-solid.png index 8a48c894946823c13b0eb86f39b55669ea2a1470..7be58625a528802b12813cfeafc3c81603ec3fae 100644 GIT binary patch delta 220 zcmV<203-kC0__2i8Gi%-007x@vVQ;o010qNS#tmY3ljhU3ljkVnw%H_005s!L_t(| z+U?Y_4TCTcM&W;)Fa{;8K#Q1y79}-ZM461i0!)CIf|l+jAR%2MOSZcx@^>A_z0yiP zk#Px_OfK}q=w%^lV%5lCBGx2}nO&s-RP1I~piuyt6i9(z4^^}QFG5D^3XH@W?YYQ_ zm16@EB`cv;%HzsH-?(wQN}j)6D>hD>+4@j0aDUGe>v4P=DCC2OeCSx1anC}h|MLR7 W5Q#r8W?Gv70000NklR634@6vckmdDG8#ulxQaS+1y|$h!aY0& zn_=>~koXf@Qm}xDeG4RQd0+oh`T)HCUCPuzasz;_e3VjmtDYoFPN%ZZ7$kE}ubg}r zHV`!efMSMaFIulIK&!QXxX+X$0muv<9{^G-hqE?5D_D9PdH@gL0X)Fs0AWvC>?ji` z0I_WrsAf2htG+yt%m9$cJkSAXuPMoT0^^!wD!q)Auvn^-#^7i%ZulFd8$`0v05oF^ zLkos2$sK^F2p5s2Uqtc@;32m76~Jv&EElu*Y8xsU07q8f0AMd4Dlp_Dck#boKd%?# WvRUp0Sm%@g0000MORHv!ZBSU@RdMBRsv(r=#!K#M>*q27kc}vIqk9i?`fGcEfv= zprF~c5^*0P46v4XF7|*X(Z>Qx#*m*qD-(cmE)a5o!Uqgm0S@RSfRlCr4%uNC-2@VV zqyGa`RGhNQfMY(W{J>*i9 zI07#Ki~5jU!Z+{0l2i|rq*{q7In70voVJA6=dX<k07*qoM6N<$f_++jxc~qF delta 527 zcmV+q0`UFL0;85#xv0047(dh`GQ00v@9M??Vs0RI60puMM)ks%j<00(qQO+^Rl z0}2)jA^kfq<^TWzzDYzuR9M69mpw}yQ51%sci7;^b}EEztSkgUu`r~PR3>Ti4=l74 zJB1KJv`LXbx`1W;0r>@jg-yDo34}-x!BlBh8&_mk_qCZ-vh426-t{t#FHALO?s@Jx z=bn2;q_SNB-T^a!8C(s2U{BH~+eqqeY5RrascL(|c1Hr)9s{bx)desKoJ#sHx(V=> z_!AD;q$0OfSn1m=O^E)bKp?;>IQphy0`hHlyR_bzMJY>(eYA_E`^ zbdK%C9_!Z9!lb7INzD*|^vKmSYT{553B_sL_GXa)0MCmCcoY+V;5v^{l2Oe|-CAf4 zJ2@qz?=I30N9CH1VtC&13(af(`O5K3OoTefUBTMD&sQhq~rFZ zY2V(gzil`BSnD7p0t@XsmDGZm>tk*RO2NLQYNr8H5|Zk`ZcKo0S#tnz5)+`3V-6UK z39y{QW;G_ji0uz*JyNg^JdWK5UfcfC;V6CtKKHv=3AhY^SOHdSAEgawIGS{q diff --git a/bin/Icons/ui/home/32/gamepad-solid.png b/bin/Icons/ui/home/32/gamepad-solid.png index b783fee792ea8887c02cda1091e28fa56e51b3d2..da1db845267562dada5ca086d3b801d736890905 100644 GIT binary patch delta 274 zcmV+t0qy?S1EKiWCz?U76=QZPJ?W~3OH1_)aap!dvJSheeE?q zlV1Wh7<19M%Vk#FMPoLA6ftDdS|tsUi^lI4icF${nh_J6s;0(k9nT>}Q@TLs4~ zXB}+z-n0M{<{JXLET<2^xM>MIH0#AD-yM*aT*-3Q1A+cgb|-BA^KT1PE5XOJ=#8QZe!BP>#6DXusNEc8^a)EdNTMG~1 z6+D22NK%Pl9nlkL3KJ^}kqCB%_*u9K;qhKJ3FZ&vea-B?+1>fW_htqXB$#(t_=6Oz6qoz?7*j)EeDbc9^*ImN8QsAjNH1r>p(lCOGzpOK+f~XwUbvPIB)`B zX0O0SggzGlnYa`IHQ>wb+du=T58*(uXMGr<&mgH4!P0xr?|MFe1moYF{E5(g2V){w zt!KR!S9LqlG-5n&N_uuAMbf6Ex}+CR#Cz`i>Hyhk1VA+=iWIN~EV=!HWAjGe=3;i| zYW{mD6H%xJK*e+Dz{#V5I*@ecn%TY!pdTtTQHTJtQy2xZ&UQC-rD-&y*=fhq8c1eu fBukKB?(ho=T#>jCB&ieJ00000NkvXXu0mjfc0s@d diff --git a/bin/Icons/ui/home/32/gauge-solid.png b/bin/Icons/ui/home/32/gauge-solid.png index 9853811ae26315e8bc16398ec09aeebd82bb131b..156b1085c1c47f7a9a0bb6e2df59c31524abeda5 100644 GIT binary patch delta 329 zcmV-P0k;0x1K9$Q8Gi%-007x@vVQ;o010qNS#tmY3ljhU3ljkVnw%H_009e0L_t(| z+TE2ws=_c7MQg$NpSYs$p9$T78*$_YGW;F6mhPdTAfo$l*5l)a2Ky3?nwcli-u9B) zhP))z7sCoiM=z}twR*i{MNLbJR-6|C8lKVQy6?!b%Xa@Tf`9v;KLzz8Eq>b&2T(Jz zkf)`pgE|M*OHm6(>NudqbE*{8M^#4zxr+{e@gD~$;agi9z*f{Bfw*i8CLqF;7Vhl; zHx20UY@{UvBEOpk^xjszNd-iHUmTDh!oXR*Gedp|4$Ht^>r-6z3|L%#8t05fKF>{~ zfaNlAFBl${azfzhi`QSd8n;a?Cd)4~b!MV0b$U5l*6OUWG?Z;9gK44+-K|ut+kS|z!>4ByhXC{dobFd(o)TA<%?xxccz3^mkQvrZE5fwy~6VbcSH4*(1 zQN_$Z4|NED0Av8RNXJ%xG!HRQqCLv4oA1#b`)6+6+=S%Z7xs&Xdy^yO-ZH5sq hKKwr>FZ?(D0DFfLaQ;~5jvW91002ovPDHLkV1lEu#PR?D diff --git a/bin/Icons/ui/home/32/headphones-solid.png b/bin/Icons/ui/home/32/headphones-solid.png index e2cfabb07c4eb36e60b39949e46b1d53795d32f9..996ed79fdbe60d32bf58f0816f02455b300bf617 100644 GIT binary patch delta 321 zcmV-H0lxm}1JMGI8Gi%-007x@vVQ;o010qNS#tmY3ljhU3ljkVnw%H_009F@L_t(| z+U?FEj>13`hw%r31Jn{Eq>_ZAa1XA4>ms=W5{DYIm1tB+NWknOIRIw9&C4^L?zBTK z;g^j1&wLqqQ|MXnh2z8tN5Mjb9*>tiXnL@;HU0cZn`0t@Fn{EZ$6VO3V#S6F#&c)b zow(vr6;r8UN`)n^(vAYNZ+;a$drTp5j43~_s#~W%Z9oV97UG=$i zVBY#m#@LjA8A}s+uRxv*5U#HW_(he?043@t9Wb6Y+{U0`F{(%v-0}~8o zWNXK&QUwcD+l3G4lGnwNEH`m%Cs8Gow^-5LyL-N~&jC98GsM-ABt!%xQvmk>ZUI~= z^EZGO01qPaoclHclKDD+C3$8w&LpQgw~6F?`eW}RLMoC+08Rj|4c~VFj{rW^_YHtM z0Er#~z!!iRKo-;zk_VERwyRf?iN!xrJ~=XyhtTrRjgqdaN~*PNWpL-d$$LhCr+^LY zjOz7#$TK~AjYF(s=0iMc#6=AO3oXtuRQaTafQfe{Ne-JRf5~QlhNe9#;PhJ@{e2e! zPSerXR))wS;fGejo#XY(aSG|#*fQTUl1mGBY21Ai?FY0Vc3B0sE#%+2&H<1dSnl%L!d+W<1LsLeQWRlh1oLiU6Ry^gKJ^-SR6ATSegT$ei(2K1^tS*2002ovPDHLkV1kdf#V7y( diff --git a/bin/Icons/ui/home/32/home.png b/bin/Icons/ui/home/32/home.png index 2ec05eab248b7cc9ccfdcde290c54fbe425d938b..e40425cf5c5e074879445cd84f22d2db77062685 100644 GIT binary patch delta 236 zcmZo*{>wN)vYv&3f#GKHrg|X7S>O>_%)r3f3BruI8FPOD1=oAJIEGZ*dOG=NB#Wa2 z>-{4J7ac_=GsaAO>>)9MX_CM@k#o&o|5ew%z7-$3yRA{hYTeFdlLNTye@WWU@op(q zKeS6Y@owjacP=sIO6#lzug&Fn?FSd0@h-LH#fgQY*Pj$jmELjYev`{#VZnJBUzm3< z*|d0nfrl1*F-OkJ^b%{42_ND)S(RIF(O0>Y!O56xfBhe8) ztVB=vFcNpd?~@n^-cMqGV0br)MDW`r62qG%oZ$5m&hV&&C;Uvps+H`OJSj|435+ud zlq2#+Bj7!w!1CCH3rTy&2HZm(4 uNHSmwd;+`3OEwLF@5ucf@BvIK#wiB|K?;Pg>MDx>0000ys7$ diff --git a/bin/Icons/ui/home/32/maximize-solid.png b/bin/Icons/ui/home/32/maximize-solid.png index 7a0a9e4fb6ea026301bf3031eb4f38c11ce57143..42763ebf40b99ea2bbee8c20337ed5632c3e4344 100644 GIT binary patch delta 420 zcmV;V0bBmj1+xQ?8Gi%-007x@vVQ;o010qNS#tmY3ljhU3ljkVnw%H_00Cu5L_t(| z+KrWgX98guhu_#%hYhgU{_80q5Z6)w1#ReG*jO7{)R;ABObqiqbG2UU>-*Wg2e|Kf zT)j`7nQ=ucaW%-WVkoXg@=SA!rzbG9-=RYgXWB*!H6s`Fgnt0WTJXiWe}ofW2~r^O zia&vIBosohqVBjWn3WeSIK%b@W;~V`1Xi4~kIxBOpcNXIf=D6pgy4f`Laa#OYn}*u z0$*Ild!%^dA;Q18;MkWsHX4N8-Z5&f@HxOMco%eyj3J|4HfV+8Ugv;Y>V|*QW|2bT zPB`b|iUsj}a)0T#9Jez0x6bHMM0L7O=P)|-sG@LP=QVw@?HU71st8=vIoojgE~Jej zS=}^MXMuZ(erwJoQQcvkOYRaW%j#qoTHv^-QwU^rTA>AN$Nwr`$_u8{IIQ!&oWPgr z3g5dF2t^Hnm;Fy1h<9ToXv&*6F6hf&M_$}+GfrGx>K*=W%*c~xajWU)1 O00009Q!iW}RC(I|on;z#PzoeNifkZtj%nl^E=e>9DnL7p`X%o0iT%D+w#lngL6J=hZ22nibO90NBWF zdv*jHKo3v~SY-#ig90RA5R%d2I->JC^ zxB+y4mHheVDvVIf52Vf!11o-->tZ}tC;5=@lD{cWGB{v2NTGfz#i~7 z;1fM0)g|pndMjy7lI4R-(z2wli9Rn$LrK>Ic$Xx-k@QZ|Isr=^Nv|nHjF5*oLVUrN z6VZ(zKbF)8kVc)lE7Azjq>!;7rnyq?Izf^S*CyOVUe8wUD3$ z@=_5wycd#QNvb1h%O{*k+RsGHKpqs4!)xdGo>#nvGrv~d;c5vE_c_5a+raG{U!xkB zvtA1>ng2N?J; z?te}aTMj(?^5P;9X^u|-?@rT7I5f?pWgBqrcWy2I53K#2b#@{O0HfnX0f2jZH2^kM z0Im`xfHy~p0sw=Z8UQzm5&)}23E6#o6h_atSlGq{3k%UkOrI)+S}2IvY7-DqP>BlS zAF;48f`W*@!9p7aNs%-bY0{|077MGvR1z@9B0C__WH+0g_rB&8bD8hV+X!e1>Zf|OfYda<;Qm@sPuB4648CWF#LWTU)K_Y!2Efq~<8J`J z)kl-6k8w})MEwC=PI4%S!(8VS@K*f1#`F7St>(f109NNLyWl%D QnE(I)07*qoM6N<$f`*db>Hq)$ diff --git a/bin/Icons/ui/home/32/power-off-solid.png b/bin/Icons/ui/home/32/power-off-solid.png index 21ebad8e69ec2edc2978f18dfca6fb1c2b8e5437..59a914ed7703c5b8001985c0ff904679bf6fdd66 100644 GIT binary patch delta 482 zcmV<80UiFn1@Qxr8Gi%-007x@vVQ;o010qNS#tmY3ljhU3ljkVnw%H_00E;(L_t(| z+MUw_tejgIh2eE=TX9Z!ZCkZ%GpKFbh-%xmZCgQYciv(hPWB+@8UFgPq1X@~F`p%* zplo6d0DF{O90%aCl85{;j)4Q1ucA2kiJ=sY86Yo1`A4zQ27mh_6o5~#ehOn01`UD% z%3&}|W=1m%PVrc{1&(6SQ$pzwpJK2?LZJXiVkQQ^;55b=Y>6xoz?h9)%bdSFc1|Kr z0OKT9Tas}C`xzyyAY(SJ%XlB#C5sclSdM++h;^~*BozQr3Tx>TW3jiBuHZ3jt`D~Y zfGj}(!wzL0)qg8-cVjs8)y(Vbh7^q@M1ZY|=A>}R2OGjIAYNxGv-ki-!#r;c#!?go z`8yh~ViTOFI@VZ8K~%-+B1t@pT~d-biG3(z1y&Lz!eiva4#^PzVDJKp2k{uUu_7oP z>j8*xL_%S{!hRwE9E_eYi*S^eQ3&E${5ZfzL|y!Y3|kcyKuI8io%*~D8Y4kYnCGYMJ99}-Fke;1=O(^$qbX3&LFJQ05Q YKH6XR&&$j3>Jo{AjZ#TkB;N+-aY5uIL%$| z{xkE>?9A>QkqQC`&;`tY0SiDkApcc>C;X9>s&<;{;Ls6SH;zD&)<}BE)lD5wtqhz1 z?up3x3c(F{-G1j>r8B<4-_mFH*VW#p**k1>$I3dt&%bi51c6Hd{pnoi*8|EQ0GCU^ z@2>^y+>X|iFP0+#rG=1EjSLjOQvrLYY%p4JBjh}SO=dvhW{k~$FR|z^8{nrz3uY7W z*!RZv)ez{N0i8_sZ;1?qy5g$^wHv^TjAG5sfX6>FK6*t&ntYTO4SuYVkBhf;*Zh4} z111c+13QobXMD`+tGGvlopT=>{dzj*Y)TJl0{hg)R<6woJl?AHK~3O?+Srw8Y*oF8 zuQPR;)p}c>&vSi$IGGdCUf=;R4RqubZM4&XJ7%*xv$9k3g2lHPACtNbmkfS5qo{)G z1X(*%JpD}^XffmlLoI^espdoDH; zJX4^bz??16rB?yeD0JIDy15s%k zijepQ+yagTbbEoDz*a=}O4&0!9f_ifoT*a10_*`E*5P;&*k8Gm)R7#IOt>+bFFs^y zId{24it84*ARXMmuB0xt;~7LHCt&`oXt2RyD`rUQy8<`XZ>~6_1?|f=jG{JKRyv* zuQibtx>;hgLk`m)g7Nq& zAB!>qQr_5Uu3?6nVT(r+xRf8jRjngMJ*OpH$qPujDos0|lO`_D4!9N>6n$PK5iMi{ za6LET1K@sMCtk{q&41&sf#CJ3v4w-avx#wM9XpC6?fKyu1t$4vXt5JyO+auGcNBbAFx z8H=fi6#(jsJc>Ra0rv~E$!GPHllS<`)P_<-m?U9XR$u7gOL|L7*ev0iwvnQ~GZL<3 z)~LigyUjP!Ff(lR7)W}*Fw=ghuq=!$LaiS!ZQ1?Y+$fQZ;@T@h{2*N|v8lAYugEU% Z-vIhRE_}tSMRWiF002ovPDHLkV1f_fy=nje delta 639 zcmV-_0)YL#1E2+v85#xv0047(dh`GQ00v@9M??Vs0RI60puMM)ks%j<00(qQO+^Rl z0}2)n5Xgz@*Z=?mElET{R9M5km%VEiK@i4&^CF^!LSiC;fboNfA4G^2qQVQJB1FjR zU!sKu{0AhER;<)CDx?zgYI-dMwGk|A)D#j0i5hD`ADcbAjC;xM<;^|K-R@DQ2 zM17YeE#wd|vmzIa0^gmuTjYpVhRz9}CsIiOC!J_aQd<(O5XGtJNE*l`VP=cK9VfbG zW+3TI#(DlkO-S12l@aoIF=1=M-~39>@o^F_fYYU+3tP&{Q(aoqI6&7CIMt#d1mbVp z@Ni=U0=~NM!KMj+{D-Cq47u;+#t4KU9CyQ?n-0QBH~g~d0@(}?Y>y?PR^-x|EtvM0 z$Sr>%d4}VT;8{u5i@le$Ka$qltA0?@RAf^BM!Znk(r-@h+oU}T6-}Qc%Oz4W{$Z_x z#Jg&u;udVzD9H{8)8}B#%hCo7tQmPYGPBL23**59|VVm)i3c;CXI) Z{uhm(jpYWJ)I6y%n)1l?x0?1OXd;jA2zH;mN309?Vv*smx~`vEi3L#0wQusQ1WZuJQl?002ov JPDHLkV1miEXd?gs delta 411 zcmV;M0c8G^0>1;085#xv0047(dh`GQ00v@9M??Vs0RI60puMM)ks%m=2XskIMF;8w z3KkCl%q7eH0003@NklK~BRk5Jlfql|T)LARM4YqQ_{C0lTv9vL^ruj>0uS zq8Df`0a16u#*s`LC$_PHMgGRJJRXn#AAK7}jOc)>uGEdn#8i>%s;aB@tcjzBW#&6B zhZxwJN;ip_-I%=FAqHB1oF~5dNxsQn_uIcM;O%HkgF7^}r0+0ha?gOW@ta`{3qi{9b@X=UpI^x3O|ex@ZR;0`okE%F$xlL3=D( zIWBZNT2F@It8WFj+^sUYO11Lgv-VYIZ0VLFlpUh_L z5qSQsw?Gn_o3{^~Xxd6(NwJQoq2C8wrlhJn)8zoAna@(NGWC>T4(xyG`$Ii&NR;ys zwWg|tra|HHEAIRgHoyX?BX3@t{f$TLYnHb?M~{rijxR;kY)o_1=p+CD002ovPDHLk FV1jd@!kYj9 diff --git a/bin/Icons/ui/home/32/settings.png b/bin/Icons/ui/home/32/settings.png index eeaeceef7de0e2522f4ceccdfb54de9803d3c310..c049ef1b75d107ada2a5cfd9c2093473574f4e86 100644 GIT binary patch delta 349 zcmV-j0iyoP1nmNl8Gi%-007x@vVQ;o010qNS#tmY2J8R;2J8VIbvQKu00AFKL_t(| z+N{(iP{ctL$MN64UB%P&jJrF%;C;BBj)K#X-k}E^dWBwa^7(yn*xB>l`^;=vxA&AE zVO}x45>_Qx$F`wLaD?qxmEacJor+_CRtf!-JdD;hhGjy`0e|pDM52=ive>db(jyV! z4S;!Mz=8g;kBdWnLNws25lP|_S67l4r?5C@oDrw6NwG^78)Qi^qaVzWD9~$1)bX09 zF+qp`eL@6;NaPv*O1+T8HMSW783>rcb}gYFL@^~KWI_^gOi`Jr#dM}TIK@<7oe4aS zu&OUUmv|!~|5j&Y+xH_)cz$L7U=oeEYC>N)a8D>da8Nj@b{9;lT@ow20kDirVu+Tq v(|QZ22BUhH!>$qlk!B9#$(H;Z00000NkvXXu0mjfwvw5P delta 554 zcmV+_0@eNP0?P!D85#xv0047(dh`GQ00v@9M??Vs0RI60puMM)ks%j<00(qQO+^Rl z0}2)oD`1&2y#N3K*hxe|R9M5!m(NZVK@i4&H3`biWLJ~}cvg-;V#LHqSPjS<$b}PJ zmK(?AG0gG~Jb^|N#rO#F=LujpNW#tKz~`mLOcu83S(t_|nM@~L^;LCu{pp4hkTfaj zM1yf6X|fDwMmekj^}u|89ayi@ffu(VGqeL!wNB>o)-(nZbXiMkYs`AHkY{$yTu|^BxnVc zdRHp-6*K?;4e+!=1hs(Tw-R~&HNf-uCe5hw3YFprwgxGs48ote?K@Ay4A_h`4lv>d zmI@6GA20dbNK8Y2beo$d={@lIu1ayfh2NDPKZ@=63D8NLbmKrLGc(Mr3$zm&-!`+3 zncc4|8Nf#e4#cePca`08BI0@etPJNrYjLThJfBpw00000NkvWtM6N<$f+QIFmH+?% diff --git a/bin/Icons/ui/home/32/sliders-solid.png b/bin/Icons/ui/home/32/sliders-solid.png index ca4c75df2337b94c252b965c4d8b6ee1fd0c451d..3b0c61ede5838718e3b4d417169093ee6a1c36a6 100644 GIT binary patch delta 211 zcmV;^04)E^0^|XZ8Gi%-007x@vVQ;o010qNS#tmY3ljhU3ljkVnw%H_005RrL_t(| z+U1ln3WPumMKhg8vh<8%Gv#^=TTkFE?Cs|*EG(uN7{?DH`cfz1|9oN(1+|%$1%Q!& zRYS+0#CmWm4L$K!0~?;1n5muyb1;#pAu*XcK$oDKSU%&2z)YE3aCt7giN5lt-X{mT z1kuDY#_S N002ovPDHLkV1k&%RlNWJ delta 296 zcmV+@0oVTI0n7rB85#xv0047(dh`GQ00v@9M??Vs0RI60puMM)ks%m=2XskIMF;8w z4-^L^45fj10002lNklw(tJezx$S9!dM_F2=B~8IFVH9j$D!nRam!(RF9}7RiAR3PNz#? z4=h?|uD}*pSvU^B(NXVz0_=dZG3IHfMblX*)RGD>4}?ZsBN)Pj&iR+rjbYY~VemNG z1YQ(4jy>UG!an$zblL-vk08d!syC9Zd*W@Oh9qwhmy!}&AtAc0EXhcJVZt@AvD`fY u88G+IoAyBDBN)PjUyI>id{QP1f*V#NzxocG2<`v?002ovPDHK)LSTabrFpgh diff --git a/bin/Icons/ui/home/32/trophy-solid.png b/bin/Icons/ui/home/32/trophy-solid.png index 9d94e14b97209dcc69424bca7f1e1b58fc201daf..fde5c76ef05f1ea0f6631942f01ad4500dfe7db1 100644 GIT binary patch delta 408 zcmV;J0cZZ41*Zd$8Gi%-007x@vVQ;o010qNS#tmY3ljhU3ljkVnw%H_00CJ^L_t(| z+SShiWL0q(#^LuOEKm>%Bn(hZxLE)}j7R}usEx9au`9Tf04YJV21X4DATk1l2oMr< zQy>C~ruKA>NbByN^KXGYKY-82n?FfnPQRhKL>l;{&1ao#O@AyXaU-L+qr}qi?w(Z- zs$MJcroQ#iwL~fgw(DaOr~Hp|aUR^$)pc2kd0ofd1(#wHtfpdIi6g040ViV&yiaNh zBsCwvo+Q43U8(q@RVv27_tY$dE0TDk&9hW2f~6#45`0ZWPn+wh045|g@4)TEQEg5n z*1)U$BD#R7M1PCKeZWEa%`#x#ElnO-1I%VKF97RG+{|W@c&yZPw&t{TZC=`+Q6w>I zV3ZXTi8PYLUOx=mok$TKhx~0^C*^eP^A@mS;DAp4jU)hxYzsh=o%O(!MSXoe8-NA< zI%m?(MNO`zji;JCPcv~=lj*c`*o+IqnQ<&begc98kr6_>fLH?n00000)+ji1Dpkr85#xv0047(dh`GQ00v@9M??Vs0RI60puMM)ks%j<00(qQO+^Rl z0}2-!9spf>y#N3LDM>^@R9M5sm%D3JK@`S+Us!??5aJ_676LXRHjBX`KK=qBAR_iQ z5(3(YvZ>Wl6e}SS3oX@uKnp<-5f=ol6v3d_D8@ooqL|OZxi}7YA9wFyK3H}*GjksE zojG%^=mFbE!uDBUJEP%$i=^v?t}>|KZrh)Loz%k`utSo|CdYb3Z@ZnrIKU)usn=ww z1L3%)$%m<46N$1GCA-X=tQ)?l62YjpB%8g3e50-@ljH9%=XbuFb*(n z`{Y=XXv@IC@H>;y*oC0;5O5=s?`i;VBf&OFPXjG$869{a=|#|gyBOz&Y;Og+LGWJE zOmrQc!@8m>WcvfqEUsvggzLa~5ROaw8RXx9iChjO!TyreDC)qSX#HXo_~Q%*@F*I$ zqw%e{>K*o9bR+qa>*HcfX@uE-7`FW`n!FZd`!hIjB^&W}@-?vCwanWBGYyZX}} zoyLOg)e#Kewmlo`s@#$#z2PMAxmOdDU_w&2UoY6VBP!{R0KNiyhA_St_@3;|1KYAa zW&2HX+#7+WrtL~rHA-#-N}N78!yI{K3i?n|X)c=sxv}Y14m5`3eI7Uf6uhs8aop*& zfi2Otmy+(~$o$has^GaC6r8Bx|M6N5gqyZp!-177b-;EDn2SE!h6$`A>G`0AzX4f> V-}58{Gt2-0002ovPDHLkV1hpqEkpnS diff --git a/bin/Icons/ui/home/32/user-group-solid.png b/bin/Icons/ui/home/32/user-group-solid.png index 114c45599d9f509b07ee22c5ee1bf93ce748fd2d..989f7a8e5fd51bb52923b53c4192c6c69fe72771 100644 GIT binary patch delta 425 zcmV;a0apH#1-Ju{8Gi%-007x@vVQ;o010qNS#tmY3ljhU3ljkVnw%H_00C-AL_t(| z+F}@708r~Z!0MTW0T7<`Mr+o#ZA7(gx3Oy5wqrGJP}`1EyFqPZ%0K;->-(JOX!80E zSlS+T^k0xnvzbp#Icq79jKi@;HIfVx8<^x*Qt)3Fdca+d^M7ZN2+tb#&h>oZ@bGMe z`JKsL0f=3VDlGw)*JONR+#!N2lvcnRCLqjYrvU6|lKcd@$|Swa=mg*c!`^v{FN`}( znD~b`4B8K-?z$OOMj`|p=r(VA!wohC`O1+7H71#)NRi=S@?*D4CcU}eo z&lpu#zVMEwk=PGn8RLox;C$25R=^`hT?fGQT>){3agDLB8SxMJr*VsLp&2m*z_>lQ z(TtcR;BBLh;AS&o3V=6~0>jLRS^&n)0UYU3kEF5o+ae0UDxM6TA9FexBf023!^=}3 Tf_jTJ00000NkvXXu0mjfrbEJu delta 626 zcmV-&0*(E+1Cs@i85#xv0047(dh`GQ00v@9M??Vs0RI60puMM)ks%j<00(qQO+^Rl z0}2-z1)&w-k^le#AW1|)R9M61m%VEhQ4qy{^CA*#1O??0q9`Ip5G6%G1TkQtHhxsv zSqP~u)FS=`K}~I8D+rb%qWFOkjZJJ55R6G0H9|lH6D2>JjVzn&dv}u!D4u4Qy>srI zoxO90h5sEC?E>Vb*^EbvqC zI?rhoG<;jb`RPjxJzOdvA|@;5eV4o6Q9*2XSp@)YR}e6q`wCNk$?g|1-A>_LLI;ek zz)QiK6ffAK&a~KMr09eh??Qrr{V86sbiJfLR=;F|?x`nQ*|2)8Me_dSVYHN_ICN45 zk=g{V0)4;&@EjNdeq?9hFCWKCZ>jDAjssoU(m3!aBIepvBEQ}$HcAo?0JnfmCHubz zE=RPtWiKCXEO6i1mJ0n0v_h> zyAtAGZit8*Y6ox*SnZ$2Phcn_Mzc=n1;(=HWiS3DA_i;ysre`I8_?nt!)7=uApigX M07*qoM6N<$g7pd%;{X5v diff --git a/bin/Icons/ui/home/32/video-camera.png b/bin/Icons/ui/home/32/video-camera.png index d8fa8dfaafb514a0fe5fbfc24ea2fc672537a99e..976ae49ca0245133cf578d40162f0a92f69a24f5 100644 GIT binary patch delta 184 zcmV;p07w7g0?7f88Gi%-007x@vVQ;o010qNS#tmY2VnpJ2Vnt~!??Bp004VQL_t(| z+GC&^7zO_s|FitB{=fSFIvjA~e^q?i8UCyPCk(Ri8S&viF+c^?)d;5Pf8xLduxgI~ zjsL&@|Ms67VL%{}1}y&X_J1p!7mREGIUsPP88B+Vr~!mClQ9W}*_rYJh2g&%r9~R! mf9C&HcnZ}CK-*~rMgagqmnu2kk#`IL0000F=_%q7=^#LrqDDNwrPW{7Ul>^z$&yXYJ z3JH>{#44!;tC%X!W)>E41ImaB{|5s*GduI%{0z*4AUHCrc5Dl108cBNlaqy{ z4@txH0#1S7^fJy)GLQh=WDq2RfLTP`GQ2LcZ={)ioesDId0Y1)^WiIlA Q1poj507*qoM6N<$g0^ag`Tzg` diff --git a/bin/Icons/ui/left_stick.png b/bin/Icons/ui/left_stick.png index 101b99cb170ad267ae83d33153fbdfdf647af792..d4302c58e1e4de5892dd31ae3cef8a2cfc6dedd9 100644 GIT binary patch delta 1747 zcmV;^1}yoo9@q_#8Gi!+002ikWo7^X0K-sBR7C&)01*)p5D*X$5D*j;6cZB@6B82^ z6%`Z|6ciK`6%`c}6ciN|6%`c~6ciMUjEswmi-(7Yg@uKGe}8#-d3bnuS65e6RaH|{ zQ&Lh=P*6}$Pft!xPE1TpOG`^iN=isbNJmFUMMXtKL_|YFLw`X*K|nx2KR-V_JUlr$ zIX5>qG&D3ZF)=SMFDxu9Dk>@`CnqH(B_t#yBO@asA|fFnAs`?iA0Hnc9v&PV92*-O z8X6iI85tND7#9~878Vv26&36z<)Uek)5urck1seB{=G59FUaC>Mb_}8uBLZ*3 zm_=f2;{`FM^JPqn5T0XO8L}OZFs-kJF~IY_v$S%xbbow&Z19C(TCm$=R*4wG8Mms2 z(MJ@j4bEmq+N{;TAew%y5+mx1(6OKo*XJquE`gjd>YECbM#S)J`0Iu|N8$DZpYb9} zLz@xV;n3rS+5zK4#%NONf)Pf~E@MQnUcA3T^Tj&u5--qx5Qe^qFnxsVNIsMp%#$f)3(BGP?SeXPlX;>CnJINYF>*DzF{MQR@2F_nnUI6) z0U6>_UELUkx|G4pT(TuNc%K`{N+v6y7Q8e{bS5d!flSycFO;DScAF@yYok=>RASVV zyMJs~n!*QZ+uDR~4GmqI&{~#`@TZyCBLM9F_ zVxxG*sT&aAYl(ghWMxeaO-*3_EWnwux0P&NRfAkA`LdCdUIH>e0j~})Dy>S8DIRm-?xBbWDc>2+Pa8dARDw{xY@FpR z<-E9->~*-`yyNh#3PIbyAFdzPUVJZ=Q4gSa2#YcTteQC{dOaX-SbCxAD z^`+HKKw25E--l|D`;6CbEBhj`RevrL=T#t6TW55!FSy*b)IWN7;t>T_;WF&emrYrM7qEl!rciEm8P^mD8qUGXH=VDY zJXt&wy3|b;r&2%A#&u(WQ;S%D_s;AMq}?pxtSE#74%Ny zIET}@mFY^j#Arnw-#q3Tb9S$ea4=k1hHxZzT;O3Qfmop1X%=F7V=8gbJi^PLdf=_X z*RTcmd#SsWH5a#LESr-dYk#pGD47T=!$CVaQ@fUESnCuX`F;u*t6Dn zkRc8lW3@|%slGC>4KxOwuP*$c(QsdP^b88O$`}?0Lv#F$mc$U<38G-;MTohJEeHnb zXv1PPly$%oV{~sm%R`7#!nZu^%t2Ahy~1N|L+{v!p&?T)z?mMTQk!v1qe4ZXB_e^;r476sbC9!5p|Ohu{Xs zESRw>AIF>WHTwiu$4tBOap$Owd^f^?v?B#P*0}q11k@h#LJix;5|FiFE&+Ku4X4!| pjCew$LAM3MN!3(T`r&VV>vulX_Svx$1bhGh002ovPDHLkV1irY6jlHL literal 3888 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

<=(N7K} zSsA##6*n>8RK>xow$b;e`54NAY6(C0#St(eNQ3-^f3N40TN*0I2w zoF5J1Da`Sl69fBu8EaYU)NEvwk2i6XiC?|-W5H#>-$3}DK6N^F-b&i3RPiNqY5=~2 z&MpFS8u0(AUV-Zaq8|BiE!g22os1EC0XHsrl~W(e9s^(Ge)=^#^4*HR9p+m2A$S-# zp0Qm19d}o-1a+bwm*ZM|2;CP8CIKI4^&{<-+uwrg;J=sa)BW;H@DCWZU+2-aG7-c_ z4RL6ps6V2SV zkWQo6=i+o;XTX8qv`=ptxbB7cw4t*e0et1<_>Ma?Ho=zhbl`C>1~!cN1aP4m2$TqZ z--3r(TssGyNcdw-+xh2T;w@)hIUl>0e-|Kal0VKBqP_=d1Jph>4aet&zT`(UNd@g~f;8xMT3ZkDFZKlbG7cjL!+7ya{HK%dcf6n|4>4)9MM_tZxE z^P%B9@V~(IAg?bY);rJt30CR#nDjYJ!q8zi`cTkl(Q9-#R!@f{K)6YM40!U3pzfFY zls(hWar^`4kT>lrKX=rXoKpkuv>YVUYeKGjArXXp+WR$-P0LIja~ZH3<3y8hk3 z^c_?GxYjJvSg&M96z4-Rjk!q$`A5Cq8*op_bsbM}6I}`%;Kg_s{KMDJ+W@)LXMOsV zOAkh$1w9qUOY_8>d8nNMUJha|ebU{KIzF7u3$h1BcvTb5sqTb)+F)qr~@_bJ&zgpb04>wYMcA;Dz z8*RRv`x9(Sf8Z-?>On_e32wFRW^jrebm>2_ribQ%PP53nPrA2*g@N@P-}O>+@XGT* z@wgKYJNkycXMFW(R~wH8={sB6)=T?}zP{}kzG8DlJDIR^1SAfFyA z<@SDX8tA#etFgzma6PGrhpzDNS7+|66JzK~#xEE}`3nT6Xo^a(=|G9>8 z{i)|dzbSqjYsp{302cr`^)Yu*aDOf*JMQIYSfHQEsqs$#{WkXb?PhK6sbp^bH40bQ*4 zJGt(z8EecpU$egpAg?=th)3MXX z_}#%Xz;${%Wd>b;H?kj(NpkN04}B^9A4dMYK(5aL7lL_3^wH0PNx;LyG4e^;Q>mY$ zJcjdVTv{DG3OtylZ}^U@*r3wG$yJ_7AwgKrqWOnAU)}^20eGq>4Ysaqad~NAu z|F*MHZtwL;l%GzKn_85c9ruE5*JIljr0G8+x6kx!84UfY#O!_Oh zGrrB@dT$0!ewOV{zS9q7ivE2I98>t>2${a9hK7?1oG}}{<=_K_th~wAT(uRgqs+j0;yzB#SeqxkKx-QoIY*(7L-C8 z@5jU?2aWzBE$ffxeAp9d8@71b_tn*~w>7Qw6?I6TF2{`WvTVHN!v@j_Zn1HPPmN}h zYb!p^({~kL0V{EE9lGLYjAwy){5O3giOUE8F@7p9>)U2L3A)Gc?k2x+t!8^hJUA8h z`2~&eSL@5M{CbGz)0FC+q3FZ$|fACTZL*Lni=b4B-S8t9#G<-FmyHe*$x9&QrTC$9>C;P zj{UF2W|I!2I|eSJxlzIIi5PgzUktY{@?o17WiKc(0G4RM_!J9hC1+{_5}7UzdHo5c1jnwC>5T4lV zQeR#9Iq|U9X)kQ1hOFnb3g0rKX+%|&A~}p z^H><1`ekI_ETn5VNl(4rX+N z&@To)^`WEg9%tVL=ob}(eg_N;7#J`xU|_(&fPn!60|o{R3>X+NFkoQ7z<_}P0|N#I z3=9|;Ffd?Xz`%fk0RsaD1`G@s7%(tkV8FmU!NA6gTsW2gllGY@TW+@FJYmqlhyeow z1_lfa7#J`xU|_(&fPn!60|o{R3>X+NFkoQ7z<_}P0|N#I3=9}};WEHqSp3(&-n{FJ XUwhEDZ`f5DrfjwSmS=6g=d}M1%lyD^ diff --git a/bin/Icons/ui/new.png b/bin/Icons/ui/new.png index ac21f0e9e6ea9fe3343901c399147037aa6cbc95..ee3273b2e2f4573aa29f6608c2580631f3e0401d 100644 GIT binary patch literal 6345 zcmeAS@N?(olHy`uVBq!ia0y~yV7~yu9LzwGwa-kvffQ$fM`SSr1Gg{;GcwGYBLNh2 z3h)VW1=9a1103;}+JL5rmIV0)GXw;OMMcLXC70K>cdS~oWB23dFW)?S&;bH##ROqh7I3Yw+sJWEyVbJ?GYxR{viu0R<5ygmtr`Ow(Flv?j6PtybKO6 z7#c1xGAv|faAJp&Eqn|dvJ4PXz=}bkgaJZAl+s26&{Uv3aI+Ck0y+ceFt}rY4ud;} zHX7*SUAP~B9))`v>QVZ77gvCeCI@)P;EXItrlDnap?m6wdm1f64*ulOz{ytj<`A0$ zLqns&JH6lQPYGDud3&KIhy_?;0818N8Ry6jLU2A*2sW;E(gR|P7s;|Gw83K0RVQeUF0yZ&$ElXhAa{)6DF~Io{At)cN1jL6c zAx{exjF7G_ZD@30U|=kG%gpuVe}0_EP5YR+GkzWcRgQIzFBlw{K@Dd}b0I+r(VAtr z4D7(b8nH9j5G~jPCP8tCoU?(U;d>ZSX;!AXQ~^9(^yL37 z4&hZ&RiUO|R%N{iy?S9agj}^SJk)tTlx&L&<=wjqLPC_1tN~~$+yzq67CGeq#UiLlXa?j4)y>LH#e&2Hk zhufT&s|!{{Du^gppQGJOBzN#Fz@Lq@tM46PJO8rvIxTtl$9n6+Nj4H_$|cc1y=SjI zVxx9_l4=@^z>kaVGsOv4cO4OR|4h0^Yf*oD#~HuJlGHdW-{TfB`QD zcmM|QfD?cRU?6IMOhhe+B4BPrCL$AO&BPAfj?$U60Nx)WJsAfi2N)nZW=)R2(;{_) z?XBhe_TmHyk*%t8vfN$RJ6^%oDhVya5g+z8?XQhgd&3!jb za__|iSh67g=U51ijvCFL$T&7^$f|zQeZA=Y zl@jC8BYZ{Kwq|7=+wqp8nTfx3=m}szV89+3-~kx0aD)e7z$Zy~00!`Y6MzR`AZmb2 zL@kIS_}1L$zPwAGN`i(4Chd1*mnaR*zJ};zog5SG7D_7gI)?oe(zo$Yi diff --git a/bin/Icons/ui/right_stick.png b/bin/Icons/ui/right_stick.png index 374f589bf9c23971b215a74b08609ab0d69799c2..d0e32caef40443ec7e52a46f4edcac9c46c5ed54 100644 GIT binary patch delta 1987 zcmV;!2R!)FAjS`n8Gi!+002ikWo7^X0Uc0GR7C&)01*)p5D*X$5D*j;6cZB@6B82^ z6%`Z|6ciK`6%`c}6ciN|6%`c~6ciMUjEswmi;0PehlhuThK7ZOg@lBJf`Wp9fq{R2 ze|>#@e0+R+dwY6%dU<(yczAescXxJnc6D`ibaZraadB{PaDQ%YZf$LCY;0_6Yinp| zXlG|hN=QgZM@L6RMMXqJL_6 z78Vs16?{NJ5dZ)H4|GyaQveSiFF#LTZ-0-Uzt7+Aw}pV^000I_NklkD&o<(8MJRynr_q7ot;du$jQlVOZ) zC&X0FjVUpNZR(mpx@j{^>3m@{aR1C4Xo(t_GhEilog)m`Z5vvK4207@YcRPwqTp>X z$5W>9h=2bJqN(T3#0dJrH8tqent3tJECw>&pl{AVDFh4~ZtIroCCHte;u<@k6r>q} z9VWXyRa0Qhz!*tNo-o|t-a&|PM*Wi`sMjBbU1A59p1OpRm-k~9+&K22QSU(gMF%~@ zgT?`6247?u1CpsJV(4=OUfsTpD^5w+vJ}E_2!F$*2sK3~z?g*M5K0!KPW@o1(hx2H3=z|)Z!%!BaB1usuJqzVJrrr6jDrYA-mL%s2h7* z8!OPp)}G3%??vxy<1MEv@mKUP!T0Y(cVSEVFzZyQ_*oE4zFw%*|PH z!hcY`x?hQep{rE;KnO7VDwR$se(mcibzElVksdTus-2FKsLrNJMf!iril!`t_^vz5 z5R28-rjn{P8cf$>wm81`iGd7hvK-ceYf6TeDdoVS2^%Jb(xkyoB89b~WNL*gG4$kA z>`IaNKy4eT(3T>hH5D4s(jop7g+1aR5Pu{K3<+(pgwaqOVXw4dn$CB~Zby;R4&N<0 zil-gh0eN!`(60`ytR+QK9hl#Bux1Rrxk|BYAx@VIWL@EPlj-)|C$GOmDXUy4F3oyf z&?H0Z7#!JCBD!%UqNm?P2|J+mGmN)Np3jyc?hrtjZhsQhvBBpnAM3;!t%@EEB!3A4 z-B)<+qE~2@&SL#o17GK|wJw4@o$K*~YXRj$tXYsR9XY8*APp4o(1!_23y`;puOCkd zNDD;07V&VR>S

Kcf#iN!9jCMv4^^U-G{_6$$urSnd`R1I z%GO980y+#-gplWRJ$rPEuP!Fsh^#CCp@Q!h4!QC1;vtVdDHjE~e*HQ@y!fg>3qd;K z>Oy5*<>G)k8IS^7)g(&zJBj6y0*OkPuC>v93k z{ZoO&%gP`IX>tpshRtbm$G;+>ycBOHG;V=xW-j%eM99xu#QV=e-;x!jwda z@+RmMktJRJp;e7QN`lAlZZbr%KVew|}^7QA=8Bn>)ItUsa^FOgHvvo4XSKN1MKk(gKs;4BPC> z#w@`D*hG1=P_|?l8!QksoQa2TJYQ3~ve+uLCYvnCW}hN_btuvAVDRq_`^z$n&K}!t z^B+@2 zi&46EB=ADB*@1vO1C%C4&^Qx-9HW240_q<14ab9~!KH>Pdw)y=_u(WCtWq_@b*B7* z6Hl4yz)X@6_E1B_V4V4k(H*kWMB5b*rtFM!=$_}SvCa;xsEqN1OWe#J8yeLqj1%=> zc9G$TE?qi3%q%Q$ENdHC=cP#1Vh7BQmB2A9XORPD9F@1jlk(9oAY&AsmA5Mkoyb># zA#$cnju)z3Jv=`GDmT4UHOq?k4oKm$x%K&OMswEJ9tBRa5FTT{J{sc=@ VkxwZnl)wN0002ovPDHLkV1hs{br}Ev literal 4178 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 literal 26456 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 delta 1809 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 GF6uv{xXz^j literal 34763 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 Xj=Fj5^^canE60vJeZ-@~rrh{{8SXBg diff --git a/bin/Icons/ui/square.png b/bin/Icons/ui/square.png index 0be20e14c9796487acbec23cfd4b516d70833794..09af27a6ac588d6d9d97d1469adad8bad75936e6 100644 GIT binary patch delta 1554 zcmV+t2JQK|8kh`_8Gi!+008jvbEyCT010qNS#tmY3ljhU3ljkVnw%H_007lcOjJbx z000pY5g8d78yg!K7#JEF8XFrM85tQG8X6lL8yXrK8X6iK8ygxL8X6iJ8yg$Yj?%}9 z$-joduYR$odZ~|YkcVoBZ(eU=Vq#!mU|(NfUS3{ZU0qyUTz^|zTUuILUshjPSy@f?iE|#|0A8m8~lR}0jylV`)@BiztIdMX_Cu8zO*Ozaf+3C zQ$%RiD@A?1a=k5LY1g&v7HS=lK&M(bRInjJcpJhKA%ALxLj>z0V6&JE-4MgcVj}{w zJFNsEucmG+(^U|DIh)0n@Y&8`FP7naD|{Lmj2ayX&RpX8@s3{+{O<9^C1w!qq$VG$ zxSQj#mxn9!S1kMC75_Tl35AjTo-~mYgbckn_!Gk4AoWR#E#Kk-f+u*qcg!yP#3eiK znLg~%RevmeqxJVCo4(@Ml{`VvVh;ZWhgqiL%3sy7uUSo8M{gwm1B0e_dlc{eaRd|%V>qgEd8Ov#bM6LF5zx;!eMe(W)|RNAj2R~8vh zg(;&C!FqNIZ<6g-_?SF)ZJq&JX+9}UA!)@Xdw-^CN5wPXnHb32ThHoEiYd>E-z8LL zR3$<&i)N2B{XSBThE2(SwlYQ?ik-bu+S}3kp@n49Bowo1st0H}!xdi;k_Dyak{`sS zeB@renkwu0h{>G_TmJJoC(gbn^7D*?bGe)^GW1=@CQQx{c8?R^KBe&Gngf}lE6O?* zCx1+Csebw#{QQ*44-WcNom<$Xbi<^4vrjqkJzerUCr(2)=>$M4`6xfl(UEkNOS?^Osjuy0&pK&jXf$K?f z3oR*#yefZPBkoIG$xB4OmQoe;AeHY|#DA?LiO4DE4Jp~i>-~f>*OTNuKj&lW9YTWF z`&3`@6fe5cLUufC4;T897pBRji09`=Np6sxzP@B1FVM!9RQ-I3x6#&=MB6-(B1=Ez zRce*$q@ypXc2#Pc)xWpo|B?oE4ffHxWYjl|Kcdu2w3pq=&(W8ZG2YUSR@}FZ`+wi9 zZD5~3bF+T0=B6&7>YDRAwBR|lU{yt{4{j6}$j(aDP;@&x)|Irdl>3bw2f>eSx-VEt z95))&F>REQ{?TB$KN=W_T;;qw&^f>i=$y5q!!<=t$1J8Jc^*1u#T*8m!zJy|VXz*) zMNLpgLDJ7Yrzw6uz?%-+|8O$3WttMfct1=)x434Oeqd`6m}GY#t?KhJ?E*Mn}4*97)2D5 zMjJ{qbr8`%iYgk(Bb^u9l(2-%JIs{u*Zo+hmNa-$nwXgMnDdUHKYy|AT_`3DpYrX{ z=n2EI6-2X`%T5{5!|ZyoXAOIZxs*GMQe7mX z^<|2D1y*BdSMoVc3P$~nY`bnC%lhO?Ms<%-O1JkLOS5c?1s68$01E&B07*qoM6N<$ Ef~ilvvH$=8 delta 3373 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 Hu0mjfy+)J3 literal 2606 zcmV+}3eok6P)~GHZoO{l>1~eLtMx)VaG#ZUYqtR$I3qWBq4Gs>zDxFRr18_e8FmoP2 zVS0Kxf9uw*iTIkg`UoY65aKiueWKMhW-b6I5K-Q7oP4oZ{7;kyt~NpmVp-NL00Tag zk279zbEW+gxmd z5D}Q;(TSN~0Z>?tHW!;9n>KAirBXq)T1BN&LAhLp<2cbB8joaq(%v@N`HrI7Qyi_WcM(>H)=EhMU zhnADgbwm);G+|j548uUVT*mbDG$tn}F+Dxqw(MH1))1$YHrK1G3LOz-`}XZfr_=ND zRjbv8IPS|2s?Aj@l`u_iiEDH2l)D#ft|Nl%+_}?tSyNL}jovdkIf-()+%}JEbM814 zr_H(Ra!X}%OD>3)nVFfUUgX#2Tyf&IIRJUo$D(f7Tvr6CR;x%RlVPd?0NlQPyGfv0 zt+r@-$8nnOhdO0*omf@qiXb;`+yD{5Fbu3&v!?M1OH`YyR4TDex1lVaGIJrS&2>$X zR=5JGf5V{Kocp&OuFbg?7xQfH3^N}K(|f}ENDS0!wI=&XBoa-%$gj=y_4T2zuMYzQ zb2|dA&A9@3ZO$+Zq*5uQQYip)s|xCrJ1q6Rq5%N!3z~OH1@YoIPUDMlNhXsGfegby zB9ZV_R)2p#`uqDE;i;*qrpbcW<`RiSL)dle)&W3cq7cUBh-k0x#0otnNGn`Bac5g$ zZ7!WoBb`oTsX+ajjJ8LowqajWZ zn{&Tx)#k2Txq^v_&fOcXNI|@~Ha9af17LP{Q|(1TY;N1OZMbylQrnx;u=wlCD-33C zx=HkNW9gDiCSjUp$J(|kdI&JrE7WOp7_MEr7Tb8yiWMtJB9Uks*u$=+xdVHUJ)J15 z7(vuKe8Vt8FT(^~C-ctmqOxoS33~_crQH&XmrkyM0n0>?u(KjB?%lb1^Vg0JZicm_ zCk2Vy{};Nk^AhJiN`2oXFg+oNcZD~s{kZ<`3ee8~JGj$0PDJkwlW|D|QT;#4Mpe+A z#O1IT-xWdBFF&mP_*tFx(&V`F2;<#LU%>i>S0AJmN>cLo#}y?$!GBZ8DlB}`0A zG|u+6n|^ldxsv7Z_*}=vki~j|Yd`KwKY2Ar#|QOp*bi3Fvx%__(&5FoWo18Mh)t03 z@$sHMqPbj%O^_hlpsmoq05Qu_-WcZfZ=}qpTY{`g`w2r>LGl3hE_AUM9~E0Jg#LM^ zR4SDxqWkMnd35n9BaKF*(P%UpjV2hOro9W5H8eCdoJ=N%iD&@8O~-KxrBZ1u#yVC! zaR_1xA-)FSqX4$Hxc+kh-?wf1+?Fj{QjX(X3R(dX{ZC5yCU3lDSx1@qfEzBC%Wu4X z{rc_2$`V361z_I-m+ul$iJ6Pc{Bp5ad=|jndcKbUcp_-q0sPRm?XUVx9BJu92(cBw z^8ofNl59VK{g!2Y5x~<#B$zqqVXVI|5I+LoUN>Nx<_LgOKFYgyp$p8s9RP^v!}T_Q zT1xqwcKPBW(gQn0bOMWu;ih{+N_iqmU0!mz+{c*twVrxD9%miQJj~3eGnq`Ted>4! z-9v;BdzkqHp6JH`oOc|@Oe7LJi0Cn9z96MM>Ly_3qn37KDg) zt6vlm9hXubQ+z2AtEv1~-CLzRoJW*BKw!iJS?p8#xtc)69=9}IGQp!

-*|m>L$?s6gV>iN8fD+;@lG=_GAUmO663NjJdqB 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 XhrH%4C>HRG63}CL)rUoLrf>c);)hRU diff --git a/rpcs3/Icons/exit_fullscreen.png b/rpcs3/Icons/exit_fullscreen.png index d2f5a46070ddfea0384fe5a80442d030be0348e6..acbf1fbfe2588702c1bd8a0b751b86187990e4dc 100644 GIT binary patch literal 1452 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&w@L)Zt|+Cx8@Zfk$L9Q2q)CGrpg=OO%0u z(JsIz#1$wx3djzDT*I(-pyteyAirP+MkW?kHg*n9E^c0aQ895TX<0c1MI{wgHFXUw zZCyQm14C0Ya|W$lXA3S;b^7V%=-+uo3=g}c{mw|zKzNd?0NX4zUcbm`2JBl2* z_}e_|cG=@4+j3iuzP`5Y?t*XM1iMbAeLp?#Gt=t(=X@$a$pJ5rI3eZirXqQ-k7;XL zuZPhV(NOc8r`uGb)mY*&aeDlo7#FbFU(0g(d(2LmIFKX9B6#~GyV)~&PJx?)4r=IiH! z*UywWaHF+b?0IIEy4D)ow8C{_zJ2yTk`;x;`Bu65y*S$&Q@i)y0Z9hNDXk!%P}Ak$ zpg}S4$FFChJNNc8)mHpob>&`7=O<7m#s!|Oy}xz$nKGX~rrx_7c3;`1<3CTvs-oy* zZwC|a?3g0k&CP-inN$yS3se>pAL;KhpRf0V!=kwcxdwdqaxEFG>XHJ>9x?sk0r zJ^9UCG1gfdYU?MR4bBQIJUj96r7w#d=3aa}spl0Nu84t&8#Mf7EB;~qLqiJ#14v233kHT#0|tgy2@DKYGZ+}e3+C(!v;j(R7I;J!1I@ky!i?`H z?h*wGvX^-Jy0SlFWfIoX*vPM^2^5knag8Vm&QB{TPb^AhC`ioAE78kKEm1JhGte`% zymD<*3Il@xucwP+NJZS+Ylhtavty5aTs&v7oa-EufGI-OT|u`3yjEziZ@I`m!8!Tm zlF7}_t|W0t@h)7{9Ubt(SwQMZLo-Js2cK0-cQcDw#&`L5AKAD5IlpvIy#9`P2d49X z|NfT;=!}5|fA-r}e>=8$yUX`yo5SZ{{IqJby+w72aO>WeZ%&#s9GYj-G~fF7^cVkr zzKKoW^5^1B`#H9|IuHH(_on}RTp^o_Z6(XT@^AMq{{8eu87TkrX8k;ne4N$q2RF6P zH>@b1SNs3X_KSaiy*X+eb+7*0<<0Kqfj9Wi+tsKsDEKgNG$=7DFevzsGDZVoG$oLb z3x3Fccyse}`ufc$@0EYMbaS!$A_K+?A^Z*Ub8Fwc`I_E;kF|PN_1l}p>6Q9({(ilA zf8O7@d*A$i6!}w8gu(YK!;hagr=Pbg{q`bu!}8txEvw&0-cvtcSM+W6X7~22Zzk#t zvtBVK-2VIMjd6M<(}8Ki48CA;I>UyiEDn=F3elOfuV!30dkj4B@u znIVw~zFyqCes1maH@nmHKmU9CW^ekIJq6!-f%Q}3w=Lh_ZuXzUNZ-2oL-jlT^ZQD^ zo!y*2bMKkozi#e6pHcbyraiDi<=nh{Z@ty;)tmSD&-?r2jd}Wh)9RVuUvCx%s`!7? z|GeDYmYbLF>7TPJo~AyUEk{eB;aCFI7kzuV`TXsac+1~6Z!T8W^dGF@^`8?0M zc_p}MdQmxW21CXw_5+|M>95|4+fD7-nVZ4Z}EHni@MTp7mcI- zJ$iFIy+3c!2KhO)FMJprZbY90)^6`F{(XIO{=AEyRBHB@eS4wC_50P$>T}?(Wcjyi zo6B3i-!hJhEB@A=-v4glhV650>p|lJ0}cK!PoMWQ{&QEsO6_jjZ6Mcpy85}Sb4q9e E0FYuHGXMYp diff --git a/rpcs3/Icons/fullscreen.png b/rpcs3/Icons/fullscreen.png index f75326efa390c2fabc0260c10cb073259f6ca365..e7bf0c9d9cf81f7ed101c7d69f6b5fd4b35c0ba7 100644 GIT binary patch literal 1143 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&w@L)Zt|+Cx8@Zfk$L9Q2q)CGrpg=OB5)$ zBEToa6-W;WpmX1&4d_sdk|4iehLryu&h`t#?v!QU%Hia$&%Y3u`+$#~k)x|&3O`Rp z`#b@W&6E0OO0=Eap}h3bwZ+?RcFN5bG_0+7=4Z>mz-;L0;uunK>+N0Fuo6RohKr|u z-;FISpKlA?hZk;E%nLiF zXSF)@$t1=PM>riAI2afe7+4w@1Q?iLoC7?92o8!&0|N^hA4wZ7nTEY@r!M=pc(c5= zudLkJ3Wlv$mU)$!t@Yijaq)V}iO4ukA-j6XqPXA8Xzq9?htm~A*h-E|!Fn*f@#n|P z&+o%kKD>N=eopU+pMSNVzn|~%z`u;y?x+SM18(r)pYyp(>pdP^KF)9XUn$+_iOzZ# zruqAMEZ6(;KmW)C3vCShs3yaR7N9JIt$J|!`_E-!i#E6ZT=wtp?2imtD}8+zZw|Vx zb@AHijMpZ&s$}QJ&Z}m6$3%wN4EXh6I@a&h3D@+mlKKJ+1V906rs)-f-S<=sK?*%x L{an^LB{Ts5_M6bP literal 3961 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4Yzkn1=x}&cn1H;CC?mvmFK)yn< zN02WALzNl>LqiJ#14v233kHT#0|tgy2@DKYGZ+}e3+C(!v;j(R7I;J!1I@ky!i?`H z?h*wGvX^-Jy0SlFWfIoX*vPM^2^5knag8Vm&QB{TPb^AhC`ioAE78kKEm1JhGte`% zymD<*3IhY*c25__kczms*EVwPcpiD|p+#oL5e`|a(vKWAO?+~V-hBsrRcG&*Vih_2 zpks`R0LLRijz^k1Qnj{}2>7e)`~Np`^6sbQu?6!F96tX0uN}yv0}Oub{rEh;KGp2j z^ZYG;pWgnOJL9jw@0Zcn&fnW-Ed6$S{+8O`Wwp|2_DA+ro)%)*HiyB1;YJbDfgBUY z28In!SsHF;FflMDoaSWMe36BL>A*B$hP1_;3@i=0>I`Sxgc&#(qWu_V^r|rkfb<$j z`!XmnH|9`*DH@g`QOk<~kY3#=L{r{_ef4%+HEKH5z(C_~3 z_SL^9`hHsuOl{wQsqNd}_v-okYj)o|c8bNJB7T2uMFT^YUFGkePz}Ni4pV^%>Up5n zC~GtfM$^Hd$_pLr2k!6tn_m&Xul5&Pz~_&*#q+PEx{yCfM>lVK~Y+e9v zLmbcl|D$Yg?^Mo)4|QL^UA?{kR?7bmZny96kGLlW=$ R_|5~l$J5o%Wt~$(697y7K#l+a diff --git a/rpcs3/Icons/grid.png b/rpcs3/Icons/grid.png index 128e32adf969cd4a85d2e13eb699b43c83d1355e..7cf12acb0abb1cb6199f74cf44e8a450769a5e7b 100644 GIT binary patch literal 4807 zcmeHLX*3(!+D=PL2W?N#IyIe=QYBOkY0XLzGcg}St2KofO3b8#mKfS1gc6h@5}`^A zF$ATmrnZ8Xk{YU-)J#kXSHHWy^R2tqz5mZz-+kBG>wVw->_7Widp+;7HrmqMkniZ( zqW}Pa4{D@u4FDY6FAoBEx%SiR642ZIbR^KoF?b&z{os95~3uedsU`?~$X&j`N*3dFnSHzkuNBGeW zTd1vV?XNpJ-*mn0e%I66*FW(7!^c6|(D2Bo&!b~s#wX}sC#R-ozRiB0`@vxToL^X6 zT3%UQTW4)-Zf)QeF@OPqI%twN0T z`}vK9zDh)>3k&<+N?xddTw#R~iHwP0)q%yV^?db#0a6nMbepJmH`SkXCzN5bWaz9-t}wd) zN?ef2kx_UL7(&0T|N2hGwY7=wbDYre$d$NfAVfo_T@GS23W^hG7mt{kj9RQ&p9$(V zXMY!f$mgVI2oo0zgDcQU2qQL6>UM=ED}9g+8(Qga|N(N6BL znlTGUa_KkH0x%QRMrd+MucVeZwKKL1sz=jzI0^1(=mmQjxd&S&~Nb+KC zauzefE6E8G21Dz11~Xbe@?Sm�lbKf+44GWpln0xhk>Hkf@O|t~S}CPMa+iGltGs z^K6%Tph3Zj+Z))oiFy6RW3ngLI^L@-mhsd5B_1_(%MPJW!hl21=w#CcOpae^+|>&5%mRz=53q#9I=l6*)fy@CP zaTm0?O&Jup8*l}^X1_yy>ztP{2)xxusd{D5dpx(|ag(BP?{No$|4e@R|1h`v$)Pud zy3brm;CRI@{NmaU;?$pte-lge|1xTOe7?~E=Mei! z=pqS8n@daq5el=fBA@RrVT7D^T#!@3(}U|$V0-D7xj$0ptBgf?C!AoW87`mkCu+uR zrAoFf_-OaozX4sg1{tj@gV$;r7qE=hFMJ&ik@N^gYg7jC0r@l@`MGol-O#&?gwucc zD2~jtPLut+Gl4v)J4K_c*A5ofE;K_)jny{SmL4_b+4np<*>5Cg%>%*Pwx#iba@S~0 zP8s=PtiY~VQM|307uLiyF?5S!JMRYhHj zwBS|^zy5w{Yik_TG=Eq(c z;BC)Q%zEOBQ?82-7Nf%!2yyCt!+kqnCyEY-TPM)o4vO!%>*~4k57ka>j0Aips?Ekf z5YE?RzTmgeSjNE8*A@lMTiC1R0#lWTHu8f$qNPFV%NUeYUI;_9dN1u7x3+883e|0@ ztlJ{G&>T1^{cb0~bd9awjrwJj{$mu>jNP4-OjoW6_@1mkX}d0>A<_L%^6&5mqSl3{^!iwgf>|4@n z@-_E*3+63azOFFSaN+Cc$vg<>bIXjEoo3?lw#P>I!ha+m$P*}lKZ&RM+Z=OhiJ7`9 zZ=E0}t+nS%lu~eD{czz=I&Uyu8a+tJ5<3FfI7ZZwhN5OjQcpk#iQ9 z7-oQTVi}{*{U3N%7UXbX~h7f{JccWyz3E8@{{PVM<7V>Jx~7lHNh&Omhg0 z4wy<@ME^bzU8K}6Rid#9c)2aPuUdbp(_h6u)$H%o-gN|^(6T7bdE$YME+It#0v1%H zc}l54H3&2&?^!c6R7X{Lno!|q1v%|6@42l-c-*9{-@BGmg(mEDG4yxuUskMHw_tR9 zY3{I`{hF&*g|E~Pjme>0iZWCjLK*Z!3jqi3AIL656x7Y+~M9OcjXefp?<#y~hZzCHPC(@Q%fKX*nABuSBw4;PlbdhRFEj0Z=oZNl(X9{_Qs05U z-I%RCLOj$^>_%69gFP6cww-d71lQg95@srB!sxbE~~*pyuBUlt~^zJt3Afvv_;2v|*^-LgFw?9VZN6&utN?ZHV+ZCW5mVeGiCT_%o39E<+f7ad3n}=IoS}#S= z^^Q($(5qRQU7lLlrH--1i$V-EXXVdsb-@qhlna|_jf494!c!!GC>8Qjk7y<6G;vBFBn#)R-5pkq3}9- zFdR0Sx9(6XoST51i2}qFYLPlFmPB zdiIdfA?$;OZ`w2T0}+ObHC-A=_ijaZ{7j7w&Oz0#a5Uf^WqH;}5f&Y5j(a<9E8$7e zBKa%hKvrgD_K?_d%ifSim}ms0F6#$}v~M38^^tlxl&WZ1MWq`AwUtp`#X(dmB^9N{ zAOWZsCH-wePbqcUP8s<$WI@A#5O)7ReOD^0)AS?W3#Nn_-%XHf>-i{+Q5$cf}fl9I~$|6GAyL16!>tT1gk;{-fBFn z8lCkcB42IA8KpS5;f0ipqUs}QK;-nGN~h^o2IH+{hI`45FvFnd5OCS1oz&JE1G4)fqaRhv(hPXQPleCP9jJAsv^IUmN9t54uf;C|`VUbvQ3S zOo7vpq8(pa4aaB{!6;*q%Z92%1l7zG%Bv}E$1K^voMNYFy(4;nVaDfAdyviGBP%#1 zpz$J>_6oaWeBlRLyUYbVvhg$vBUp&LWT2+%Yz^m`W4d z@YHjie=ARI#Kzg*nF|AFp5=8yX*CqZ*@w=53?)l?Z%2sMU6asMAA4;5tq literal 9395 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 diff --git a/rpcs3/Icons/open.png b/rpcs3/Icons/open.png index 354171345af7f41ba6ccc8f0af0a7dec58ea1886..f33cb7b4b13c51fc9dce6fd9a0694d0d2b291257 100644 GIT binary patch literal 6160 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 -x*4eMzBvLx?)aWt+-h6urH(`Hh_=!7D6&e$ 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 diff --git a/rpcs3/Icons/pause.png b/rpcs3/Icons/pause.png index e5a22b88ca6275eb169ddcd3ba5c77b5e28f4849..9b2df58036dae6327bc3200e9765b9aa97a6cd55 100644 GIT binary patch literal 2972 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 JwY#Fu{SN>mG*18k diff --git a/rpcs3/Icons/play.png b/rpcs3/Icons/play.png index 8675cd3b6958539181634fce99b135e4d35ea2f7..5abba54de47e9e03c68aedb918609d3451ee4241 100644 GIT binary patch literal 5049 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 diff --git a/rpcs3/Icons/refresh.png b/rpcs3/Icons/refresh.png index 425e147eccf250ee5db5eb47a3cff8507a6dad14..a3f45b1ca2f5618f4f0dd14f4d40aca474d65b74 100644 GIT binary patch literal 8218 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 literal 13725 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 p54Nbr%k}?%{?`HzhC;$5Xk-K4;^5Zd+)q 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 Ar~m)} literal 15262 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 diff --git a/rpcs3/Icons/stop.png b/rpcs3/Icons/stop.png index e9ed61ea2c8c10ed3a4d2805f8cecd8f45d83b99..7ad63da242bf25ce041f6d91c05e3487d79bf809 100644 GIT binary patch literal 2102 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&w@L)Zt|+Cx8@Zfk$L91A`nGGdj)C5@%pw zToT|D;tG@;1%o^U3|B^E0G-%f666=mz{teR!pg?Z$;BriEFvl?B`qT>C$FTes-~r@ zr*CL%VrFh>ZSUadE-R?7Z4Z{79JIwn3SBBonKH`Tv}dT+tSwF+0)lQanjWJ z3l}X}x_s5T4V$-a+qHY|{sV^&A3c8J+MbEZF8+<4qTLpxw7qJ&#i5LV{U)j zdfql(?XTKJwU<%V{SU?eG2a)%9o8$(#%y}FTzB_3`9F^=Hl)ASe?9HoD~_Y9&i?p% zB>wt)yQ-i2>OXWRKe)X5`1kxj#d){yL}>(m|7FZ?-yb@0efFaFKbQ7i=E`1hZN|Qj z=UhZR7iHPrG+w@V4qH}ias6&1ATtIBFB(@(71_v1--m`d}vcJ9}o#Wy_apI4^Ro%P|>d0EBvU%y99%u$Qa;kCRP zeka?#sOq<~^7Ehn-L)r$eoZJfzW?`sioeR{kM`5ei+Jn4?ay#8dTqIPgI{0YOhjQH|rjHYKIQDLKj@n<>$GUK@wMwY9p%}N* z*Ld3{CZE@9O>4RS*~!a$-SI^qGIKpL&)$s?sWNMsQdcF?edxit374i#->A_e!>9SS zO1}HhkChWH{reXovWi=AX>;>Noft8PASMR}4hBXA29^c}0R|?DIUc@LHO_(IB_{(T z)m%4f918`}%;fRnfP)U#)uR(G&GX-=vE^Lblx_RETob=|c)Xl`e4_@>TTacjyXCu` z-angg>5}wDjhZO=pjlu2b-3P(wN9}*=X<0n;O;vv&)nDDtP5*3mY9C8)ZtL>c8=QW z9je2={gvXz-nAZvt7;XuX8J1~t=O%zB<%L(E|H{9SFTLBGbekZlg*!Xf|Fj~xF@Z7 z=)=aBihFMz(q8Mqcx(Iq{5GCl+wHU6H?6jln=4qf;;j9@ggxngW)--XpIDLn`nJ|2U(<>W#!tQ;ZvN<@w)VNT zm2+C})%tH+lqEx)uLIS;nRVKK|C|n$>;Ec#9)B0maBR`u|KCC;ZfVPxkG(0{6)=C> zuLoy0dN@ty@2|CAEa`P|#;#W%E^AHl`1 z1y2Rf-urw1_4!q7?#D_$h=#1axbU9;`#kxm82+QH&PVS~eEu+4T<`PISexpU^UuC^ h?*di$IKT(rpYp~HYtNSoZVCn|@pScbS?83{1OVj(Lt+2` literal 4405 zcmeI0i&K+V7Qk;3FfItx>K1|_&|RwwS{|kH5)&S}$gBv9Y}d|WfCh|~N&-X(BuE0PspZc{~#Uv}=h5J9oImI&*r{CETcqX^8;z2t93i?k@dT z^po$G0zmkAqLP|Id|gHyhZ)ZCRsl}K4!kEl$jz#AG}#`7^Zv%C%w6Q3)c-i`cq|jDj zbLTrhXTjaD1x|qv!NWBXt-MaVM#+o+V5Mg95QUWQc!5!t>(vV+0ZllNzq-)VxKn`o z;v>?29|9|6@hdGw`=oe15u+I_tdZ(uh43C&G;+j^q4<$PTVl;xpIX(X_Tu#+bnCF5 z0zKBh##Az;^$xjXjb~HzS)eHPGBzfV6{YFZp3??v6O%U~o?}L65g3K`Ry>Cf79LO; zyr?1q>x_7JYo{oVNaV&gzrx1kus+og-?Kh6-F^{(_LZEgVvVZBT>dq!kTPL4T&rdb zJ)d$Q<2>gEBKM(3*qQOX6^i;hFwYw2r6b5oA9}I=tty&;x+@*qTwzh^p=g`_h_lVd z4fx9DwR zADx@A8^!}tus9IF9@Z!__KyH@>okR=PAa8_&5om$Fdf!-wbQ{)q0kb6r1hDYSgASlj6%>QA`mo z1^a7o`r)Pc!j8Mtx^9?tLN4f1>bIriE6tG#K&N z;Jkfrw9;-}jEU<2^wD|kKytxAg{=}FkOg82T7J`4(Q((FrW@dvGBQw_7SrUHy}JO& z+>wyyN-M#b)^H5q-$Z3Jp+LeY_}yawf(pRi^8nPp13V%DIEe$*H~{YK;(x!rZTm>J zZ^`z<*-i@Ed2+jSY?sCVLsC%u1*XB1C>Lls;)(HD@>=b;#Xn)wO_IQ8SHtCD>x(VQ zGRo#^Mk`HL`IbtPiPGMCe}a$`xW#as{*sQn2W!IwTMWm^pTLDIKQ}FI`Dzg?e>_^L zv1%k#e85>CY38`Cj%kOIs|PA=AL0YDT^3TU*t@~pWEv=D&{3Ka1AfM*p$sxz?`bco z^9~32jc1a|4#}SdoLf_qs2%)2=o{f^uLjGiNngyUcfl)(kWL7pg<)21H8;BhSNL_7 zx*D%95`}~oSBU$7;qo%mAaOp$-8Z^1#}zYigaA6Q&NFq)M=n%uM2W(QQQ00qlZhyu zgH~OI7L`n$PKHJ9R)Ye=Sw{iQzi0a#JfbS13m5l|`LI+A_rVh%mt(*^GnGe*6GgER z(v(?BEKtT9{89qlKxo~-VfGkvXjSEmG$#JUuceegOUz~hpgYW`RtG~JJeYhy?tURf zdJVS7CTr0AH8J%{&QaSMl&f#6iWYFRpCTxiANwuHX`}fg)fv9`bwZk;Pd15l=dbn5 z*ev&*+%?OD^NN_ps)VhNtp8d4Taa{PmS$&(ovKyc=a54_kdE!A*>aVUb;Ja)J{wks zG&_k);&KGhbwh;{ZrRbQ7*`|l5ub$t-|2tuFOVB8oG0owZrsXJ4=J#}(arp_KCG?} zo~-fUBVC-wES`d@)!jq;iXDxdTI2#tagr8jMrWaaAXb%8rW%2A9+_#zbeOE>Elap7jZvx%=Vo;ZEHD=GKN{{SX}-A(`i diff --git a/rpcs3/rpcs3.png b/rpcs3/rpcs3.png index fd8c4a82b791396b7a7cbd16fc8c9bcc55d3f9ca..aa294825c202dc1d211fb8332268bec24143ac6a 100644 GIT binary patch delta 1136 zcmV-$1dsc?45JB+v`G zyt#o)=n>}zP%A96YBB&dK4ImdyWMx#*+;BgbK$X@+AltSD;H9Rf8?TuwzH2|vFear z?mh@Wh0y0%e6W6O@XW(reeuF$w^BBG#-Xn~Q(rYSkgO4=VVG5C9J=Dw3y#@J+3e|u zyz(4?N}&lG`G@WH@bTv#y_MYH!MoglxRnVQmbqoc!NZ6EH&|KH=WqbIiMx}hq_8e< z?h#ue=N_?@+~7G!e{9*|_2kqix{-JE;5|p2bNE(rlYJYe3ed?zTPTWR8 zPzENg)c4BA@#hbQ-)|~v(#$~H?_q>?#$h-7m!Z^*gn3e<5sqY(SNSo0VYNB~BxQgI zjy!tX=lH)UF7@H)v-_i0-vZbfHl`FSp8gRIWY1lwqb-6>D}IGcMRiU}S3u4{MvTP> zGK{JBLAG20f5T)LKdl@x?SDk{o&%~3>~UxS1BVp>b{Lc}E`-Td)u7~P#Qb#_R~0GH)G(~%HI zItld2$JF^%-~>kjjknP|ulxjO9r{*s4|@w|r{du~f1YFWrVBp8Z$F12Gj3{`Mu^oJ zKq$n8k^iT={1y=ptepUY^V$4ug>qoGEK4dfW)+H830J6o znNw#%Z#}8Dci2uI%aYWEKnz5Hx|8d!m#4M%e^Ku%eNqxY0>D*Tk@pDcmyXvvh!C^p zvmc_+@11XL2SACdP`T@b^>6GkxtZMHE)&)^0jRLQv=q!4{^aSqPi!VPID6QmCjiKY z4by8D)+`&lcH?dnnkk!II(GGHgL$g}n2_){lrI>tbj;d~yN++6Y;?((HEU{1XY>W& zW`_fQuUSwtbI6mYEgiG|^dKgl%wRaWszOsjuY=K1Ra zfr?#*2}fkeVY$AV0DuasCKDPM)@{|BVLd_v4*Utj(AMwFy5%7N0000RA@uhnQLqmRTRhX?CkFB zZl9DsfR?rtN@0pTD?R}AgM<(gpZh_Lrtm@07$HHH#0Ot6CK_X6qKTTQ38)|BgW`ig ziHbZ-z<|XT0z?AkQA*ow>4SD3vpeHCcjoTS?A~2klWwQ~=GU2f?%DR7z31H9&I%;6 zaL#{WTqjc+pc>aS@q!Zp3Gf1Lms4^If@4yWP&HMH#Ue4djR0W-OeUe!z}!Gl^An$K zC@-md!R_)ccR0i%uuaw~XsQ|?h$^F}yMvc@@A>J~gJ2s1qI4Ey4$NI!xnkDSYv29E zBNc8iY_?J;Jh<<>1KYQD_ME!~Lz)DZ3%!5BJ6*Er$*;bI;MW^A+sWzlENG~GciZxAe@v^leL=(K#GnVHk62O0z z;5phEIGZqbTK`~4cd$J)a3cX~;MAI(VHxNv07}cy?ig`T*%D&HKPB8t=KJMGnzps- zrgSyGR!DxqAEuLKcd}N1wx%2oX z(+UU~DK3$S^2!?vi6n{KSP~fiW9otaV1$H2aSIV7JT{^cm5UOENI05aE|E3sD!8#Q zSO&BQ?wRM8A6oW$#vYhR6-{%K7X$UAW-cDANp<{thkW?-8jcDugZUtz>fDCNnL}r$tF@GcVcAMmNqhYTQMx@YB{MVkhuqN zsf_zvtFI>lr*q62Pbx+kC3*l)ZwuhW?xSHC~N6Kd4v$UixwhxgH-aK!N()EAqsepW~o0Sk` zl#MW~0PYH0f>AiB$3SnAJ`?BLhDgizT{I}OX3q96qUxkYxme7`!=y z{R#1h1d9Y z*XW0|y@0a$z4gkj&BLK9yIG$p2n z&Wwbw?KytorM+=AG6+Wekeezs0TiwZeuU}sNwd7A1x@%sNIx%fFSU2*uc1)%)+pR# w&C|xk2_{|wOc*qh%_kRveTQx|NQwyg4-Pt+ja)Ttz5oCK07*qoM6N<$f;9N>_W%F@ From 74f3349b196cf8dff77757d90bc20573a5eb6fdc Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 13 Jun 2026 02:07:43 +0200 Subject: [PATCH 22/64] Use std::string_view in overlays --- .../overlay_friends_list_dialog.cpp | 2 +- .../FriendsList/overlay_friends_list_dialog.h | 2 +- .../HomeMenu/overlay_home_menu_components.cpp | 2 +- .../HomeMenu/overlay_home_menu_components.h | 2 +- .../overlay_home_menu_message_box.cpp | 2 +- .../HomeMenu/overlay_home_menu_message_box.h | 2 +- .../HomeMenu/overlay_home_menu_page.cpp | 2 +- .../HomeMenu/overlay_home_menu_page.h | 4 +-- .../Network/overlay_recvmessage_dialog.cpp | 2 +- .../Network/overlay_recvmessage_dialog.h | 2 +- .../Network/overlay_sendmessage_dialog.cpp | 4 +-- .../Network/overlay_sendmessage_dialog.h | 4 +-- .../Overlays/overlay_media_list_dialog.cpp | 4 +-- .../RSX/Overlays/overlay_media_list_dialog.h | 4 +-- rpcs3/Emu/RSX/Overlays/overlay_message.cpp | 6 ++--- rpcs3/Emu/RSX/Overlays/overlay_message.h | 6 ++--- rpcs3/Emu/RSX/Overlays/overlay_osk.cpp | 26 +++++++++---------- rpcs3/Emu/RSX/Overlays/overlay_osk.h | 16 ++++++------ .../Emu/RSX/Overlays/overlay_save_dialog.cpp | 2 +- rpcs3/Emu/RSX/Overlays/overlay_save_dialog.h | 2 +- .../RSX/Overlays/overlay_user_list_dialog.cpp | 4 +-- .../RSX/Overlays/overlay_user_list_dialog.h | 4 +-- 22 files changed, 52 insertions(+), 52 deletions(-) diff --git a/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.cpp b/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.cpp index f96505ea3c..d925a9b542 100644 --- a/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.cpp @@ -14,7 +14,7 @@ namespace rsx dlg->callback_handler(ntype, username, status); } - friends_list_dialog::friends_list_entry::friends_list_entry(friends_list_dialog_page page, const std::string& username, const rpcn::friend_online_data& data) + friends_list_dialog::friends_list_entry::friends_list_entry(friends_list_dialog_page page, std::string_view username, const rpcn::friend_online_data& data) { std::unique_ptr image = std::make_unique(); image->set_size(160, 110); diff --git a/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.h b/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.h index 3d5ec9dbe2..5d07c349b8 100644 --- a/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.h @@ -26,7 +26,7 @@ namespace rsx std::unique_ptr icon_data; public: - friends_list_entry(friends_list_dialog_page page, const std::string& username, const rpcn::friend_online_data& data); + friends_list_entry(friends_list_dialog_page page, std::string_view username, const rpcn::friend_online_data& data); }; std::mutex m_list_mutex; diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp index 94e70f4c63..c1b1585e99 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp @@ -5,7 +5,7 @@ namespace rsx { namespace overlays { - home_menu_entry::home_menu_entry(home_menu::fa_icon icon, const std::string& text, u16 width, text_align alignment) + home_menu_entry::home_menu_entry(home_menu::fa_icon icon, std::string_view text, u16 width, text_align alignment) { auto text_stack = std::make_unique(); auto padding = std::make_unique(); diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.h b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.h index 88e1c53324..5a065fc177 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.h +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.h @@ -31,7 +31,7 @@ namespace rsx struct home_menu_entry : horizontal_layout { public: - home_menu_entry(home_menu::fa_icon icon, const std::string& text, u16 width, text_align alignment = text_align::center); + home_menu_entry(home_menu::fa_icon icon, std::string_view text, u16 width, text_align alignment = text_align::center); }; template diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_message_box.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_message_box.cpp index ed42f4f815..f906283987 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_message_box.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_message_box.cpp @@ -53,7 +53,7 @@ namespace rsx return compiled_resources; } - void home_menu_message_box::show(const std::string& text, std::function on_accept, std::function on_cancel) + void home_menu_message_box::show(std::string_view text, std::function on_accept, std::function on_cancel) { m_on_accept = std::move(on_accept); m_on_cancel = std::move(on_cancel); diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_message_box.h b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_message_box.h index 4540484efc..3e04c26840 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_message_box.h +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_message_box.h @@ -11,7 +11,7 @@ namespace rsx public: home_menu_message_box(s16 x, s16 y, u16 width, u16 height); compiled_resource& get_compiled() override; - void show(const std::string& text, std::function on_accept = nullptr, std::function on_cancel = nullptr); + void show(std::string_view text, std::function on_accept = nullptr, std::function on_cancel = nullptr); void hide(); page_navigation handle_button_press(pad_button button_press); diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp index 224aace848..65346cbedb 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp @@ -155,7 +155,7 @@ namespace rsx refresh(); } - void home_menu_page::show_dialog(const std::string& text, std::function on_accept, std::function on_cancel) + void home_menu_page::show_dialog(std::string_view text, std::function on_accept, std::function on_cancel) { if (m_message_box && !m_message_box->visible) { diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h index 67ee03f66d..0db5f3245e 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h @@ -26,7 +26,7 @@ namespace rsx struct home_menu_page : public list_view { public: - home_menu_page(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent, const std::string& text); + home_menu_page(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent, const std::string& title); void set_current_page(home_menu_page* page); home_menu_page* get_current_page(bool include_this); @@ -56,7 +56,7 @@ namespace rsx virtual void add_item(home_menu::fa_icon icon, std::string_view, std::function callback); virtual void add_item(std::unique_ptr& element, std::function callback); virtual void apply_layout(bool center_vertically = false); - void show_dialog(const std::string& text, std::function on_accept = nullptr, std::function on_cancel = nullptr); + void show_dialog(std::string_view text, std::function on_accept = nullptr, std::function on_cancel = nullptr); std::vector> m_pages; diff --git a/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.cpp b/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.cpp index 278510e8a9..01b0c53042 100644 --- a/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.cpp @@ -14,7 +14,7 @@ namespace rsx dlg->callback_handler(std::move(new_msg), msg_id); } - recvmessage_dialog::list_entry::list_entry(const std::string& name, const std::string& subj, const std::string& body) + recvmessage_dialog::list_entry::list_entry(std::string_view name, std::string_view subj, std::string_view body) { std::unique_ptr prefix_stack = std::make_unique(); std::unique_ptr text_stack = std::make_unique(); diff --git a/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.h b/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.h index 0c910e1311..eb107a4823 100644 --- a/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.h @@ -15,7 +15,7 @@ namespace rsx struct list_entry : horizontal_layout { public: - list_entry(const std::string& name, const std::string& subj, const std::string& body); + list_entry(std::string_view name, std::string_view subj, std::string_view body); }; shared_mutex m_mutex; diff --git a/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp b/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp index 5d2d5c1bef..19a1e752e2 100644 --- a/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp @@ -18,7 +18,7 @@ namespace rsx dlg->callback_handler(ntype, username, status); } - sendmessage_dialog::list_entry::list_entry(const std::string& msg) + sendmessage_dialog::list_entry::list_entry(std::string_view msg) { std::unique_ptr text_stack = std::make_unique(); std::unique_ptr padding = std::make_unique(); @@ -336,7 +336,7 @@ namespace rsx return {}; } - void sendmessage_dialog::reload(const std::string& previous_selection) + void sendmessage_dialog::reload(std::string_view previous_selection) { if (m_list) { diff --git a/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.h b/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.h index 508d296fc4..ef506bb0d6 100644 --- a/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.h @@ -15,7 +15,7 @@ namespace rsx struct list_entry : horizontal_layout { public: - list_entry(const std::string& msg); + list_entry(std::string_view msg); }; shared_mutex m_mutex; @@ -29,7 +29,7 @@ namespace rsx animation_color_interpolate fade_animation; std::string get_current_selection() const; - void reload(const std::string& previous_selection); + void reload(std::string_view previous_selection); public: sendmessage_dialog(); diff --git a/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.cpp index bedbf652c7..9cc5a5c1e3 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.cpp @@ -221,7 +221,7 @@ namespace rsx return result; } - s32 media_list_dialog::show(std::shared_ptr root, media_entry& result, const std::string& title, u32 focused, bool enable_overlay) + s32 media_list_dialog::show(std::shared_ptr root, media_entry& result, std::string_view title, u32 focused, bool enable_overlay) { auto ref = g_fxo->get().get(uid); @@ -291,7 +291,7 @@ namespace rsx return return_code; } - void media_list_dialog::reload(const std::string& title, u32 focused) + void media_list_dialog::reload(std::string_view title, u32 focused) { ensure(m_media); diff --git a/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.h b/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.h index e2656d728f..110058e7cd 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.h @@ -39,10 +39,10 @@ namespace rsx compiled_resource get_compiled() override; - s32 show(std::shared_ptr root, media_entry& result, const std::string& title, u32 focused, bool enable_overlay); + s32 show(std::shared_ptr root, media_entry& result, std::string_view title, u32 focused, bool enable_overlay); private: - void reload(const std::string& title, u32 focused); + void reload(std::string_view title, u32 focused); struct media_list_entry : horizontal_layout { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_message.cpp b/rpcs3/Emu/RSX/Overlays/overlay_message.cpp index 1c49401d02..cfb642b02b 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_message.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_message.cpp @@ -95,7 +95,7 @@ namespace rsx return m_text.text == text; } - void message_item::set_label_text(const std::string& text) + void message_item::set_label_text(std::string_view text) { m_text.set_text(text); m_is_compiled = false; @@ -338,12 +338,12 @@ namespace rsx return check_lists(location, check_list); } - bool message::message_exists(message_pin_location location, const std::string& msg, bool allow_refresh, bool compare_id) + bool message::message_exists(message_pin_location location, std::string_view msg, bool allow_refresh, bool compare_id) { return message_exists(location, utf8_to_u32string(msg), allow_refresh, compare_id); } - bool message::message_exists(message_pin_location location, const std::u32string& msg, bool allow_refresh, bool /*compare_id*/) + bool message::message_exists(message_pin_location location, std::u32string_view msg, bool allow_refresh, bool /*compare_id*/) { const auto check_list = [&](std::deque& list) { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_message.h b/rpcs3/Emu/RSX/Overlays/overlay_message.h index e8cb1a3285..4e3caaee6d 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_message.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_message.h @@ -33,7 +33,7 @@ namespace rsx bool id_matches(localized_string_id id) const; bool text_matches(std::u32string_view text) const; - void set_label_text(const std::string& text); + void set_label_text(std::string_view text); private: localized_string_id m_loc_id = localized_string_id::INVALID; @@ -126,8 +126,8 @@ namespace rsx // Stacking. Extends the lifetime of a message instead of inserting a duplicate bool check_lists(message_pin_location location, std::function& list)> check_list); bool message_exists(message_pin_location location, localized_string_id id, bool allow_refresh, bool compare_id); - bool message_exists(message_pin_location location, const std::string& msg, bool allow_refresh, bool compare_id); - bool message_exists(message_pin_location location, const std::u32string& msg, bool allow_refresh, bool compare_id); + bool message_exists(message_pin_location location, std::string_view msg, bool allow_refresh, bool compare_id); + bool message_exists(message_pin_location location, std::u32string_view msg, bool allow_refresh, bool compare_id); bool message_exists(message_pin_location location, const localized_string& container, bool allow_refresh, bool compare_id); }; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp b/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp index 428c68a541..fce759f18f 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp @@ -467,7 +467,7 @@ namespace rsx m_update = true; } - void osk_dialog::initialize_layout(const std::u32string& title, const std::u32string& initial_text) + void osk_dialog::initialize_layout(std::u32string_view title, std::u32string_view initial_text) { const auto scale_font = [this](overlay_element& elem) { @@ -1096,14 +1096,14 @@ namespace rsx on_text_changed(); } - void osk_dialog::on_shift(const std::u32string&) + void osk_dialog::on_shift(std::u32string_view /*str*/) { const u32 max = num_shift_layers_by_charset[m_selected_charset]; selected_z = (selected_z + 1) % max; m_update = true; } - void osk_dialog::on_layer(const std::u32string&) + void osk_dialog::on_layer(std::u32string_view /*str*/) { const u32 num_charsets = std::max(::size32(num_shift_layers_by_charset), 1); m_selected_charset = (m_selected_charset + 1) % num_charsets; @@ -1120,7 +1120,7 @@ namespace rsx m_update = true; } - void osk_dialog::on_space(const std::u32string&) + void osk_dialog::on_space(std::u32string_view /*str*/) { if (!(flags & CELL_OSKDIALOG_NO_SPACE)) { @@ -1132,19 +1132,19 @@ namespace rsx } } - void osk_dialog::on_backspace(const std::u32string&) + void osk_dialog::on_backspace(std::u32string_view /*str*/) { m_preview.erase(); on_text_changed(); } - void osk_dialog::on_delete(const std::u32string&) + void osk_dialog::on_delete(std::u32string_view /*str*/) { m_preview.del(); on_text_changed(); } - void osk_dialog::on_enter(const std::u32string&) + void osk_dialog::on_enter(std::u32string_view /*str*/) { if (!(flags & CELL_OSKDIALOG_NO_RETURN)) { @@ -1156,7 +1156,7 @@ namespace rsx } } - void osk_dialog::on_move_cursor(const std::u32string&, edit_text::direction dir) + void osk_dialog::on_move_cursor(std::u32string_view /*str*/, edit_text::direction dir) { m_preview.move_caret(dir); m_update = true; @@ -1371,11 +1371,11 @@ namespace rsx m_title.back_color.a = 0.7f; // Uses the dimmed color of the frame background } - const callback_t shift_cb = [this](const std::u32string& text){ on_shift(text); }; - const callback_t layer_cb = [this](const std::u32string& text){ on_layer(text); }; - const callback_t space_cb = [this](const std::u32string& text){ on_space(text); }; - const callback_t delete_cb = [this](const std::u32string& text){ on_backspace(text); }; - const callback_t enter_cb = [this](const std::u32string& text){ on_enter(text); }; + const callback_t shift_cb = [this](std::u32string_view text){ on_shift(text); }; + const callback_t layer_cb = [this](std::u32string_view text){ on_layer(text); }; + const callback_t space_cb = [this](std::u32string_view text){ on_space(text); }; + const callback_t delete_cb = [this](std::u32string_view text){ on_backspace(text); }; + const callback_t enter_cb = [this](std::u32string_view text){ on_enter(text); }; const auto is_supported = [&](u32 mode) -> bool { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_osk.h b/rpcs3/Emu/RSX/Overlays/overlay_osk.h index 2d5fa294ab..b7015963c0 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_osk.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_osk.h @@ -111,7 +111,7 @@ namespace rsx void SetText(const std::u16string& text) override; void Insert(const std::u16string& text) override; - void initialize_layout(const std::u32string& title, const std::u32string& initial_text); + void initialize_layout(std::u32string_view title, std::u32string_view initial_text); void add_panel(const osk_panel& panel); void step_panel(bool next_panel); void update_panel(); @@ -128,13 +128,13 @@ namespace rsx void on_text_changed(); void on_default_callback(const std::u32string& str); - void on_shift(const std::u32string&); - void on_layer(const std::u32string&); - void on_space(const std::u32string&); - void on_backspace(const std::u32string&); - void on_delete(const std::u32string&); - void on_enter(const std::u32string&); - void on_move_cursor(const std::u32string&, edit_text::direction dir); + void on_shift(std::u32string_view str); + void on_layer(std::u32string_view str); + void on_space(std::u32string_view str); + void on_backspace(std::u32string_view str); + void on_delete(std::u32string_view str); + void on_enter(std::u32string_view str); + void on_move_cursor(std::u32string_view str, edit_text::direction dir); std::u32string get_placeholder() const; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp index 2847db969c..cdeba03496 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp @@ -7,7 +7,7 @@ namespace rsx { namespace overlays { - save_dialog::save_dialog_entry::save_dialog_entry(const std::string& text1, const std::string& text2, const std::string& text3, u8 resource_id, const std::vector& icon_buf, const std::string& video_path) + save_dialog::save_dialog_entry::save_dialog_entry(std::string_view text1, std::string_view text2, std::string_view text3, u8 resource_id, const std::vector& icon_buf, const std::string& video_path) { const std::string audio_path; // no audio here std::unique_ptr image = resource_id != image_resource_id::raw_image diff --git a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.h b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.h index 0c65379153..378c3a70a3 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.h @@ -14,7 +14,7 @@ namespace rsx struct save_dialog_entry : horizontal_layout { public: - save_dialog_entry(const std::string& text1, const std::string& text2, const std::string& text3, u8 resource_id, const std::vector& icon_buf, const std::string& video_path); + save_dialog_entry(std::string_view text1, std::string_view text2, std::string_view text3, u8 resource_id, const std::vector& icon_buf, const std::string& video_path); void set_selected(bool selected) override; private: diff --git a/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.cpp index f534ce5587..6b98a667b9 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.cpp @@ -9,7 +9,7 @@ namespace rsx { namespace overlays { - user_list_dialog::user_list_entry::user_list_entry(const std::string& username, const std::string& user_id, const std::string& avatar_path) + user_list_dialog::user_list_entry::user_list_entry(std::string_view username, std::string_view user_id, const std::string& avatar_path) { std::unique_ptr image = std::make_unique(); image->set_size(160, 110); @@ -174,7 +174,7 @@ namespace rsx return result; } - error_code user_list_dialog::show(const std::string& title, u32 focused, const std::vector& user_ids, bool enable_overlay, std::function on_close) + error_code user_list_dialog::show(std::string_view title, u32 focused, const std::vector& user_ids, bool enable_overlay, std::function on_close) { visible = false; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.h b/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.h index eb2498a032..06400c27ea 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.h @@ -17,7 +17,7 @@ namespace rsx std::unique_ptr icon_data; public: - user_list_entry(const std::string& username, const std::string& user_id, const std::string& avatar_path); + user_list_entry(std::string_view username, std::string_view user_id, const std::string& avatar_path); }; std::vector m_entry_ids; @@ -35,7 +35,7 @@ namespace rsx compiled_resource get_compiled() override; - error_code show(const std::string& title, u32 focused, const std::vector& user_ids, bool enable_overlay, std::function on_close); + error_code show(std::string_view title, u32 focused, const std::vector& user_ids, bool enable_overlay, std::function on_close); }; } } From 5bc128e085ea2ce5148ef5bc4ce4fa2319f4e64f Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 06:19:01 +0200 Subject: [PATCH 23/64] Use std::string_view in midi handlers --- rpcs3/Emu/Io/RB3MidiDrums.cpp | 2 +- rpcs3/Emu/Io/RB3MidiDrums.h | 2 +- rpcs3/Emu/Io/RB3MidiGuitar.cpp | 2 +- rpcs3/Emu/Io/RB3MidiGuitar.h | 2 +- rpcs3/Emu/Io/RB3MidiKeyboard.cpp | 2 +- rpcs3/Emu/Io/RB3MidiKeyboard.h | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Io/RB3MidiDrums.cpp b/rpcs3/Emu/Io/RB3MidiDrums.cpp index efb1283c1c..88ccb17178 100644 --- a/rpcs3/Emu/Io/RB3MidiDrums.cpp +++ b/rpcs3/Emu/Io/RB3MidiDrums.cpp @@ -313,7 +313,7 @@ usb_device_rb3_midi_drums::Definition::Definition(std::string name, const std::s , create_state{create_state} {} -usb_device_rb3_midi_drums::usb_device_rb3_midi_drums(const std::array& location, const std::string& device_name) +usb_device_rb3_midi_drums::usb_device_rb3_midi_drums(const std::array& location, std::string_view device_name) : usb_device_emulated(location) { m_id_to_note_mapping = midi::create_id_to_note_mapping(); diff --git a/rpcs3/Emu/Io/RB3MidiDrums.h b/rpcs3/Emu/Io/RB3MidiDrums.h index 9d13a81812..8d71ce93ef 100644 --- a/rpcs3/Emu/Io/RB3MidiDrums.h +++ b/rpcs3/Emu/Io/RB3MidiDrums.h @@ -109,7 +109,7 @@ enum class Note : u8 class usb_device_rb3_midi_drums : public usb_device_emulated { public: - usb_device_rb3_midi_drums(const std::array& location, const std::string& device_name); + usb_device_rb3_midi_drums(const std::array& location, std::string_view device_name); ~usb_device_rb3_midi_drums(); void control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, u32 buf_size, u8* buf, UsbTransfer* transfer) override; diff --git a/rpcs3/Emu/Io/RB3MidiGuitar.cpp b/rpcs3/Emu/Io/RB3MidiGuitar.cpp index 923fc3a98b..573944dd52 100644 --- a/rpcs3/Emu/Io/RB3MidiGuitar.cpp +++ b/rpcs3/Emu/Io/RB3MidiGuitar.cpp @@ -6,7 +6,7 @@ LOG_CHANNEL(rb3_midi_guitar_log); -usb_device_rb3_midi_guitar::usb_device_rb3_midi_guitar(const std::array& location, const std::string& device_name, bool twentytwo_fret) +usb_device_rb3_midi_guitar::usb_device_rb3_midi_guitar(const std::array& location, std::string_view device_name, bool twentytwo_fret) : usb_device_emulated(location) { // For the 22-fret guitar (Fender Squier), the only thing that's different diff --git a/rpcs3/Emu/Io/RB3MidiGuitar.h b/rpcs3/Emu/Io/RB3MidiGuitar.h index 3a93f95d61..6c20aa5a2a 100644 --- a/rpcs3/Emu/Io/RB3MidiGuitar.h +++ b/rpcs3/Emu/Io/RB3MidiGuitar.h @@ -36,7 +36,7 @@ private: void write_state(u8* buf); public: - usb_device_rb3_midi_guitar(const std::array& location, const std::string& device_name, bool twentytwo_fret); + usb_device_rb3_midi_guitar(const std::array& location, std::string_view device_name, bool twentytwo_fret); ~usb_device_rb3_midi_guitar(); void control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, u32 buf_size, u8* buf, UsbTransfer* transfer) override; diff --git a/rpcs3/Emu/Io/RB3MidiKeyboard.cpp b/rpcs3/Emu/Io/RB3MidiKeyboard.cpp index f96f138628..f22ad800b7 100644 --- a/rpcs3/Emu/Io/RB3MidiKeyboard.cpp +++ b/rpcs3/Emu/Io/RB3MidiKeyboard.cpp @@ -6,7 +6,7 @@ LOG_CHANNEL(rb3_midi_keyboard_log); -usb_device_rb3_midi_keyboard::usb_device_rb3_midi_keyboard(const std::array& location, const std::string& device_name) +usb_device_rb3_midi_keyboard::usb_device_rb3_midi_keyboard(const std::array& location, std::string_view device_name) : usb_device_emulated(location) { device = UsbDescriptorNode(USB_DESCRIPTOR_DEVICE, UsbDeviceDescriptor{0x0200, 0x00, 0x00, 0x00, 64, 0x12ba, 0x2338, 0x01, 0x01, 0x02, 0x00, 0x01}); diff --git a/rpcs3/Emu/Io/RB3MidiKeyboard.h b/rpcs3/Emu/Io/RB3MidiKeyboard.h index c5042af239..131fedc0c3 100644 --- a/rpcs3/Emu/Io/RB3MidiKeyboard.h +++ b/rpcs3/Emu/Io/RB3MidiKeyboard.h @@ -41,7 +41,7 @@ private: void write_state(u8* buf); public: - usb_device_rb3_midi_keyboard(const std::array& location, const std::string& device_name); + usb_device_rb3_midi_keyboard(const std::array& location, std::string_view device_name); ~usb_device_rb3_midi_keyboard(); void control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, u32 buf_size, u8* buf, UsbTransfer* transfer) override; From 41a7cd29f8fb3f7c5e95f0aac7c8d89ac175c403 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 06:21:03 +0200 Subject: [PATCH 24/64] Use std::string_view in input code --- Utilities/Config.cpp | 2 +- rpcs3/Emu/Io/PadHandler.cpp | 72 ++++++++++----------- rpcs3/Emu/Io/PadHandler.h | 4 +- rpcs3/Emu/Io/camera_config.cpp | 22 +++++-- rpcs3/Input/evdev_joystick_handler.cpp | 4 +- rpcs3/Input/keyboard_pad_handler.cpp | 2 +- rpcs3/Input/keyboard_pad_handler.h | 2 +- rpcs3/Input/mm_joystick_handler.cpp | 2 +- rpcs3/Input/raw_mouse_handler.h | 12 ++-- rpcs3/rpcs3qt/config_adapter.cpp | 2 +- rpcs3/rpcs3qt/pad_settings_dialog.cpp | 4 +- rpcs3/rpcs3qt/pad_settings_dialog.h | 2 +- rpcs3/rpcs3qt/raw_mouse_settings_dialog.cpp | 12 ++-- rpcs3/rpcs3qt/raw_mouse_settings_dialog.h | 8 +-- 14 files changed, 81 insertions(+), 69 deletions(-) diff --git a/Utilities/Config.cpp b/Utilities/Config.cpp index 87d4c14690..6b2e3bf841 100644 --- a/Utilities/Config.cpp +++ b/Utilities/Config.cpp @@ -757,7 +757,7 @@ void cfg::log_entry::from_default() std::pair cfg::device_info::get_usb_ids() const { - auto string_to_hex = [](const std::string& str) -> u16 + auto string_to_hex = [](std::string_view str) -> u16 { u16 value = 0x0000; if (!str.empty() && std::from_chars(str.data(), str.data() + str.size(), value, 16).ec != std::errc{}) diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index ccd81d2805..178ae9f4fa 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -11,7 +11,7 @@ PadHandlerBase::PadHandlerBase(pad_handler type) : m_type(type) { } -std::vector> PadHandlerBase::find_key_combos(const std::unordered_map& map, const std::string& cfg_string) +std::vector> PadHandlerBase::find_key_combos(const std::unordered_map& map, std::string_view cfg_string) { std::vector> key_codes; @@ -232,7 +232,7 @@ pad_capabilities PadHandlerBase::get_capabilities(const std::string& /*pad_id*/) }; } -cfg_pad* PadHandlerBase::get_config(const std::string& pad_id) +cfg_pad* PadHandlerBase::get_config(std::string_view pad_id) { int index = 0; @@ -595,52 +595,52 @@ std::array>, PadHandlerBase::button::button_count> Pad if (!device || !cfg) return mapping; - mapping[button::up] = find_key_combos(button_list, cfg->up); - mapping[button::down] = find_key_combos(button_list, cfg->down); - mapping[button::left] = find_key_combos(button_list, cfg->left); - mapping[button::right] = find_key_combos(button_list, cfg->right); - mapping[button::cross] = find_key_combos(button_list, cfg->cross); - mapping[button::square] = find_key_combos(button_list, cfg->square); - mapping[button::circle] = find_key_combos(button_list, cfg->circle); - mapping[button::triangle] = find_key_combos(button_list, cfg->triangle); - mapping[button::start] = find_key_combos(button_list, cfg->start); - mapping[button::select] = find_key_combos(button_list, cfg->select); - mapping[button::l1] = find_key_combos(button_list, cfg->l1); - mapping[button::l2] = find_key_combos(button_list, cfg->l2); - mapping[button::l3] = find_key_combos(button_list, cfg->l3); - mapping[button::r1] = find_key_combos(button_list, cfg->r1); - mapping[button::r2] = find_key_combos(button_list, cfg->r2); - mapping[button::r3] = find_key_combos(button_list, cfg->r3); - mapping[button::ls_left] = find_key_combos(button_list, cfg->ls_left); - mapping[button::ls_right] = find_key_combos(button_list, cfg->ls_right); - mapping[button::ls_down] = find_key_combos(button_list, cfg->ls_down); - mapping[button::ls_up] = find_key_combos(button_list, cfg->ls_up); - mapping[button::rs_left] = find_key_combos(button_list, cfg->rs_left); - mapping[button::rs_right] = find_key_combos(button_list, cfg->rs_right); - mapping[button::rs_down] = find_key_combos(button_list, cfg->rs_down); - mapping[button::rs_up] = find_key_combos(button_list, cfg->rs_up); - mapping[button::ps] = find_key_combos(button_list, cfg->ps); + mapping[button::up] = find_key_combos(button_list, cfg->up.to_string()); + mapping[button::down] = find_key_combos(button_list, cfg->down.to_string()); + mapping[button::left] = find_key_combos(button_list, cfg->left.to_string()); + mapping[button::right] = find_key_combos(button_list, cfg->right.to_string()); + mapping[button::cross] = find_key_combos(button_list, cfg->cross.to_string()); + mapping[button::square] = find_key_combos(button_list, cfg->square.to_string()); + mapping[button::circle] = find_key_combos(button_list, cfg->circle.to_string()); + mapping[button::triangle] = find_key_combos(button_list, cfg->triangle.to_string()); + mapping[button::start] = find_key_combos(button_list, cfg->start.to_string()); + mapping[button::select] = find_key_combos(button_list, cfg->select.to_string()); + mapping[button::l1] = find_key_combos(button_list, cfg->l1.to_string()); + mapping[button::l2] = find_key_combos(button_list, cfg->l2.to_string()); + mapping[button::l3] = find_key_combos(button_list, cfg->l3.to_string()); + mapping[button::r1] = find_key_combos(button_list, cfg->r1.to_string()); + mapping[button::r2] = find_key_combos(button_list, cfg->r2.to_string()); + mapping[button::r3] = find_key_combos(button_list, cfg->r3.to_string()); + mapping[button::ls_left] = find_key_combos(button_list, cfg->ls_left.to_string()); + mapping[button::ls_right] = find_key_combos(button_list, cfg->ls_right.to_string()); + mapping[button::ls_down] = find_key_combos(button_list, cfg->ls_down.to_string()); + mapping[button::ls_up] = find_key_combos(button_list, cfg->ls_up.to_string()); + mapping[button::rs_left] = find_key_combos(button_list, cfg->rs_left.to_string()); + mapping[button::rs_right] = find_key_combos(button_list, cfg->rs_right.to_string()); + mapping[button::rs_down] = find_key_combos(button_list, cfg->rs_down.to_string()); + mapping[button::rs_up] = find_key_combos(button_list, cfg->rs_up.to_string()); + mapping[button::ps] = find_key_combos(button_list, cfg->ps.to_string()); - mapping[button::skateboard_ir_nose] = find_key_combos(button_list, cfg->ir_nose); - mapping[button::skateboard_ir_tail] = find_key_combos(button_list, cfg->ir_tail); - mapping[button::skateboard_ir_left] = find_key_combos(button_list, cfg->ir_left); - mapping[button::skateboard_ir_right] = find_key_combos(button_list, cfg->ir_right); - mapping[button::skateboard_tilt_left] = find_key_combos(button_list, cfg->tilt_left); - mapping[button::skateboard_tilt_right] = find_key_combos(button_list, cfg->tilt_right); + mapping[button::skateboard_ir_nose] = find_key_combos(button_list, cfg->ir_nose.to_string()); + mapping[button::skateboard_ir_tail] = find_key_combos(button_list, cfg->ir_tail.to_string()); + mapping[button::skateboard_ir_left] = find_key_combos(button_list, cfg->ir_left.to_string()); + mapping[button::skateboard_ir_right] = find_key_combos(button_list, cfg->ir_right.to_string()); + mapping[button::skateboard_tilt_left] = find_key_combos(button_list, cfg->tilt_left.to_string()); + mapping[button::skateboard_tilt_right] = find_key_combos(button_list, cfg->tilt_right.to_string()); if (b_has_pressure_intensity_button) { - mapping[button::pressure_intensity_button] = find_key_combos(button_list, cfg->pressure_intensity_button); + mapping[button::pressure_intensity_button] = find_key_combos(button_list, cfg->pressure_intensity_button.to_string()); } if (b_has_analog_limiter_button) { - mapping[button::analog_limiter_button] = find_key_combos(button_list, cfg->analog_limiter_button); + mapping[button::analog_limiter_button] = find_key_combos(button_list, cfg->analog_limiter_button.to_string()); } if (b_has_orientation) { - mapping[button::orientation_reset_button] = find_key_combos(button_list, cfg->orientation_reset_button); + mapping[button::orientation_reset_button] = find_key_combos(button_list, cfg->orientation_reset_button.to_string()); } return mapping; diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index 0f38f0cb3b..4db058e597 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -193,7 +193,7 @@ protected: std::shared_ptr m_pad_for_pad_settings; // Search an unordered map for a string value and return the found combos - static std::vector> find_key_combos(const std::unordered_map& map, const std::string& cfg_string); + static std::vector> find_key_combos(const std::unordered_map& map, std::string_view cfg_string); // Search an unordered map for a combo and return the found key codes static std::set find_key_codes(const std::unordered_map& map, const pad::combo& combo); @@ -324,7 +324,7 @@ protected: virtual void get_mapping(const pad_ensemble& binding); void TranslateButtonPress(const std::shared_ptr& device, u32 keyCode, bool& pressed, u16& val, bool use_stick_multipliers, bool ignore_stick_threshold = false, bool ignore_trigger_threshold = false); void init_configs(); - cfg_pad* get_config(const std::string& pad_id); + cfg_pad* get_config(std::string_view pad_id); static void set_raw_orientation(ps_move_data& move_data, f32 accel_x, f32 accel_y, f32 accel_z, f32 gyro_x, f32 gyro_y, f32 gyro_z); static void set_raw_orientation(Pad& pad); diff --git a/rpcs3/Emu/Io/camera_config.cpp b/rpcs3/Emu/Io/camera_config.cpp index 4016447321..e9ef5de7c5 100644 --- a/rpcs3/Emu/Io/camera_config.cpp +++ b/rpcs3/Emu/Io/camera_config.cpp @@ -85,9 +85,15 @@ void cfg_camera::camera_setting::from_string(std::string_view text) return; } - const auto to_integer = [](const std::string& str, int& out) -> bool + const auto to_integer = [](std::string_view str, int& out) -> bool { - auto [ptr, ec] = std::from_chars(str.c_str(), str.c_str() + str.size(), out); + if (str.empty()) + { + camera_log.error("Empty string cannot be interpreted as integer."); + return false; + } + + auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), out); if (ec != std::errc{}) { camera_log.error("String '%s' cannot be interpreted as integer.", str); @@ -96,11 +102,17 @@ void cfg_camera::camera_setting::from_string(std::string_view text) return true; }; - const auto to_double = [](const std::string& str, double& out) -> bool + const auto to_double = [](std::string_view str, double& out) -> bool { + if (str.empty()) + { + camera_log.error("Empty string cannot be interpreted as double."); + return false; + } + char* end{}; - out = std::strtod(str.c_str(), &end); - if (end != str.c_str() + str.size()) + out = std::strtod(str.data(), &end); + if (end != str.data() + str.size()) { camera_log.error("String '%s' cannot be interpreted as double.", str); return false; diff --git a/rpcs3/Input/evdev_joystick_handler.cpp b/rpcs3/Input/evdev_joystick_handler.cpp index a8a957502a..5bb03c5852 100644 --- a/rpcs3/Input/evdev_joystick_handler.cpp +++ b/rpcs3/Input/evdev_joystick_handler.cpp @@ -371,7 +371,7 @@ PadHandlerBase::connection evdev_joystick_handler::get_next_button_press(const s const auto data = GetButtonValues(device); - const auto find_value = [&, this](const std::string& str) + const auto find_value = [&, this](std::string_view str) { const std::vector combos = cfg_pad::get_combos(str); @@ -1419,7 +1419,7 @@ bool evdev_joystick_handler::bindPadToDevice(std::shared_ptr pad) e_sensor.mirrored = sensor.mirrored.get(); e_sensor.shift = sensor.shift.get(); - const std::vector> combos = find_key_combos(motion_axis_list, sensor.axis); + const std::vector> combos = find_key_combos(motion_axis_list, sensor.axis.to_string()); if (!combos.empty() && !combos.front().empty()) e_sensor.code = *combos.front().begin(); // We should only have one key for each of our sensors return e_sensor; }; diff --git a/rpcs3/Input/keyboard_pad_handler.cpp b/rpcs3/Input/keyboard_pad_handler.cpp index e4cb6608b3..9ce274141a 100644 --- a/rpcs3/Input/keyboard_pad_handler.cpp +++ b/rpcs3/Input/keyboard_pad_handler.cpp @@ -906,7 +906,7 @@ std::string keyboard_pad_handler::GetKeyName(u32 keyCode) return QKeySequence(keyCode).toString(QKeySequence::NativeText).toStdString(); } -std::vector> keyboard_pad_handler::GetKeyCombos(const std::string& cfg_string) +std::vector> keyboard_pad_handler::GetKeyCombos(std::string_view cfg_string) { std::vector> res; diff --git a/rpcs3/Input/keyboard_pad_handler.h b/rpcs3/Input/keyboard_pad_handler.h index aadc51b29b..ec1a4416a3 100644 --- a/rpcs3/Input/keyboard_pad_handler.h +++ b/rpcs3/Input/keyboard_pad_handler.h @@ -94,7 +94,7 @@ public: static QStringList GetKeyNames(const QKeyEvent* keyEvent); static std::string GetKeyName(const QKeyEvent* keyEvent, bool with_modifiers); static std::string GetKeyName(u32 keyCode); - static std::vector> GetKeyCombos(const std::string& cfg_string); + static std::vector> GetKeyCombos(std::string_view cfg_string); static u32 GetKeyCode(const QString& keyName); static int native_scan_code_from_string(const std::string& key); diff --git a/rpcs3/Input/mm_joystick_handler.cpp b/rpcs3/Input/mm_joystick_handler.cpp index 710488a4f4..207e7461d3 100644 --- a/rpcs3/Input/mm_joystick_handler.cpp +++ b/rpcs3/Input/mm_joystick_handler.cpp @@ -226,7 +226,7 @@ pad_preview_values mm_joystick_handler::get_preview_values(const std::unordered_ if (buttons.size() != 10) return preview_values; - const auto get_key_value = [this, &data](const std::string& str) -> u16 + const auto get_key_value = [this, &data](std::string_view str) -> u16 { u16 value{}; diff --git a/rpcs3/Input/raw_mouse_handler.h b/rpcs3/Input/raw_mouse_handler.h index 9ab7945f20..d2846b2c20 100644 --- a/rpcs3/Input/raw_mouse_handler.h +++ b/rpcs3/Input/raw_mouse_handler.h @@ -74,12 +74,12 @@ public: const std::map& get_mice() const { return m_raw_mice; }; - void set_mouse_press_callback(std::function cb) + void set_mouse_press_callback(std::function cb) { m_mouse_press_callback = std::move(cb); } - void mouse_press_callback(const std::string& device_name, s32 button_code, bool pressed) + void mouse_press_callback(std::string_view device_name, s32 button_code, bool pressed) { if (m_mouse_press_callback) { @@ -87,12 +87,12 @@ public: } } - void set_key_press_callback(std::function cb) + void set_key_press_callback(std::function cb) { m_key_press_callback = std::move(cb); } - void key_press_callback(const std::string& device_name, s32 scan_code, bool pressed) + void key_press_callback(std::string_view device_name, s32 scan_code, bool pressed) { if (m_key_press_callback) { @@ -120,8 +120,8 @@ private: bool m_is_for_gui = false; std::map m_raw_mice; - std::function m_mouse_press_callback; - std::function m_key_press_callback; + std::function m_mouse_press_callback; + std::function m_key_press_callback; std::unique_ptr>> m_thread; }; diff --git a/rpcs3/rpcs3qt/config_adapter.cpp b/rpcs3/rpcs3qt/config_adapter.cpp index ddc0cc839c..ec03eca95e 100644 --- a/rpcs3/rpcs3qt/config_adapter.cpp +++ b/rpcs3/rpcs3qt/config_adapter.cpp @@ -6,7 +6,7 @@ LOG_CHANNEL(cfg_log, "CFG"); // Helper methods to interact with YAML and the config settings. namespace cfg_adapter { - static cfg::_base& get_cfg(const cfg::_base& root, const std::string& name) + static cfg::_base& get_cfg(const cfg::_base& root, std::string_view name) { if (root.get_type() == cfg::type::node) { diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.cpp b/rpcs3/rpcs3qt/pad_settings_dialog.cpp index d0334d3ae0..3cc15b7528 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/pad_settings_dialog.cpp @@ -495,7 +495,7 @@ void pad_settings_dialog::InitButtons() return; } - const auto update_preview = [this](const std::string& pad_name, bool is_connected, int battery_level, int trigger_left, int trigger_right, int lx, int ly, int rx, int ry, const pad_capabilities& capabilities) + const auto update_preview = [this](std::string_view pad_name, bool is_connected, int battery_level, int trigger_left, int trigger_right, int lx, int ly, int rx, int ry, const pad_capabilities& capabilities) { SwitchPadInfo(pad_name, is_connected); @@ -801,7 +801,7 @@ void pad_settings_dialog::switch_pad_info(int index, pad_device_info info, bool } } -void pad_settings_dialog::SwitchPadInfo(const std::string& pad_name, bool is_connected) +void pad_settings_dialog::SwitchPadInfo(std::string_view pad_name, bool is_connected) { for (int i = 0; i < ui->chooseDevice->count(); i++) { diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.h b/rpcs3/rpcs3qt/pad_settings_dialog.h index 4f20d2d0db..c917f82ffa 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.h +++ b/rpcs3/rpcs3qt/pad_settings_dialog.h @@ -228,7 +228,7 @@ private: pad_device_info get_pad_info(QComboBox* combo, int index); void switch_pad_info(int index, pad_device_info info, bool is_connected); - void SwitchPadInfo(const std::string& name, bool is_connected); + void SwitchPadInfo(std::string_view name, bool is_connected); /** Enable/Disable Buttons while trying to remap an other */ void SwitchButtons(bool is_enabled); diff --git a/rpcs3/rpcs3qt/raw_mouse_settings_dialog.cpp b/rpcs3/rpcs3qt/raw_mouse_settings_dialog.cpp index c64391c021..174b227fc1 100644 --- a/rpcs3/rpcs3qt/raw_mouse_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/raw_mouse_settings_dialog.cpp @@ -70,11 +70,11 @@ raw_mouse_settings_dialog::raw_mouse_settings_dialog(QWidget* parent) g_raw_mouse_handler = std::make_unique(); g_raw_mouse_handler->set_is_for_gui(true); g_raw_mouse_handler->Init(std::max(max_devices, ::size32(g_cfg_raw_mouse.players))); - g_raw_mouse_handler->set_mouse_press_callback([this](const std::string& device_name, s32 button_code, bool pressed) + g_raw_mouse_handler->set_mouse_press_callback([this](std::string_view device_name, s32 button_code, bool pressed) { mouse_press(device_name, button_code, pressed); }); - g_raw_mouse_handler->set_key_press_callback([this](const std::string& device_name, s32 scan_code, bool pressed) + g_raw_mouse_handler->set_key_press_callback([this](std::string_view device_name, s32 scan_code, bool pressed) { key_press(device_name, scan_code, pressed); }); @@ -350,7 +350,7 @@ void raw_mouse_settings_dialog::reset_config() } } -void raw_mouse_settings_dialog::mouse_press(const std::string& device_name, s32 button_code, bool pressed) +void raw_mouse_settings_dialog::mouse_press(std::string_view device_name, s32 button_code, bool pressed) { if (m_button_id < 0 || pressed) // Let's only react to mouse releases { @@ -378,7 +378,7 @@ void raw_mouse_settings_dialog::mouse_press(const std::string& device_name, s32 reactivate_buttons(); } -void raw_mouse_settings_dialog::key_press(const std::string& device_name, s32 scan_code, bool pressed) +void raw_mouse_settings_dialog::key_press(std::string_view device_name, s32 scan_code, bool pressed) { if (m_button_id < 0 || !pressed) // Let's only react to key presses { @@ -404,7 +404,7 @@ void raw_mouse_settings_dialog::key_press(const std::string& device_name, s32 sc reactivate_buttons(); } -void raw_mouse_settings_dialog::handle_device_change(const std::string& device_name) +void raw_mouse_settings_dialog::handle_device_change(std::string_view device_name) { if (is_device_active(device_name)) { @@ -419,7 +419,7 @@ void raw_mouse_settings_dialog::handle_device_change(const std::string& device_n } } -bool raw_mouse_settings_dialog::is_device_active(const std::string& device_name) +bool raw_mouse_settings_dialog::is_device_active(std::string_view device_name) { if (!g_raw_mouse_handler || device_name.empty()) { diff --git a/rpcs3/rpcs3qt/raw_mouse_settings_dialog.h b/rpcs3/rpcs3qt/raw_mouse_settings_dialog.h index 16aced5a77..a1c214eba7 100644 --- a/rpcs3/rpcs3qt/raw_mouse_settings_dialog.h +++ b/rpcs3/rpcs3qt/raw_mouse_settings_dialog.h @@ -30,10 +30,10 @@ private: void on_enumeration(); void reset_config(); void on_button_click(int id); - void mouse_press(const std::string& device_name, s32 button_code, bool pressed); - void key_press(const std::string& device_name, s32 scan_code, bool pressed); - void handle_device_change(const std::string& device_name); - bool is_device_active(const std::string& device_name); + void mouse_press(std::string_view device_name, s32 button_code, bool pressed); + void key_press(std::string_view device_name, s32 scan_code, bool pressed); + void handle_device_change(std::string_view device_name); + bool is_device_active(std::string_view device_name); std::string get_current_device_name(int player); void reactivate_buttons(); From 06c8a875343cb46725ef6cc6632ee556d8626b0e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 10 Jun 2026 23:22:39 +0300 Subject: [PATCH 25/64] gl: Drop use of the retired glNamedBufferStorageEXT function - The DSA_EXT fallback is now GLES-only. - We introduce a wrapper to act as a fallback for older GPUs - NamedBufferStorageEX. --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/RSX/GL/GLProcTable.h | 2 +- rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp | 3 ++- rpcs3/Emu/RSX/GL/glutils/common.h | 14 +++++++++++++- rpcs3/Emu/RSX/GL/glutils/ex.cpp | 19 +++++++++++++++++++ rpcs3/Emu/RSX/GL/glutils/ex.h | 12 ++++++++++++ rpcs3/Emu/RSX/GL/glutils/ring_buffer.cpp | 5 +++-- rpcs3/GLGSRender.vcxproj | 2 ++ rpcs3/GLGSRender.vcxproj.filters | 6 ++++++ 9 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 rpcs3/Emu/RSX/GL/glutils/ex.cpp create mode 100644 rpcs3/Emu/RSX/GL/glutils/ex.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 3a3d202a2e..045fa30769 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -588,6 +588,7 @@ if(NOT ANDROID AND NOT APPLE) RSX/GL/glutils/buffer_object.cpp RSX/GL/glutils/capabilities.cpp RSX/GL/glutils/common.cpp + RSX/GL/glutils/ex.cpp RSX/GL/glutils/fbo.cpp RSX/GL/glutils/image.cpp RSX/GL/glutils/program.cpp diff --git a/rpcs3/Emu/RSX/GL/GLProcTable.h b/rpcs3/Emu/RSX/GL/GLProcTable.h index b4a9c1c289..f39610012d 100644 --- a/rpcs3/Emu/RSX/GL/GLProcTable.h +++ b/rpcs3/Emu/RSX/GL/GLProcTable.h @@ -248,7 +248,7 @@ OPENGL_PROC(PFNGLCOPYIMAGESUBDATAPROC, CopyImageSubData); // ARB_Buffer_Storage OPENGL_PROC(PFNGLNAMEDBUFFERSTORAGEPROC, NamedBufferStorage); -OPENGL_PROC(PFNGLNAMEDBUFFERSTORAGEEXTPROC, NamedBufferStorageEXT); +OPENGL_PROC(PFNGLBUFFERSTORAGEPROC, BufferStorage); // ARB_sync OPENGL_PROC(PFNGLFENCESYNCPROC, FenceSync); diff --git a/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp b/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp index f3849718d0..d47848f393 100644 --- a/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "buffer_object.h" #include "common.h" +#include "ex.h" namespace gl { @@ -44,7 +45,7 @@ namespace gl flags |= GL_CLIENT_STORAGE_BIT; } - DSA_CALL2(NamedBufferStorage, m_id, size, data_, flags); + DSA_CALL_EX(NamedBufferStorage, m_id, static_cast(m_target), size, data_, flags); m_size = size; } else diff --git a/rpcs3/Emu/RSX/GL/glutils/common.h b/rpcs3/Emu/RSX/GL/glutils/common.h index 326a79b9e8..ef714a991c 100644 --- a/rpcs3/Emu/RSX/GL/glutils/common.h +++ b/rpcs3/Emu/RSX/GL/glutils/common.h @@ -25,19 +25,31 @@ #define GL_COMPUTE_BUFFER_SLOT(index) SSBO_SLOT(2 + index) #define GL_COMPUTE_IMAGE_SLOT(index) SSBO_SLOT(index) -//Function call wrapped in ARB_DSA vs EXT_DSA compat check +// Function call wrapped in ARB_DSA vs EXT_DSA compat check #define DSA_CALL(func, object_name, target, ...)\ if (::gl::get_driver_caps().ARB_direct_state_access_supported)\ gl##func(object_name, __VA_ARGS__);\ else\ gl##func##EXT(object_name, target, __VA_ARGS__); +#define DSA_CALL_EX(func, object_name, target, ...)\ + if (::gl::get_driver_caps().ARB_direct_state_access_supported)\ + gl##func(object_name, __VA_ARGS__);\ + else\ + gl##func##EX(object_name, target, __VA_ARGS__); + #define DSA_CALL2(func, ...)\ if (::gl::get_driver_caps().ARB_direct_state_access_supported)\ gl##func(__VA_ARGS__);\ else\ gl##func##EXT(__VA_ARGS__); +#define DSA_CALL2_EX(func, ...)\ + if (::gl::get_driver_caps().ARB_direct_state_access_supported)\ + gl##func(__VA_ARGS__);\ + else\ + gl##func##EX(__VA_ARGS__); + #define DSA_CALL2_RET(func, ...)\ (::gl::get_driver_caps().ARB_direct_state_access_supported) ?\ gl##func(__VA_ARGS__) :\ diff --git a/rpcs3/Emu/RSX/GL/glutils/ex.cpp b/rpcs3/Emu/RSX/GL/glutils/ex.cpp new file mode 100644 index 0000000000..867930724d --- /dev/null +++ b/rpcs3/Emu/RSX/GL/glutils/ex.cpp @@ -0,0 +1,19 @@ +#include "stdafx.h" +#include "ex.h" + +namespace gl::ex +{ + void glNamedBufferStorageEX(GLuint buffer, GLenum target, GLsizeiptr size, const void* data, GLbitfield flags) + { + GLint restore = GL_NONE; + glGetIntegerv(target, &restore); + + glBindBuffer(target, buffer); + glBufferStorage(target, size, data, flags); + + if (restore != buffer) + { + glBindBuffer(target, restore); + } + } +} diff --git a/rpcs3/Emu/RSX/GL/glutils/ex.h b/rpcs3/Emu/RSX/GL/glutils/ex.h new file mode 100644 index 0000000000..5464e50580 --- /dev/null +++ b/rpcs3/Emu/RSX/GL/glutils/ex.h @@ -0,0 +1,12 @@ +#pragma once + +#include "capabilities.h" + +namespace gl::ex +{ + // Fallback EX implementation of NamedBufferStorage. The official EXT_DSA variant was dropped from desktop spec as it was originally meant for GLES only. + // Target parameter reintroduced as an optimization to avoid side effects. + void glNamedBufferStorageEX(GLuint buffer, GLenum target, GLsizeiptr size, const void* data, GLbitfield flags); +} + +using namespace ::gl::ex; diff --git a/rpcs3/Emu/RSX/GL/glutils/ring_buffer.cpp b/rpcs3/Emu/RSX/GL/glutils/ring_buffer.cpp index ac0cc48afe..8ec0e29590 100644 --- a/rpcs3/Emu/RSX/GL/glutils/ring_buffer.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/ring_buffer.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "ring_buffer.h" +#include "ex.h" namespace gl { @@ -17,7 +18,7 @@ namespace gl GLbitfield buffer_storage_flags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT; if (gl::get_driver_caps().vendor_MESA) buffer_storage_flags |= GL_CLIENT_STORAGE_BIT; - DSA_CALL2(NamedBufferStorage, m_id, size, data, buffer_storage_flags); + DSA_CALL_EX(NamedBufferStorage, m_id, static_cast(m_target), size, data, buffer_storage_flags); m_memory_mapping = DSA_CALL2_RET(MapNamedBufferRange, m_id, 0, size, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); ensure(m_memory_mapping != nullptr); @@ -206,7 +207,7 @@ namespace gl buffer::create(); save_binding_state save(current_target(), *this); - DSA_CALL2(NamedBufferStorage, m_id, size, data, GL_MAP_WRITE_BIT); + DSA_CALL_EX(NamedBufferStorage, m_id, static_cast(m_target), size, data, GL_MAP_WRITE_BIT); m_data_loc = 0; m_size = ::narrow(size); diff --git a/rpcs3/GLGSRender.vcxproj b/rpcs3/GLGSRender.vcxproj index 8d6ba02dd9..c48f3845b9 100644 --- a/rpcs3/GLGSRender.vcxproj +++ b/rpcs3/GLGSRender.vcxproj @@ -66,6 +66,7 @@ + @@ -102,6 +103,7 @@ + diff --git a/rpcs3/GLGSRender.vcxproj.filters b/rpcs3/GLGSRender.vcxproj.filters index c4fe752d10..72aee7172c 100644 --- a/rpcs3/GLGSRender.vcxproj.filters +++ b/rpcs3/GLGSRender.vcxproj.filters @@ -49,6 +49,9 @@ + + glutils + @@ -125,6 +128,9 @@ glutils + + glutils + From 048b1c3f052884756ca694005d0ebc70fe31a8ac Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Jun 2026 19:15:33 +0300 Subject: [PATCH 26/64] gl/interpreter: Do not emit bindless texture usage unless the textures are used --- rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp index aac9a9eabf..d5b49deb69 100644 --- a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp @@ -302,9 +302,14 @@ namespace gl GLFragmentDecompilerThread comp(shader_str, arr, frag, len); std::stringstream builder; - builder << - "#version 450\n" - "#extension GL_ARB_bindless_texture : require\n\n"; + builder << "#version 450\n"; + + if (compiler_options & COMPILER_OPT_ENABLE_TEXTURES) + { + builder << "#extension GL_ARB_bindless_texture : require\n"; + } + + builder << "\n"; ::glsl::insert_subheader_block(builder); comp.insertConstants(builder); From ff68a1ea09d6d2fe26da91ae72540a4938207029 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Jun 2026 21:06:10 +0300 Subject: [PATCH 27/64] gl: Do not use SSBOs on devices that do not support the extension --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 6 +++--- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 17 +++++++++++++++-- rpcs3/Emu/RSX/GL/glutils/capabilities.cpp | 2 ++ rpcs3/Emu/RSX/GL/glutils/capabilities.h | 2 ++ rpcs3/Emu/RSX/RSXThread.h | 1 + rpcs3/Emu/RSX/VK/VKGSRender.cpp | 1 + 6 files changed, 24 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index 9c09a96d39..80cef7c5ac 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -749,7 +749,7 @@ void GLGSRender::emit_geometry(u32 sub_index) if (!upload_info.index_info) { - if (draw_call.is_trivial_instanced_draw) + if (draw_call.is_trivial_instanced_draw && backend_config.supports_hw_instanced_rendering) { glDrawArraysInstanced(draw_mode, 0, upload_info.vertex_draw_count, draw_call.pass_count()); } @@ -821,7 +821,7 @@ void GLGSRender::emit_geometry(u32 sub_index) m_index_ring_buffer->bind(); - if (draw_call.is_trivial_instanced_draw) + if (draw_call.is_trivial_instanced_draw && backend_config.supports_hw_instanced_rendering) { glDrawElementsInstanced(draw_mode, upload_info.vertex_draw_count, index_type, reinterpret_cast(u64{ index_offset }), draw_call.pass_count()); } @@ -948,7 +948,7 @@ void GLGSRender::end() { emit_geometry(subdraw++); - if (draw_call.is_trivial_instanced_draw) + if (draw_call.is_trivial_instanced_draw && backend_config.supports_hw_instanced_rendering) { // We already completed. End the draw. draw_call.end(); diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 02233d46f4..d4c7b475da 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -49,6 +49,7 @@ GLGSRender::GLGSRender(utils::serial* ar) noexcept : GSRender(ar) backend_config.supports_multidraw = true; backend_config.supports_normalized_barycentrics = true; + backend_config.supports_hw_instanced_rendering = true; if (g_cfg.video.antialiasing_level != msaa_level::none) { @@ -176,6 +177,12 @@ void GLGSRender::on_init_thread() rsx_log.warning("Texture barriers are not supported by your GPU. Feedback loops will have undefined results."); } + if (!gl_caps.ARB_shader_storage_buffer_object_supported) + { + rsx_log.warning("[PERFORMANCE WARNING] SSBOs are not supported by your GPU. Some functionality such as hardware instancing will be unavailable."); + backend_config.supports_hw_instanced_rendering = false; + } + if (!gl_caps.ARB_bindless_texture_supported) { switch (shadermode) @@ -326,10 +333,16 @@ void GLGSRender::on_init_thread() m_vertex_layout_buffer->create(gl::buffer::target::uniform, 16 * 0x100000); m_raster_env_ring_buffer->create(gl::buffer::target::uniform, 16 * 0x100000); m_scratch_ring_buffer->create(gl::buffer::target::uniform, 16 * 0x100000); - m_instancing_ring_buffer->create(gl::buffer::target::ssbo, 128 * 0x100000); + + if (backend_config.supports_hw_instanced_rendering) + { + ensure(gl_caps.ARB_shader_storage_buffer_object_supported); + m_instancing_ring_buffer->create(gl::buffer::target::ssbo, 128 * 0x100000); + } if (shadermode == shader_mode::async_with_interpreter || shadermode == shader_mode::interpreter_only) { + ensure(gl_caps.ARB_shader_storage_buffer_object_supported); m_vertex_instructions_buffer->create(gl::buffer::target::ssbo, 16 * 0x100000); m_fragment_instructions_buffer->create(gl::buffer::target::ssbo, 16 * 0x100000); } @@ -919,7 +932,7 @@ void GLGSRender::load_program_env() const bool update_fragment_texture_env = m_graphics_state & rsx::pipeline_state::fragment_texture_state_dirty; const bool update_instruction_buffers = !!m_interpreter_state && m_shader_interpreter.is_interpreter(m_program); const bool update_raster_env = REGS(m_ctx)->polygon_stipple_enabled() && (m_graphics_state & rsx::pipeline_state::polygon_stipple_pattern_dirty); - const bool update_instancing_data = REGS(m_ctx)->current_draw_clause.is_trivial_instanced_draw; + const bool update_instancing_data = backend_config.supports_hw_instanced_rendering && REGS(m_ctx)->current_draw_clause.is_trivial_instanced_draw; if (manually_flush_ring_buffers) { diff --git a/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp b/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp index a6999d6f9c..1a8ea39126 100644 --- a/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp @@ -93,6 +93,8 @@ namespace gl CHECK_EXTENSION_SUPPORT(EXT_texture_compression_s3tc); + CHECK_EXTENSION_SUPPORT(ARB_shader_storage_buffer_object); + #undef CHECK_EXTENSION_SUPPORT // Set GLSL version diff --git a/rpcs3/Emu/RSX/GL/glutils/capabilities.h b/rpcs3/Emu/RSX/GL/glutils/capabilities.h index cfe104ffbe..2a0c1bf292 100644 --- a/rpcs3/Emu/RSX/GL/glutils/capabilities.h +++ b/rpcs3/Emu/RSX/GL/glutils/capabilities.h @@ -43,11 +43,13 @@ namespace gl bool NV_fragment_shader_barycentric_supported = false; bool ARB_shader_texture_image_samples_supported = false; bool EXT_texture_compression_s3tc_supported = false; + bool ARB_shader_storage_buffer_object_supported = false; bool vendor_INTEL = false; // has broken GLSL compiler bool vendor_AMD = false; // has broken ARB_multidraw bool vendor_NVIDIA = false; // has NaN poisoning issues bool vendor_MESA = false; // requires CLIENT_STORAGE bit set for streaming buffers + bool subvendor_RADEONSI = false; bool subvendor_NOUVEAU = false; bool subvendor_ATI = false; // Pre-GCN cards (terascale, evergreen) diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 30ff3bd346..17c72a44d6 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -86,6 +86,7 @@ namespace rsx bool supports_hw_msaa; // MSAA support bool supports_hw_a2one; // Alpha to one bool supports_hw_conditional_render; // Conditional render + bool supports_hw_instanced_rendering; // Instanced draws bool supports_passthrough_dma; // DMA passthrough bool supports_asynchronous_compute; // Async compute bool supports_host_gpu_labels; // Advanced host synchronization diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index d8ac9fccf1..e8acd2ec4c 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -640,6 +640,7 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar) } backend_config.supports_multidraw = true; + backend_config.supports_hw_instanced_rendering = true; // NVIDIA has broken attribute interpolation backend_config.supports_normalized_barycentrics = ( From 00c57be1edc510ff362c35696c685b0d93950877 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Jun 2026 21:19:06 +0300 Subject: [PATCH 28/64] gl: Fix linux build --- rpcs3/Emu/RSX/GL/glutils/ex.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/glutils/ex.cpp b/rpcs3/Emu/RSX/GL/glutils/ex.cpp index 867930724d..d93ea508e8 100644 --- a/rpcs3/Emu/RSX/GL/glutils/ex.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/ex.cpp @@ -5,8 +5,8 @@ namespace gl::ex { void glNamedBufferStorageEX(GLuint buffer, GLenum target, GLsizeiptr size, const void* data, GLbitfield flags) { - GLint restore = GL_NONE; - glGetIntegerv(target, &restore); + GLuint restore = GL_NONE; + glGetIntegerv(target, utils::bless(&restore)); glBindBuffer(target, buffer); glBufferStorage(target, size, data, flags); From c38e8229ed063d476a55e8092922b728fa6854d3 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Jun 2026 22:32:34 +0300 Subject: [PATCH 29/64] gl: Finalize the merge of bind_texture_env and bind_interpreter_env --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 106 ++++++---------------------------- rpcs3/Emu/RSX/GL/GLGSRender.h | 1 - 2 files changed, 17 insertions(+), 90 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index 80cef7c5ac..cc16350a5b 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -489,92 +489,6 @@ void GLGSRender::load_texture_env() } void GLGSRender::bind_texture_env() -{ - // Bind textures and resolve external copy operations - gl::command_context cmd{ gl_state }; - - for (u32 textures_ref = current_fp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) - { - if (!(textures_ref & 1)) - { - continue; - } - - gl::texture_view* view = nullptr; - auto sampler_state = static_cast(fs_sampler_state[i].get()); - - if (rsx::method_registers.fragment_textures[i].enabled() && - sampler_state->validate()) - { - if (view = sampler_state->image_handle; !view) [[unlikely]] - { - view = m_gl_texture_cache.create_temporary_subresource(cmd, sampler_state->external_subresource_desc); - } - } - - if (view) [[likely]] - { - view->bind(cmd, GL_FRAGMENT_TEXTURES_START + i); - - if (current_fragment_program.texture_state.redirected_textures & (1 << i)) - { - auto root_texture = static_cast(view->image()); - auto stencil_view = root_texture->get_view(rsx::default_remap_vector.with_encoding(gl::GL_REMAP_IDENTITY), gl::image_aspect::stencil); - stencil_view->bind(cmd, GL_STENCIL_MIRRORS_START + i); - } - } - else - { - const auto target = gl::get_target(current_fragment_program.get_texture_dimension(i)); - cmd->bind_texture(GL_FRAGMENT_TEXTURES_START + i, target, m_null_textures[target]->id()); - - if (current_fragment_program.texture_state.redirected_textures & (1 << i)) - { - cmd->bind_texture(GL_STENCIL_MIRRORS_START + i, target, m_null_textures[target]->id()); - } - } - } - - for (u32 textures_ref = current_vp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) - { - if (!(textures_ref & 1)) - { - continue; - } - - auto sampler_state = static_cast(vs_sampler_state[i].get()); - gl::texture_view* view = nullptr; - - if (rsx::method_registers.vertex_textures[i].enabled() && - sampler_state->validate()) - { - if (view = sampler_state->image_handle; !view) - { - view = m_gl_texture_cache.create_temporary_subresource(cmd, sampler_state->external_subresource_desc); - } - } - - if (view) [[likely]] - { - view->bind(cmd, GL_VERTEX_TEXTURES_START + i); - } - else - { - cmd->bind_texture(GL_VERTEX_TEXTURES_START + i, GL_TEXTURE_2D, GL_NONE); - } - } - - if (current_fragment_program.ctrl & RSX_SHADER_CONTROL_EMULATE_DEPTH_COMPARE) - { - ensure(m_rtts.m_bound_depth_stencil.first, "Invalid FBO setup"); - gl::insert_texture_barrier(); - - auto view = m_rtts.m_bound_depth_stencil.second->get_view(rsx::default_remap_vector, gl::image_aspect::depth); - view->bind(cmd, GL_TEMP_IMAGE_SLOT(0)); - } -} - -void GLGSRender::bind_interpreter_texture_env() { // Bind textures and resolve external copy operations gl::command_context cmd{ gl_state }; @@ -600,13 +514,18 @@ void GLGSRender::bind_interpreter_texture_env() } } - if (!primary_view) + if (const bool is_redirected = (current_fragment_program.texture_state.redirected_textures & (1 << i)); + !primary_view) { const auto target = gl::get_target(current_fragment_program.get_texture_dimension(i)); primary_view = m_null_textures[target]->get_view(rsx::default_remap_vector); - stencil_mirror = primary_view; + + if (is_redirected) + { + stencil_mirror = primary_view; + } } - else if (current_fragment_program.texture_state.redirected_textures & (1 << i)) + else if (is_redirected) { auto root_texture = static_cast(primary_view->image()); stencil_mirror = root_texture->get_view(rsx::default_remap_vector.with_encoding(gl::GL_REMAP_IDENTITY), gl::image_aspect::stencil); @@ -659,6 +578,15 @@ void GLGSRender::bind_interpreter_texture_env() { m_shader_interpreter.flush_texture_bindings(); } + + if (current_fragment_program.ctrl & RSX_SHADER_CONTROL_EMULATE_DEPTH_COMPARE) + { + ensure(m_rtts.m_bound_depth_stencil.first, "Invalid FBO setup"); + gl::insert_texture_barrier(); + + auto view = m_rtts.m_bound_depth_stencil.second->get_view(rsx::default_remap_vector, gl::image_aspect::depth); + view->bind(cmd, GL_TEMP_IMAGE_SLOT(0)); + } } void GLGSRender::emit_geometry(u32 sub_index) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index 530da541c7..357635c1e7 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -184,7 +184,6 @@ private: void load_texture_env(); void bind_texture_env(); - void bind_interpreter_texture_env(); gl::texture* get_present_source(gl::present_surface_info* info, const rsx::avconf& avconfig); From a4649475b6d8f524ab3a80ad831565852a97cd45 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 21:45:14 +0200 Subject: [PATCH 30/64] Use opengl renderer in game window title --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 3 +++ rpcs3/Emu/RSX/GL/glutils/capabilities.cpp | 10 ++++++++ rpcs3/Emu/RSX/GL/glutils/capabilities.h | 1 + rpcs3/Emu/RSX/GSFrameBase.h | 2 ++ rpcs3/Emu/RSX/Overlays/overlay_manager.cpp | 8 ++++++- rpcs3/Emu/RSX/RSXThread.cpp | 4 ++-- rpcs3/Emu/RSX/RSXThread.h | 2 +- rpcs3/Emu/title.cpp | 22 +++++++++++++++++- rpcs3/rpcs3qt/gs_frame.cpp | 27 +++++++++++++--------- rpcs3/rpcs3qt/gs_frame.h | 2 ++ 10 files changed, 65 insertions(+), 16 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index d4c7b475da..d8d412911e 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -149,6 +149,9 @@ void GLGSRender::on_init_thread() rsx_log.success("GL VERSION: %s", reinterpret_cast(glGetString(GL_VERSION))); rsx_log.success("GLSL VERSION: %s", reinterpret_cast(glGetString(GL_SHADING_LANGUAGE_VERSION))); + // Update frame title after GL was initialized in order to show the proper GPU + m_frame->update_title(); + const auto& gl_caps = gl::get_driver_caps(); std::vector exception_reasons; diff --git a/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp b/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp index 1a8ea39126..4ecb74d010 100644 --- a/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp @@ -167,4 +167,14 @@ namespace gl initialized = true; } + + const std::string get_device_name() + { + if (const char* renderer = reinterpret_cast(glGetString(GL_RENDERER))) + { + return renderer; + } + + return "OpenGL GPU"; + } } diff --git a/rpcs3/Emu/RSX/GL/glutils/capabilities.h b/rpcs3/Emu/RSX/GL/glutils/capabilities.h index 2a0c1bf292..b68cd56923 100644 --- a/rpcs3/Emu/RSX/GL/glutils/capabilities.h +++ b/rpcs3/Emu/RSX/GL/glutils/capabilities.h @@ -58,4 +58,5 @@ namespace gl }; const capabilities& get_driver_caps(); + const std::string get_device_name(); } diff --git a/rpcs3/Emu/RSX/GSFrameBase.h b/rpcs3/Emu/RSX/GSFrameBase.h index 69d2832c55..b5edbc19a4 100644 --- a/rpcs3/Emu/RSX/GSFrameBase.h +++ b/rpcs3/Emu/RSX/GSFrameBase.h @@ -33,4 +33,6 @@ public: virtual bool can_consume_frame() const = 0; virtual void present_frame(std::vector&& data, u32 pitch, u32 width, u32 height, bool is_bgra) const = 0; virtual void take_screenshot(std::vector&& sshot_data, u32 sshot_width, u32 sshot_height, bool is_bgra) = 0; + + virtual void update_title(double fps = 0.0) = 0; }; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp b/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp index 70f933fbaa..d778dc1422 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp @@ -175,13 +175,19 @@ namespace rsx return; } + rsx_log.notice("display_manager::start_audio: path='%s'", audio_path); + m_audio_player = std::make_unique(audio_path); m_audio_player->set_active(true); } void display_manager::stop_audio() { - m_audio_player.reset(); + if (m_audio_player) + { + rsx_log.notice("display_manager::stop_audio"); + m_audio_player.reset(); + } } void display_manager::on_overlay_activated(const std::shared_ptr& /*item*/) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 4ded77ff09..a2435dcffe 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -765,7 +765,7 @@ namespace rsx ar(stereo_enabled, format, aspect, resolution_id, scanline_pitch, gamma, resolution_x, resolution_y, state, scan_mode); } - void thread::capture_frame(const std::string& name) + void thread::capture_frame(const std::string& name) const { frame_trace_data::draw_state draw_state{}; @@ -843,7 +843,7 @@ namespace rsx if (capture_current_frame) { - u32 element_count = rsx::method_registers.current_draw_clause.get_elements_count(); + const u32 element_count = rsx::method_registers.current_draw_clause.get_elements_count(); capture_frame(fmt::format("Draw %s %d", rsx::method_registers.current_draw_clause.primitive, element_count)); } } diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 17c72a44d6..b8bc59ad88 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -218,7 +218,7 @@ namespace rsx surface_scaling_config_t resolution_scaling_config{}; - void capture_frame(const std::string& name); + void capture_frame(const std::string& name) const; const backend_configuration& get_backend_config() const { return backend_config; } const draw_command_processor* draw_processor() const { return &m_draw_processor; } diff --git a/rpcs3/Emu/title.cpp b/rpcs3/Emu/title.cpp index ff614397cb..809681b391 100644 --- a/rpcs3/Emu/title.cpp +++ b/rpcs3/Emu/title.cpp @@ -3,6 +3,11 @@ #include "rpcs3_version.h" #include "util/sysinfo.hpp" +#include "Emu/system_config.h" + +#if !(defined(__ANDROID__) || defined(__APPLE__)) +#include "Emu/RSX/GL/glutils/capabilities.h" +#endif namespace rpcs3 { @@ -68,7 +73,22 @@ namespace rpcs3 } case 'G': { - title_string += title_data.vulkan_adapter; + switch (g_cfg.video.renderer.get()) + { + case video_renderer::null: + title_string += "null"; + break; + case video_renderer::opengl: +#if !(defined(__ANDROID__) || defined(__APPLE__)) + title_string += gl::get_device_name(); +#else + title_string += "OpenGL GPU"; +#endif + break; + case video_renderer::vulkan: + title_string += title_data.vulkan_adapter; + break; + } break; } case 'C': diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index 0754dc0748..483c8ac6e5 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -830,17 +830,7 @@ void gs_frame::flip(draw_context_t /*context*/, bool /*skip_frame*/) if (fps_t.GetElapsedTimeInSec() >= 0.5) { - std::string new_title = Emu.GetFormattedTitle(m_frames / fps_t.GetElapsedTimeInSec()); - - if (new_title != m_window_title) - { - m_window_title = new_title; - - Emu.CallFromMainThread([this, title = std::move(new_title)]() - { - setTitle(QString::fromStdString(title)); - }); - } + update_title(m_frames / fps_t.GetElapsedTimeInSec()); m_frames = 0; fps_t.Start(); @@ -1130,6 +1120,21 @@ void gs_frame::take_screenshot(std::vector&& data, u32 sshot_width, u32 ssho .detach(); } +void gs_frame::update_title(double fps) +{ + std::string new_title = Emu.GetFormattedTitle(fps); + + if (new_title != m_window_title) + { + m_window_title = new_title; + + Emu.CallFromMainThread([this, title = std::move(new_title)]() + { + setTitle(QString::fromStdString(title)); + }); + } +} + void gs_frame::mouseDoubleClickEvent(QMouseEvent* ev) { if (m_disable_mouse) diff --git a/rpcs3/rpcs3qt/gs_frame.h b/rpcs3/rpcs3qt/gs_frame.h index 5e63a2d9c1..4c55ef4525 100644 --- a/rpcs3/rpcs3qt/gs_frame.h +++ b/rpcs3/rpcs3qt/gs_frame.h @@ -82,6 +82,8 @@ public: void present_frame(std::vector&& data, u32 pitch, u32 width, u32 height, bool is_bgra) const override; void take_screenshot(std::vector&& data, u32 sshot_width, u32 sshot_height, bool is_bgra) override; + void update_title(double fps = 0.0) override; + protected: video_renderer m_renderer; From fbe9ad0f4537121c2818f1d771a32a69049ea1f9 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 16 Jun 2026 00:38:47 +0200 Subject: [PATCH 31/64] Use more fmt::split_sv --- Utilities/cheat_info.cpp | 8 ++++---- rpcs3/Emu/Io/camera_config.cpp | 2 +- rpcs3/util/cpu_stats.cpp | 9 +++++---- rpcs3/util/sysinfo.cpp | 3 ++- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Utilities/cheat_info.cpp b/Utilities/cheat_info.cpp index 7745d26732..e67e103214 100644 --- a/Utilities/cheat_info.cpp +++ b/Utilities/cheat_info.cpp @@ -29,7 +29,7 @@ void fmt_class_string::format(std::string& out, u64 arg) bool cheat_info::from_str(std::string_view cheat_line) { - const auto cheat_vec = fmt::split(cheat_line, {"@@@"}, false); + auto cheat_vec = fmt::split(cheat_line, {"@@@"}, false); s64 val64 = 0; if (cheat_vec.size() != 5 || !try_to_int64(&val64, cheat_vec[2], 0, cheat_type_max - 1)) @@ -38,11 +38,11 @@ bool cheat_info::from_str(std::string_view cheat_line) return false; } - game = cheat_vec[0]; - description = cheat_vec[1]; + game = std::move(cheat_vec[0]); + description = std::move(cheat_vec[1]); type = cheat_type{::narrow(val64)}; offset = std::stoul(cheat_vec[3]); - red_script = cheat_vec[4]; + red_script = std::move(cheat_vec[4]); return true; } diff --git a/rpcs3/Emu/Io/camera_config.cpp b/rpcs3/Emu/Io/camera_config.cpp index e9ef5de7c5..f1fabe5531 100644 --- a/rpcs3/Emu/Io/camera_config.cpp +++ b/rpcs3/Emu/Io/camera_config.cpp @@ -77,7 +77,7 @@ void cfg_camera::camera_setting::from_string(std::string_view text) return; } - const std::vector list = fmt::split(text, { "," }); + const std::vector list = fmt::split_sv(text, { "," }); if (list.size() != member_count) { diff --git a/rpcs3/util/cpu_stats.cpp b/rpcs3/util/cpu_stats.cpp index 8203d1977b..0f4149e909 100644 --- a/rpcs3/util/cpu_stats.cpp +++ b/rpcs3/util/cpu_stats.cpp @@ -208,22 +208,23 @@ namespace utils content << proc_stat.rdbuf(); proc_stat.close(); - const std::vector lines = fmt::split(content.str(), {"\n"}); + const std::string content_str = content.str(); + const std::vector lines = fmt::split_sv(content_str, {"\n"}); if (lines.empty()) { perf_log.error("/proc/stat is empty"); return; } - for (const std::string& line : lines) + for (const std::string_view& line : lines) { - const std::vector tokens = fmt::split(line, {" "}); + const std::vector tokens = fmt::split_sv(line, {" "}); if (tokens.size() < 5) { return; } - const std::string& token = tokens[0]; + const std::string_view token = tokens[0]; if (!token.starts_with("cpu")) { return; diff --git a/rpcs3/util/sysinfo.cpp b/rpcs3/util/sysinfo.cpp index fb6dd6d7f7..66e551f42a 100755 --- a/rpcs3/util/sysinfo.cpp +++ b/rpcs3/util/sysinfo.cpp @@ -765,7 +765,8 @@ utils::OS_version utils::get_OS_version() #else if (struct utsname details = {}; !uname(&details)) { - const std::vector version_list = fmt::split(details.release, { "." }); + const std::string_view release = details.release; + const std::vector version_list = fmt::split_sv(release, { "." }); const auto get_version_part = [&version_list](usz i) -> usz { if (version_list.size() <= i) return 0; From 79616a376fc1ad3c48ee50f74066123077fdfeab Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 16 Jun 2026 01:26:03 +0200 Subject: [PATCH 32/64] Qt: don't play movie unless the parent window is active --- rpcs3/rpcs3qt/game_list.cpp | 4 ++-- rpcs3/rpcs3qt/game_list_grid_item.cpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list.cpp b/rpcs3/rpcs3qt/game_list.cpp index 846ab5863e..cbd359ab48 100644 --- a/rpcs3/rpcs3qt/game_list.cpp +++ b/rpcs3/rpcs3qt/game_list.cpp @@ -26,7 +26,7 @@ game_list::game_list() : QTableWidget(), game_list_base() movie_item* new_item = static_cast(item(row, 0)); - if (new_item) + if (new_item && isActiveWindow()) { new_item->set_active(true); } @@ -157,7 +157,7 @@ void game_list::mouseMoveEvent(QMouseEvent* event) { m_last_hover_item->set_active(false); } - if (new_item) + if (new_item && isActiveWindow()) { new_item->set_active(true); } diff --git a/rpcs3/rpcs3qt/game_list_grid_item.cpp b/rpcs3/rpcs3qt/game_list_grid_item.cpp index a3952a264a..1411bca8ba 100644 --- a/rpcs3/rpcs3qt/game_list_grid_item.cpp +++ b/rpcs3/rpcs3qt/game_list_grid_item.cpp @@ -74,7 +74,8 @@ bool game_list_grid_item::event(QEvent* event) switch (event->type()) { case QEvent::HoverEnter: - set_active(true); + if (isActiveWindow()) + set_active(true); break; case QEvent::HoverLeave: case QEvent::FocusOut: From 5e745ac661e845ff76fdbf76577d5084c410b9ec Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 16 Jun 2026 01:27:35 +0200 Subject: [PATCH 33/64] Qt: prevent playing movies directly after a refresh --- rpcs3/rpcs3qt/game_list.cpp | 9 +++++++++ rpcs3/rpcs3qt/game_list.h | 2 ++ rpcs3/rpcs3qt/game_list_grid.cpp | 14 ++++++++++++++ rpcs3/rpcs3qt/game_list_grid.h | 2 ++ rpcs3/rpcs3qt/game_list_table.cpp | 3 +++ rpcs3/rpcs3qt/main_window.cpp | 8 ++++---- 6 files changed, 34 insertions(+), 4 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list.cpp b/rpcs3/rpcs3qt/game_list.cpp index cbd359ab48..21f00f2256 100644 --- a/rpcs3/rpcs3qt/game_list.cpp +++ b/rpcs3/rpcs3qt/game_list.cpp @@ -35,6 +35,15 @@ game_list::game_list() : QTableWidget(), game_list_base() }); } +void game_list::stop_movie() +{ + if (m_last_hover_item) + { + m_last_hover_item->set_active(false); + m_last_hover_item = nullptr; + } +} + void game_list::sync_header_actions(std::map& actions, std::function get_visibility) { ensure(get_visibility); diff --git a/rpcs3/rpcs3qt/game_list.h b/rpcs3/rpcs3qt/game_list.h index 6d5a3f5a3e..34e7cba059 100644 --- a/rpcs3/rpcs3qt/game_list.h +++ b/rpcs3/rpcs3qt/game_list.h @@ -23,6 +23,8 @@ class game_list : public QTableWidget, public game_list_base public: game_list(); + void stop_movie(); + void sync_header_actions(std::map& actions, std::function get_visibility); void create_header_actions(std::map& actions, std::function get_visibility, std::function set_visibility); diff --git a/rpcs3/rpcs3qt/game_list_grid.cpp b/rpcs3/rpcs3qt/game_list_grid.cpp index 04dd3a4e98..72cf5816a2 100644 --- a/rpcs3/rpcs3qt/game_list_grid.cpp +++ b/rpcs3/rpcs3qt/game_list_grid.cpp @@ -35,6 +35,17 @@ game_list_grid::game_list_grid() }); } +void game_list_grid::stop_movie() +{ + for (flow_widget_item* flow_item : items()) + { + if (game_list_grid_item* item = static_cast(flow_item)) + { + item->set_active(false); + } + } +} + void game_list_grid::clear_list() { clear(); @@ -145,6 +156,9 @@ void game_list_grid::populate( QApplication::processEvents(); select_items(selected_items); + + // Prevent playing unwanted movie + stop_movie(); } void game_list_grid::repaint_icons(std::vector& game_data, const QColor& icon_color, const QSize& icon_size, qreal device_pixel_ratio) diff --git a/rpcs3/rpcs3qt/game_list_grid.h b/rpcs3/rpcs3qt/game_list_grid.h index 0aebbe0547..e888e0ac08 100644 --- a/rpcs3/rpcs3qt/game_list_grid.h +++ b/rpcs3/rpcs3qt/game_list_grid.h @@ -12,6 +12,8 @@ class game_list_grid : public flow_widget, public game_list_base public: explicit game_list_grid(); + void stop_movie(); + void clear_list() override; void populate( diff --git a/rpcs3/rpcs3qt/game_list_table.cpp b/rpcs3/rpcs3qt/game_list_table.cpp index ca157c5183..fc393e4667 100644 --- a/rpcs3/rpcs3qt/game_list_table.cpp +++ b/rpcs3/rpcs3qt/game_list_table.cpp @@ -424,6 +424,9 @@ void game_list_table::populate( } } Q_EMIT itemSelectionChanged(); + + // Prevent playing unwanted movie + stop_movie(); } void game_list_table::repaint_icons(std::vector& game_data, const QColor& icon_color, const QSize& icon_size, qreal device_pixel_ratio) diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index b5505592b2..251b1d937f 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -3543,10 +3543,10 @@ void main_window::CreateConnects() connect(ui->downloadIntegrityDbAct, &QAction::triggered, this, [this]() { - ensure(m_game_list_frame->GetIsoIntegrity())->download(); - ensure(m_game_list_frame->GetPsnContentIntegrity())->download(); - ensure(m_game_list_frame->GetPsnDlcIntegrity())->download(); - ensure(m_game_list_frame->GetPsnUpdateIntegrity())->download(); + m_game_list_frame->GetIsoIntegrity()->download(); + m_game_list_frame->GetPsnContentIntegrity()->download(); + m_game_list_frame->GetPsnDlcIntegrity()->download(); + m_game_list_frame->GetPsnUpdateIntegrity()->download(); }); connect(ui->downloadCompatDbAct, &QAction::triggered, this, [this]() From 5c4be5dd3bf261e6ee2747508df85fd14d9eb194 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 16 Jun 2026 01:28:19 +0200 Subject: [PATCH 34/64] Qt: stop movies when the main window gets inactive --- rpcs3/rpcs3qt/game_list_frame.cpp | 6 ++++++ rpcs3/rpcs3qt/game_list_frame.h | 10 ++++++---- rpcs3/rpcs3qt/main_window.cpp | 13 +++++++++++++ rpcs3/rpcs3qt/main_window.h | 1 + 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 5308412072..9dfd6a940e 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -1237,6 +1237,12 @@ void game_list_frame::ShowCustomConfigIcon(const game_info& game) RepaintIcons(); } +void game_list_frame::stop_movie() +{ + if (m_game_list) m_game_list->stop_movie(); + if (m_game_grid) m_game_grid->stop_movie(); +} + void game_list_frame::ResizeIcons(int slider_pos) { m_icon_size_index = slider_pos; diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h index 0659b350c8..775258d02d 100644 --- a/rpcs3/rpcs3qt/game_list_frame.h +++ b/rpcs3/rpcs3qt/game_list_frame.h @@ -56,10 +56,10 @@ public: void SetShowHidden(bool show); - content_integrity* GetIsoIntegrity() const { return m_iso_integrity; } - content_integrity* GetPsnContentIntegrity() const { return m_psn_content_integrity; } - content_integrity* GetPsnDlcIntegrity() const { return m_psn_dlc_integrity; } - content_integrity* GetPsnUpdateIntegrity() const { return m_psn_update_integrity; } + content_integrity* GetIsoIntegrity() const { return ensure(m_iso_integrity); } + content_integrity* GetPsnContentIntegrity() const { return ensure(m_psn_content_integrity); } + content_integrity* GetPsnDlcIntegrity() const { return ensure(m_psn_dlc_integrity); } + content_integrity* GetPsnUpdateIntegrity() const { return ensure(m_psn_update_integrity); } game_compatibility* GetGameCompatibility() const { return ensure(m_game_compat); } config_database* GetConfigDatabase() const { return ensure(m_config_db); } const std::vector& GetGameInfo() const { return m_game_data; } @@ -75,6 +75,8 @@ public: void ShowCustomConfigIcon(const game_info& game); + void stop_movie(); + // Enqueue slot for refreshed signal // Allowing for an individual container for each distinct use case (currently disabled and contains only one such entry) template diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 251b1d937f..d51c52e7b9 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -4100,6 +4100,19 @@ void main_window::closeEvent(QCloseEvent* closeEvent) Emu.Quit(true); } +void main_window::changeEvent(QEvent* event) +{ + if (event->type() == QEvent::ActivationChange) + { + if (m_game_list_frame && !isActiveWindow()) + { + m_game_list_frame->stop_movie(); + } + } + + QMainWindow::changeEvent(event); +} + /** Add valid disc games to gamelist (games.yml) @param paths = dir paths to scan for game diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index 0dcf48200d..19a85865a4 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -126,6 +126,7 @@ private Q_SLOTS: protected: void closeEvent(QCloseEvent *event) override; + void changeEvent(QEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; void dropEvent(QDropEvent* event) override; void dragEnterEvent(QDragEnterEvent* event) override; From b8ca6d953f734900c23f2cfbe79a36e598171553 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 06:25:39 +0200 Subject: [PATCH 35/64] Use std::string_view in crypto code --- rpcs3/Crypto/key_vault.cpp | 2 +- rpcs3/Crypto/key_vault.h | 2 +- rpcs3/Crypto/unedat.cpp | 6 +++--- rpcs3/Crypto/unedat.h | 2 +- rpcs3/Crypto/utils.cpp | 10 ++++------ rpcs3/Crypto/utils.h | 2 +- 6 files changed, 11 insertions(+), 13 deletions(-) diff --git a/rpcs3/Crypto/key_vault.cpp b/rpcs3/Crypto/key_vault.cpp index 6fa9aa0684..92d308e9f8 100644 --- a/rpcs3/Crypto/key_vault.cpp +++ b/rpcs3/Crypto/key_vault.cpp @@ -5,7 +5,7 @@ LOG_CHANNEL(key_vault_log, "KEY_VAULT"); -SELF_KEY::SELF_KEY(u64 ver_start, u64 ver_end, u16 rev, u32 type, const std::string& e, const std::string& r, const std::string& pb, const std::string& pr, u32 ct) +SELF_KEY::SELF_KEY(u64 ver_start, u64 ver_end, u16 rev, u32 type, std::string_view e, std::string_view r, std::string_view pb, std::string_view pr, u32 ct) { version_start = ver_start; version_end = ver_end; diff --git a/rpcs3/Crypto/key_vault.h b/rpcs3/Crypto/key_vault.h index 4dff84992b..36344defe2 100644 --- a/rpcs3/Crypto/key_vault.h +++ b/rpcs3/Crypto/key_vault.h @@ -30,7 +30,7 @@ struct SELF_KEY u8 priv[0x15]{}; u32 curve_type{}; - SELF_KEY(u64 ver_start, u64 ver_end, u16 rev, u32 type, const std::string& e, const std::string& r, const std::string& pb, const std::string& pr, u32 ct); + SELF_KEY(u64 ver_start, u64 ver_end, u16 rev, u32 type, std::string_view e, std::string_view r, std::string_view pb, std::string_view pr, u32 ct); }; constexpr u32 PASSPHRASE_KEY_LEN = 16; diff --git a/rpcs3/Crypto/unedat.cpp b/rpcs3/Crypto/unedat.cpp index 1ffaa33fc3..6fea6c1859 100644 --- a/rpcs3/Crypto/unedat.cpp +++ b/rpcs3/Crypto/unedat.cpp @@ -679,7 +679,7 @@ u128 GetEdatRifKeyFromRapFile(const fs::file& rap_file) return rifkey; } -bool VerifyEDATHeaderWithKLicense(const fs::file& input, const std::string& input_file_name, const u8* custom_klic, NPD_HEADER* npd_out) +bool VerifyEDATHeaderWithKLicense(const fs::file& input, std::string_view input_file_name, const u8* custom_klic, NPD_HEADER* npd_out) { // Setup NPD and EDAT/SDAT structs. NPD_HEADER NPD; @@ -702,7 +702,7 @@ bool VerifyEDATHeaderWithKLicense(const fs::file& input, const std::string& inpu // Perform header validation (EDAT only). char real_file_name[CRYPTO_MAX_PATH]{}; - extract_file_name(input_file_name.c_str(), real_file_name); + extract_file_name(input_file_name, real_file_name); if (!validate_npd_hashes(real_file_name, custom_klic, &NPD, &EDAT, false)) { edat_log.error("NPD hash validation failed!"); @@ -810,7 +810,7 @@ bool EDATADecrypter::ReadHeader() { // extract key from RIF char real_file_name[CRYPTO_MAX_PATH]{}; - extract_file_name(m_file_name.c_str(), real_file_name); + extract_file_name(m_file_name, real_file_name); if (!validate_npd_hashes(real_file_name, reinterpret_cast(&dec_key), &npdHeader, &edatHeader, false)) { diff --git a/rpcs3/Crypto/unedat.h b/rpcs3/Crypto/unedat.h index 31fce60d4e..cc91509a5e 100644 --- a/rpcs3/Crypto/unedat.h +++ b/rpcs3/Crypto/unedat.h @@ -62,7 +62,7 @@ struct EDAT_HEADER extern fs::file DecryptEDAT(const fs::file& input, const std::string& input_file_name, int mode, u8 *custom_klic); extern void read_npd_edat_header(const fs::file* input, NPD_HEADER& NPD, EDAT_HEADER& EDAT); -extern bool VerifyEDATHeaderWithKLicense(const fs::file& input, const std::string& input_file_name, const u8* custom_klic, NPD_HEADER *npd_out = nullptr); +extern bool VerifyEDATHeaderWithKLicense(const fs::file& input, std::string_view input_file_name, const u8* custom_klic, NPD_HEADER *npd_out = nullptr); u128 GetEdatRifKeyFromRapFile(const fs::file& rap_file); diff --git a/rpcs3/Crypto/utils.cpp b/rpcs3/Crypto/utils.cpp index 514bf08580..7913221380 100644 --- a/rpcs3/Crypto/utils.cpp +++ b/rpcs3/Crypto/utils.cpp @@ -136,17 +136,15 @@ void cmac_hash_forge(unsigned char *key, int /*key_len*/, unsigned char *in, usz aes_cmac(&ctx, in_len, in, hash); } -char* extract_file_name(const char* file_path, char real_file_name[CRYPTO_MAX_PATH]) +char* extract_file_name(std::string_view file_path, char real_file_name[CRYPTO_MAX_PATH]) { - std::string_view v(file_path); - - if (const auto pos = v.find_last_of(fs::delim); pos != umax) + if (const auto pos = file_path.find_last_of(fs::delim); pos != umax) { - v.remove_prefix(pos + 1); + file_path.remove_prefix(pos + 1); } std::span r(real_file_name, CRYPTO_MAX_PATH); - strcpy_trunc(r, v); + strcpy_trunc(r, file_path); return real_file_name; } diff --git a/rpcs3/Crypto/utils.h b/rpcs3/Crypto/utils.h index 88f0d8ce6f..780226d3b9 100644 --- a/rpcs3/Crypto/utils.h +++ b/rpcs3/Crypto/utils.h @@ -11,7 +11,7 @@ enum { CRYPTO_MAX_PATH = 4096 }; -char* extract_file_name(const char* file_path, char real_file_name[CRYPTO_MAX_PATH]); +char* extract_file_name(std::string_view file_path, char real_file_name[CRYPTO_MAX_PATH]); std::string sha256_get_hash(const char* data, usz size, bool lower_case); From 7a4ec423628240ff5541af06626a07e161a0361c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 06:27:29 +0200 Subject: [PATCH 36/64] Use std::string_view in loader code --- rpcs3/Loader/PSF.cpp | 18 ++---------------- rpcs3/Loader/PSF.h | 2 +- rpcs3/Loader/TAR.cpp | 4 ++-- 3 files changed, 5 insertions(+), 19 deletions(-) diff --git a/rpcs3/Loader/PSF.cpp b/rpcs3/Loader/PSF.cpp index 28c08d7b8c..2efa896109 100644 --- a/rpcs3/Loader/PSF.cpp +++ b/rpcs3/Loader/PSF.cpp @@ -396,24 +396,13 @@ namespace psf return found->second.as_integer(); } - bool check_registry(const registry& psf, std::function validate, std::source_location src_loc) + bool check_registry(const registry& psf, std::source_location src_loc) { bool psf_ok = true; for (const auto& [key, value] : psf) { - bool entry_ok = value.is_valid(); - - if (validate) - { - // Validate against a custom condition as well (forward error) - if (!validate(entry_ok, key, value)) - { - entry_ok = false; - } - } - - if (!entry_ok) + if (!value.is_valid()) { if (value.type() == format::string) { @@ -424,10 +413,7 @@ namespace psf // TODO: Better logging of other types psf_log.error("Entry %s is invalid.%s", key, value.as_string(), src_loc); } - } - if (!entry_ok) - { // Do not break, run over all entries in order to report all errors psf_ok = false; } diff --git a/rpcs3/Loader/PSF.h b/rpcs3/Loader/PSF.h index 9cc8b16c19..d4d93e713e 100644 --- a/rpcs3/Loader/PSF.h +++ b/rpcs3/Loader/PSF.h @@ -103,7 +103,7 @@ namespace psf // Get integer value or default value u32 get_integer(const registry& psf, std::string_view key, u32 def = 0); - bool check_registry(const registry& psf, std::function validate = {}, std::source_location src_loc = std::source_location::current()); + bool check_registry(const registry& psf, std::source_location src_loc = std::source_location::current()); // Assign new entry inline void assign(registry& psf, std::string_view key, entry&& _entry) diff --git a/rpcs3/Loader/TAR.cpp b/rpcs3/Loader/TAR.cpp index 7cd25c6f1f..4eb568c3b7 100644 --- a/rpcs3/Loader/TAR.cpp +++ b/rpcs3/Loader/TAR.cpp @@ -565,11 +565,11 @@ void tar_object::save_directory(const std::string& target_path, utils::serial& a } }; - auto save_header = [&](const fs::stat_t& stat, const std::string& name) + auto save_header = [&](const fs::stat_t& stat, std::string_view name) { static_assert(sizeof(TARHeader) == 512); - std::string_view saved_path{name.size() == src_dir_pos ? name.c_str() : &::at32(name, src_dir_pos), name.size() - src_dir_pos}; + std::string_view saved_path = name.size() == src_dir_pos ? name : name.substr(src_dir_pos); if (is_null) { From 54b8b5399b11caea92a7ad6cc54dcec0cef02b03 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 06:25:06 +0200 Subject: [PATCH 37/64] Use std::string_view in pine_server --- 3rdparty/pine/pine_server.h | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/3rdparty/pine/pine_server.h b/3rdparty/pine/pine_server.h index fe88ddb474..5c59e87da3 100644 --- a/3rdparty/pine/pine_server.h +++ b/3rdparty/pine/pine_server.h @@ -164,14 +164,17 @@ namespace pine return IPCBuffer{ 5, MakeFailIPC(ret_buffer) }; }; - const auto write_string = [&](const std::string& str) + const auto write_string = [&](std::string_view str) { if (!SafetyChecks(buf_cnt, 0, ret_cnt, str.size() + 1 + sizeof(u32), buf_size)) return false; ToArray(ret_buffer, ::narrow(str.size() + 1), ret_cnt); ret_cnt += sizeof(u32); - memcpy(&ret_buffer[ret_cnt], str.data(), str.size()); - ret_cnt += str.size(); + if (str.size()) + { + std::memcpy(&ret_buffer[ret_cnt], str.data(), str.size()); + ret_cnt += str.size(); + } ret_buffer[ret_cnt++] = '\0'; return true; }; @@ -512,7 +515,7 @@ namespace pine */ static inline bool SafetyChecks(usz command_len, usz command_size, usz reply_len, usz reply_size = 0, usz buf_size = MAX_IPC_SIZE - 1) { - bool res = ((command_len + command_size) > buf_size || + const bool res = ((command_len + command_size) > buf_size || (reply_len + reply_size) >= MAX_IPC_RETURN_SIZE); if (res) [[unlikely]] return false; @@ -524,8 +527,8 @@ namespace pine pine_server() noexcept { #ifdef _WIN32 - WSADATA wsa; - struct sockaddr_in server; + WSADATA wsa {}; + struct sockaddr_in server {}; m_sock = INVALID_SOCKET; m_msgsock = INVALID_SOCKET; @@ -579,7 +582,7 @@ namespace pine fmt::append(m_socket_name, ".%d", slot); } - struct sockaddr_un server; + struct sockaddr_un server {}; m_sock = socket(AF_UNIX, SOCK_STREAM, 0); if (m_sock < 0) From e5cdae8c5a63855c77b16d9c8b63b24362170400 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 06:28:05 +0200 Subject: [PATCH 38/64] Use std::string_view in cpu code --- Utilities/JIT.h | 4 ++-- Utilities/JITLLVM.cpp | 6 +++--- Utilities/stack_trace.h | 4 ++-- rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.cpp | 2 +- rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.h | 2 +- rpcs3/Emu/Cell/PPUThread.cpp | 6 +++--- rpcs3/Emu/Cell/PPUTranslator.cpp | 2 +- rpcs3/Emu/Cell/PPUTranslator.h | 2 +- rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 4 ++-- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Utilities/JIT.h b/Utilities/JIT.h index d18f795563..aba30c3400 100644 --- a/Utilities/JIT.h +++ b/Utilities/JIT.h @@ -525,7 +525,7 @@ class jit_compiler final atomic_t m_disk_space = umax; public: - jit_compiler(const std::unordered_map& _link, const std::string& _cpu, u32 flags = 0, std::function symbols_cement = {}) noexcept; + jit_compiler(const std::unordered_map& _link, std::string_view _cpu, u32 flags = 0, std::function symbols_cement = {}) noexcept; jit_compiler& operator=(thread_state) noexcept; ~jit_compiler() noexcept; @@ -571,7 +571,7 @@ public: u64 get(const std::string& name); // Get CPU info - static std::string cpu(const std::string& _cpu); + static std::string cpu(std::string_view _cpu); // Get system triple (PPU) static std::string triple1(); diff --git a/Utilities/JITLLVM.cpp b/Utilities/JITLLVM.cpp index 66a7d3e678..3bfb30cea2 100644 --- a/Utilities/JITLLVM.cpp +++ b/Utilities/JITLLVM.cpp @@ -551,9 +551,9 @@ public: } }; -std::string jit_compiler::cpu(const std::string& _cpu) +std::string jit_compiler::cpu(std::string_view _cpu) { - std::string m_cpu = _cpu; + std::string m_cpu = std::string(_cpu); if (m_cpu.empty()) { @@ -681,7 +681,7 @@ bool jit_compiler::add_sub_disk_space(ssz space) }).second; } -jit_compiler::jit_compiler(const std::unordered_map& _link, const std::string& _cpu, u32 flags, std::function symbols_cement) noexcept +jit_compiler::jit_compiler(const std::unordered_map& _link, std::string_view _cpu, u32 flags, std::function symbols_cement) noexcept : m_context(new llvm::LLVMContext) , m_cpu(cpu(_cpu)) { diff --git a/Utilities/stack_trace.h b/Utilities/stack_trace.h index d0cec0cf4c..d186a698f4 100644 --- a/Utilities/stack_trace.h +++ b/Utilities/stack_trace.h @@ -14,7 +14,7 @@ namespace utils // Printing utilities template - concept Logger = requires (T& t, const std::string& msg) + concept Logger = requires (T& t, std::string_view msg) { { t.print(msg) }; }; @@ -28,7 +28,7 @@ namespace utils : log(chan) {} - void print(const std::string& s) + void print(std::string_view s) { log.error("%s", s); } diff --git a/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.cpp b/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.cpp index 91aedffd85..2fda215664 100644 --- a/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.cpp +++ b/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.cpp @@ -219,7 +219,7 @@ namespace aarch64 return result; } - gpr GHC_frame_preservation_pass::get_base_register_for_call(const std::string& callee_name, gpr default_reg) + gpr GHC_frame_preservation_pass::get_base_register_for_call(std::string_view callee_name, gpr default_reg) { // We go over the base_register_lookup table and find the first matching pattern for (const auto& pattern : m_config.base_register_lookup) diff --git a/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.h b/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.h index 701fe85be9..2ca8c383e5 100644 --- a/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.h +++ b/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.h @@ -67,7 +67,7 @@ namespace aarch64 bool is_faux_function(const std::string& function_name); - gpr get_base_register_for_call(const std::string& callee_name, gpr default_reg = gpr::x19); + gpr get_base_register_for_call(std::string_view callee_name, gpr default_reg = gpr::x19); void process_leaf_function(llvm::IRBuilder<>* irb, llvm::Function& f); diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 11bfd40eca..82564a124a 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -5177,7 +5177,7 @@ bool ppu_initialize(const ppu_module& info, bool check_only, u64 file_s settings += ppu_settings::contains_symbol_resolver; // Avoid invalidating all modules for this purpose // Write version, hash, CPU, settings - fmt::append(obj_name, "v7-kusa-%s-%s-%s.obj", fmt::base57(output, 16), fmt::base57(settings), jit_compiler::cpu(g_cfg.core.llvm_cpu)); + fmt::append(obj_name, "v7-kusa-%s-%s-%s.obj", fmt::base57(output, 16), fmt::base57(settings), jit_compiler::cpu(g_cfg.core.llvm_cpu.to_string())); } if (cpu ? cpu->state.all_of(cpu_flag::exit) : Emu.IsStopped()) @@ -5318,7 +5318,7 @@ bool ppu_initialize(const ppu_module& info, bool check_only, u64 file_s { // Use another JIT instance - jit_compiler jit2({}, g_cfg.core.llvm_cpu, 0x1); + jit_compiler jit2({}, g_cfg.core.llvm_cpu.to_string(), 0x1); ppu_initialize2(jit2, part, cache_path, obj_name); } @@ -5351,7 +5351,7 @@ bool ppu_initialize(const ppu_module& info, bool check_only, u64 file_s // Initialize compiler instance while (jits.size() < utils::aligned_div(module_counter, c_moudles_per_jit) && is_being_used_in_emulation) { - jits.emplace_back(std::make_shared(s_link_table, g_cfg.core.llvm_cpu, 0, symbols_cement)); + jits.emplace_back(std::make_shared(s_link_table, g_cfg.core.llvm_cpu.to_string(), 0, symbols_cement)); for (const auto& [addr, func] : *shared_map) { diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 9125aa5eeb..7cba32d9f7 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -961,7 +961,7 @@ void PPUTranslator::WriteMemory(Value* addr, Value* value, bool is_be, u32 align m_ir->CreateAlignedStore(value, GetMemory(addr), llvm::MaybeAlign{align})->setVolatile(true); } -void PPUTranslator::CompilationError(const std::string& error) +void PPUTranslator::CompilationError(std::string_view error) { ppu_log.error("LLVM: [0x%08x] Error: %s", m_addr + (m_reloc ? m_reloc->addr : 0), error); } diff --git a/rpcs3/Emu/Cell/PPUTranslator.h b/rpcs3/Emu/Cell/PPUTranslator.h index 010945656e..be84d8061e 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.h +++ b/rpcs3/Emu/Cell/PPUTranslator.h @@ -334,7 +334,7 @@ public: } // Handle compilation errors - void CompilationError(const std::string& error); + void CompilationError(std::string_view error); PPUTranslator(llvm::LLVMContext& context, llvm::Module* _module, const ppu_module& info, llvm::ExecutionEngine& engine); ~PPUTranslator(); diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index f976dd2d87..40e473d365 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -77,7 +77,7 @@ void spu_llvm_set_compile_context(spu_llvm_compile_context* context) noexcept class spu_llvm_recompiler : public spu_recompiler_base, public cpu_translator { // JIT Instance - jit_compiler m_jit{{}, jit_compiler::cpu(g_cfg.core.llvm_cpu)}; + jit_compiler m_jit{{}, jit_compiler::cpu(g_cfg.core.llvm_cpu.to_string())}; // Interpreter table size power const u8 m_interp_magn; @@ -1592,7 +1592,7 @@ public: clear_transforms(); #ifdef ARCH_ARM64 { - auto should_exclude_function = [](const std::string& fn_name) + auto should_exclude_function = [](std::string_view fn_name) { return fn_name.starts_with("spu_") || fn_name.starts_with("tr_"); }; From 6593caff6752c5d4296436c5703efdf77deb9ae2 Mon Sep 17 00:00:00 2001 From: Walter Date: Tue, 16 Jun 2026 12:24:29 +1000 Subject: [PATCH 39/64] [SPU ASMJIT] Add SSE4.1 CLZ method Added a SSE4.1 vectorized CLZ method to the SPU ASMJT. --- rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index 5100bc3ded..8586077574 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -3343,14 +3343,35 @@ void spu_recompiler::HGT(spu_opcode_t op) void spu_recompiler::CLZ(spu_opcode_t op) { + const XmmLink& va = XmmGet(op.ra, XmmType::Int); + if (utils::has_avx512()) { - const XmmLink& va = XmmGet(op.ra, XmmType::Int); const XmmLink& vt = XmmAlloc(); c->vplzcntd(vt, va); c->movdqa(SPU_OFF_128(gpr, op.rt), vt); return; } + + if (utils::has_sse41()) + { + // Use signed conversion to float, as exponent is ilog2 + // Fixup "negative" cases by overwriting with zero + const u32 exp_bias = 127; + + const XmmLink& vf = XmmAlloc(); + const XmmLink& v1 = XmmAlloc(); + c->cvtdq2ps(vf, va); // only correct with round-towards-zero + c->psrld(vf, 23); + c->movdqa(v1, XmmConst(v128::from32p(exp_bias - 1))); + c->psignd(v1, va); // conditional zeroing + c->paddd(v1, XmmConst(v128::from32p(32))); + c->psubd(v1, vf); // (x==0)? 32 : 31 - (exponent - exp_bias) + c->pxor(vf, vf); + c->blendvps(v1, vf, va); + c->movdqa(SPU_OFF_128(gpr, op.rt), v1); + return; + } c->mov(qw0->r32(), 32 + 31); for (u32 i = 0; i < 4; i++) // unrolled loop From 465b845bdf36c48b8a1e93c028f16334b7795ea0 Mon Sep 17 00:00:00 2001 From: Walter Date: Tue, 16 Jun 2026 13:25:21 +1000 Subject: [PATCH 40/64] Avoid unused `XmmGet` on SSE2 path Avoids creating a redundant `XmmGet` allocation on targets without SSE4.1, by duplicating the declaration across both target specific blocks. --- rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index 8586077574..d6860bd1fc 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -3343,10 +3343,9 @@ void spu_recompiler::HGT(spu_opcode_t op) void spu_recompiler::CLZ(spu_opcode_t op) { - const XmmLink& va = XmmGet(op.ra, XmmType::Int); - if (utils::has_avx512()) { + const XmmLink& va = XmmGet(op.ra, XmmType::Int); const XmmLink& vt = XmmAlloc(); c->vplzcntd(vt, va); c->movdqa(SPU_OFF_128(gpr, op.rt), vt); @@ -3359,6 +3358,7 @@ void spu_recompiler::CLZ(spu_opcode_t op) // Fixup "negative" cases by overwriting with zero const u32 exp_bias = 127; + const XmmLink& va = XmmGet(op.ra, XmmType::Int); const XmmLink& vf = XmmAlloc(); const XmmLink& v1 = XmmAlloc(); c->cvtdq2ps(vf, va); // only correct with round-towards-zero From 4d38e69fd9b2afb89198be5a7d0301c75e74ac87 Mon Sep 17 00:00:00 2001 From: Walter Date: Tue, 16 Jun 2026 15:06:06 +1000 Subject: [PATCH 41/64] Make SSE2 compatible Removed the SSE4.1 instruction to make it compatible with the baseline instruction set. Increased dependency chain by one instruction and caused constant generation to be slightly more expensive. --- rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp | 47 ++++++++++---------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index d6860bd1fc..14cd7314dc 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -3343,44 +3343,33 @@ void spu_recompiler::HGT(spu_opcode_t op) void spu_recompiler::CLZ(spu_opcode_t op) { + const XmmLink& va = XmmGet(op.ra, XmmType::Int); + if (utils::has_avx512()) { - const XmmLink& va = XmmGet(op.ra, XmmType::Int); const XmmLink& vt = XmmAlloc(); c->vplzcntd(vt, va); c->movdqa(SPU_OFF_128(gpr, op.rt), vt); return; } - - if (utils::has_sse41()) - { - // Use signed conversion to float, as exponent is ilog2 - // Fixup "negative" cases by overwriting with zero - const u32 exp_bias = 127; - const XmmLink& va = XmmGet(op.ra, XmmType::Int); - const XmmLink& vf = XmmAlloc(); - const XmmLink& v1 = XmmAlloc(); - c->cvtdq2ps(vf, va); // only correct with round-towards-zero - c->psrld(vf, 23); - c->movdqa(v1, XmmConst(v128::from32p(exp_bias - 1))); - c->psignd(v1, va); // conditional zeroing - c->paddd(v1, XmmConst(v128::from32p(32))); - c->psubd(v1, vf); // (x==0)? 32 : 31 - (exponent - exp_bias) - c->pxor(vf, vf); - c->blendvps(v1, vf, va); - c->movdqa(SPU_OFF_128(gpr, op.rt), v1); - return; - } + // Use signed conversion to float, as exponent is ilog2 + // Fixup "negative" cases by overwriting with zero + const u32 exp_bias = 127; - c->mov(qw0->r32(), 32 + 31); - for (u32 i = 0; i < 4; i++) // unrolled loop - { - c->bsr(*addr, SPU_OFF_32(gpr, op.ra, &v128::_u32, i)); - c->cmovz(*addr, qw0->r32()); - c->xor_(*addr, 31); - c->mov(SPU_OFF_32(gpr, op.rt, &v128::_u32, i), *addr); - } + const XmmLink& vf = XmmAlloc(); + const XmmLink& v1 = XmmAlloc(); + c->cvtdq2ps(vf, va); // only correct with round-towards-zero + c->psrld(vf, 23); + c->pxor(v1, v1); + c->pcmpeqd(v1, va); + c->pand(v1, XmmConst(v128::from32p(32 ^ (31 + exp_bias)))); + c->pxor(v1, XmmConst(v128::from32p(31 + exp_bias))); + c->psubd(v1, vf); // (x==0)? 32 : 31 - (exponent - exp_bias) + c->psrad(va, 31); + c->pandn(va, v1); + c->movdqa(SPU_OFF_128(gpr, op.rt), va); + return; } void spu_recompiler::XSWD(spu_opcode_t op) From e429f8cf05926852ed63949cad652bf1de5869a4 Mon Sep 17 00:00:00 2001 From: Walter Date: Tue, 16 Jun 2026 17:51:14 +1000 Subject: [PATCH 42/64] SPU LLVM + zero with saturation subtract - Added a LLVM SPU recompiler implementation as LLVM can't take advantage of the rounding mode. - Further optimized the method by replacing MSB check with saturation subtraction. Negative values are saturated to zero due to the float's sign bit. --- rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp | 10 ++++------ rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index 14cd7314dc..89694affd4 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -3354,8 +3354,8 @@ void spu_recompiler::CLZ(spu_opcode_t op) } // Use signed conversion to float, as exponent is ilog2 - // Fixup "negative" cases by overwriting with zero - const u32 exp_bias = 127; + // "Negative" values are zeroed due to saturation subtract + constexpr u32 exp_bias = 127; const XmmLink& vf = XmmAlloc(); const XmmLink& v1 = XmmAlloc(); @@ -3365,10 +3365,8 @@ void spu_recompiler::CLZ(spu_opcode_t op) c->pcmpeqd(v1, va); c->pand(v1, XmmConst(v128::from32p(32 ^ (31 + exp_bias)))); c->pxor(v1, XmmConst(v128::from32p(31 + exp_bias))); - c->psubd(v1, vf); // (x==0)? 32 : 31 - (exponent - exp_bias) - c->psrad(va, 31); - c->pandn(va, v1); - c->movdqa(SPU_OFF_128(gpr, op.rt), va); + c->psubusw(v1, vf); // (x==0)? 32 : 31 - (exponent - exp_bias) + c->movdqa(SPU_OFF_128(gpr, op.rt), v1); return; } diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index 40e473d365..80d1100754 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -6329,7 +6329,30 @@ public: void CLZ(spu_opcode_t op) { +#ifdef ARCH_ARM64 set_vr(op.rt, ctlz(get_vr(op.ra))); +#else + if (m_use_avx512) + { + set_vr(op.rt, ctlz(get_vr(op.ra))); + return; + } + + // Implement manually since LLVM can't take advantage of round-towards-zero. + // Helpful as when converting to a float the exponent is always floor(ilog2) + + constexpr u32 exp_bias = 127; + value_t flt; + + const auto a = get_vr(op.ra); + flt.value = m_ir->CreateSIToFP(a.value, get_type()); // only correct with round-towards-zero! + const auto exp = bitcast(flt) >> 23; + + // "Negative" values cause saturation due to float's sign bit + const auto offset = select(a == 0, splat(32), splat(exp_bias + 31)); + const auto lzcnt = sub_sat(bitcast(offset), bitcast(exp)); + set_vr(op.rt, bitcast(lzcnt)); +#endif } void XSWD(spu_opcode_t op) From c1263eeb79529c460730dc62fe2ec3a1efbdfb87 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Wed, 17 Jun 2026 12:00:49 +0300 Subject: [PATCH 43/64] sys_rsx: Fix IOMAP syscalls argument types --- rpcs3/Emu/Cell/lv2/sys_rsx.cpp | 56 ++++++++++++++++++++++++---------- rpcs3/Emu/Cell/lv2/sys_rsx.h | 6 ++-- rpcs3/Emu/Memory/vm.cpp | 8 ++--- rpcs3/Emu/Memory/vm.h | 4 +-- 4 files changed, 49 insertions(+), 25 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp index 4ef4e04d85..c91a1aa1aa 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp @@ -18,7 +18,7 @@ LOG_CHANNEL(sys_rsx); // Unknown error code returned by sys_rsx_context_attribute enum sys_rsx_error : s32 { - SYS_RSX_CONTEXT_ATTRIBUTE_ERROR = -17 + LV1_ILLEGAL_PARAMETER_VALUE = -17 }; template<> @@ -28,7 +28,7 @@ void fmt_class_string::format(std::string& out, u64 arg) { switch (error) { - STR_CASE(SYS_RSX_CONTEXT_ATTRIBUTE_ERROR); + STR_CASE(LV1_ILLEGAL_PARAMETER_VALUE); } return unknown; @@ -169,12 +169,28 @@ error_code sys_rsx_device_close(cpu_thread& cpu) * @param a6 (IN): E.g. Immediate value passed in cellGcmSys is 16. * @param a7 (IN): E.g. Immediate value passed in cellGcmSys is 8. */ -error_code sys_rsx_memory_allocate(cpu_thread& cpu, vm::ptr mem_handle, vm::ptr mem_addr, u32 size, u64 flags, u64 a5, u64 a6, u64 a7) +error_code sys_rsx_memory_allocate(cpu_thread& cpu, vm::ptr mem_handle, vm::ptr mem_addr, u64 size, u64 flags, u64 a5, u64 a6, u64 a7) { - cpu.state += cpu_flag::wait; - sys_rsx.warning("sys_rsx_memory_allocate(mem_handle=*0x%x, mem_addr=*0x%x, size=0x%x, flags=0x%llx, a5=0x%llx, a6=0x%llx, a7=0x%llx)", mem_handle, mem_addr, size, flags, a5, a6, a7); + // size == 0 yields available size, unimplemented + ensure(size != 0); + + if (size & 0xFFFFF) + { + return LV1_ILLEGAL_PARAMETER_VALUE; + } + + // This is a result from how the argument is treated internally + size %= 0x100000 * 0x1'0000'00000; + + if (size > 0x1000'0000) + { + return LV1_ILLEGAL_PARAMETER_VALUE; + } + + cpu.state += cpu_flag::wait; + if (vm::falloc(rsx::constants::local_mem_base, size, vm::video)) { rsx::get_current_renderer()->local_mem_size = size; @@ -395,7 +411,7 @@ error_code sys_rsx_context_free(ppu_thread& ppu, u32 context_id) * @param size (IN): Size of mapping area in bytes. E.g. 0x00200000 * @param flags (IN): */ -error_code sys_rsx_context_iomap(cpu_thread& cpu, u32 context_id, u32 io, u32 ea, u32 size, u64 flags) +error_code sys_rsx_context_iomap(cpu_thread& cpu, u32 context_id, u64 io, u64 ea, u64 size, u64 flags) { cpu.state += cpu_flag::wait; @@ -403,8 +419,12 @@ error_code sys_rsx_context_iomap(cpu_thread& cpu, u32 context_id, u32 io, u32 ea const auto render = rsx::get_current_renderer(); - if (!size || io & 0xFFFFF || ea + u64{size} > rsx::constants::local_mem_base || ea & 0xFFFFF || size & 0xFFFFF || - context_id != 0x55555555 || render->main_mem_size < io + u64{size}) + if (!size || io & 0xFFFFF || size > 0x200'00000 || size > std::min(~io, ~size) || ea & 0xFFFFF || size & 0xFFFFF) + { + return CELL_EINVAL; + } + + if (context_id != 0x55555555 || render->main_mem_size < io + size) { return CELL_EINVAL; } @@ -419,7 +439,7 @@ error_code sys_rsx_context_iomap(cpu_thread& cpu, u32 context_id, u32 io, u32 ea vm::writer_lock rlock; - for (u32 addr = ea, end = ea + size; addr < end; addr += 0x100000) + for (u64 addr = ea, end = ea + size; addr < end; addr += 0x100000) { if (!vm::check_addr(addr, vm::page_readable | (addr < 0x20000000 ? 0 : vm::page_1m_size))) { @@ -458,7 +478,7 @@ error_code sys_rsx_context_iomap(cpu_thread& cpu, u32 context_id, u32 io, u32 ea * @param io (IN): IO address. E.g. 0x00600000 (Start page 6) * @param size (IN): Size to unmap in byte. E.g. 0x00200000 */ -error_code sys_rsx_context_iounmap(cpu_thread& cpu, u32 context_id, u32 io, u32 size) +error_code sys_rsx_context_iounmap(cpu_thread& cpu, u32 context_id, u64 io, u64 size) { cpu.state += cpu_flag::wait; @@ -466,8 +486,12 @@ error_code sys_rsx_context_iounmap(cpu_thread& cpu, u32 context_id, u32 io, u32 const auto render = rsx::get_current_renderer(); - if (!size || size & 0xFFFFF || io & 0xFFFFF || context_id != 0x55555555 || - render->main_mem_size < io + u64{size}) + if (!size || size & 0xFFFFF || io & 0xFFFFF || size > 0x200'00000 || size > ~io) + { + return CELL_EINVAL; + } + + if (context_id != 0x55555555 || render->main_mem_size < io + size) { return CELL_EINVAL; } @@ -481,7 +505,7 @@ error_code sys_rsx_context_iounmap(cpu_thread& cpu, u32 context_id, u32 io, u32 std::scoped_lock lock(render->sys_rsx_mtx); - for (const u32 end = (io >>= 20) + (size >>= 20); io < end;) + for (const u64 end = (io >>= 20) + (size >>= 20); io < end;) { auto& table = render->iomap_table; @@ -626,7 +650,7 @@ error_code sys_rsx_context_attribute(u32 context_id, u32 package_id, u64 a3, u64 const u8 id = a3 & 0xFF; if (id > 7) { - return SYS_RSX_CONTEXT_ATTRIBUTE_ERROR; + return LV1_ILLEGAL_PARAMETER_VALUE; } std::lock_guard lock(render->sys_rsx_mtx); @@ -676,7 +700,7 @@ error_code sys_rsx_context_attribute(u32 context_id, u32 package_id, u64 a3, u64 { if (a3 > 7) { - return SYS_RSX_CONTEXT_ATTRIBUTE_ERROR; + return LV1_ILLEGAL_PARAMETER_VALUE; } // NOTE: There currently seem to only be 2 active heads on PS3 @@ -784,7 +808,7 @@ error_code sys_rsx_context_attribute(u32 context_id, u32 package_id, u64 a3, u64 if (a3 >= std::size(render->zculls)) { - return SYS_RSX_CONTEXT_ATTRIBUTE_ERROR; + return LV1_ILLEGAL_PARAMETER_VALUE; } if (!render->is_fifo_idle()) diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.h b/rpcs3/Emu/Cell/lv2/sys_rsx.h index 44f02a697d..9b06b88ea4 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.h +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.h @@ -127,12 +127,12 @@ struct RsxDisplayInfo // SysCalls error_code sys_rsx_device_open(cpu_thread& cpu); error_code sys_rsx_device_close(cpu_thread& cpu); -error_code sys_rsx_memory_allocate(cpu_thread& cpu, vm::ptr mem_handle, vm::ptr mem_addr, u32 size, u64 flags, u64 a5, u64 a6, u64 a7); +error_code sys_rsx_memory_allocate(cpu_thread& cpu, vm::ptr mem_handle, vm::ptr mem_addr, u64 size, u64 flags, u64 a5, u64 a6, u64 a7); error_code sys_rsx_memory_free(cpu_thread& cpu, u32 mem_handle); error_code sys_rsx_context_allocate(cpu_thread& cpu, vm::ptr context_id, vm::ptr lpar_dma_control, vm::ptr lpar_driver_info, vm::ptr lpar_reports, u64 mem_ctx, u64 system_mode); error_code sys_rsx_context_free(ppu_thread& ppu, u32 context_id); -error_code sys_rsx_context_iomap(cpu_thread& cpu, u32 context_id, u32 io, u32 ea, u32 size, u64 flags); -error_code sys_rsx_context_iounmap(cpu_thread& cpu, u32 context_id, u32 io, u32 size); +error_code sys_rsx_context_iomap(cpu_thread& cpu, u32 context_id, u64 io, u64 ea, u64 size, u64 flags); +error_code sys_rsx_context_iounmap(cpu_thread& cpu, u32 context_id, u64 io, u64 size); error_code sys_rsx_context_attribute(u32 context_id, u32 package_id, u64 a3, u64 a4, u64 a5, u64 a6); error_code sys_rsx_device_map(cpu_thread& cpu, vm::ptr dev_addr, vm::ptr a2, u32 dev_id); error_code sys_rsx_device_unmap(cpu_thread& cpu, u32 dev_id); diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index 0a899f7a7d..6372e6e3cc 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -1070,15 +1070,15 @@ namespace vm return size; } - bool check_addr(u32 addr, u8 flags, u32 size) + bool check_addr(u64 addr, u8 flags, u32 size) { if (size == 0) { return true; } - // Overflow checking - if (0x10000'0000ull - addr < size) + // u64 addressing is not supported at the moment + if (addr > u32{umax} || 0x10000'0000ull - addr < size) { return false; } @@ -1086,7 +1086,7 @@ namespace vm // Always check this flag flags |= page_allocated; - for (u32 i = addr / 4096, max = (addr + size - 1) / 4096; i <= max;) + for (u64 i = addr / 4096, max = (addr + size - 1) / 4096; i <= max;) { auto state = +g_pages[i]; diff --git a/rpcs3/Emu/Memory/vm.h b/rpcs3/Emu/Memory/vm.h index 87e798aadb..c59e32d5b4 100644 --- a/rpcs3/Emu/Memory/vm.h +++ b/rpcs3/Emu/Memory/vm.h @@ -78,10 +78,10 @@ namespace vm bool page_protect(u32 addr, u32 size, u8 flags_test = 0, u8 flags_set = 0, u8 flags_clear = 0); // Check flags for specified memory range (unsafe) - bool check_addr(u32 addr, u8 flags, u32 size); + bool check_addr(u64 addr, u8 flags, u32 size); template - inline bool check_addr(u32 addr, u8 flags = page_readable) + inline bool check_addr(u64 addr, u8 flags = page_readable) { extern std::array g_pages; From 5758ab11f7d60371c2cf6a01690ecde2b3a46b17 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 17 Jun 2026 08:53:41 +0200 Subject: [PATCH 44/64] arm64: fix exclusion_callback type --- rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.h b/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.h index 2ca8c383e5..f5a616e32c 100644 --- a/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.h +++ b/rpcs3/Emu/CPU/Backends/AArch64/AArch64JIT.h @@ -45,7 +45,7 @@ namespace aarch64 bool use_stack_frames = true; // Allocate a stack frame for each function. The gateway can alternatively manage a global stack to use as scratch. bool optimize = true; // Optimize instructions when possible. Set to false when debugging. u32 hypervisor_context_offset = 0; // Offset within the "thread" object where we can find the hypervisor context (registers configured at gateway). - std::function exclusion_callback; // [Optional] Callback run on each function before transform. Return "true" to exclude from frame processing. + std::function exclusion_callback; // [Optional] Callback run on each function before transform. Return "true" to exclude from frame processing. std::vector> base_register_lookup; // [Optional] Function lookup table to determine the location of the "thread" context. std::vector faux_function_list; // [Optional] List of faux block names to treat as untrusted - typically fake functions representing codecaves. }; From a8559a526a9ba27b876eeb4864f2f93d540838fb Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 17 Jun 2026 08:54:02 +0200 Subject: [PATCH 45/64] tar: fix save_header regression --- rpcs3/Loader/TAR.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rpcs3/Loader/TAR.cpp b/rpcs3/Loader/TAR.cpp index 4eb568c3b7..5891f0e51e 100644 --- a/rpcs3/Loader/TAR.cpp +++ b/rpcs3/Loader/TAR.cpp @@ -568,8 +568,9 @@ void tar_object::save_directory(const std::string& target_path, utils::serial& a auto save_header = [&](const fs::stat_t& stat, std::string_view name) { static_assert(sizeof(TARHeader) == 512); + ensure(src_dir_pos <= name.size()); - std::string_view saved_path = name.size() == src_dir_pos ? name : name.substr(src_dir_pos); + std::string_view saved_path = name.size() == src_dir_pos ? std::string_view() : name.substr(src_dir_pos); if (is_null) { From 6a15f9dc8ea46fafccdebebe9b57e21bbd5e7426 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 17 Jun 2026 08:14:16 +0200 Subject: [PATCH 46/64] Qt: use readable strings for windowState and visibility in gui settings --- rpcs3/rpcs3qt/gs_frame.cpp | 6 +++--- rpcs3/rpcs3qt/gui_settings.cpp | 39 ++++++++++++++++++++++++++++++++++ rpcs3/rpcs3qt/gui_settings.h | 9 +++++++- rpcs3/rpcs3qt/main_window.cpp | 16 ++++++-------- rpcs3/rpcs3qt/main_window.h | 8 +++---- 5 files changed, 61 insertions(+), 17 deletions(-) diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index 483c8ac6e5..5d65a2c93d 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -647,7 +647,7 @@ void gs_frame::hide_on_close() { // Make sure not to save the hidden state, which is useless to us. const Visibility current_visibility = visibility(); - m_gui_settings->SetValue(gui::gs_visibility, current_visibility == Visibility::Hidden ? m_visibility : current_visibility, false); + m_gui_settings->SetValue(gui::gs_visibility, gui::visibility_to_string(current_visibility == Visibility::Hidden ? m_visibility : current_visibility), false); m_gui_settings->SetValue(gui::gs_geometry, geometry(), true); if (!g_progr_text) @@ -718,10 +718,10 @@ void gs_frame::show() { setVisibility(FullScreen); } - else if (const QVariant var = m_gui_settings->GetValue(gui::gs_visibility); var.canConvert()) + else if (const QVariant var = m_gui_settings->GetValue(gui::gs_visibility); var.canConvert()) { // Restore saved visibility from last time. Make sure not to hide the window, or the user can't access it anymore. - if (const Visibility visibility = var.value(); visibility != Visibility::Hidden) + if (const Visibility visibility = gui::string_to_visibility(var.value()); visibility != Visibility::Hidden) { setVisibility(visibility); } diff --git a/rpcs3/rpcs3qt/gui_settings.cpp b/rpcs3/rpcs3qt/gui_settings.cpp index 4d72b74a70..653ad5acad 100644 --- a/rpcs3/rpcs3qt/gui_settings.cpp +++ b/rpcs3/rpcs3qt/gui_settings.cpp @@ -102,6 +102,45 @@ namespace gui fmt::throw_exception("get_trophy_game_list_column_name: Invalid column"); } + + QString window_states_to_string(Qt::WindowStates states) + { + if (states & Qt::WindowFullScreen) return "FullScreen"; + if (states & Qt::WindowMaximized) return "Maximized"; + if (states & Qt::WindowMinimized) return "Minimized"; + return "Windowed"; + } + + Qt::WindowState string_to_window_states(const QString& state) + { + const QString lower = state.toLower(); // Allow for better user experience + if (lower == "fullscreen") return Qt::WindowFullScreen; + if (lower == "maximized") return Qt::WindowMaximized; + if (lower == "minimized") return Qt::WindowMinimized; + return Qt::WindowNoState; + } + + QString visibility_to_string(QWindow::Visibility visibility) + { + switch (visibility) + { + case QWindow::Visibility::Windowed: return "Windowed"; + case QWindow::Visibility::Minimized: return "Minimized"; + case QWindow::Visibility::Maximized: return "Maximized"; + case QWindow::Visibility::FullScreen: return "FullScreen"; + default: return "AutomaticVisibility"; + } + } + + QWindow::Visibility string_to_visibility(const QString& visibility) + { + const QString lower = visibility.toLower(); // Allow for better user experience + if (lower == "windowed") return QWindow::Visibility::Windowed; + if (lower == "minimized") return QWindow::Visibility::Minimized; + if (lower == "maximized") return QWindow::Visibility::Maximized; + if (lower == "fullscreen") return QWindow::Visibility::FullScreen; + return QWindow::Visibility::AutomaticVisibility; + } } gui_settings::gui_settings(QObject* parent) : settings(parent) diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index 41be2732ab..e54700be67 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -109,6 +109,12 @@ namespace gui return q_string_pair(path, title.simplified()); // simplified() forces single line text } + QString window_states_to_string(Qt::WindowStates states); + Qt::WindowState string_to_window_states(const QString& state); + + QString visibility_to_string(QWindow::Visibility visibility); + QWindow::Visibility string_to_visibility(const QString& visibility); + const QString Settings = "CurrentSettings"; const QString DefaultStylesheet = "default"; const QString NoStylesheet = "none"; @@ -180,6 +186,7 @@ namespace gui const gui_save mw_geometry = gui_save(main_window, "geometry", QByteArray()); const gui_save mw_windowState = gui_save(main_window, "windowState", QByteArray()); const gui_save mw_mwState = gui_save(main_window, "mwState", QByteArray()); + const gui_save mw_visibility = gui_save(main_window, "visibility", window_states_to_string(Qt::WindowNoState)); const gui_save cat_hdd_game = gui_save(game_list, "categoryVisibleHDDGame", true); const gui_save cat_disc_game = gui_save(game_list, "categoryVisibleDiscGame", true); @@ -272,7 +279,7 @@ namespace gui const gui_save gs_hideMouseIdle = gui_save(gs_frame, "hideMouseOnIdle", false); const gui_save gs_hideMouseIdleTime = gui_save(gs_frame, "hideMouseOnIdleTime", 2000); const gui_save gs_geometry = gui_save(gs_frame, "geometry", QRect()); - const gui_save gs_visibility = gui_save(gs_frame, "visibility", QWindow::Visibility::AutomaticVisibility); + const gui_save gs_visibility = gui_save(gs_frame, "visibility", visibility_to_string(QWindow::Visibility::AutomaticVisibility)); const gui_save ss_icon_color = gui_save(trophy, "icon_color", gl_icon_color); const gui_save ss_game_icon_size = gui_save(trophy, "game_icon_size", 25); diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index d51c52e7b9..4a1b33610e 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -1923,6 +1923,7 @@ void main_window::DecryptSPRXLibraries() void main_window::SaveWindowState() const { // Save gui settings + m_gui_settings->SetValue(gui::mw_visibility, gui::window_states_to_string(windowState()), false); m_gui_settings->SetValue(gui::mw_geometry, saveGeometry(), false); m_gui_settings->SetValue(gui::mw_windowState, saveState(), false); @@ -1999,14 +2000,7 @@ void main_window::RepaintToolBarIcons() ui->sysPauseAct->setIcon(m_icon_play); } - if (isFullScreen()) - { - ui->toolbar_fullscreen->setIcon(m_icon_fullscreen_off); - } - else - { - ui->toolbar_fullscreen->setIcon(m_icon_fullscreen_on); - } + ui->toolbar_fullscreen->setIcon(isFullScreen() ? m_icon_fullscreen_off : m_icon_fullscreen_on); const QColor& new_color = new_colors[QIcon::Normal]; ui->sizeSlider->setStyleSheet(ui->sizeSlider->styleSheet().append("QSlider::handle:horizontal{ background: rgba(%1, %2, %3, %4); }") @@ -3941,6 +3935,10 @@ void main_window::ConfigureGuiFromSettings() // Gamelist m_game_list_frame->LoadSettings(); + + // Restore saved visibility from last time. + setWindowState(gui::string_to_window_states(m_gui_settings->GetValue(gui::mw_visibility).toString())); + ui->toolbar_fullscreen->setIcon(isFullScreen() ? m_icon_fullscreen_off : m_icon_fullscreen_on); } void main_window::SetIconSizeActions(int idx) const @@ -4060,7 +4058,7 @@ void main_window::CreateFirmwareCache() } } -void main_window::mouseDoubleClickEvent(QMouseEvent *event) +void main_window::mouseDoubleClickEvent(QMouseEvent* event) { if (isFullScreen()) { diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index 19a85865a4..4f166728f7 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -125,9 +125,9 @@ private Q_SLOTS: void update_gui_pad_thread(); protected: - void closeEvent(QCloseEvent *event) override; - void changeEvent(QEvent *event) override; - void mouseDoubleClickEvent(QMouseEvent *event) override; + void closeEvent(QCloseEvent* event) override; + void changeEvent(QEvent* event) override; + void mouseDoubleClickEvent(QMouseEvent* event) override; void dropEvent(QDropEvent* event) override; void dragEnterEvent(QDragEnterEvent* event) override; void dragMoveEvent(QDragMoveEvent* event) override; @@ -184,7 +184,7 @@ private: QActionGroup* m_category_visible_act_group = nullptr; // Dockable widget frames - QMainWindow *m_mw = nullptr; + QMainWindow* m_mw = nullptr; log_frame* m_log_frame = nullptr; debugger_frame* m_debugger_frame = nullptr; game_list_frame* m_game_list_frame = nullptr; From 860e2a82b17590782dac5776dee35a5ed4acb84f Mon Sep 17 00:00:00 2001 From: schm1dtmac Date: Tue, 9 Jun 2026 18:58:52 +0100 Subject: [PATCH 47/64] [Mac OS] Update runners to OS 15 --- .ci/build-mac.sh | 55 +++++++------------------------------ .ci/deploy-mac.sh | 3 +- .github/workflows/rpcs3.yml | 9 +++--- rpcs3/rpcs3.plist.in | 2 +- 4 files changed, 16 insertions(+), 53 deletions(-) diff --git a/.ci/build-mac.sh b/.ci/build-mac.sh index 9e16fce4ec..ae0341cc0e 100755 --- a/.ci/build-mac.sh +++ b/.ci/build-mac.sh @@ -13,31 +13,18 @@ export HOMEBREW_NO_AUTO_UPDATE=1 export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 export HOMEBREW_NO_ENV_HINTS=1 export HOMEBREW_NO_INSTALL_CLEANUP=1 -brew update brew install -f --overwrite --quiet ccache "llvm@$LLVM_COMPILER_VER" brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" -if [ "$AARCH64" -eq 1 ]; then - brew install -f --overwrite --quiet googletest opencv@4 sdl3 vulkan-headers vulkan-loader molten-vk - brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative protobuf || true -else - arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet python@3.14 opencv@4 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader molten-vk - arch -x86_64 /usr/local/bin/brew unlink --quiet ffmpeg qtbase qtsvg qtdeclarative protobuf || true -fi +brew install -f --overwrite --quiet googletest opencv@4 sdl3 vulkan-headers vulkan-loader molten-vk +brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative protobuf || true export CXX=clang++ export CC=clang export BREW_PATH; -if [ "$AARCH64" -eq 1 ]; then - BREW_PATH="$(brew --prefix)" - export BREW_BIN="/opt/homebrew/bin" - export BREW_SBIN="/opt/homebrew/sbin" -else - BREW_PATH="$("/usr/local/bin/brew" --prefix)" - export BREW_BIN="/usr/local/bin" - export BREW_SBIN="/usr/local/sbin" -fi +BREW_PATH="$(brew --prefix)" +export BREW_BIN="$BREW_PATH/bin" +export BREW_SBIN="$BREW_PATH/sbin" export WORKDIR; WORKDIR="$(pwd)" @@ -68,7 +55,7 @@ ditto "/tmp/Qt/$QT_VER" "qt-downloader/$QT_VER" export Qt6_DIR="$WORKDIR/qt-downloader/$QT_VER/clang_64/lib/cmake/Qt$QT_VER_MAIN" export SDL3_DIR="$BREW_PATH/opt/sdl3/lib/cmake/SDL3" -export PATH="/opt/homebrew/opt/llvm@$LLVM_COMPILER_VER/bin:$PATH" +export PATH="$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/bin:$PATH" export LDFLAGS="-L$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/c++ -L$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/unwind -lunwind" export VULKAN_SDK @@ -82,12 +69,13 @@ LLVM_DIR="$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER" git submodule -q update --init --depth=1 --jobs=8 $(awk '/path/ && !/llvm/ && !/opencv/ && !/SDL/ && !/feralinteractive/ { print $3 }' .gitmodules) mkdir build && cd build || exit 1 +# The below should be uncommented once bugs with Qt 6 QListWidgets when using the OS 26 visual style are resolved. +# sudo xcode-select -switch /Applications/Xcode_26.3.app/Contents/Developer -if [ "$AARCH64" -eq 1 ]; then cmake .. \ -DBUILD_RPCS3_TESTS="${RUN_UNIT_TESTS}" \ -DRUN_RPCS3_TESTS="${RUN_UNIT_TESTS}" \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 \ -DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \ -DMACOSX_BUNDLE_SHORT_VERSION_STRING="${COMM_TAG}" \ -DMACOSX_BUNDLE_BUNDLE_VERSION="${COMM_COUNT}" \ @@ -102,31 +90,8 @@ cmake .. \ -DUSE_SYSTEM_SDL=ON \ -DUSE_SYSTEM_OPENCV=ON \ -G Ninja -else -cmake .. \ - -DBUILD_RPCS3_TESTS=OFF \ - -DRUN_RPCS3_TESTS=OFF \ - -DCMAKE_OSX_ARCHITECTURES=x86_64 \ - -DCMAKE_SYSTEM_PROCESSOR=x86_64 \ - -DCMAKE_TOOLCHAIN_FILE=buildfiles/cmake/TCDarwinX86_64.cmake \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 \ - -DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \ - -DMACOSX_BUNDLE_SHORT_VERSION_STRING="${COMM_TAG}" \ - -DMACOSX_BUNDLE_BUNDLE_VERSION="${COMM_COUNT}"\ - -DSTATIC_LINK_LLVM=ON \ - -DUSE_SDL=ON \ - -DUSE_DISCORD_RPC=ON \ - -DUSE_AUDIOUNIT=ON \ - -DUSE_SYSTEM_FFMPEG=OFF \ - -DUSE_NATIVE_INSTRUCTIONS=OFF \ - -DUSE_PRECOMPILED_HEADERS=OFF \ - -DUSE_SYSTEM_MVK=ON \ - -DUSE_SYSTEM_SDL=ON \ - -DUSE_SYSTEM_OPENCV=ON \ - -G Ninja -fi -ninja; build_status=$?; +ninja -j4; build_status=$?; cd .. diff --git a/.ci/deploy-mac.sh b/.ci/deploy-mac.sh index b37b27c1e2..045b93ac9f 100755 --- a/.ci/deploy-mac.sh +++ b/.ci/deploy-mac.sh @@ -7,7 +7,6 @@ cd bin git clone --revision=a075e5e417f87675ea3137b7365f3e5a99608d72 https://github.com/KhronosGroup/MoltenVK.git cd MoltenVK ./fetchDependencies --macos -sudo xcode-select -switch /Applications/Xcode_16.2.app/Contents/Developer make macos MVK_USE_METAL_PRIVATE_API=1 cd ../ @@ -84,7 +83,7 @@ echo "[InternetShortcut]" > Quickstart.url echo "URL=https://rpcs3.net/quickstart" >> Quickstart.url echo "IconIndex=0" >> Quickstart.url -if [ "$AARCH64" -eq 1 ]; then +if [ "$(arch)" = "arm64" ]; then ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos_aarch64.7z" else ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos.7z" diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index e6877387b3..515555a224 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -123,15 +123,15 @@ jobs: matrix: include: - name: Intel - AARCH64: 0 + runs-on: macos-15-intel UPLOAD_COMMIT_HASH: 51ae32f468089a8169aaf1567de355ff4a3e0842 UPLOAD_REPO_FULL_NAME: rpcs3/rpcs3-binaries-mac - name: Apple Silicon - AARCH64: 1 + runs-on: macos-15 UPLOAD_COMMIT_HASH: 8e21bdbc40711a3fccd18fbf17b742348b0f4281 UPLOAD_REPO_FULL_NAME: rpcs3/rpcs3-binaries-mac-arm64 name: RPCS3 Mac ${{ matrix.name }} - runs-on: macos-14 + runs-on: ${{ matrix.runs-on }} env: CCACHE_DIR: /tmp/ccache_dir QT_VER: '6.11.1' @@ -140,8 +140,7 @@ jobs: RELEASE_MESSAGE: ../GitHubReleaseMessage.txt UPLOAD_COMMIT_HASH: ${{ matrix.UPLOAD_COMMIT_HASH }} UPLOAD_REPO_FULL_NAME: ${{ matrix.UPLOAD_REPO_FULL_NAME }} - AARCH64: ${{ matrix.AARCH64 }} - RUN_UNIT_TESTS: github.event_name == 'pull_request' && 'ON' || 'OFF' + RUN_UNIT_TESTS: ${{ matrix.name == 'Apple Silicon' && (github.event_name == 'pull_request' && 'ON') || 'OFF' }} steps: - name: Checkout repository uses: actions/checkout@main diff --git a/rpcs3/rpcs3.plist.in b/rpcs3/rpcs3.plist.in index 93a4f2c186..a56b8dca0e 100644 --- a/rpcs3/rpcs3.plist.in +++ b/rpcs3/rpcs3.plist.in @@ -31,7 +31,7 @@ LSApplicationCategoryType public.app-category.games LSMinimumSystemVersion - 14.4 + 15.0 NSCameraUsageDescription The camera will be used for PlayStation Eye emulation NSMicrophoneUsageDescription From 8be3a398dc3ba24bceb380b0933d951eed664cd2 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 18 Jun 2026 15:52:27 +0200 Subject: [PATCH 48/64] Log architecture --- rpcs3/rpcs3.cpp | 6 +++++- rpcs3/util/sysinfo.cpp | 11 +++++++++++ rpcs3/util/sysinfo.hpp | 2 ++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3.cpp b/rpcs3/rpcs3.cpp index 3bf6259a4a..2fa4e8cb6a 100644 --- a/rpcs3/rpcs3.cpp +++ b/rpcs3/rpcs3.cpp @@ -692,6 +692,10 @@ int run_rpcs3(int argc, char** argv) logs::stored_message ver{sys_log.always()}; ver.text = fmt::format("RPCS3 v%s", rpcs3::get_verbose_version()); + // Write Architecture + logs::stored_message arch{sys_log.always()}; + arch.text = fmt::format("Architecture: %s", utils::get_architecture()); + // Write System information logs::stored_message sys{sys_log.always()}; sys.text = utils::get_system_info(); @@ -708,7 +712,7 @@ int run_rpcs3(int argc, char** argv) logs::stored_message time{sys_log.always()}; time.text = fmt::format("Current Time: %s", std::chrono::system_clock::now()); - logs::set_init({std::move(ver), std::move(sys), std::move(os), std::move(qt), std::move(time)}); + logs::set_init({std::move(ver), std::move(arch), std::move(sys), std::move(os), std::move(qt), std::move(time)}); } #ifdef ARCH_ARM64 diff --git a/rpcs3/util/sysinfo.cpp b/rpcs3/util/sysinfo.cpp index 66e551f42a..ab52c3ff18 100755 --- a/rpcs3/util/sysinfo.cpp +++ b/rpcs3/util/sysinfo.cpp @@ -531,6 +531,17 @@ std::string utils::get_cpu_brand() #endif } +std::string_view utils::get_architecture() +{ +#if defined(ARCH_X64) + return "x64"sv; +#elif defined(ARCH_ARM64) + return "arm64"sv; +#else + return "unknown"sv; +#endif +} + std::string utils::get_system_info() { std::string result; diff --git a/rpcs3/util/sysinfo.hpp b/rpcs3/util/sysinfo.hpp index dfe781e17a..7ce1ba8bbb 100755 --- a/rpcs3/util/sysinfo.hpp +++ b/rpcs3/util/sysinfo.hpp @@ -71,6 +71,8 @@ namespace utils #endif std::string get_cpu_brand(); + std::string_view get_architecture(); + std::string get_system_info(); std::string get_firmware_version(); From 5ee92d2e6ca1a5c04fa65830c945c8584124c451 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 18 Jun 2026 15:53:00 +0200 Subject: [PATCH 49/64] Allow to add architecture to game window title --- rpcs3/Emu/title.cpp | 5 +++++ rpcs3/rpcs3qt/settings_dialog.cpp | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/title.cpp b/rpcs3/Emu/title.cpp index 809681b391..62306f0729 100644 --- a/rpcs3/Emu/title.cpp +++ b/rpcs3/Emu/title.cpp @@ -45,6 +45,11 @@ namespace rpcs3 title_string += '%'; break; } + case 'A': + { + title_string += utils::get_architecture(); + break; + } case 'T': { title_string += title_data.title; diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 116057fcf1..9bdae9511c 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -2147,7 +2147,8 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std { "%R", tr("Renderer", "Game window title") }, { "%T", tr("Title", "Game window title") }, { "%t", tr("Title ID", "Game window title") }, - { "%V", tr("RPCS3 Version", "Game window title") } + { "%V", tr("RPCS3 Version", "Game window title") }, + { "%A", tr("Architecture", "Game window title") } }; QString glossary; From 0735c55bfd05c8e9bc757ef074ff895f0927c5d6 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 18 Jun 2026 15:54:22 +0200 Subject: [PATCH 50/64] Add user agent to curl requests --- Utilities/version.cpp | 16 ++++++------- Utilities/version.h | 8 +++---- rpcs3/rpcs3qt/curl_handle.cpp | 16 ++++++++++++- rpcs3/rpcs3qt/downloader.cpp | 2 +- rpcs3/util/sysinfo.cpp | 45 ++++++++++++++++++++++++++--------- rpcs3/util/sysinfo.hpp | 4 +++- 6 files changed, 64 insertions(+), 27 deletions(-) diff --git a/Utilities/version.cpp b/Utilities/version.cpp index 0c3cbb6da1..8c63560743 100644 --- a/Utilities/version.cpp +++ b/Utilities/version.cpp @@ -24,29 +24,27 @@ namespace utils return (m_hi << 24) | (m_mid << 16) | (m_lo << 8) | ((uint(m_type) & 0xf) << 4) | (m_type_index & 0xf); } - std::string version::to_string() const + std::string version::to_string(bool simple) const { - std::string version = std::to_string(hi()) + "." + std::to_string(mid()); + std::string version = fmt::format("%d.%d", hi(), mid()); if (lo()) { - version += '.'; - version += std::to_string(lo()); + fmt::append(version, ".%d", lo()); } - if (type() != version_type::release) + if (!simple && type() != version_type::release) { if (!postfix().empty()) { - version += "-" + postfix(); + fmt::append(version, "-%s", postfix()); } - version += ' '; - version += utils::to_string(type()); + fmt::append(version, " %s", utils::to_string(type())); if (type_index() > 1) { - version += " " + std::to_string(type_index()); + fmt::append(version, " %d", type_index()); } } diff --git a/Utilities/version.h b/Utilities/version.h index 00180b5436..316c1ae96f 100644 --- a/Utilities/version.h +++ b/Utilities/version.h @@ -23,10 +23,10 @@ namespace utils uint m_lo; version_type m_type = version_type::release; uint m_type_index = 1; - const char* m_postfix; + std::string_view m_postfix; public: - constexpr version(uint hi, uint mid, uint lo, version_type type, uint type_index, const char* postfix) + constexpr version(uint hi, uint mid, uint lo, version_type type, uint type_index, std::string_view postfix) : m_hi(hi) , m_mid(mid) , m_lo(lo) @@ -56,7 +56,7 @@ namespace utils return m_type; } - std::string postfix() const + std::string_view postfix() const { return m_postfix; } @@ -67,7 +67,7 @@ namespace utils } uint to_hex() const; - std::string to_string() const; + std::string to_string(bool simple = false) const; }; // Generic version comparison (e.g. 0.0.5 vs 1.3) diff --git a/rpcs3/rpcs3qt/curl_handle.cpp b/rpcs3/rpcs3qt/curl_handle.cpp index 56b02dd9e6..ff0c3e8018 100644 --- a/rpcs3/rpcs3qt/curl_handle.cpp +++ b/rpcs3/rpcs3qt/curl_handle.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "curl_handle.h" #include "util/logs.hpp" +#include "util/sysinfo.hpp" #ifdef _WIN32 #include "Utilities/StrUtil.h" @@ -15,6 +16,12 @@ curl_handle::curl_handle() { m_curl = curl_easy_init(); + if (!m_curl) + { + network_log.error("curl_easy_init failed"); + return; + } + CURLcode err = curl_easy_setopt(m_curl, CURLOPT_ERRORBUFFER, m_error_buffer.data()); if (err != CURLE_OK) network_log.error("curl_easy_setopt(CURLOPT_ERRORBUFFER): %s", curl_easy_strerror(err)); @@ -28,11 +35,18 @@ curl_handle::curl_handle() err = curl_easy_setopt(m_curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); if (err != CURLE_OK) network_log.error("curl_easy_setopt(CURLOPT_SSL_OPTIONS): %s", curl_easy_strerror(err)); #endif + + const std::string user_agent = utils::get_user_agent(); + err = curl_easy_setopt(m_curl, CURLOPT_USERAGENT, user_agent.c_str()); + if (err != CURLE_OK) network_log.error("curl_easy_setopt(CURLOPT_USERAGENT): %s", curl_easy_strerror(err)); } curl_handle::~curl_handle() { - curl_easy_cleanup(m_curl); + if (m_curl) + { + curl_easy_cleanup(m_curl); + } } CURL* curl_handle::get_curl() const diff --git a/rpcs3/rpcs3qt/downloader.cpp b/rpcs3/rpcs3qt/downloader.cpp index c8e2b5896b..5a3c6b9819 100644 --- a/rpcs3/rpcs3qt/downloader.cpp +++ b/rpcs3/rpcs3qt/downloader.cpp @@ -29,7 +29,7 @@ int curl_xferinfo_cb(void* userdata, curl_off_t /*dltotal*/, curl_off_t /*dlnow* downloader::downloader(QWidget* parent) : QObject(parent) , m_parent(parent) - , m_curl(new rpcs3::curl::curl_handle()) + , m_curl(std::make_unique()) { } diff --git a/rpcs3/util/sysinfo.cpp b/rpcs3/util/sysinfo.cpp index ab52c3ff18..6092da71b5 100755 --- a/rpcs3/util/sysinfo.cpp +++ b/rpcs3/util/sysinfo.cpp @@ -3,6 +3,7 @@ #include "Utilities/File.h" #include "Emu/vfs_config.h" #include "Utilities/Thread.h" +#include "rpcs3_version.h" #if defined(ARCH_ARM64) #include "Emu/CPU/Backends/AArch64/AArch64Common.h" @@ -796,14 +797,18 @@ utils::OS_version utils::get_OS_version() return res; } -std::string utils::get_OS_version_string() +std::string utils::get_OS_version_string(bool simple) { - std::string output; #ifdef _WIN32 OSVERSIONINFOW osvi{}; osvi.dwOSVersionInfoSize = sizeof(osvi); RtlGetVersion(&osvi); + if (simple) + { + return fmt::format("Windows %lu.%lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber); + } + const bool has_sp = osvi.szCSDVersion[0] != L'\0'; std::vector holder; if (has_sp) @@ -815,8 +820,7 @@ std::string utils::get_OS_version_string() holder.data(), len, nullptr, nullptr); } - fmt::append(output, - "Operating system: Windows, Major: %lu, Minor: %lu, Build: %lu, Service Pack: %s", + return fmt::format("Operating system: Windows, Major: %lu, Minor: %lu, Build: %lu, Service Pack: %s", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber, has_sp ? holder.data() : "none"); #elif defined (__APPLE__) @@ -824,22 +828,41 @@ std::string utils::get_OS_version_string() const int minor_version = Darwin_Version::getNSminorVersion(); const int patch_version = Darwin_Version::getNSpatchVersion(); - fmt::append(output, "Operating system: macOS, Version: %d.%d.%d", - major_version, minor_version, patch_version); + if (simple) + { + return fmt::format("macOS %d.%d.%d", major_version, minor_version, patch_version); + } + + return fmt::format("Operating system: macOS, Version: %d.%d.%d", major_version, minor_version, patch_version); #else struct utsname details = {}; if (!uname(&details)) { - fmt::append(output, "Operating system: POSIX, Name: %s, Release: %s, Version: %s", - details.sysname, details.release, details.version); + if (simple) + { + return fmt::format("%s %s", details.sysname, details.release); + } + + return fmt::format("Operating system: POSIX, Name: %s, Release: %s, Version: %s", details.sysname, details.release, details.version); } - else + + if (simple) { - fmt::append(output, "Operating system: POSIX, Unknown version! (Error: %d)", errno); + return "POSIX"; } + + return fmt::format("Operating system: POSIX, Unknown version! (Error: %d)", errno); #endif - return output; +} + +std::string utils::get_user_agent() +{ + const std::string user_agent = fmt::format("RPCS3/%s (%s; %s)", + rpcs3::get_version().to_string(true), + utils::get_OS_version_string(true), + utils::get_architecture()); + return user_agent; } int utils::get_maxfiles() diff --git a/rpcs3/util/sysinfo.hpp b/rpcs3/util/sysinfo.hpp index 7ce1ba8bbb..5d36f24adc 100755 --- a/rpcs3/util/sysinfo.hpp +++ b/rpcs3/util/sysinfo.hpp @@ -89,7 +89,9 @@ namespace utils }; OS_version get_OS_version(); - std::string get_OS_version_string(); + std::string get_OS_version_string(bool simple = false); + + std::string get_user_agent(); int get_maxfiles(); From c0598f61e7e9d96be287c68985b0b438a200f89b Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 18 Jun 2026 15:54:39 +0200 Subject: [PATCH 51/64] Handle curl_easy_setopt errors in clans_client --- rpcs3/Emu/NP/clans_client.cpp | 48 +++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/NP/clans_client.cpp b/rpcs3/Emu/NP/clans_client.cpp index c529d5ea38..ecdd764e73 100644 --- a/rpcs3/Emu/NP/clans_client.cpp +++ b/rpcs3/Emu/NP/clans_client.cpp @@ -145,10 +145,15 @@ namespace clan clan_request_ctx() { curl = curl_easy_init(); - if (curl) + + if (!curl) { - curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); + clan_log.error("curl_easy_init failed"); + return; } + + CURLcode err = curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); + if (err != CURLE_OK) clan_log.error("curl_easy_setopt(CURLOPT_SSL_OPTIONS): %s", curl_easy_strerror(err)); } ~clan_request_ctx() @@ -245,24 +250,39 @@ namespace clan std::vector response_buffer; - curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_write_callback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_buffer); - curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, err_buf); + CURLcode err = curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + if (err != CURLE_OK) clan_log.error("curl_easy_setopt(CURLOPT_URL): %s", curl_easy_strerror(err)); + + err = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_write_callback); + if (err != CURLE_OK) clan_log.error("curl_easy_setopt(CURLOPT_WRITEFUNCTION): %s", curl_easy_strerror(err)); + + err = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_buffer); + if (err != CURLE_OK) clan_log.error("curl_easy_setopt(CURLOPT_WRITEDATA): %s", curl_easy_strerror(err)); + + err = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, err_buf); + if (err != CURLE_OK) clan_log.error("curl_easy_setopt(CURLOPT_ERRORBUFFER): %s", curl_easy_strerror(err)); // WARN: This disables certificate verification! - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + err = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + if (err != CURLE_OK) clan_log.error("curl_easy_setopt(CURLOPT_SSL_VERIFYHOST): %s", curl_easy_strerror(err)); - curl_easy_setopt(curl, CURLOPT_POST, 1); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, xml.c_str()); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, xml.size()); + err = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + if (err != CURLE_OK) clan_log.error("curl_easy_setopt(CURLOPT_SSL_VERIFYPEER): %s", curl_easy_strerror(err)); - const CURLcode res = curl_easy_perform(curl); + err = curl_easy_setopt(curl, CURLOPT_POST, 1); + if (err != CURLE_OK) clan_log.error("curl_easy_setopt(CURLOPT_POST): %s", curl_easy_strerror(err)); - if (res != CURLE_OK) + err = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, xml.c_str()); + if (err != CURLE_OK) clan_log.error("curl_easy_setopt(CURLOPT_POSTFIELDS): %s", curl_easy_strerror(err)); + + err = curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, xml.size()); + if (err != CURLE_OK) clan_log.error("curl_easy_setopt(CURLOPT_POSTFIELDSIZE): %s", curl_easy_strerror(err)); + + err = curl_easy_perform(curl); + + if (err != CURLE_OK) { - clan_log.error("curl_easy_perform() failed: %s", curl_easy_strerror(res)); + clan_log.error("curl_easy_perform() failed: %s", curl_easy_strerror(err)); clan_log.error("Error buffer: %s", err_buf); return SCE_NP_CLANS_ERROR_BAD_REQUEST; } From 33123bff044396473cedd41b6110231a5fda9da5 Mon Sep 17 00:00:00 2001 From: Walter <90877047+WalterKruger@users.noreply.github.com> Date: Sat, 20 Jun 2026 01:02:20 +1000 Subject: [PATCH 52/64] [SPU] Calculate `FRSQEST` exponent using arithmetic (#18905) The `FRSQEST` instruction uses a lookup-table to calculate both the exponent and mantissa. The exponent follows a simple linear pattern and thus can be calculated using integer arithmetic: `(exponent==0)? 0xFF : 190 - (exponent + 1) / 2`. This patch replaces the LUT with this method, vectorizing its calculating and saving on 1kB. The mantissa still relies on a LUT, which bottlenecks this instruction's emulation despite the improvement. --- rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp | 25 +++++++++-------- rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 37 ++++++++++++++------------ 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index 89694affd4..2addc37017 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -2799,32 +2799,35 @@ void spu_recompiler::FREST(spu_opcode_t op) void spu_recompiler::FRSQEST(spu_opcode_t op) { const XmmLink& va = XmmGet(op.ra, XmmType::Float); + const XmmLink& vz = XmmAlloc(); + const XmmLink& v1 = XmmAlloc(); const XmmLink& v_fraction = XmmAlloc(); const XmmLink& v_exponent = XmmAlloc(); c->movdqa(v_fraction, va); c->movdqa(v_exponent, va); + // (exponent==0)? 0xFF : 190 - (exponent + 1) / 2 + c->paddd(v_exponent, v_exponent); + c->pxor(vz, vz); + c->pavgb(v_exponent, vz); + c->movdqa(v1, XmmConst(v128::from32p(190 << 24))); + c->psubb(v1, v_exponent); + c->pcmpeqb(v_exponent, vz); + c->por(v_exponent, v1); + c->psrld(v_exponent, 1); + c->pand(v_exponent, XmmConst(v128::from32p(0xFF << 23))); + c->psrld(v_fraction, 18); - c->psrld(v_exponent, 23); - - c->andps(v_fraction, XmmConst(v128::from32p(0x3F))); - c->andps(v_exponent, XmmConst(v128::from32p(0xFF))); - + c->pand(v_fraction, XmmConst(v128::from32p(0x3F))); const u64 fraction_lut_addr = reinterpret_cast(spu_frsqest_fraction_lut); - const u64 exponent_lut_addr = reinterpret_cast(spu_frsqest_exponent_lut); c->movabs(*arg0, fraction_lut_addr); - c->movabs(*arg1, exponent_lut_addr); for (u32 index = 0; index < 4; index++) { c->pextrd(*qw0, v_fraction, index); c->mov(*qw1, asmjit::x86::dword_ptr(*arg0, *qw0, 2)); c->pinsrd(v_fraction, *qw1, index); - - c->pextrd(*qw0, v_exponent, index); - c->mov(*qw1, asmjit::x86::dword_ptr(*arg1, *qw0, 2)); - c->pinsrd(v_exponent, *qw1, index); } c->orps(v_fraction, v_exponent); diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index 80d1100754..5f5c90f6f4 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -128,7 +128,6 @@ class spu_llvm_recompiler : public spu_recompiler_base, public cpu_translator // Global LUTs llvm::GlobalVariable* m_spu_frest_fraction_lut{}; llvm::GlobalVariable* m_spu_frsqest_fraction_lut{}; - llvm::GlobalVariable* m_spu_frsqest_exponent_lut{}; // Helpers (interpreter) llvm::GlobalVariable* m_scale_float_to{}; @@ -1623,7 +1622,6 @@ public: // LUTs for some instructions m_spu_frest_fraction_lut = new llvm::GlobalVariable(*m_module, llvm::ArrayType::get(GetType(), 32), true, llvm::GlobalValue::PrivateLinkage, llvm::ConstantDataArray::get(m_context, spu_frest_fraction_lut)); m_spu_frsqest_fraction_lut = new llvm::GlobalVariable(*m_module, llvm::ArrayType::get(GetType(), 64), true, llvm::GlobalValue::PrivateLinkage, llvm::ConstantDataArray::get(m_context, spu_frsqest_fraction_lut)); - m_spu_frsqest_exponent_lut = new llvm::GlobalVariable(*m_module, llvm::ArrayType::get(GetType(), 256), true, llvm::GlobalValue::PrivateLinkage, llvm::ConstantDataArray::get(m_context, spu_frsqest_exponent_lut)); } virtual spu_function_t compile(spu_program&& _func) override @@ -7529,22 +7527,23 @@ public: { const auto a = bitcast(value(ci->getOperand(0))); + // (exponent==0)? 0xFF : 190 - (exponent + 1) / 2 + const auto a_exponent = a & splat(0xFF << 23); + const auto h_exponent = (a_exponent + (a_exponent & splat(1 << 23))) >> splat(1); + const auto r_exponent = splat(190 << 23) - h_exponent; + const auto final_exponent = select(a_exponent == 0, splat(0xFF << 23), r_exponent); + const auto a_fraction = (a >> splat(18)) & splat(0x3F); - const auto a_exponent = (a >> splat(23)) & splat(0xFF); - value_t final_result = eval(splat(0)); + value_t final_fraction = eval(splat(0)); for (u32 i = 0; i < 4; i++) { const auto eval_fraction = eval(extract(a_fraction, i)); - const auto eval_exponent = eval(extract(a_exponent, i)); - value_t r_fraction = load_const(m_spu_frsqest_fraction_lut, eval_fraction); - value_t r_exponent = load_const(m_spu_frsqest_exponent_lut, eval_exponent); - - final_result = eval(insert(final_result, i, eval(r_fraction | r_exponent))); + final_fraction = eval(insert(final_fraction, i, r_fraction)); } - return bitcast(final_result); + return bitcast(final_fraction | final_exponent); }); set_vr(op.rt, frsqest(get_vr(op.ra))); @@ -8575,21 +8574,25 @@ public: register_intrinsic("spu_rsqrte", [&](llvm::CallInst* ci) { const auto a = bitcast(value(ci->getOperand(0))); + + // (exponent==0)? 0xFF : 190 - (exponent + 1) / 2 + const auto a_exponent = a & splat(0xFF << 23); + const auto h_exponent = (a_exponent + (a_exponent & splat(1 << 23))) >> splat(1); + const auto r_exponent = splat(190 << 23) - h_exponent; + const auto final_exponent = select(a_exponent == 0, splat(0xFF << 23), r_exponent); + const auto a_fraction = (a >> splat(18)) & splat(0x3F); - const auto a_exponent = (a >> splat(23)) & splat(0xFF); - value_t b = eval(splat(0)); + value_t final_fraction = eval(splat(0)); for (u32 i = 0; i < 4; i++) { const auto eval_fraction = eval(extract(a_fraction, i)); - const auto eval_exponent = eval(extract(a_exponent, i)); - value_t r_fraction = load_const(m_spu_frsqest_fraction_lut, eval_fraction); - value_t r_exponent = load_const(m_spu_frsqest_exponent_lut, eval_exponent); - - b = eval(insert(b, i, eval(r_fraction | r_exponent))); + final_fraction = eval(insert(final_fraction, i, r_fraction)); } + const auto b = eval(final_fraction | final_exponent); + const auto base = (b & 0x007ffc00u) << 9; // Base fraction const auto ymul = (b & 0x3ff) * (a & 0x7ffff); // Step fraction * Y fraction (fixed point at 2^-32) const auto comparison = (ymul > base); // Should exponent be adjusted? From e32d19ffac500c6194f93b0338a4a64c51399b38 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 19 Jun 2026 14:21:37 +0200 Subject: [PATCH 53/64] Add missing sanity check in savedata_op --- rpcs3/Emu/Cell/Modules/cellSaveData.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp index 7878e86642..22086bdf5c 100644 --- a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp @@ -1155,15 +1155,16 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v } } - auto delete_save = [&]() + const auto delete_save = [&]() { - strcpy_trunc(doneGet->dirName, save_entries[selected].dirName); + const SaveDataEntry& entry = ::at32(save_entries, selected); + strcpy_trunc(doneGet->dirName, entry.dirName); doneGet->hddFreeSizeKB = 40 * 1024 * 1024 - 256; // Read explanation in cellHddGameCheck doneGet->excResult = CELL_OK; std::memset(doneGet->reserved, 0, sizeof(doneGet->reserved)); - const std::string old_path = base_dir + ".backup_" + save_entries[selected].escaped + "/"; - const std::string del_path = base_dir + save_entries[selected].escaped + "/"; + const std::string old_path = base_dir + ".backup_" + entry.escaped + "/"; + const std::string del_path = base_dir + entry.escaped + "/"; const fs::dir _dir(del_path); u64 size_bytes = 0; @@ -1456,7 +1457,7 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v } else { - fmt::throw_exception("Invalid savedata selected"); + fmt::throw_exception("Invalid savedata selected (selected=%d)", selected); } } } From 8da8c267c60aa027d0121d6bcd4fff6c3f2cf662 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 16 Jun 2026 17:48:05 +0200 Subject: [PATCH 54/64] Update pugixml to 1.16 --- 3rdparty/pugixml | 2 +- rpcs3.sln | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/3rdparty/pugixml b/3rdparty/pugixml index ee86beb30e..c8033ce9d0 160000 --- a/3rdparty/pugixml +++ b/3rdparty/pugixml @@ -1 +1 @@ -Subproject commit ee86beb30e4973f5feffe3ce63bfa4fbadf72f38 +Subproject commit c8033ce9d039e7f9d134877c363397b3cfe20816 diff --git a/rpcs3.sln b/rpcs3.sln index 4cb0830474..748946d239 100644 --- a/rpcs3.sln +++ b/rpcs3.sln @@ -117,6 +117,13 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rpcs3_test", "rpcs3\tests\r {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12} = {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12} EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pugixml", "pugixml", "{F520F4A6-27D1-4DD2-9BB2-E0625826D0A3}" + ProjectSection(SolutionItems) = preProject + 3rdparty\pugixml\src\pugiconfig.hpp = 3rdparty\pugixml\src\pugiconfig.hpp + 3rdparty\pugixml\src\pugixml.cpp = 3rdparty\pugixml\src\pugixml.cpp + 3rdparty\pugixml\src\pugixml.hpp = 3rdparty\pugixml\src\pugixml.hpp + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -274,6 +281,7 @@ Global {8846A9AA-5539-4C91-8301-F54260E1A07A} = {6C3B64A0-8F8A-4DC4-8C0B-D71EBEED7FA8} {3C67A2FF-4710-402A-BE3E-31B0CB0576DF} = {6C3B64A0-8F8A-4DC4-8C0B-D71EBEED7FA8} {D1CBF84E-07F8-4ACB-9CD2-BD205FDEEE1E} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {F520F4A6-27D1-4DD2-9BB2-E0625826D0A3} = {6C3B64A0-8F8A-4DC4-8C0B-D71EBEED7FA8} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {06CC7920-E085-4B81-9582-8DE8AAD42510} From efc9a1a6686368e35578715969ce69b3bee5286c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 16 Jun 2026 18:25:07 +0200 Subject: [PATCH 55/64] NP: Use std::string_view in clans --- rpcs3/Emu/NP/clans_client.cpp | 348 +++++++++++++++++----------------- 1 file changed, 174 insertions(+), 174 deletions(-) diff --git a/rpcs3/Emu/NP/clans_client.cpp b/rpcs3/Emu/NP/clans_client.cpp index ecdd764e73..2e7bb88407 100644 --- a/rpcs3/Emu/NP/clans_client.cpp +++ b/rpcs3/Emu/NP/clans_client.cpp @@ -230,8 +230,8 @@ namespace clan CURL* curl = ctx->curl; ClanRequestType req_type = ClanRequestType::FUNC; - const pugi::xml_node clan = xml_body.child("clan"); - if (clan && clan.child("ticket")) + const pugi::xml_node clan = xml_body.child("clan"sv); + if (clan && clan.child("ticket"sv)) { req_type = ClanRequestType::SEC; } @@ -296,11 +296,11 @@ namespace clan return SCE_NP_CLANS_ERROR_BAD_RESPONSE; } - const pugi::xml_node clan_result = out_response.child("clan"); + const pugi::xml_node clan_result = out_response.child("clan"sv); if (!clan_result) return SCE_NP_CLANS_ERROR_BAD_RESPONSE; - const pugi::xml_attribute result = clan_result.attribute("result"); + const pugi::xml_attribute result = clan_result.attribute("result"sv); if (!result) return SCE_NP_CLANS_ERROR_BAD_RESPONSE; @@ -358,11 +358,11 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); + pugi::xml_node clan = doc.append_child("clan"sv); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("start").text().set(paging.startPos); - clan.append_child("max").text().set(paging.max); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("start"sv).text().set(paging.startPos); + clan.append_child("max"sv).text().set(paging.max); pugi::xml_document response = pugi::xml_document(); const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetClanList, ClanManagerOperationType::VIEW, doc, response); @@ -370,37 +370,37 @@ namespace clan if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - const pugi::xml_node clan_result = response.child("clan"); - const pugi::xml_node list = clan_result.child("list"); + const pugi::xml_node clan_result = response.child("clan"sv); + const pugi::xml_node list = clan_result.child("list"sv); - const pugi::xml_attribute results = list.attribute("results"); + const pugi::xml_attribute results = list.attribute("results"sv); const uint32_t results_count = results.as_uint(); - const pugi::xml_attribute total = list.attribute("total"); + const pugi::xml_attribute total = list.attribute("total"sv); const uint32_t total_count = total.as_uint(); int i = 0; - for (pugi::xml_node info = list.child("info"); info; info = info.next_sibling("info"), i++) + for (pugi::xml_node info = list.child("info"sv); info; info = info.next_sibling("info"sv), i++) { - const pugi::xml_attribute id = info.attribute("id"); + const pugi::xml_attribute id = info.attribute("id"sv); const uint32_t clan_id = id.as_uint(); - const pugi::xml_node name = info.child("name"); + const pugi::xml_node name = info.child("name"sv); const std::string name_str = name.text().as_string(); - const pugi::xml_node tag = info.child("tag"); + const pugi::xml_node tag = info.child("tag"sv); const std::string tag_str = tag.text().as_string(); - const pugi::xml_node role = info.child("role"); + const pugi::xml_node role = info.child("role"sv); const int32_t role_int = role.text().as_uint(); - const pugi::xml_node status = info.child("status"); + const pugi::xml_node status = info.child("status"sv); const uint32_t status_int = status.text().as_uint(); - const pugi::xml_node onlinename = info.child("onlinename"); + const pugi::xml_node onlinename = info.child("onlinename"sv); const std::string onlinename_str = onlinename.text().as_string(); - const pugi::xml_node members = info.child("members"); + const pugi::xml_node members = info.child("members"sv); const uint32_t members_int = members.text().as_uint(); SceNpClansEntry entry = SceNpClansEntry{ @@ -431,8 +431,8 @@ namespace clan SceNpClansError clans_client::get_clan_info(u32 req_id, SceNpClanId clan_id, SceNpClansClanInfo& clan_info) { pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("id"sv).text().set(clan_id); pugi::xml_document response = pugi::xml_document(); const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetClanInfo, ClanManagerOperationType::VIEW, doc, response); @@ -440,14 +440,14 @@ namespace clan if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - const pugi::xml_node clan_result = response.child("clan"); - const pugi::xml_node info = clan_result.child("info"); + const pugi::xml_node clan_result = response.child("clan"sv); + const pugi::xml_node info = clan_result.child("info"sv); - const std::string name_str = info.child("name").text().as_string(); - const std::string tag_str = info.child("tag").text().as_string(); - const uint32_t members_int = info.child("members").text().as_uint(); - const std::string date_created_str = info.child("date-created").text().as_string(); - const std::string description_str = info.child("description").text().as_string(); + const std::string name_str = info.child("name"sv).text().as_string(); + const std::string tag_str = info.child("tag"sv).text().as_string(); + const uint32_t members_int = info.child("members"sv).text().as_uint(); + const std::string date_created_str = info.child("date-created"sv).text().as_string(); + const std::string description_str = info.child("description"sv).text().as_string(); clan_info = SceNpClansClanInfo{ .info = SceNpClansClanBasicInfo{ @@ -474,12 +474,12 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); - clan.append_child("jid").text().set(jid_str.c_str()); + clan.append_child("jid"sv).text().set(jid_str); pugi::xml_document response = pugi::xml_document(); const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetMemberInfo, ClanManagerOperationType::VIEW, doc, response); @@ -487,10 +487,10 @@ namespace clan if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - const pugi::xml_node clan_result = response.child("clan"); - const pugi::xml_node member_info = clan_result.child("info"); + const pugi::xml_node clan_result = response.child("clan"sv); + const pugi::xml_node member_info = clan_result.child("info"sv); - const pugi::xml_attribute member_jid = member_info.attribute("jid"); + const pugi::xml_attribute member_jid = member_info.attribute("jid"sv); const std::string member_jid_str = member_jid.as_string(); const std::string member_username = fmt::split(member_jid_str, {"@"})[0]; @@ -504,13 +504,13 @@ namespace clan np::string_to_npid(member_username, member_npid); } - const pugi::xml_node role = member_info.child("role"); + const pugi::xml_node role = member_info.child("role"sv); const uint32_t role_int = role.text().as_uint(); - const pugi::xml_node status = member_info.child("status"); + const pugi::xml_node status = member_info.child("status"sv); const uint32_t status_int = status.text().as_uint(); - const pugi::xml_node description = member_info.child("description"); + const pugi::xml_node description = member_info.child("description"sv); const std::string description_str = description.text().as_string(); mem_info = SceNpClansMemberEntry @@ -535,11 +535,11 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); - clan.append_child("start").text().set(paging.startPos); - clan.append_child("max").text().set(paging.max); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); + clan.append_child("start"sv).text().set(paging.startPos); + clan.append_child("max"sv).text().set(paging.max); pugi::xml_document response = pugi::xml_document(); const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetMemberList, ClanManagerOperationType::VIEW, doc, response); @@ -547,19 +547,19 @@ namespace clan if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - const pugi::xml_node clan_result = response.child("clan"); - const pugi::xml_node list = clan_result.child("list"); + const pugi::xml_node clan_result = response.child("clan"sv); + const pugi::xml_node list = clan_result.child("list"sv); - const pugi::xml_attribute results = list.attribute("results"); + const pugi::xml_attribute results = list.attribute("results"sv); const uint32_t results_count = results.as_uint(); - const pugi::xml_attribute total = list.attribute("total"); + const pugi::xml_attribute total = list.attribute("total"sv); const uint32_t total_count = total.as_uint(); int i = 0; - for (pugi::xml_node member_info = list.child("info"); member_info; member_info = member_info.next_sibling("info")) + for (pugi::xml_node member_info = list.child("info"sv); member_info; member_info = member_info.next_sibling("info"sv)) { - const std::string member_jid = member_info.attribute("jid").as_string(); + const std::string member_jid = member_info.attribute("jid"sv).as_string(); const std::string member_username = fmt::split(member_jid, {"@"})[0]; SceNpId member_npid; @@ -572,9 +572,9 @@ namespace clan np::string_to_npid(member_username, member_npid); } - const uint32_t role_int = member_info.child("role").text().as_uint(); - const uint32_t status_int = member_info.child("status").text().as_uint(); - const std::string description_str = member_info.child("description").text().as_string(); + const uint32_t role_int = member_info.child("role"sv).text().as_uint(); + const uint32_t status_int = member_info.child("status"sv).text().as_uint(); + const std::string description_str = member_info.child("description"sv).text().as_string(); SceNpClansMemberEntry entry = SceNpClansMemberEntry { @@ -603,11 +603,11 @@ namespace clan const std::string ticket = get_clan_ticket(nph); pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); - clan.append_child("start").text().set(paging.startPos); - clan.append_child("max").text().set(paging.max); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); + clan.append_child("start"sv).text().set(paging.startPos); + clan.append_child("max"sv).text().set(paging.max); pugi::xml_document response = pugi::xml_document(); const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetBlacklist, ClanManagerOperationType::VIEW, doc, response); @@ -615,19 +615,19 @@ namespace clan if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - const pugi::xml_node clan_result = response.child("clan"); - const pugi::xml_node list = clan_result.child("list"); + const pugi::xml_node clan_result = response.child("clan"sv); + const pugi::xml_node list = clan_result.child("list"sv); - const pugi::xml_attribute results = list.attribute("results"); + const pugi::xml_attribute results = list.attribute("results"sv); const uint32_t results_count = results.as_uint(); - const pugi::xml_attribute total = list.attribute("total"); + const pugi::xml_attribute total = list.attribute("total"sv); const uint32_t total_count = total.as_uint(); int i = 0; - for (pugi::xml_node member = list.child("entry"); member; member = member.next_sibling("entry")) + for (pugi::xml_node member = list.child("entry"sv); member; member = member.next_sibling("entry"sv)) { - const pugi::xml_node member_jid = member.child("jid"); + const pugi::xml_node member_jid = member.child("jid"sv); const std::string member_jid_str = member_jid.text().as_string(); const std::string member_username = fmt::split(member_jid_str, {"@"})[0]; @@ -638,7 +638,7 @@ namespace clan } else { - np::string_to_npid(member_username.c_str(), member_npid); + np::string_to_npid(member_username, member_npid); } SceNpClansBlacklistEntry entry = SceNpClansBlacklistEntry @@ -666,12 +666,12 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); - clan.append_child("jid").text().set(jid_str.c_str()); + clan.append_child("jid"sv).text().set(jid_str); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, ClanRequestAction::RecordBlacklistEntry, ClanManagerOperationType::UPDATE, doc, response); @@ -684,12 +684,12 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); - clan.append_child("jid").text().set(jid_str.c_str()); + clan.append_child("jid"sv).text().set(jid_str); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, ClanRequestAction::DeleteBlacklistEntry, ClanManagerOperationType::UPDATE, doc, response); @@ -698,16 +698,16 @@ namespace clan SceNpClansError clans_client::clan_search(u32 req_id, const SceNpClansPagingRequest& paging, const SceNpClansSearchableName& search, std::vector& clan_list, SceNpClansPagingResult& page_result) { pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("start").text().set(paging.startPos); - clan.append_child("max").text().set(paging.max); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("start"sv).text().set(paging.startPos); + clan.append_child("max"sv).text().set(paging.max); - pugi::xml_node filter = clan.append_child("filter"); - pugi::xml_node name = filter.append_child("name"); + pugi::xml_node filter = clan.append_child("filter"sv); + pugi::xml_node name = filter.append_child("name"sv); const std::string op_name = fmt::format("%s", static_cast(static_cast(search.nameSearchOp))); - name.append_attribute("op").set_value(op_name.c_str()); - name.append_attribute("value").set_value(search.name); + name.append_attribute("op"sv).set_value(op_name); + name.append_attribute("value"sv).set_value(search.name); pugi::xml_document response = pugi::xml_document(); const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::ClanSearch, ClanManagerOperationType::VIEW, doc, response); @@ -715,22 +715,22 @@ namespace clan if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - const pugi::xml_node clan_result = response.child("clan"); - const pugi::xml_node list = clan_result.child("list"); + const pugi::xml_node clan_result = response.child("clan"sv); + const pugi::xml_node list = clan_result.child("list"sv); - const pugi::xml_attribute results = list.attribute("results"); + const pugi::xml_attribute results = list.attribute("results"sv); const uint32_t results_count = results.as_uint(); - const pugi::xml_attribute total = list.attribute("total"); + const pugi::xml_attribute total = list.attribute("total"sv); const uint32_t total_count = total.as_uint(); int i = 0; - for (pugi::xml_node node = list.child("info"); node; node = node.next_sibling("info")) + for (pugi::xml_node node = list.child("info"sv); node; node = node.next_sibling("info"sv)) { - const uint32_t clan_id = node.attribute("id").as_uint(); - const std::string name_str = node.child("name").text().as_string(); - const std::string tag_str = node.child("tag").text().as_string(); - const uint32_t members_int = node.child("members").text().as_uint(); + const uint32_t clan_id = node.attribute("id"sv).as_uint(); + const std::string name_str = node.child("name"sv).text().as_string(); + const std::string tag_str = node.child("tag"sv).text().as_string(); + const uint32_t members_int = node.child("members"sv).text().as_uint(); SceNpClansClanBasicInfo entry = SceNpClansClanBasicInfo { @@ -764,11 +764,11 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); - clan.append_child("name").text().set(name.data()); - clan.append_child("tag").text().set(tag.data()); + clan.append_child("name"sv).text().set(name.data()); + clan.append_child("tag"sv).text().set(tag.data()); pugi::xml_document response = pugi::xml_document(); const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::CreateClan, ClanManagerOperationType::UPDATE, doc, response); @@ -776,8 +776,8 @@ namespace clan if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - const pugi::xml_node clan_result = response.child("clan"); - const pugi::xml_attribute id = clan_result.attribute("id"); + const pugi::xml_node clan_result = response.child("clan"sv); + const pugi::xml_attribute id = clan_result.attribute("id"sv); const uint32_t clan_id_int = id.as_uint(); *clan_id = clan_id_int; @@ -792,9 +792,9 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); pugi::xml_document response = pugi::xml_document(); const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::DisbandClan, ClanManagerOperationType::UPDATE, doc, response); @@ -812,9 +812,9 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, ClanRequestAction::RequestMembership, ClanManagerOperationType::UPDATE, doc, response); @@ -827,9 +827,9 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, ClanRequestAction::CancelRequestMembership, ClanManagerOperationType::UPDATE, doc, response); @@ -842,12 +842,12 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); - clan.append_child("jid").text().set(jid_str.c_str()); + clan.append_child("jid"sv).text().set(jid_str); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, allow ? ClanRequestAction::AcceptMembershipRequest : ClanRequestAction::DeclineMembershipRequest, ClanManagerOperationType::UPDATE, doc, response); @@ -860,12 +860,12 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); - clan.append_child("jid").text().set(jid_str.c_str()); + clan.append_child("jid"sv).text().set(jid_str); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, ClanRequestAction::SendInvitation, ClanManagerOperationType::UPDATE, doc, response); @@ -878,12 +878,12 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); - clan.append_child("jid").text().set(jid_str.c_str()); + clan.append_child("jid"sv).text().set(jid_str); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, ClanRequestAction::CancelInvitation, ClanManagerOperationType::UPDATE, doc, response); @@ -896,9 +896,9 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, accept ? ClanRequestAction::AcceptInvitation : ClanRequestAction::DeclineInvitation, ClanManagerOperationType::UPDATE, doc, response); @@ -911,17 +911,17 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); - pugi::xml_node role = clan.append_child("onlinename"); - role.text().set(np::npid_to_string(nph.get_npid()).c_str()); + pugi::xml_node role = clan.append_child("onlinename"sv); + role.text().set(np::npid_to_string(nph.get_npid())); - pugi::xml_node description = clan.append_child("description"); + pugi::xml_node description = clan.append_child("description"sv); description.text().set(info.description); - pugi::xml_node status = clan.append_child("bin-attr1"); + pugi::xml_node status = clan.append_child("bin-attr1"sv); byte bin_attr_1[SCE_NP_CLANS_MEMBER_BINARY_ATTRIBUTE1_MAX_SIZE * 2 + 1] = {0}; uint32_t bin_attr_1_size = UINT32_MAX; @@ -933,10 +933,10 @@ namespace clan // `reinterpret_cast` used to let the compiler select the correct overload of `set` status.text().set(reinterpret_cast(bin_attr_1)); - pugi::xml_node allow_msg = clan.append_child("allow-msg"); + pugi::xml_node allow_msg = clan.append_child("allow-msg"sv); allow_msg.text().set(static_cast(info.allowMsg)); - pugi::xml_node size = clan.append_child("size"); + pugi::xml_node size = clan.append_child("size"sv); size.text().set(info.binData1Size); pugi::xml_document response = pugi::xml_document(); @@ -950,13 +950,13 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); // TODO: implement binary and integer attributes (not implemented in server yet) - pugi::xml_node description = clan.append_child("description"); + pugi::xml_node description = clan.append_child("description"sv); description.text().set(info.description); pugi::xml_document response = pugi::xml_document(); @@ -970,9 +970,9 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, ClanRequestAction::JoinClan, ClanManagerOperationType::UPDATE, doc, response); @@ -985,9 +985,9 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, ClanRequestAction::LeaveClan, ClanManagerOperationType::UPDATE, doc, response); @@ -1000,12 +1000,12 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); - clan.append_child("jid").text().set(jid_str.c_str()); + clan.append_child("jid"sv).text().set(jid_str); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, ClanRequestAction::KickMember, ClanManagerOperationType::UPDATE, doc, response); @@ -1018,14 +1018,14 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); - clan.append_child("jid").text().set(jid_str.c_str()); + clan.append_child("jid"sv).text().set(jid_str); - pugi::xml_node role_node = clan.append_child("role"); + pugi::xml_node role_node = clan.append_child("role"sv); role_node.text().set(static_cast(role)); pugi::xml_document response = pugi::xml_document(); @@ -1039,11 +1039,11 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); - clan.append_child("start").text().set(paging.startPos); - clan.append_child("max").text().set(paging.max); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); + clan.append_child("start"sv).text().set(paging.startPos); + clan.append_child("max"sv).text().set(paging.max); pugi::xml_document response = pugi::xml_document(); const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::RetrieveAnnouncements, ClanManagerOperationType::VIEW, doc, response); @@ -1051,25 +1051,25 @@ namespace clan if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - const pugi::xml_node clan_result = response.child("clan"); - const pugi::xml_node list = clan_result.child("list"); + const pugi::xml_node clan_result = response.child("clan"sv); + const pugi::xml_node list = clan_result.child("list"sv); - const pugi::xml_attribute results = list.attribute("results"); + const pugi::xml_attribute results = list.attribute("results"sv); const uint32_t results_count = results.as_uint(); - const pugi::xml_attribute total = list.attribute("total"); + const pugi::xml_attribute total = list.attribute("total"sv); const uint32_t total_count = total.as_uint(); int i = 0; - for (pugi::xml_node node = list.child("msg-info"); node; node = node.next_sibling("msg-info")) + for (pugi::xml_node node = list.child("msg-info"sv); node; node = node.next_sibling("msg-info"sv)) { - const pugi::xml_attribute id = node.attribute("id"); + const pugi::xml_attribute id = node.attribute("id"sv); const uint32_t msg_id = id.as_uint(); - const std::string subject_str = node.child("subject").text().as_string(); - const std::string msg_str = node.child("msg").text().as_string(); - const std::string author_jid = node.child("jid").text().as_string(); - const std::string msg_date = node.child("msg-date").text().as_string(); + const std::string subject_str = node.child("subject"sv).text().as_string(); + const std::string msg_str = node.child("msg"sv).text().as_string(); + const std::string author_jid = node.child("jid"sv).text().as_string(); + const std::string msg_date = node.child("msg-date"sv).text().as_string(); SceNpId author_npid; const std::string author_username = fmt::split(author_jid, {"@"})[0]; @@ -1119,17 +1119,17 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); - pugi::xml_node subject = clan.append_child("subject"); + pugi::xml_node subject = clan.append_child("subject"sv); subject.text().set(announcement.subject); - pugi::xml_node msg = clan.append_child("msg"); + pugi::xml_node msg = clan.append_child("msg"sv); msg.text().set(announcement.body); - pugi::xml_node expire_date = clan.append_child("expire-date"); + pugi::xml_node expire_date = clan.append_child("expire-date"sv); expire_date.text().set(duration); pugi::xml_document response = pugi::xml_document(); @@ -1138,8 +1138,8 @@ namespace clan if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - const pugi::xml_node clan_result = response.child("clan"); - const pugi::xml_node msg_id_node = clan_result.child("id"); + const pugi::xml_node clan_result = response.child("clan"sv); + const pugi::xml_node msg_id_node = clan_result.child("id"sv); msg_id = msg_id_node.text().as_uint(); return SCE_NP_CLANS_SUCCESS; @@ -1152,10 +1152,10 @@ namespace clan return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); - clan.append_child("msg-id").text().set(announcement_id); + pugi::xml_node clan = doc.append_child("clan"sv); + clan.append_child("ticket"sv).text().set(ticket); + clan.append_child("id"sv).text().set(clan_id); + clan.append_child("msg-id"sv).text().set(announcement_id); pugi::xml_document response = pugi::xml_document(); return send_request(req_id, ClanRequestAction::DeleteAnnouncement, ClanManagerOperationType::UPDATE, doc, response); From 2af7b58ce44a3b2bf2764c4f913e87aa5a2e2023 Mon Sep 17 00:00:00 2001 From: Antonino Di Guardo <64427768+digant73@users.noreply.github.com> Date: Sun, 21 Jun 2026 19:38:03 +0200 Subject: [PATCH 56/64] fix double path delimiter (#18923) A cosmetic fix. It removes a double delimiter at the end of a path in `games.yml` when using `VFS games` path. --- Utilities/StrFmt.cpp | 7 +++++++ rpcs3/Emu/System.cpp | 14 ++++++++++---- rpcs3/Emu/System.h | 6 +++--- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Utilities/StrFmt.cpp b/Utilities/StrFmt.cpp index d68ef51cb5..cd0fe2b5dc 100644 --- a/Utilities/StrFmt.cpp +++ b/Utilities/StrFmt.cpp @@ -921,6 +921,13 @@ std::string_view fmt::trim_front_sv(std::string_view source, std::string_view va void fmt::trim_back(std::string& source, std::string_view values) { const usz index = source.find_last_not_of(values); + + if (index == source.npos) + { + source.clear(); + return; + } + source.resize(index + 1); } diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 12013c7965..60e6cb3fca 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -4276,10 +4276,12 @@ std::set Emulator::GetGameDirs() const return dirs; } -u32 Emulator::AddGamesFromDir(const std::string& path) +u32 Emulator::AddGamesFromDir(std::string path) { u32 games_added = 0; + fmt::trim_back(path, fs::delim); + m_games_config.set_save_on_dirty(false); // search for a game on the provided path first (game on ISO file or on folder type) @@ -4313,7 +4315,7 @@ u32 Emulator::AddGamesFromDir(const std::string& path) continue; } - const std::string dir_path = path + '/' + dir_entry.name; + const std::string dir_path = path + "/" + dir_entry.name; if (!dir_entry.is_directory && !is_iso_file(dir_path)) { @@ -4349,8 +4351,10 @@ u32 Emulator::AddGamesFromDir(const std::string& path) return games_added; } -game_boot_result Emulator::AddGame(const std::string& path) +game_boot_result Emulator::AddGame(std::string path) { + fmt::trim_back(path, fs::delim); + // Handle files directly if (!fs::is_dir(path) || fs::get_optical_raw_device(path)) { @@ -4396,8 +4400,10 @@ game_boot_result Emulator::AddGame(const std::string& path) return result; } -game_boot_result Emulator::AddGameToYml(const std::string& path) +game_boot_result Emulator::AddGameToYml(std::string path) { + fmt::trim_back(path, fs::delim); + // Detect boot location const auto is_invalid_path = [this](std::string_view path, std::string_view dir) -> game_boot_result { diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index e0efebc1d8..6f89967d79 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -489,9 +489,9 @@ public: void ConfigurePPUCache() const; std::set GetGameDirs() const; - u32 AddGamesFromDir(const std::string& path); - game_boot_result AddGame(const std::string& path); - game_boot_result AddGameToYml(const std::string& path); + u32 AddGamesFromDir(std::string path); + game_boot_result AddGame(std::string path); + game_boot_result AddGameToYml(std::string path); u32 RemoveGamesFromDir(const std::string& games_dir, const std::vector& serials_to_remove_from_yml = {}, bool save_on_disk = true); u32 RemoveGames(const std::vector& title_id_list, bool save_on_disk = true); game_boot_result RemoveGameFromYml(const std::string& title_id); From f8c88c3a7ad4988527df25f562d3dcead165e115 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 06:24:53 +0200 Subject: [PATCH 57/64] Use std::string_view in cell modules --- rpcs3/Emu/Cell/Modules/cellMusicExport.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellSsl.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellVideoExport.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellMusicExport.cpp b/rpcs3/Emu/Cell/Modules/cellMusicExport.cpp index c01d4b7a51..0d90ab9afd 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusicExport.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMusicExport.cpp @@ -72,7 +72,7 @@ struct music_export }; -bool check_music_path(const std::string& file_path) +bool check_music_path(std::string_view file_path) { if (file_path.size() >= CELL_MUSIC_EXPORT_UTIL_HDD_PATH_MAX) { diff --git a/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp b/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp index 473bd435e7..541879153f 100644 --- a/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp @@ -74,7 +74,7 @@ struct photo_export }; -bool check_photo_path(const std::string& file_path) +bool check_photo_path(std::string_view file_path) { if (file_path.size() >= CELL_PHOTO_EXPORT_UTIL_HDD_PATH_MAX) { diff --git a/rpcs3/Emu/Cell/Modules/cellSsl.cpp b/rpcs3/Emu/Cell/Modules/cellSsl.cpp index 7de808bd25..e515c2e69b 100644 --- a/rpcs3/Emu/Cell/Modules/cellSsl.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSsl.cpp @@ -75,7 +75,7 @@ error_code cellSslGetMemoryInfo() return CELL_OK; } -std::string getCert(const std::string& certPath, const int certID, const bool isNormalCert) +std::string getCert(std::string_view certPath, const int certID, const bool isNormalCert) { int newID = certID; diff --git a/rpcs3/Emu/Cell/Modules/cellVideoExport.cpp b/rpcs3/Emu/Cell/Modules/cellVideoExport.cpp index 8c0ed93771..30ede6e7a3 100644 --- a/rpcs3/Emu/Cell/Modules/cellVideoExport.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVideoExport.cpp @@ -76,7 +76,7 @@ struct video_export }; -bool check_movie_path(const std::string& file_path) +bool check_movie_path(std::string_view file_path) { if (file_path.size() >= CELL_VIDEO_EXPORT_UTIL_HDD_PATH_MAX) { From f95a225d633ac3f94a9620936d96902f7b6e50df Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 06:28:53 +0200 Subject: [PATCH 58/64] Use std::string_view in rsx code --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 2 +- rpcs3/Emu/RSX/GL/GLFragmentProgram.h | 4 ++-- rpcs3/Emu/RSX/GL/GLVertexProgram.cpp | 8 ++++---- rpcs3/Emu/RSX/GL/GLVertexProgram.h | 18 ++++++++--------- .../RSX/Program/FragmentProgramDecompiler.h | 20 +++++++++---------- rpcs3/Emu/RSX/Program/GLSLCommon.cpp | 2 +- rpcs3/Emu/RSX/Program/GLSLCommon.h | 2 +- rpcs3/Emu/RSX/Program/ShaderParam.h | 10 +++++----- .../Emu/RSX/Program/VertexProgramDecompiler.h | 16 +++++++-------- rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 2 +- rpcs3/Emu/RSX/VK/VKFragmentProgram.h | 4 ++-- rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp | 10 +++++----- rpcs3/Emu/RSX/VK/VKProgramPipeline.h | 5 ++--- rpcs3/Emu/RSX/VK/VKVertexProgram.cpp | 18 ++++++++--------- rpcs3/Emu/RSX/VK/VKVertexProgram.h | 18 ++++++++--------- rpcs3/tests/test_rsx_fp_asm.cpp | 2 +- 16 files changed, 70 insertions(+), 71 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index ab63cb2ea1..c445a0532f 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -21,7 +21,7 @@ std::string GLFragmentDecompilerThread::getFunction(FUNCTION f) return glsl::getFunctionImpl(f); } -std::string GLFragmentDecompilerThread::compareFunction(COMPARE f, const std::string &Op0, const std::string &Op1) +std::string GLFragmentDecompilerThread::compareFunction(COMPARE f, std::string_view Op0, std::string_view Op1) { return glsl::compareFunctionImpl(f, Op0, Op1); } diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.h b/rpcs3/Emu/RSX/GL/GLFragmentProgram.h index e8fc2ed6f1..29e461793a 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.h +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.h @@ -34,8 +34,8 @@ public: protected: std::string getFloatTypeName(usz elementCount) override; std::string getHalfTypeName(usz elementCount) override; - std::string getFunction(FUNCTION) override; - std::string compareFunction(COMPARE, const std::string&, const std::string&) override; + std::string getFunction(FUNCTION f) override; + std::string compareFunction(COMPARE f, std::string_view Op0, std::string_view Op1) override; void insertHeader(std::stringstream &OS) override; void insertInputs(std::stringstream &OS) override; diff --git a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp index 6f5cb85df0..d275a55bcf 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp @@ -21,12 +21,12 @@ std::string GLVertexDecompilerThread::getFunction(FUNCTION f) return glsl::getFunctionImpl(f); } -std::string GLVertexDecompilerThread::compareFunction(COMPARE f, const std::string &Op0, const std::string &Op1, bool scalar) +std::string GLVertexDecompilerThread::compareFunction(COMPARE f, std::string_view Op0, std::string_view Op1, bool scalar) { return glsl::compareFunctionImpl(f, Op0, Op1, scalar); } -void GLVertexDecompilerThread::insertHeader(std::stringstream &OS) +void GLVertexDecompilerThread::insertHeader(std::stringstream& OS) { OS << "#version 430\n" @@ -162,7 +162,7 @@ void GLVertexDecompilerThread::insertOutputs(std::stringstream& OS, const std::v } } -void GLVertexDecompilerThread::insertMainStart(std::stringstream & OS) +void GLVertexDecompilerThread::insertMainStart(std::stringstream& OS) { const auto& dev_caps = gl::get_driver_caps(); @@ -236,7 +236,7 @@ void GLVertexDecompilerThread::insertMainStart(std::stringstream & OS) } } -void GLVertexDecompilerThread::insertMainEnd(std::stringstream & OS) +void GLVertexDecompilerThread::insertMainEnd(std::stringstream& OS) { OS << "}\n\n"; diff --git a/rpcs3/Emu/RSX/GL/GLVertexProgram.h b/rpcs3/Emu/RSX/GL/GLVertexProgram.h index 631b6ac245..2fb57b04c7 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexProgram.h +++ b/rpcs3/Emu/RSX/GL/GLVertexProgram.h @@ -26,20 +26,20 @@ struct GLVertexDecompilerThread : public VertexProgramDecompiler protected: std::string getFloatTypeName(usz elementCount) override; std::string getIntTypeName(usz elementCount) override; - std::string getFunction(FUNCTION) override; - std::string compareFunction(COMPARE, const std::string&, const std::string&, bool scalar) override; + std::string getFunction(FUNCTION f) override; + std::string compareFunction(COMPARE f, std::string_view Op0, std::string_view Op1, bool scalar) override; - void insertHeader(std::stringstream &OS) override; - void insertInputs(std::stringstream &OS, const std::vector &inputs) override; - void insertConstants(std::stringstream &OS, const std::vector &constants) override; - void insertOutputs(std::stringstream &OS, const std::vector &outputs) override; - void insertMainStart(std::stringstream &OS) override; - void insertMainEnd(std::stringstream &OS) override; + void insertHeader(std::stringstream& OS) override; + void insertInputs(std::stringstream& OS, const std::vector& inputs) override; + void insertConstants(std::stringstream& OS, const std::vector& constants) override; + void insertOutputs(std::stringstream& OS, const std::vector& outputs) override; + void insertMainStart(std::stringstream& OS) override; + void insertMainEnd(std::stringstream& OS) override; const RSXVertexProgram &rsx_vertex_program; std::unordered_map input_locations; public: - GLVertexDecompilerThread(const RSXVertexProgram &prog, std::string& shader, ParamArray&) + GLVertexDecompilerThread(const RSXVertexProgram& prog, std::string& shader, ParamArray&) : VertexProgramDecompiler(prog) , m_shader(shader) , rsx_vertex_program(prog) diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.h b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.h index 8e22a21a93..f3cfaa8730 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.h +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.h @@ -111,33 +111,33 @@ protected: /** returns string calling function where arguments are passed via * $0 $1 $2 substring. */ - virtual std::string getFunction(FUNCTION) = 0; + virtual std::string getFunction(FUNCTION f) = 0; /** returns string calling comparison function on 2 args passed as strings. */ - virtual std::string compareFunction(COMPARE, const std::string &, const std::string &) = 0; + virtual std::string compareFunction(COMPARE f, std::string_view Op0, std::string_view Op1) = 0; /** Insert header of shader file (eg #version, "system constants"...) */ - virtual void insertHeader(std::stringstream &OS) = 0; + virtual void insertHeader(std::stringstream& OS) = 0; /** Insert global declaration of fragments inputs. */ - virtual void insertInputs(std::stringstream &OS) = 0; + virtual void insertInputs(std::stringstream& OS) = 0; /** insert global declaration of fragments outputs. */ - virtual void insertOutputs(std::stringstream &OS) = 0; + virtual void insertOutputs(std::stringstream& OS) = 0; /** insert declaration of shader constants. */ - virtual void insertConstants(std::stringstream &OS) = 0; + virtual void insertConstants(std::stringstream& OS) = 0; /** insert helper function definitions. */ - virtual void insertGlobalFunctions(std::stringstream &OS) = 0; + virtual void insertGlobalFunctions(std::stringstream& OS) = 0; /** insert beginning of main (signature, temporary declaration...) */ - virtual void insertMainStart(std::stringstream &OS) = 0; + virtual void insertMainStart(std::stringstream& OS) = 0; /** insert end of main function (return value, output copy...) */ - virtual void insertMainEnd(std::stringstream &OS) = 0; + virtual void insertMainEnd(std::stringstream& OS) = 0; public: enum : u16 @@ -201,7 +201,7 @@ public: device_props; ParamArray m_parr; - FragmentProgramDecompiler(const RSXFragmentProgram &prog, u32& size); + FragmentProgramDecompiler(const RSXFragmentProgram& prog, u32& size); FragmentProgramDecompiler(const FragmentProgramDecompiler&) = delete; FragmentProgramDecompiler(FragmentProgramDecompiler&&) = delete; std::string Decompile(); diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index 3330b4be9b..761aa091ee 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -73,7 +73,7 @@ namespace glsl } } - std::string compareFunctionImpl(COMPARE f, const std::string &Op0, const std::string &Op1, bool scalar) + std::string compareFunctionImpl(COMPARE f, std::string_view Op0, std::string_view Op1, bool scalar) { if (scalar) { diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.h b/rpcs3/Emu/RSX/Program/GLSLCommon.h index b71dc8c80d..47fd730589 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.h +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.h @@ -71,7 +71,7 @@ namespace glsl std::string getFloatTypeNameImpl(usz elementCount); std::string getHalfTypeNameImpl(usz elementCount); - std::string compareFunctionImpl(COMPARE f, const std::string &Op0, const std::string &Op1, bool scalar = false); + std::string compareFunctionImpl(COMPARE f, std::string_view Op0, std::string_view Op1, bool scalar = false); void insert_vertex_input_fetch(std::stringstream& OS, glsl_rules rules, bool glsl4_compliant=true); void insert_rop_init(std::ostream& OS); void insert_rop(std::ostream& OS, const shader_properties& props); diff --git a/rpcs3/Emu/RSX/Program/ShaderParam.h b/rpcs3/Emu/RSX/Program/ShaderParam.h index 4cd98f2e34..bf78b8f499 100644 --- a/rpcs3/Emu/RSX/Program/ShaderParam.h +++ b/rpcs3/Emu/RSX/Program/ShaderParam.h @@ -130,7 +130,7 @@ struct ParamType { } - bool HasItem(const std::string& name) const + bool HasItem(std::string_view name) const { return std::any_of(items.cbegin(), items.cend(), [&name](const auto& item) { @@ -138,7 +138,7 @@ struct ParamType }); } - bool ReplaceOrInsert(const std::string& name, const ParamItem& item) + bool ReplaceOrInsert(std::string_view name, const ParamItem& item) { if (HasItem(name)) { @@ -168,7 +168,7 @@ struct ParamArray { std::vector params[PF_PARAM_COUNT]; - ParamType* SearchParam(const ParamFlag &flag, const std::string& type) + ParamType* SearchParam(const ParamFlag& flag, std::string_view type) { for (auto& param : params[flag]) { @@ -179,7 +179,7 @@ struct ParamArray return nullptr; } - bool HasParamTypeless(const ParamFlag flag, const std::string& name) const + bool HasParamTypeless(const ParamFlag flag, std::string_view name) const { const auto& p = params[flag]; return std::any_of(p.cbegin(), p.cend(), [&name](const auto& param) @@ -188,7 +188,7 @@ struct ParamArray }); } - bool HasParam(const ParamFlag flag, const std::string& type, const std::string& name) + bool HasParam(const ParamFlag flag, std::string_view type, std::string_view name) { const ParamType* t = SearchParam(flag, type); return t && t->HasItem(name); diff --git a/rpcs3/Emu/RSX/Program/VertexProgramDecompiler.h b/rpcs3/Emu/RSX/Program/VertexProgramDecompiler.h index 94b25f8076..adf6676921 100644 --- a/rpcs3/Emu/RSX/Program/VertexProgramDecompiler.h +++ b/rpcs3/Emu/RSX/Program/VertexProgramDecompiler.h @@ -99,35 +99,35 @@ protected: /** returns string calling function where arguments are passed via * $0 $1 $2 substring. */ - virtual std::string getFunction(FUNCTION) = 0; + virtual std::string getFunction(FUNCTION f) = 0; /** returns string calling comparison function on 2 args passed as strings. */ - virtual std::string compareFunction(COMPARE, const std::string &, const std::string &, bool scalar = false) = 0; + virtual std::string compareFunction(COMPARE f, std::string_view Op0, std::string_view Op1, bool scalar = false) = 0; /** Insert header of shader file (eg #version, "system constants"...) */ - virtual void insertHeader(std::stringstream &OS) = 0; + virtual void insertHeader(std::stringstream& OS) = 0; /** Insert vertex declaration. */ - virtual void insertInputs(std::stringstream &OS, const std::vector &inputs) = 0; + virtual void insertInputs(std::stringstream& OS, const std::vector& inputs) = 0; /** insert global declaration of vertex shader outputs. */ - virtual void insertConstants(std::stringstream &OS, const std::vector &constants) = 0; + virtual void insertConstants(std::stringstream& OS, const std::vector& constants) = 0; /** insert declaration of shader constants. */ - virtual void insertOutputs(std::stringstream &OS, const std::vector &outputs) = 0; + virtual void insertOutputs(std::stringstream& OS, const std::vector& outputs) = 0; /** insert beginning of main (signature, temporary declaration...) */ - virtual void insertMainStart(std::stringstream &OS) = 0; + virtual void insertMainStart(std::stringstream& OS) = 0; /** insert end of main function (return value, output copy...) */ - virtual void insertMainEnd(std::stringstream &OS) = 0; + virtual void insertMainEnd(std::stringstream& OS) = 0; public: struct diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index 03ad33ac07..29d7e6b0e4 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -21,7 +21,7 @@ std::string VKFragmentDecompilerThread::getFunction(FUNCTION f) return glsl::getFunctionImpl(f); } -std::string VKFragmentDecompilerThread::compareFunction(COMPARE f, const std::string &Op0, const std::string &Op1) +std::string VKFragmentDecompilerThread::compareFunction(COMPARE f, std::string_view Op0, std::string_view Op1) { return glsl::compareFunctionImpl(f, Op0, Op1); } diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.h b/rpcs3/Emu/RSX/VK/VKFragmentProgram.h index 0412561340..b17a67f1c5 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.h +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.h @@ -37,8 +37,8 @@ public: protected: std::string getFloatTypeName(usz elementCount) override; std::string getHalfTypeName(usz elementCount) override; - std::string getFunction(FUNCTION) override; - std::string compareFunction(COMPARE, const std::string&, const std::string&) override; + std::string getFunction(FUNCTION f) override; + std::string compareFunction(COMPARE f, std::string_view Op0, std::string_view Op1) override; void insertHeader(std::stringstream &OS) override; void insertInputs(std::stringstream &OS) override; diff --git a/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp b/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp index 48874f55d0..7ae53c4c5e 100644 --- a/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp +++ b/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp @@ -282,7 +282,7 @@ namespace vk return *this; } - bool program::has_uniform(program_input_type type, const std::string& uniform_name) + bool program::has_uniform(program_input_type type, std::string_view uniform_name) { for (auto& set : m_sets) { @@ -296,7 +296,7 @@ namespace vk return false; } - std::pair program::get_uniform_location(::glsl::program_domain domain, program_input_type type, const std::string& uniform_name) + std::pair program::get_uniform_location(::glsl::program_domain domain, program_input_type type, std::string_view uniform_name) { for (unsigned i = 0; i < ::size32(m_sets); ++i) { @@ -632,7 +632,7 @@ namespace vk std::unordered_map descriptor_type_map; - auto descriptor_count = [](const std::string& name) -> u32 + auto descriptor_count = [](std::string_view name) -> u32 { const auto start = name.find_last_of("["); if (start == std::string::npos) @@ -643,8 +643,8 @@ namespace vk const auto end = name.find_last_of("]"); ensure(end != std::string::npos && start < end, "Invalid variable name"); - const std::string array_size = name.substr(start + 1, end - start - 1); - if (const auto count = std::atoi(array_size.c_str()); + const std::string_view array_size = name.substr(start + 1, end - start - 1); + if (const auto count = std::atoi(array_size.data()); count > 0) { return count; diff --git a/rpcs3/Emu/RSX/VK/VKProgramPipeline.h b/rpcs3/Emu/RSX/VK/VKProgramPipeline.h index bbf82bf26e..2beb2b90eb 100644 --- a/rpcs3/Emu/RSX/VK/VKProgramPipeline.h +++ b/rpcs3/Emu/RSX/VK/VKProgramPipeline.h @@ -221,13 +221,12 @@ namespace vk program& link(bool separate_stages); program& bind(const vk::command_buffer& cmd, VkPipelineBindPoint bind_point); - bool has_uniform(program_input_type type, const std::string &uniform_name); - std::pair get_uniform_location(::glsl::program_domain domain, program_input_type type, const std::string& uniform_name); + bool has_uniform(program_input_type type, std::string_view uniform_name); + std::pair get_uniform_location(::glsl::program_domain domain, program_input_type type, std::string_view uniform_name); void bind_uniform(const VkDescriptorImageInfoEx& image_descriptor, u32 set_id, u32 binding_point); void bind_uniform(const VkDescriptorBufferInfoEx& buffer_descriptor, u32 set_id, u32 binding_point); void bind_uniform(const VkDescriptorBufferViewEx& buffer_view, u32 set_id, u32 binding_point); - void bind_uniform(const VkDescriptorBufferViewEx& buffer_view, ::glsl::program_domain domain, program_input_type type, const std::string &binding_name); void bind_uniform_array(const std::span& image_descriptors,u32 set_id, u32 binding_point); diff --git a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp index 41faf3ca1e..7496679c40 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp @@ -21,7 +21,7 @@ std::string VKVertexDecompilerThread::getFunction(FUNCTION f) return glsl::getFunctionImpl(f); } -std::string VKVertexDecompilerThread::compareFunction(COMPARE f, const std::string &Op0, const std::string &Op1, bool scalar) +std::string VKVertexDecompilerThread::compareFunction(COMPARE f, std::string_view Op0, std::string_view Op1, bool scalar) { return glsl::compareFunctionImpl(f, Op0, Op1, scalar); } @@ -69,7 +69,7 @@ void VKVertexDecompilerThread::prepareBindingTable() } } -void VKVertexDecompilerThread::insertHeader(std::stringstream &OS) +void VKVertexDecompilerThread::insertHeader(std::stringstream& OS) { prepareBindingTable(); @@ -182,7 +182,7 @@ void VKVertexDecompilerThread::insertInputs(std::stringstream& OS, const std::ve } } -void VKVertexDecompilerThread::insertConstants(std::stringstream & OS, const std::vector & constants) +void VKVertexDecompilerThread::insertConstants(std::stringstream& OS, const std::vector& constants) { vk::glsl::program_input in { @@ -330,7 +330,7 @@ void VKVertexDecompilerThread::insertFSExport(std::stringstream& OS) "}\n\n"; } -void VKVertexDecompilerThread::insertMainStart(std::stringstream & OS) +void VKVertexDecompilerThread::insertMainStart(std::stringstream& OS) { glsl::shader_properties properties2{}; properties2.domain = glsl::glsl_vertex_program; @@ -388,9 +388,9 @@ void VKVertexDecompilerThread::insertMainStart(std::stringstream & OS) OS << "{\n"; //Declare temporary registers, ignoring those mapped to outputs - for (const ParamType &PT : m_parr.params[PF_PARAM_NONE]) + for (const ParamType& PT : m_parr.params[PF_PARAM_NONE]) { - for (const ParamItem &PI : PT.items) + for (const ParamItem& PI : PT.items) { if (PI.name.starts_with("dst_reg")) continue; @@ -403,9 +403,9 @@ void VKVertexDecompilerThread::insertMainStart(std::stringstream & OS) } } - for (const ParamType &PT : m_parr.params[PF_PARAM_IN]) + for (const ParamType& PT : m_parr.params[PF_PARAM_IN]) { - for (const ParamItem &PI : PT.items) + for (const ParamItem& PI : PT.items) { OS << " vec4 " << PI.name << "= read_location(" << std::to_string(PI.location) << ");\n"; } @@ -414,7 +414,7 @@ void VKVertexDecompilerThread::insertMainStart(std::stringstream & OS) OS << "\nuint xform_constants_offset = get_draw_params().xform_constants_offset;\n\n"; } -void VKVertexDecompilerThread::insertMainEnd(std::stringstream & OS) +void VKVertexDecompilerThread::insertMainEnd(std::stringstream& OS) { OS << "}\n\n"; diff --git a/rpcs3/Emu/RSX/VK/VKVertexProgram.h b/rpcs3/Emu/RSX/VK/VKVertexProgram.h index c36f089a2e..e5aeee0c3d 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexProgram.h +++ b/rpcs3/Emu/RSX/VK/VKVertexProgram.h @@ -25,21 +25,21 @@ struct VKVertexDecompilerThread : public VertexProgramDecompiler protected: std::string getFloatTypeName(usz elementCount) override; std::string getIntTypeName(usz elementCount) override; - std::string getFunction(FUNCTION) override; - std::string compareFunction(COMPARE, const std::string&, const std::string&, bool scalar) override; + std::string getFunction(FUNCTION f) override; + std::string compareFunction(COMPARE f, std::string_view Op0, std::string_view Op1, bool scalar) override; - void insertHeader(std::stringstream &OS) override; - void insertInputs(std::stringstream &OS, const std::vector &inputs) override; - void insertConstants(std::stringstream &OS, const std::vector &constants) override; - void insertOutputs(std::stringstream &OS, const std::vector &outputs) override; - void insertMainStart(std::stringstream &OS) override; - void insertMainEnd(std::stringstream &OS) override; + void insertHeader(std::stringstream& OS) override; + void insertInputs(std::stringstream& OS, const std::vector& inputs) override; + void insertConstants(std::stringstream& OS, const std::vector& constants) override; + void insertOutputs(std::stringstream& OS, const std::vector& outputs) override; + void insertMainStart(std::stringstream& OS) override; + void insertMainEnd(std::stringstream& OS) override; void prepareBindingTable(); const RSXVertexProgram &rsx_vertex_program; public: - VKVertexDecompilerThread(const RSXVertexProgram &prog, std::string& shader, ParamArray&, class VKVertexProgram &dst) + VKVertexDecompilerThread(const RSXVertexProgram& prog, std::string& shader, ParamArray&, class VKVertexProgram& dst) : VertexProgramDecompiler(prog) , m_shader(shader) , vk_prog(&dst) diff --git a/rpcs3/tests/test_rsx_fp_asm.cpp b/rpcs3/tests/test_rsx_fp_asm.cpp index 704df5a23d..c28707de44 100644 --- a/rpcs3/tests/test_rsx_fp_asm.cpp +++ b/rpcs3/tests/test_rsx_fp_asm.cpp @@ -51,7 +51,7 @@ namespace rsx::assembler return nullptr; }; - static FlowGraph CFG_from_source(const std::string& asm_) + static FlowGraph CFG_from_source(std::string_view asm_) { auto ir = FPIR::from_source(asm_); From 7b5f3e6921c7e49fc973851a4b92dfef18f6f7ac Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 16 Jun 2026 15:50:20 +0200 Subject: [PATCH 59/64] Fix unused midi_deleter variable warning --- rpcs3/rpcs3qt/midi_creator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/midi_creator.cpp b/rpcs3/rpcs3qt/midi_creator.cpp index 587b1a04eb..c1baa66c1f 100644 --- a/rpcs3/rpcs3qt/midi_creator.cpp +++ b/rpcs3/rpcs3qt/midi_creator.cpp @@ -8,7 +8,7 @@ LOG_CHANNEL(cfg_log, "CFG"); -const auto midi_deleter = [](RtMidiWrapper* ptr) { if (ptr) rtmidi_in_free(ptr); }; +inline constexpr auto midi_deleter = [](RtMidiWrapper* ptr) { if (ptr) rtmidi_in_free(ptr); }; using midi_ptr = std::unique_ptr; std::mutex midi_creator::m_midi_init_mutex = {}; From ed6a2f862eef7420c113f6c7c49243b94ac45ca3 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 06:26:12 +0200 Subject: [PATCH 60/64] Use std::string_view in rpcn code --- rpcs3/Emu/NP/ip_address.cpp | 2 +- rpcs3/Emu/NP/ip_address.h | 2 +- rpcs3/Emu/NP/np_handler.cpp | 2 +- rpcs3/Emu/NP/np_handler.h | 4 ++-- rpcs3/Emu/NP/np_requests.cpp | 2 +- rpcs3/Emu/NP/rpcn_client.cpp | 22 +++++++++++----------- rpcs3/Emu/NP/rpcn_client.h | 24 ++++++++++++------------ rpcs3/Emu/NP/upnp_handler.cpp | 5 +++-- rpcs3/rpcs3qt/rpcn_settings_dialog.cpp | 2 +- rpcs3/rpcs3qt/rpcn_settings_dialog.h | 2 +- 10 files changed, 34 insertions(+), 33 deletions(-) diff --git a/rpcs3/Emu/NP/ip_address.cpp b/rpcs3/Emu/NP/ip_address.cpp index 7d9d972d7c..fe0124c74d 100644 --- a/rpcs3/Emu/NP/ip_address.cpp +++ b/rpcs3/Emu/NP/ip_address.cpp @@ -66,7 +66,7 @@ namespace np return sockaddr_ipv6; } - u32 register_ip(const std::string& ip_bytes) + u32 register_ip(std::string_view ip_bytes) { if (ip_bytes.size() == 4) { diff --git a/rpcs3/Emu/NP/ip_address.h b/rpcs3/Emu/NP/ip_address.h index f019e299cb..39205a007d 100644 --- a/rpcs3/Emu/NP/ip_address.h +++ b/rpcs3/Emu/NP/ip_address.h @@ -66,7 +66,7 @@ namespace np std::vector> ipv4_to_ipv6; }; - u32 register_ip(const std::string& ip_bytes); + u32 register_ip(std::string_view ip_bytes); enum class IPV6_SUPPORT : u8 { diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index 0d628e299e..6b4ada8e84 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -1303,7 +1303,7 @@ namespace np } } - bool np_handler::error_and_disconnect(const std::string& error_msg) + bool np_handler::error_and_disconnect(std::string_view error_msg) { rpcn_log.error("%s", error_msg); rpcn.reset(); diff --git a/rpcs3/Emu/NP/np_handler.h b/rpcs3/Emu/NP/np_handler.h index 575fe68941..940ad6eac3 100644 --- a/rpcs3/Emu/NP/np_handler.h +++ b/rpcs3/Emu/NP/np_handler.h @@ -267,7 +267,7 @@ namespace np error_code abort_request(u32 req_id); // For signaling - void req_sign_infos(const std::string& npid, u32 conn_id); + void req_sign_infos(std::string_view npid, u32 conn_id); // For UPNP void upnp_add_port_mapping(u16 internal_port, std::string_view protocol); @@ -297,7 +297,7 @@ namespace np // Various generic helpers bool discover_ip_address(); bool discover_ether_address(); - bool error_and_disconnect(const std::string& error_msg); + bool error_and_disconnect(std::string_view error_msg); // Notification handlers void notif_user_joined_room(vec_stream& noti); diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index d9dd6dc337..fb1fb0cfe8 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -814,7 +814,7 @@ namespace np cb_info_opt->queue_callback(req_id, 0, error_code, 0); } - void np_handler::req_sign_infos(const std::string& npid, u32 conn_id) + void np_handler::req_sign_infos(std::string_view npid, u32 conn_id) { const u32 req_id = get_req_id(REQUEST_ID_HIGH::MISC); { diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index 96ab505abf..da590278f5 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -967,7 +967,7 @@ namespace rpcn server_info_received = false; } - bool rpcn_client::connect(const std::string& host) + bool rpcn_client::connect(std::string_view host) { rpcn_log.warning("connect: Attempting to connect"); @@ -1172,7 +1172,7 @@ namespace rpcn return true; } - bool rpcn_client::login(const std::string& npid, const std::string& password, const std::string& token) + bool rpcn_client::login(std::string_view npid, std::string_view password, std::string_view token) { if (npid.empty()) { @@ -1338,7 +1338,7 @@ namespace rpcn return error; } - ErrorType rpcn_client::resend_token(const std::string& npid, const std::string& password) + ErrorType rpcn_client::resend_token(std::string_view npid, std::string_view password) { if (authentified) { @@ -1469,7 +1469,7 @@ namespace rpcn return error; } - std::optional rpcn_client::add_friend(const std::string& friend_username) + std::optional rpcn_client::add_friend(std::string_view friend_username) { std::vector data; std::copy(friend_username.begin(), friend_username.end(), std::back_inserter(data)); @@ -1494,7 +1494,7 @@ namespace rpcn return error; } - bool rpcn_client::remove_friend(const std::string& friend_username) + bool rpcn_client::remove_friend(std::string_view friend_username) { std::vector data; std::copy(friend_username.begin(), friend_username.end(), std::back_inserter(data)); @@ -2159,7 +2159,7 @@ namespace rpcn return forge_request_with_com_id(serialized, communication_id, CommandType::SendRoomMessage, req_id); } - bool rpcn_client::req_sign_infos(u32 req_id, const std::string& npid) + bool rpcn_client::req_sign_infos(u32 req_id, std::string_view npid) { std::vector data; std::copy(npid.begin(), npid.end(), std::back_inserter(data)); @@ -2168,7 +2168,7 @@ namespace rpcn return forge_send(CommandType::RequestSignalingInfos, req_id, data); } - bool rpcn_client::req_ticket(u32 req_id, const std::string& service_id, const std::vector& cookie) + bool rpcn_client::req_ticket(u32 req_id, std::string_view service_id, const std::vector& cookie) { std::vector data; std::copy(service_id.begin(), service_id.end(), std::back_inserter(data)); @@ -2859,7 +2859,7 @@ namespace rpcn memcpy(data.data(), com_id_str.data(), COMMUNICATION_ID_SIZE); } - bool rpcn_client::forge_request_with_com_id(const std::string& serialized_data, const SceNpCommunicationId& com_id, CommandType command, u64 packet_id) + bool rpcn_client::forge_request_with_com_id(std::string_view serialized_data, const SceNpCommunicationId& com_id, CommandType command, u64 packet_id) { const usz bufsize = serialized_data.size(); std::vector data(COMMUNICATION_ID_SIZE + sizeof(u32) + bufsize); @@ -2872,7 +2872,7 @@ namespace rpcn return forge_send(command, packet_id, data); } - bool rpcn_client::forge_request_with_data(const std::string& serialized_data, CommandType command, u64 packet_id) + bool rpcn_client::forge_request_with_data(std::string_view serialized_data, CommandType command, u64 packet_id) { const usz bufsize = serialized_data.size(); std::vector data(sizeof(u32) + bufsize); @@ -2897,14 +2897,14 @@ namespace rpcn return packet; } - bool rpcn_client::error_and_disconnect(const std::string& error_msg) + bool rpcn_client::error_and_disconnect(std::string_view error_msg) { connected = false; rpcn_log.error("%s", error_msg); return false; } - bool rpcn_client::error_and_disconnect_notice(const std::string& error_msg) + bool rpcn_client::error_and_disconnect_notice(std::string_view error_msg) { connected = false; rpcn_log.notice("%s", error_msg); diff --git a/rpcs3/Emu/NP/rpcn_client.h b/rpcs3/Emu/NP/rpcn_client.h index daa60d90e7..e37b1bb2e0 100644 --- a/rpcs3/Emu/NP/rpcn_client.h +++ b/rpcs3/Emu/NP/rpcn_client.h @@ -166,7 +166,7 @@ public: vec.push_back(*(reinterpret_cast(&value) + index)); } } - void insert_string(const std::string& str) const + void insert_string(std::string_view str) const { std::copy(str.begin(), str.end(), std::back_inserter(vec)); vec.push_back(0); @@ -277,8 +277,8 @@ namespace rpcn bool send_packet(const std::vector& packet); private: - bool connect(const std::string& host); - bool login(const std::string& npid, const std::string& password, const std::string& token); + bool connect(std::string_view host); + bool login(std::string_view npid, std::string_view password, std::string_view token); void disconnect(); public: @@ -297,12 +297,12 @@ namespace rpcn void remove_friend_cb(friend_cb_func, void* cb_param); ErrorType create_user(std::string_view npid, std::string_view password, std::string_view online_name, std::string_view avatar_url, std::string_view email); - ErrorType resend_token(const std::string& npid, const std::string& password); + ErrorType resend_token(std::string_view npid, std::string_view password); ErrorType send_reset_token(std::string_view npid, std::string_view email); ErrorType reset_password(std::string_view npid, std::string_view token, std::string_view password); ErrorType delete_account(); - std::optional add_friend(const std::string& friend_username); - bool remove_friend(const std::string& friend_username); + std::optional add_friend(std::string_view friend_username); + bool remove_friend(std::string_view friend_username); u32 get_num_friends() const; u32 get_num_blocks() const; @@ -346,8 +346,8 @@ namespace rpcn bool set_userinfo(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SetUserInfoRequest* req); bool ping_room_owner(u32 req_id, const SceNpCommunicationId& communication_id, u64 room_id); bool send_room_message(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SendRoomMessageRequest* req); - bool req_sign_infos(u32 req_id, const std::string& npid); - bool req_ticket(u32 req_id, const std::string& service_id, const std::vector& cookie); + bool req_sign_infos(u32 req_id, std::string_view npid); + bool req_ticket(u32 req_id, std::string_view service_id, const std::vector& cookie); bool send_message(const message_data& msg_data, const std::set& npids); bool get_board_infos(u32 req_id, const SceNpCommunicationId& communication_id, SceNpScoreBoardId board_id); bool record_score(u32 req_id, const SceNpCommunicationId& communication_id, SceNpScoreBoardId board_id, SceNpScorePcId char_id, SceNpScoreValue score, const std::optional comment, const std::optional> score_data); @@ -396,12 +396,12 @@ namespace rpcn std::vector forge_request(rpcn::CommandType command, u64 packet_id, const std::vector& data) const; bool forge_send(rpcn::CommandType command, u64 packet_id, const std::vector& data); - bool forge_request_with_com_id(const std::string& serialized_data, const SceNpCommunicationId& com_id, CommandType command, u64 packet_id); - bool forge_request_with_data(const std::string& serialized_data, CommandType command, u64 packet_id); + bool forge_request_with_com_id(std::string_view serialized_data, const SceNpCommunicationId& com_id, CommandType command, u64 packet_id); + bool forge_request_with_data(std::string_view serialized_data, CommandType command, u64 packet_id); bool forge_send_reply(rpcn::CommandType command, u64 packet_id, const std::vector& data, std::vector& reply_data); - bool error_and_disconnect(const std::string& error_mgs); - bool error_and_disconnect_notice(const std::string& error_msg); + bool error_and_disconnect(std::string_view error_mgs); + bool error_and_disconnect_notice(std::string_view error_msg); std::string get_wolfssl_error(WOLFSSL* wssl, int error) const; diff --git a/rpcs3/Emu/NP/upnp_handler.cpp b/rpcs3/Emu/NP/upnp_handler.cpp index c19e30d441..4ebd9084d1 100644 --- a/rpcs3/Emu/NP/upnp_handler.cpp +++ b/rpcs3/Emu/NP/upnp_handler.cpp @@ -119,13 +119,14 @@ void upnp_handler::add_port_redir(const std::string& addr, u16 internal_port, st if (!m_active) return; + const std::string protocol_str(protocol); + std::lock_guard lock(m_mutex); - if (m_bindings[std::string(protocol)].contains(internal_port)) + if (m_bindings[protocol_str].contains(internal_port)) return; const std::string internal_port_str = fmt::format("%d", internal_port); - const std::string protocol_str(protocol); const u32 max_port = std::min(static_cast(internal_port) + 100, 0xFFFFu); int res = 0; diff --git a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp index cab71be3bc..f927291178 100644 --- a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp @@ -1353,7 +1353,7 @@ rpcn_friends_dialog::~rpcn_friends_dialog() } } -bool rpcn_friends_dialog::add_friend_with_error_dialog(const std::string& friend_username) +bool rpcn_friends_dialog::add_friend_with_error_dialog(std::string_view friend_username) { QString err_msg; const auto opt_error = m_rpcn->add_friend(friend_username); diff --git a/rpcs3/rpcs3qt/rpcn_settings_dialog.h b/rpcs3/rpcs3qt/rpcn_settings_dialog.h index c28828e410..a4fd8ec5e0 100644 --- a/rpcs3/rpcs3qt/rpcn_settings_dialog.h +++ b/rpcs3/rpcs3qt/rpcn_settings_dialog.h @@ -121,7 +121,7 @@ public: private: void add_update_list(QListWidget* list, const QString& name, const QIcon& icon, const QVariant& data); void remove_list(QListWidget* list, const QString& name); - bool add_friend_with_error_dialog(const std::string& friend_username); + bool add_friend_with_error_dialog(std::string_view friend_username); private Q_SLOTS: void add_update_friend(const QString& name, bool status); From c7478d6dcc3b5e5303a91a107b6a393e79c0e7cb Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 14 Jun 2026 06:24:03 +0200 Subject: [PATCH 61/64] Use more std::string_view --- rpcs3/Emu/GDB.cpp | 8 ++++---- rpcs3/Emu/GDB.h | 6 +++--- rpcs3/Emu/System.cpp | 6 +++--- rpcs3/Emu/System.h | 2 +- rpcs3/Emu/system_utils.cpp | 6 +++--- rpcs3/Emu/system_utils.hpp | 2 +- rpcs3/Emu/vfs_config.cpp | 4 ++-- rpcs3/Emu/vfs_config.h | 2 +- rpcs3/rpcs3qt/cheat_manager.cpp | 9 ++++++--- rpcs3/rpcs3qt/cheat_manager.h | 2 +- rpcs3/rpcs3qt/shortcut_utils.cpp | 6 +++--- rpcs3/rpcs3qt/steam_utils.cpp | 6 +++--- rpcs3/rpcs3qt/steam_utils.h | 4 ++-- rpcs3/rpcs3qt/user_manager_dialog.cpp | 2 +- rpcs3/rpcs3qt/user_manager_dialog.h | 2 +- 15 files changed, 35 insertions(+), 32 deletions(-) diff --git a/rpcs3/Emu/GDB.cpp b/rpcs3/Emu/GDB.cpp index 20e6c82cd4..5c6eb11396 100644 --- a/rpcs3/Emu/GDB.cpp +++ b/rpcs3/Emu/GDB.cpp @@ -102,7 +102,7 @@ std::string u32_to_padded_hex(u32 value) template T hex_to(std::string_view val) { - T result; + T result {}; auto [ptr, err] = std::from_chars(val.data(), val.data() + val.size(), result, 16); if (err != std::errc()) { @@ -361,7 +361,7 @@ void gdb_thread::ack(bool accepted) send_char(accepted ? '+' : '-'); } -void gdb_thread::send_cmd(const std::string& cmd) +void gdb_thread::send_cmd(std::string_view cmd) { u8 checksum = 0; std::string buf; @@ -376,7 +376,7 @@ void gdb_thread::send_cmd(const std::string& cmd) send(buf.c_str(), static_cast(buf.length())); } -bool gdb_thread::send_cmd_ack(const std::string& cmd) +bool gdb_thread::send_cmd_ack(std::string_view cmd) { while (true) { @@ -465,7 +465,7 @@ std::string gdb_thread::get_reg(ppu_thread* thread, u32 rid) } } -bool gdb_thread::set_reg(ppu_thread* thread, u32 rid, const std::string& value) +bool gdb_thread::set_reg(ppu_thread* thread, u32 rid, std::string_view value) { switch (rid) { diff --git a/rpcs3/Emu/GDB.h b/rpcs3/Emu/GDB.h index 75d272f9d7..0de02ffe25 100644 --- a/rpcs3/Emu/GDB.h +++ b/rpcs3/Emu/GDB.h @@ -44,10 +44,10 @@ class gdb_thread //acknowledge packet, either as accepted or declined void ack(bool accepted); //sends command body cmd to client - void send_cmd(const std::string& cmd); + void send_cmd(std::string_view cmd); //sends command to client until receives positive acknowledgement //returns false in case some error happened, and command wasn't sent - bool send_cmd_ack(const std::string& cmd); + bool send_cmd_ack(std::string_view cmd); //appends encoded char c to string str, and returns checksum. encoded byte can occupy 2 bytes static u8 append_encoded_char(char c, std::string& str); //convert u8 to 2 byte hexademical representation @@ -57,7 +57,7 @@ class gdb_thread //returns register value as hex string by register id (in gdb), in case of wrong id returns empty string static std::string get_reg(ppu_thread* thread, u32 rid); //sets register value to hex string by register id (in gdb), in case of wrong id returns false - static bool set_reg(ppu_thread* thread, u32 rid, const std::string& value); + static bool set_reg(ppu_thread* thread, u32 rid, std::string_view value); //returns size of register with id rid in bytes, zero if invalid rid is provided static u32 get_reg_size(ppu_thread* thread, u32 rid); //send reason of stop, returns false if sending response failed diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 60e6cb3fca..8f36b9a899 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -4849,7 +4849,7 @@ bool Emulator::IsValidSfb(const std::string& path) return false; } -void Emulator::SaveSettings(const std::string& settings, const std::string& title_id) +void Emulator::SaveSettings(std::string_view settings, const std::string& title_id) { std::string config_name; @@ -4870,7 +4870,7 @@ void Emulator::SaveSettings(const std::string& settings, const std::string& titl } else { - temp.file.write(settings.c_str(), settings.size()); + temp.file.write(settings.data(), settings.size()); if (!temp.commit()) { sys_log.error("Could not save config to %s (failed to commit) (error=%s)", config_name, fs::g_tls_error); @@ -4881,7 +4881,7 @@ void Emulator::SaveSettings(const std::string& settings, const std::string& titl if (config_name == g_cfg.name || title_id == Emu.GetTitleID()) { // Update current config - if (!g_cfg.from_string({settings.c_str(), settings.size()}, !Emu.IsStopped())) + if (!g_cfg.from_string(settings, !Emu.IsStopped())) { sys_log.fatal("Failed to update configuration"); } diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 6f89967d79..9a9b00c865 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -510,7 +510,7 @@ public: static bool IsVsh(); static bool IsValidSfb(const std::string& path); - static void SaveSettings(const std::string& settings, const std::string& title_id); + static void SaveSettings(std::string_view settings, const std::string& title_id); }; extern Emulator Emu; diff --git a/rpcs3/Emu/system_utils.cpp b/rpcs3/Emu/system_utils.cpp index dd3f414938..f95d65fd69 100644 --- a/rpcs3/Emu/system_utils.cpp +++ b/rpcs3/Emu/system_utils.cpp @@ -56,13 +56,13 @@ namespace rpcs3::utils was_silenced = silenced; } - u32 check_user(const std::string& user) + u32 check_user(std::string_view user) { u32 id = 0; if (user.size() == 8) { - std::from_chars(&user.front(), &user.back() + 1, id); + std::from_chars(user.data(), user.data() + user.size(), id); } return id; @@ -583,7 +583,7 @@ namespace rpcs3::utils const bool check_disc = !disc_dir.empty(); const bool check_hdd0 = !hdd0_dir.empty() && !check_disc; - const auto find_content = [&](const std::string& name, const std::string& extension) -> std::string + const auto find_content = [&](std::string_view name, std::string_view extension) -> std::string { // Check localized content first for (bool localized : { true, false }) diff --git a/rpcs3/Emu/system_utils.hpp b/rpcs3/Emu/system_utils.hpp index 8745b7d3b0..ae6e8bf3d3 100644 --- a/rpcs3/Emu/system_utils.hpp +++ b/rpcs3/Emu/system_utils.hpp @@ -21,7 +21,7 @@ namespace rpcs3::utils void configure_logs(bool force_enable = false); - u32 check_user(const std::string& user); + u32 check_user(std::string_view user); bool install_pkg(const std::string& path); diff --git a/rpcs3/Emu/vfs_config.cpp b/rpcs3/Emu/vfs_config.cpp index bd292f9a25..0958c01b28 100644 --- a/rpcs3/Emu/vfs_config.cpp +++ b/rpcs3/Emu/vfs_config.cpp @@ -11,9 +11,9 @@ std::string cfg_vfs::get(const cfg::string& _cfg, std::string_view emu_dir) cons return get(_cfg.to_string(), _cfg.def, emu_dir); } -std::string cfg_vfs::get(const std::string& _cfg, const std::string& def, std::string_view emu_dir) const +std::string cfg_vfs::get(std::string_view _cfg, std::string_view def, std::string_view emu_dir) const { - std::string path = _cfg; + std::string path = std::string(_cfg); // Fallback if (path.empty()) diff --git a/rpcs3/Emu/vfs_config.h b/rpcs3/Emu/vfs_config.h index eaba041344..feedf0d668 100644 --- a/rpcs3/Emu/vfs_config.h +++ b/rpcs3/Emu/vfs_config.h @@ -42,7 +42,7 @@ struct cfg_vfs : cfg::node cfg::device_info get_device(const cfg::device_entry& _cfg, std::string_view key, std::string_view emu_dir = {}) const; private: - std::string get(const std::string& _cfg, const std::string& def, std::string_view emu_dir) const; + std::string get(std::string_view _cfg, std::string_view def, std::string_view emu_dir) const; cfg::device_info get_device_info(const cfg::device_entry& _cfg, std::string_view key, std::string_view emu_dir = {}) const; }; diff --git a/rpcs3/rpcs3qt/cheat_manager.cpp b/rpcs3/rpcs3qt/cheat_manager.cpp index fa8d0b4d58..90b38f2d49 100644 --- a/rpcs3/rpcs3qt/cheat_manager.cpp +++ b/rpcs3/rpcs3qt/cheat_manager.cpp @@ -195,7 +195,7 @@ bool cheat_engine::erase(const std::string& game, const u32 offset) return true; } -bool cheat_engine::resolve_script(u32& final_offset, const u32 offset, const std::string& red_script) +bool cheat_engine::resolve_script(u32& final_offset, const u32 offset, std::string_view red_script) { enum operand { @@ -290,8 +290,11 @@ bool cheat_engine::resolve_script(u32& final_offset, const u32 offset, const std cur_op = operand_sub; index++; break; - case ' ': index++; break; - default: log_cheat.fatal("invalid character in redirection script"); return false; + case ' ': index++; + break; + default: + log_cheat.fatal("invalid character in redirection script"); + return false; } } } diff --git a/rpcs3/rpcs3qt/cheat_manager.h b/rpcs3/rpcs3qt/cheat_manager.h index c09f47428f..a02aa8c696 100644 --- a/rpcs3/rpcs3qt/cheat_manager.h +++ b/rpcs3/rpcs3qt/cheat_manager.h @@ -30,7 +30,7 @@ public: void save() const; // Static functions to find/get/set values in ps3 memory - static bool resolve_script(u32& final_offset, const u32 offset, const std::string& red_script); + static bool resolve_script(u32& final_offset, const u32 offset, std::string_view red_script); template static std::vector search(const T value, const std::vector& to_filter); diff --git a/rpcs3/rpcs3qt/shortcut_utils.cpp b/rpcs3/rpcs3qt/shortcut_utils.cpp index 2112dfe0e9..9b457a3362 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.cpp +++ b/rpcs3/rpcs3qt/shortcut_utils.cpp @@ -109,7 +109,7 @@ namespace gui::utils return true; } - static std::string make_simple_name(const std::string& name) + static std::string make_simple_name(std::string_view name) { const std::string simple_name = QString::fromStdString(vfs::escape(name, true)).simplified().toStdString(); return simple_name; @@ -227,7 +227,7 @@ namespace gui::utils Microsoft::WRL::ComPtr pShellLink; Microsoft::WRL::ComPtr pPersistFile; - const auto cleanup = [&](bool return_value, const std::string& fail_reason) -> bool + const auto cleanup = [&](bool return_value, std::string_view fail_reason) -> bool { if (!return_value) sys_log.error("Failed to create shortcut: %s", fail_reason); CoUninitialize(); @@ -611,7 +611,7 @@ namespace gui::utils return result; } - static void remove_shortcuts(const std::string& simple_name, [[maybe_unused]] const std::string& serial) + static void remove_shortcuts(std::string_view simple_name, [[maybe_unused]] const std::string& serial) { if (simple_name.empty() || simple_name == "." || simple_name == "..") { diff --git a/rpcs3/rpcs3qt/steam_utils.cpp b/rpcs3/rpcs3qt/steam_utils.cpp index e5aedf9e20..036a7a4876 100644 --- a/rpcs3/rpcs3qt/steam_utils.cpp +++ b/rpcs3/rpcs3qt/steam_utils.cpp @@ -520,7 +520,7 @@ namespace gui::utils return !path.empty() && fs::is_dir(path); } - u32 steam_shortcut::crc32(const std::string& data) + u32 steam_shortcut::crc32(std::string_view data) { u32 crc = 0xFFFFFFFF; @@ -882,7 +882,7 @@ namespace gui::utils } #endif - std::string steam_shortcut::steamid64_to_32(const std::string& steam_id) + std::string steam_shortcut::steamid64_to_32(std::string_view steam_id) { u64 id = 0; if (!try_to_uint64(&id, steam_id, 0, umax)) @@ -1009,7 +1009,7 @@ namespace gui::utils usz user_count = 0; - const auto find_user_id = [&content, &user_count](const std::string& key, const std::string& comp) -> std::string + const auto find_user_id = [&content, &user_count](const std::string& key, std::string_view comp) -> std::string { user_count = 0; usz pos = 0; diff --git a/rpcs3/rpcs3qt/steam_utils.h b/rpcs3/rpcs3qt/steam_utils.h index deb7c0dad7..d3e011f19a 100644 --- a/rpcs3/rpcs3qt/steam_utils.h +++ b/rpcs3/rpcs3qt/steam_utils.h @@ -105,7 +105,7 @@ namespace gui::utils void update_steam_input_config(const std::string& user_dir); - static u32 crc32(const std::string& data); + static u32 crc32(std::string_view data); static u32 steam_appid(const std::string& exe, const std::string& name); static void append(std::string& s, const std::string& val); @@ -114,7 +114,7 @@ namespace gui::utils static std::string fix_slashes(const std::string& s); static std::string kv_string(const std::string& key, const std::string& value); static std::string kv_int(const std::string& key, u32 value); - static std::string steamid64_to_32(const std::string& steam_id); + static std::string steamid64_to_32(std::string_view steam_id); static std::string get_steam_path(); static std::string get_last_active_steam_user(const std::string& steam_path); diff --git a/rpcs3/rpcs3qt/user_manager_dialog.cpp b/rpcs3/rpcs3qt/user_manager_dialog.cpp index 8c96992b2a..5da620effe 100644 --- a/rpcs3/rpcs3qt/user_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/user_manager_dialog.cpp @@ -229,7 +229,7 @@ void user_manager_dialog::OnUserRemove() } } -void user_manager_dialog::GenerateUser(const std::string& user_id, const std::string& username) +void user_manager_dialog::GenerateUser(const std::string& user_id, std::string_view username) { ensure(rpcs3::utils::check_user(user_id) > 0); diff --git a/rpcs3/rpcs3qt/user_manager_dialog.h b/rpcs3/rpcs3qt/user_manager_dialog.h index 75d0ba23e1..fcd5a88fa3 100644 --- a/rpcs3/rpcs3qt/user_manager_dialog.h +++ b/rpcs3/rpcs3qt/user_manager_dialog.h @@ -35,7 +35,7 @@ protected: private: void Init(); void UpdateTable(bool mark_only = false); - static void GenerateUser(const std::string& user_id, const std::string& username); + static void GenerateUser(const std::string& user_id, std::string_view username); static bool ValidateUsername(const QString& text_to_validate); void ShowContextMenu(const QPoint &pos); From 927e2492ef720d2223bd8b149a02af875e11c398 Mon Sep 17 00:00:00 2001 From: Walter <90877047+WalterKruger@users.noreply.github.com> Date: Mon, 22 Jun 2026 22:27:37 +1000 Subject: [PATCH 62/64] SPU LLVM: Calculate FREST fraction LUT using vperm2dlculate `FREST` fraction using `vperm2d` for AVX512 (#18931) The `FREST` instruction uses a scalar lookup-table loop to calculate the mantissa. Given that it's only 32 elements, we can load it into two 512-bit vectors and treat them as the sources to the `vperm2d` shuffle instruction. This allows it to be calculated in parallel, improving its performance. --- rpcs3/Emu/CPU/CPUTranslator.h | 17 ++++++++++++ rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 40 +++++++++++++++++++++------- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index 0ae5179916..97020f039a 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -3670,6 +3670,23 @@ public: #endif } + template + value_t vperm2d128From512(T1 a, T2 b, T3 c) + { + value_t result; + value_t perm512; + + const auto data0 = a.eval(m_ir); + const auto index128 = b.eval(m_ir); + const auto data1 = c.eval(m_ir); + + const auto index512 = m_ir->CreateInsertVector(get_type(), llvm::UndefValue::get(get_type()), index128, m_ir->getInt64(0)); + perm512.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::x86_avx512_vpermi2var_d_512), {data0, index512, data1}); + + result.value = m_ir->CreateExtractVector(get_type(), perm512.value, m_ir->getInt64(0)); + return result; + } + template value_t gf2p8affineqb(T1 a, T2 b, u8 c) { diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index 5f5c90f6f4..392f2f339b 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -7498,13 +7498,23 @@ public: const auto a_sign = (a & splat(0x80000000)); value_t final_result = eval(splat(0)); - for (u32 i = 0; i < 4; i++) + if (m_use_avx512) { - const auto eval_fraction = eval(extract(a_fraction, i)); + value_t lo_lut; + value_t hi_lut; + lo_lut.value = llvm::ConstantDataVector::get(m_context, llvm::ArrayRef(spu_frest_fraction_lut, 16)); + hi_lut.value = llvm::ConstantDataVector::get(m_context, llvm::ArrayRef(spu_frest_fraction_lut + 16, 16)); - value_t r_fraction = load_const(m_spu_frest_fraction_lut, eval_fraction); - - final_result = eval(insert(final_result, i, r_fraction)); + final_result = vperm2d128From512(lo_lut, a_fraction, hi_lut); + } + else + { + for (u32 i = 0; i < 4; i++) + { + const auto eval_fraction = eval(extract(a_fraction, i)); + value_t r_fraction = load_const(m_spu_frest_fraction_lut, eval_fraction); + final_result = eval(insert(final_result, i, r_fraction)); + } } //final_result = eval(select(final_result != (0), final_result, bitcast(pshufb(splat(0), bitcast(final_result))))); @@ -8551,13 +8561,23 @@ public: const auto a_sign = (a & splat(0x80000000)); value_t b = eval(splat(0)); - for (u32 i = 0; i < 4; i++) + if (m_use_avx512) { - const auto eval_fraction = eval(extract(a_fraction, i)); + value_t lo_lut; + value_t hi_lut; + lo_lut.value = llvm::ConstantDataVector::get(m_context, llvm::ArrayRef(spu_frest_fraction_lut, 16)); + hi_lut.value = llvm::ConstantDataVector::get(m_context, llvm::ArrayRef(spu_frest_fraction_lut + 16, 16)); - value_t r_fraction = load_const(m_spu_frest_fraction_lut, eval_fraction); - - b = eval(insert(b, i, r_fraction)); + b = vperm2d128From512(lo_lut, a_fraction, hi_lut); + } + else + { + for (u32 i = 0; i < 4; i++) + { + const auto eval_fraction = eval(extract(a_fraction, i)); + value_t r_fraction = load_const(m_spu_frest_fraction_lut, eval_fraction); + b = eval(insert(b, i, r_fraction)); + } } b = eval(b | fix_exponent | a_sign); From 064365d6fb5bd36b507467ad68ffdbb26ce3734c Mon Sep 17 00:00:00 2001 From: Christopher Hotchkiss Date: Tue, 23 Jun 2026 11:58:10 -0800 Subject: [PATCH 63/64] SPU Analyzer: prune dead in-range targets from m_targets (Giga) Giga cleanup clears m_block_info for removed blocks but left their in-range edges in m_targets, so the register-state walk dereferenced a stale target and aborted ("Range check failed") - e.g. a brsl whose return is a stop-trap, hit in Skylanders Giants. Prune those edges at the m_targets cleanup; export out_target_list after the prune so callers see the cleaned map; keep the initiate_patterns and cond_next-walk guards as defense in depth. Adds made-up-data regression tests (the exported-map test fails without the prune) and the rpcs3_test.vcxproj entry. Co-Authored-By: Claude Opus 4.8 --- rpcs3/CMakeLists.txt | 1 + rpcs3/Emu/Cell/SPUCommonRecompiler.cpp | 43 ++++- rpcs3/tests/rpcs3_test.vcxproj | 1 + rpcs3/tests/test_spu_analyser.cpp | 244 +++++++++++++++++++++++++ 4 files changed, 282 insertions(+), 7 deletions(-) create mode 100644 rpcs3/tests/test_spu_analyser.cpp diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 6178f9c7d1..2fa497467c 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -192,6 +192,7 @@ if(BUILD_RPCS3_TESTS) tests/test_rsx_cfg.cpp tests/test_rsx_fp_asm.cpp tests/test_dmux_pamf.cpp + tests/test_spu_analyser.cpp ) target_link_libraries(rpcs3_test diff --git a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp index 813915820b..f4c3027d93 100644 --- a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp @@ -3973,11 +3973,6 @@ spu_program spu_recompiler_base::analyse(const be_t* ls, u32 entry_point, s it++; } - if (out_target_list) - { - out_target_list->insert(m_targets.begin(), m_targets.end()); - } - // Remove unnecessary target lists for (auto it = m_targets.begin(); it != m_targets.end();) { @@ -3991,7 +3986,13 @@ spu_program spu_recompiler_base::analyse(const be_t* ls, u32 entry_point, s for (auto it2 = it->second.begin(); it2 != it->second.end();) { - if (*it2 < lsa || *it2 >= limit) + // Drop targets out of range, OR pointing at a block that cleanup + // removed above (m_block_info cleared) - the dead in-range edges + // that otherwise leave dangling targets in m_bbs. Pruning them here + // keeps m_targets self-consistent. The pre-existing get_block_targets + // / get_block_preds guards are retained, plus a belt-and-suspenders + // initiate_patterns guard added below - all defense in depth. + if (*it2 < lsa || *it2 >= limit || !m_block_info[*it2 / 4]) { it2 = it->second.erase(it2); removed = true; @@ -4010,6 +4011,14 @@ spu_program spu_recompiler_base::analyse(const be_t* ls, u32 entry_point, s it++; } + // Export the now-pruned, self-consistent target map AFTER the prune above, + // so callers don't see the dead in-range edges (or stale out-of-range keys) + // we just removed from m_targets. + if (out_target_list) + { + out_target_list->insert(m_targets.begin(), m_targets.end()); + } + // Fill holes which contain only NOP and LNOP instructions (TODO: compile) for (u32 i = 0, nnop = 0, vsize = 0; i <= result.data.size(); i++) { @@ -5257,6 +5266,14 @@ spu_program spu_recompiler_base::analyse(const be_t* ls, u32 entry_point, s const auto initiate_patterns = [&](block_reg_state_iterator& block_state_it, u32 bpc, bool is_multi_block) { + // Defense in depth: cleanup now prunes dead in-range edges from m_targets, + // but still skip a bpc whose block was removed (matches get_block_targets) + // so no consumer can ever deref a stale target (e.g. a stop-trap return). + if (!m_block_info[bpc / 4] || !m_bbs.count(bpc)) + { + return; + } + // Initiate patterns (that are initiated on block start) const auto& bb_body = ::at32(m_bbs, bpc); @@ -5319,7 +5336,19 @@ spu_program spu_recompiler_base::analyse(const be_t* ls, u32 entry_point, s { targets_count = 0; - const u32 cond_next = block_pc + ::at32(m_bbs, block_pc).size * 4; + // Belt-and-suspenders (PR #18935): block_pc is the previous block's + // fall-through (cond_next), a live m_bbs key only because the m_targets + // prune keeps dead edges out of block.targets. If that ever regressed, + // the ::at32 below would abort with the same "Range check failed" as + // the bug we fixed - bail cleanly instead of dereferencing a non-block. + const auto block_it = m_bbs.find(block_pc); + if (block_it == m_bbs.end() || !m_block_info[block_pc / 4]) + { + invalid = true; + break; + } + + const u32 cond_next = block_pc + block_it->second.size * 4; valid = false; bool is_end = false; diff --git a/rpcs3/tests/rpcs3_test.vcxproj b/rpcs3/tests/rpcs3_test.vcxproj index 0c2457bc96..fb96921efc 100644 --- a/rpcs3/tests/rpcs3_test.vcxproj +++ b/rpcs3/tests/rpcs3_test.vcxproj @@ -96,6 +96,7 @@ true + diff --git a/rpcs3/tests/test_spu_analyser.cpp b/rpcs3/tests/test_spu_analyser.cpp new file mode 100644 index 0000000000..57881edaaa --- /dev/null +++ b/rpcs3/tests/test_spu_analyser.cpp @@ -0,0 +1,244 @@ +#include + +#include +#include +#include +#include +#include + +#include "util/types.hpp" +#include "Emu/Cell/SPURecompiler.h" +#include "Emu/Cell/SPUThread.h" +#include "Emu/system_config.h" +#include "Emu/system_config_types.h" + +// Giga SPU analyser regression: a brsl whose return address is a stop-trap leaves +// a dangling target edge after block cleanup, which the reg-state walk must not +// dereference. The SPU program below is made-up data (not from any game). +namespace +{ + constexpr u32 SPU_STOP = 0x00000000u; // stop 0x0 — the no-return trap word + + // RI16: il rt, i16 (opcode 0x081) + constexpr u32 enc_il(u32 rt, u32 imm) + { + return (0x081u << 23) | ((imm & 0xffff) << 7) | (rt & 0x7f); + } + + // RI16: brsl rt, target (opcode 0x066). Branch-relative-and-set-link (call). + constexpr u32 enc_brsl(u32 pos, u32 target) + { + const u32 rel = ((target - pos) / 4) & 0xffff; + return (0x066u << 23) | (rel << 7) | 0u /* rt = $lr ($0) */; + } + + // RR: bi $0 (opcode 0x1a8) — branch indirect to $lr, i.e. function return. + constexpr u32 enc_bi_lr() + { + return 0x1a8u << 21; + } +} + +TEST(SpuAnalyserGiga, ReturnToStopTrapDoesNotRangeCheckFail) +{ + const auto saved = g_cfg.core.spu_block_size.get(); + g_cfg.core.spu_block_size.set(spu_block_size_type::giga); + + auto rec = spu_recompiler_base::make_asmjit_recompiler(); + ASSERT_TRUE(rec); + + std::array, SPU_LS_SIZE / 4> ls{}; + const auto w = [&](u32 addr, u32 instr) { ls[addr / 4] = instr; }; + + // entry@0x00 calls funcA@0x10; the call's return address (0x04) is a stop + // trap, sitting immediately before funcB@0x08 which funcA also calls — so the + // return-point block at 0x04 is created, then removed (stop word), orphaning it. + w(0x00, enc_brsl(0x00, 0x10)); // entry -> funcA ; return = 0x04 + w(0x04, SPU_STOP); // <- the trap that drives the bug + w(0x08, enc_il(3, 7)); // funcB@0x08 + w(0x0c, enc_bi_lr()); // funcB return + w(0x10, enc_brsl(0x10, 0x08)); // funcA@0x10 -> funcB ; return = 0x14 + w(0x14, enc_bi_lr()); // funcA return + + std::map> targets; + + // Pre-fix this aborts inside analyse() (Range check failed); reaching the + // assertions is the regression check. + const spu_program prog = rec->analyse(ls.data(), 0x00, &targets); + EXPECT_EQ(prog.entry_point, 0x00u); + EXPECT_FALSE(prog.data.empty()); + + g_cfg.core.spu_block_size.set(saved); +} + +// Encoders for the added coverage tests below. enc2_ prefix avoids clashing with +// the reused enc_il / enc_brsl / enc_bi_lr / SPU_STOP above; every word is +// MADE-UP data encoded from the SPU opcode tables. +namespace +{ + // RI16 (magn 2): opcode<<23 | i16<<7 | rt + constexpr u32 enc2_il(u32 rt, u32 imm) + { + return (0x081u << 23) | ((imm & 0xffff) << 7) | (rt & 0x7f); + } + + // RI18 (magn 4): opcode<<25 | i18<<7 | rt + constexpr u32 enc2_ila(u32 rt, u32 imm18) + { + return (0x021u << 25) | ((imm18 & 0x3ffff) << 7) | (rt & 0x7f); + } + + // br target - unconditional relative branch (single successor). + constexpr u32 enc2_br(u32 pos, u32 target) + { + const u32 rel = ((target - pos) / 4) & 0xffff; + return (0x064u << 23) | (rel << 7); + } + + // brnz rt, target - conditional relative branch (branch target + fall-through). + constexpr u32 enc2_brnz(u32 rt, u32 pos, u32 target) + { + const u32 rel = ((target - pos) / 4) & 0xffff; + return (0x042u << 23) | (rel << 7) | (rt & 0x7f); + } +} + +// FIX #1 (DISCRIMINATING): the exported target map must be the post-prune, +// self-consistent map. Cleanup removes the 0x04 STOP-trap return block +// (m_block_info[0x04/4] cleared); the prune drops the dead in-range edge +// 0x00 -> 0x04 and appends the SPU_LS_SIZE sentinel. The export was MOVED to run +// AFTER the prune, so callers no longer see 0x04. PASS with the fix; FAIL without +// it (pre-fix the export ran before the prune and leaked 0x04 into m_targets[0x00]). +TEST(SpuAnalyserGiga, OutTargetListHasNoDeadInRangeEdge) +{ + const auto saved = g_cfg.core.spu_block_size.get(); + g_cfg.core.spu_block_size.set(spu_block_size_type::giga); + + auto rec = spu_recompiler_base::make_asmjit_recompiler(); + ASSERT_TRUE(rec); + + std::array, SPU_LS_SIZE / 4> ls{}; + const auto w = [&](u32 addr, u32 instr) { ls[addr / 4] = instr; }; + + w(0x00, enc_brsl(0x00, 0x10)); // entry -> funcA ; return-point block = 0x04 + w(0x04, SPU_STOP); // STOP: kills the 0x04 return block + w(0x08, enc2_il(3, 7)); // funcB@0x08 + w(0x0c, enc_bi_lr()); // funcB return + w(0x10, enc_brsl(0x10, 0x08)); // funcA@0x10 -> funcB ; return-point = 0x14 + w(0x14, enc_bi_lr()); // funcA return + + std::map> targets; + const spu_program prog = rec->analyse(ls.data(), 0x00, &targets); + + EXPECT_EQ(prog.entry_point, 0x00u); + EXPECT_FALSE(prog.data.empty()); + + constexpr u32 kDeadBlock = 0x04u; + + for (const auto& [key, succ] : targets) + { + EXPECT_LT(key, static_cast(SPU_LS_SIZE)) + << "target-map key out of range: 0x" << std::hex << key; + EXPECT_NE(key, kDeadBlock) + << "removed block 0x04 must not be a key in the exported map"; + + for (u32 t : succ) + { + EXPECT_NE(t, kDeadBlock) + << "exported edge from 0x" << std::hex << key + << " still points at removed block 0x04 (export ran before prune)"; + + const bool in_range = (t < static_cast(SPU_LS_SIZE)); + const bool sentinel = (t == static_cast(SPU_LS_SIZE)); + EXPECT_TRUE(in_range || sentinel) + << "exported edge from 0x" << std::hex << key + << " has bad successor 0x" << t; + } + } + + g_cfg.core.spu_block_size.set(saved); +} + +// FIX #2 (POSITIVE walk - does NOT fire the guard): a giga function whose body is +// a multi-block loop, so the loop-body walk advances block_pc through cond_next +// fall-through hops. The guard is belt-and-suspenders and cannot trigger on valid +// input (the prune keeps dead edges out of block.targets). Asserts only that +// analyse() completes and returns a sane program. +TEST(SpuAnalyserGiga, MultiBlockLoopBodyWalkCompletes) +{ + const auto saved = g_cfg.core.spu_block_size.get(); + g_cfg.core.spu_block_size.set(spu_block_size_type::giga); + + auto rec = spu_recompiler_base::make_asmjit_recompiler(); + ASSERT_TRUE(rec); + + std::array, SPU_LS_SIZE / 4> ls{}; + const auto w = [&](u32 addr, u32 instr) { ls[addr / 4] = instr; }; + + w(0x00, enc2_il(3, 4)); // r3 = 4 (loop counter seed) + w(0x04, enc2_il(4, 1)); // r4 = 1 + w(0x08, enc2_brnz(3, 0x08, 0x10)); // if r3 != 0 -> 0x10, else fall to 0x0c + w(0x0c, enc_bi_lr()); // exit path: return + w(0x10, enc2_il(5, 9)); // body block B @0x10 + w(0x14, enc2_brnz(4, 0x14, 0x1c)); // -> 0x1c, else fall to 0x18 + w(0x18, enc2_il(6, 2)); // body block C @0x18 (fall-through chain) + w(0x1c, enc2_br(0x1c, 0x00)); // back-edge to loop head + + std::map> targets; + const spu_program prog = rec->analyse(ls.data(), 0x00, &targets); + + EXPECT_EQ(prog.entry_point, 0x00u); + EXPECT_FALSE(prog.data.empty()); + + for (const auto& [key, succ] : targets) + { + EXPECT_LT(key, static_cast(SPU_LS_SIZE)); + for (u32 t : succ) + { + EXPECT_TRUE(t < static_cast(SPU_LS_SIZE) + || t == static_cast(SPU_LS_SIZE)); + } + } + + g_cfg.core.spu_block_size.set(saved); +} + +// FIX #3 (POSITIVE, NON-DISCRIMINATING): the /41 -> /4 typo lives in the giga +// secondary "Fill more block info" re-decode loop and only corrupts internal +// bb.reg_const / bb.reg_val32 (-> stack_sub / func.good) - none of which reaches +// analyse()'s public outputs (spu_program / out_target_list), and BI/BISL targets +// come from the untouched first pass. So this can only exercise the re-decode loop +// over a multi-instruction block + assert completion + data round-trip; it PASSES +// under both /4 and /41. Discriminating coverage needs a test accessor on the +// internal block state (flagged in the PR notes). +TEST(SpuAnalyserGiga, ReDecodeConstPropCompletes) +{ + const auto saved = g_cfg.core.spu_block_size.get(); + g_cfg.core.spu_block_size.set(spu_block_size_type::giga); + + auto rec = spu_recompiler_base::make_asmjit_recompiler(); + ASSERT_TRUE(rec); + + std::array, SPU_LS_SIZE / 4> ls{}; + const auto w = [&](u32 addr, u32 instr) { ls[addr / 4] = instr; }; + + w(0x00, enc2_il(3, 0x1234)); // index 0 : const into r3 + w(0x04, enc2_ila(4, 0x208)); // index 1 : const into r4 (distinct word) + w(0x08, enc2_il(5, 0x22)); // index 2 : const into r5 + w(0x0c, enc2_ila(6, 0x108)); // index 3 : const into r6 + w(0x10, enc2_il(7, 0x33)); // index 4 : const into r7 + w(0x14, enc_bi_lr()); // return ($lr) + + std::map> targets; + const spu_program prog = rec->analyse(ls.data(), 0x00, &targets); + + EXPECT_EQ(prog.entry_point, 0x00u); + EXPECT_FALSE(prog.data.empty()); + + // data stores std::bit_cast(ls_word); compare underlying u32 forms. + ASSERT_GE(prog.data.size(), (0x10u / 4) + 1); + EXPECT_EQ(prog.data[0x00 / 4], std::bit_cast(be_t{enc2_il(3, 0x1234)})); + EXPECT_EQ(prog.data[0x10 / 4], std::bit_cast(be_t{enc2_il(7, 0x33)})); + + g_cfg.core.spu_block_size.set(saved); +} From 42242b3c430934c1ee47c1406919658c96c6f579 Mon Sep 17 00:00:00 2001 From: Christopher Hotchkiss Date: Tue, 23 Jun 2026 11:59:11 -0800 Subject: [PATCH 64/64] SPU Analyzer: fix wrong divisor in Giga const-prop re-decode The "Fill more block info" re-decode indexed result.data[(ia - lsa) / 41] instead of / 4 (its companion decode uses / 4), so it read the wrong word and corrupted the per-block reg_const / reg_val32 constant propagation. Co-Authored-By: Claude Opus 4.8 --- rpcs3/Emu/Cell/SPUCommonRecompiler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp index f4c3027d93..ab92524d27 100644 --- a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp @@ -4573,7 +4573,7 @@ spu_program spu_recompiler_base::analyse(const be_t* ls, u32 entry_point, s for (u32 ia = addr; ia < addr + bb.size * 4; ia += 4) { // Decode instruction again - op.opcode = std::bit_cast>(result.data[(ia - lsa) / 41]); + op.opcode = std::bit_cast>(result.data[(ia - lsa) / 4]); last_inst = g_spu_itype.decode(op.opcode); // Propagate some constants

t29wi?do^7ZC|XvS9{4&eG2S{nl;}aS=j%2*7z@}^`Z#M^_`8I{O_2qC_= zWy_Wg-gqJ!^n^pN`ew7)A^7-jZ$*$PFf*U@M8z`p1tF3kLWtu44lwf{gb<(2<#G?? za=8aA%lbS3?}z(K*m?}Z7y)pP8)oJcl}hDxtzM4f?Dk|I$z(G9@IkRydJXjA71y}_J z5uIe_A1L7?gM))V?$*(!usy^eqT%+*0L-4(JruGYkxLK>!E+>=8f7e%cH5!dZqtR$I8jVJy(P%UpjYgxS5Z?_Q&Lh=QBhG)P*6`#PfScq zNl8gYMn*$JLqI@4Jv}`-IyyHuH#9UfF)=YOFE1`GE-Wl8D=RB1Dk>-_C?_W;CMG5% zBqSpvBOxInAb%hrA0Hnb9UUAT92*-O5X^830000GbW%=J01qE8KTlt8e~+K9zt7+A z`rjdr000GSNklu!-Zr-Am=-0 ztC!!?ktUadd?_UN-zk=>bw5VES}wj{Z?D?)S(?>%nSWc@Z}|zdDut|qH9x}U8EpIr z`-LomRX^bQelhhTOc(dhen5Il%Yn;}OOIvw7`VTe&cueV*{)$8$8^2*HMJCmS}hV> zdEn;iT=aoBzq<9nibPv)CZD3XTYH+@%l@C2*zV;WeY)QH3M;u!>XZ|58F~!jn%sY; z)F&x6w10{BBzQ!RcMhH22=tu84*jijLcq^oG@~W`WXp^&u#EoFpN;0 zTQU>rCL?8M9}9+G?T}xB;W%O@P5_AHmHalgu|F!Y4s@^+WVNF7cdfL^3&s(8eM5ob~f~S=$cybEBggey7IUnMK&rwT7UAH zvcohZTxG)$Wke11tR>Yvf1qx34Mu)rll5|J9!Zf0o$?AsrOcVB6^Cp|#gUI=XjT#> zQQU0dzfTgaI5hrUc1c)dv^={c;%1I-c1dK{R0U>93sb`h>(X3xrLU*U&d;Dnd5FQOIcrJ7PcM_CIDu0mk3C>wN z9IoLxj#*BSo-d!@CP>d|e9j$) zFYYLyLatLd?bN=zHUhb3?tkQs;C^*jB7mi3TwPXMQGOI%f>S@HHLF`8(TJ-6+syr<)sJJOVPIjHM=h^ zq310(sdu-fCKk&pFM$=7%#BnV=KQ`7OYdjA-t2x8Y}fO-bQBvt*xoN*>MicKKByOS z>Dhz#ip|q~$P>&{G(AeWY?P{gB2@@xB42Kr^qOVFFgpdS+I%HfwUFg^lP_775UcdI adH(}*i{GL)tR7(i0000#APeNsMchM* zp4zmR9-H2_r*;2>^wy($>#gpwH+N6n-9x>|sn`Hbfc8)zn{|RpR_sKUOo@~zlG8&( zc4j!F9;Oth11vTcDT?!dY9zy8eJl~UL84yC# zSO=cx&3j9GK@jXM3sAHq03RTP?oT^cQ4~;B6%<7QS(X7~JlAgpK>(iT!FW6d*L7h$ z9?v5B50=4Dlre~(VT>Q7iEuujhg>cPxm<23k}w*LU^E)Ra5$VM^7mV<)?Y3akP{Xj zAcTaj3&t1?P+Scox( zVzCICrlnp((=~ zfH4MHmO+w#B#>?DNjw_2@VEgi^4qwzPMi3lO6R4Sk- z3UjWm>#(u0Aq3F#JaAnXMx#-pF_?8=j3JlHfvTz?%W~|vWm)jz#fz9O9goM*?RG_A zK4`UCzg-%TBAqD9GL*|@h82<|!N$f0R4Q>VXgC~y!f-g8%DP2|BuS9Z=OLfZ$BrEz zA49v{j!8qW*AqGTbLmX!q99f(6$V6I*I|2m8+2WdxgwTjf$O?S%08=D8^+^tBNnV4Y+dU zN{oe$<6Me-p{8lEfZ+M_=g{eNrs>RX5Ck`;Iqi6wg_b1gfd8Ba(KO8%i09|$mj=Yp zDL+3yXCz~DbCXd)ilT`0dIceLa3LLe<;s(P#vUqD0Irm&;&TR%C2K*NV3A2qCjnDpf4Y`eJS%*VfiPLkNA!CmiS}sOvgx zZEZ1n=KTCTGh;&X7=j*Dj4@Oy6$VU2Q6j&V8n+F@cx+jJ z*1u;4vRbW{RaHFzfIMxXOQlj|0X0p7?d|R8$p%3HmStteM3TqgeYyp~_bWi&Ga%S5 z0{-VYATOJTG#-yZRaHO;MM)J}KPrkMvgEfd%liGyK-OxtKOlr|)1Q^gWyaav-ri($DLUwCW5V^FfoCDzc~}Kk!B_S=1iE- z$TD=K=gODd@EDnlKP-@#T< z7z*NtuK=A*S0CtX3|Qc#lWjdSR?>6jf#fkl2;Ia8p$ea%ve_`ts$> z*O0z^DGnV)*S?^CXbU159>~gSiWO%J1<`PJj{psWm4%M8jFkeJ77B_)b?VJOe6_OB z@lpYq77EV8MuwFu3LP&Ekh6w@^Nv-9j+X++c|yT?$ErfdR3H&TM@b$%05EGZqT0h{ zgo1NVVhN!mJy(8RipK~cbcB81KT7hSvT}JA2?ggC@g;_TjywhejE?ZMFVTrkKF*xU zz^vyN3I!KoWn$>Ko}c@A^j!HwHjj}cNnOm>{_)uzx|nE@Ju-g6+R7}U;M}ZC3LO_% z-=XKqmrU~*HJi;R;o03J9Y8;gd39uBDEQ6UOrhZ1?$Fs-$jU`R$0SDb`f;)wH_AsI zCILyW_s+Y2U(ioj6_h@2EzNpLpSOge<2#?(ZBQgeCjTL{OIh`;)uRY_FWM|%tj}A<_zAi|76 zqtR%8FuXMkgLy*lzyE&3M%%ViD=z$7l{bY>nsjME#E;HWb!4GXh~{fq7Ce3WlyQML z!_#dxn^B}8b5z}@%hd*h0Rv>a-GuZX!GQ| zHZ)C(BAIY|T^a_W<|3k`#RJ{}rPD}`Wx=EV-F7Kf8q0)DM z-+jkyJ2MPpYU86zyru5P&dNd?h7m}u%V}y{&CpuMC zjdY^#`;m^JeYCK}Awmd(AXplIpy9T^VzC&j?QFGLaD05s{B}z3pZ!*=_3N44sd;X4 z(uL|VUn-r}K*=;sVGA$UbzwLhW~M{KR*Iq};{_Th9kg1lpUvf$&U?d2Exp2+RRmhS zUWa-D8Knd^4D(CKu90H!sWTNK2Ffuz9P7xmDcrR`z8UXN`Qy~wa_8~Xh|oSvR0_LEF& zdw3BLF9c*bChcJNl3b5sv6u>0*h^B^^{5%=v_b^W^P&cv{eB<%{eEgQ&e3QDgTWwa zGeIV8Vl&Ayn5KCLW4xb#)LUFp6v*fEQ#+exJsihLHE4v8$Apl3S+s`DB#!I%`_E-r z-d7YQ4*<7CdWmjv7&a+d#_)X~9LIrvzn``px=RT8o#Qy4o}Qj&QiPOw-mB4Qd^B16 zxjBo!7y6eM8DZ;e$8l!a;&%uDyIH@AU}*`&$?F96W_^`FSXVTEYw6&4JdSM%P8)=f z$3YP6F6*@eOV7kk^ymFq8oV!K5JL7>@!p1&rL?QnYB`_J-$w}TF6)IC6nIC3kiFq> zxPNwb)?3B=-pbm*)|BB9{ z$9?|{PPm4?;y?5L{{HUn?)LWf=H}+_-@n(_*H>3pmzS3p7Z>N}=YRhEIXgQ$Jv}`+ zIXON)J~}!&JUl!&IN0Cc|L?#5_V)I6cXzQ^?9R^4_V)JH*4F0c=Elax`uh6X+S=;s z>dMN>^78W1($eDM;=;nh{QUgf+}!Wqzh`G>XJ%%mr>Cc;rY0vRCnhGw$H&LU#zsd+ zM@B}5hlhuTh6V=*2L=ZE`}=?W`qkIh*W26M)6>)4-QCsI)!EtE(b3V~-j2aw+S=M$ zTU%RNTAG`ifByX0)YR12*x1m}P+wnPS6BDr$B)|D+M1f0>gww6-@kwR_U-G}uT@o5 zm6eqh6&2;>=H%pLXJ>!; z@+B)PD>E}QBO@a{Jv}WgEj2YYB_$;}IXNjQDKRlIAt50?K0YokE;cqcCMG62Iyx#U zDl#%MA|fI@JUlEcEHpGUBqSs_I5;RMC@?TEARqvVMEd*t`}z6#`uh6#_;`DJdwF?z zdU|?zc(}W}yScf2`t-@w)z!tt#o5`}(b3Vt!NK0%-p*4Ea>#^%F^4^~!I@7}$$ zw6rugH#ajgGchrF`}VD|v9Y0{p@D(Ht5>h|^z?LebhNd#H8nNW)zwv1Rh5;M6%`fb z37e+%+Ia9}J~#lCm%@a%JB!+rhb(J$qDr&VlH@!fLX z#M8LjHb}2_)2#q!X;sxj1Cz{1N$|M5>+B6*TGyJjrBk@_OPoF-WBxAOEG2BUL!bkZ?|6W;U4oqb2 zZcuh0#d9InPEkoJb5F?9VX%kemPqY>b5Vz(zRf{o1-y^BB;X$(35`S|RI6G*hYdK% z{F`JSR!SWFBj_xqS^na125ZZo`;WZ}c6Kp(E7@3ScEib;d~7K`+_tM3eCGE9;To}A zl8=Hfk)AGV7nv#9#0(Tf?Oz|0IG~(+B36a(CtKjhZxayJZ`#h7;3~Oc>HeGb@Dsfl zM72@d^=r7HP?vMYeYg<(lWicP-}hFB7G`nF?2&UnnFXJ0g-LE2V`@3zHc{CEK#eh) zyXLLrM#J5LFlQ|fr0UcxJ+yj|8yi1yEi@;)y8lTEIijX~p&{pL=Z*{o5ye)IH) zlJ2lQR&eK!hcM*!mvy1QtEVGYXqn0K?shDH`VlofR#qZlNRyHmvad z#?$aYrw~ixTE81e2@1z@b_qCVlZ#Ug13_oOOu`*lu%JW`=MZiF{hwa$O6|56CV<+= zBVDoGYaaFJKp9k!sDxCYFPP%*<0WmAelgZEk48X4Zi6O#?BY6qVpP_@=`En!OWqju z#PaMFY>k!^EyWL-1<06p%AY?=g%QQLrTbrzc*Z~ES2_giK1Budb1;IP2~3+=l@9;R z$Pr0#g-+e@WUlrSJoBc3BPfh*B03=}z)P=J#HIkdzO_GyvysqDDUyPh^-ipI)b=|W z#@O@J(+reOEOJ)j3#=)xYJT)Wy?kaGOmEB)I?e+6<3N-D8T87w1f6j1fmB`{!yXjt zKbw{(`9W)F20$5BCvcxNQ6EuHj$T+YAtjD>TXR4qNam(xX&|n%yu6edlujm9J1z-C z@Em>gsgrxg9Lk(&=?kL68L5j%;9C*cK}+rd_DE|Md>lAfDp|`If5pvnIu(j*4n7+- zJAZ>@IC8LI1qRSzOLe3$sphPCqkKAi*($6Ec2Ph+0sr^_WD~|*_MHUN(2S3w_AVJ01(M?N7jTt|`b7b~Q$L7}67w;Q zpw!`OB*z8?j-bdP$Od=w_>`6Mlo`n|Dlc!3BS>>+1qL+`NC{8>^LfIIY(s|?{l-Hv z-ihFWk4Vl&efG42txj$QccgaEDRrRuPgj17H&kb%277=H@!=8~t~uG+XwWnZ;b(#+ zDOv)I+77zD0_PiOX`kv*V4LDN%QOp7ZenkC*^L>_8T`|NC_sJWsK5$DeAq!hp9lJk zJX5)dabc~%=CORhU7SUmsvvM7N5=Pq6!YBE9Ug5DsX>R48sV~Pn~{E5TBns$8;8pu zM*exSLf333K#B{y7_dN$NdtdZr;06)94shG>qs#TFYh7~Zp{AC=iSqUtr5SpBV*L> zzNE6V`RWF|7klY#IbAXGx!6%Pe88Ilih|g3{3f z#SeuK`d|f}AtB3hI83fTal3M13hwG*?cALA4A33jes&;~t~8E3Vtd_k!#>?=ms7HV-zgJUhiVAruMHOfEcO!SdkExPI zzVJQ*9YxmmiL_{{7!g=KrUJ>??1Nf?Y%G zToE2e)E|4~xV+l+s`WHzU?3=#U-}wq225s|8gQVeJo-j2OoUJ08LTjORRP%erpGIv|7+l-JS$E33Pn!y4tBjHkgc&t z78%uKo#``lGlYcC23^erx2D_w6ceB8#SD*X4vWG(~r+6|MG+ zKLE2HoIr=hw}Fdw!yRB#+r@h_1ga=1ICsP!4MVzWe@vVBd@=#y8;rqTz2HiwRq0K)w>OhFq3}C#5+LkQSua_77b7+WTn_Y z&I}WPGW_fMj;lf}Z(L&B6#C|$^^x;G^5nA^{h)FFpNtr4weplL;De5_IIeX_N3y7x z1BkV3MXFn>1f)FW33FkAPUr*46a~#QF)Ibv0xDklr~>Qz!b6*mzckM9s0-m$6E3RH zew*B^3y@*k`-~6v!KtCQ7bvcTJ7~@8*W&Y-PutZ|9D!fw&E3&{7*k?(l}eqrepc0 ziY2D?g#y^ceEpl>+_j@7^pxUD60~L;wK57L%m#D%m?BNk8xz|8j?&GxrN>W zwTT~vA0MH$IsB$hXr!79EdLE2vTdWXqAGPG+wSd+__YxsHwx97h{xpbUgi%fp6$q? zzk^YmEY_I#`X9%%Mn8APj(y}IumPz)BwGUMW%>B_*-m-}*cJW$@I59Oav8RCW@kp4 z45r+E>u7~Z?hUyNtJpiU`zT6GISA@>;XgQV zCOt4MaGm2gy}HPmVl4dq=<`VYV4&A+?0HMig-4su;sQdDIXwNlp`xOCk!T?NZS$TWy=53YrB)W+5s{z%F=Nv7SK_~ zr5T^s6_h7+!5)@aLV`u%7%@B=JFapGCKoPAz?nLDS_k7nL({6=PN&)xvaI{dIO7r0 z3DDT|(3zVTYzom6CUR#AzEh`I4gm&vivk~#l7V7LfdvAzFV%@=Xha`Aw&hv)Njf-Ti6 zEb@yF9kO9j{|6KM+(-K3?BPI_1M0FltT1wc^VNQ!%D0qIAF{uXboP0;qsm5-lo$NJ z*n>C|izdU7ct{+l` zjqmboLT?}tnJVKtpe$(+;g~@6pW7X!g7*ZT+4h7oAEKMPiz^3|S$Y5{l%?yp&VUMm zj$wb}FxKbEzc$Mapnyvh7NZkBc|33`A%o9)@PNrvCtP6;k0b3c)*E>EO!Bx)z#Hmd zRehzO17UL{$hLhLIAX=PQNM?sa}n|Vt52L=d#y`rLLt>wQdQmDY`Jlh&&2Q49ntUv zQS$NS9p43gn^D?FoXa;`C7n&DDEd#w^(wa#^uO~MF;S}Ms_KKYJ} zCB*5;Uq&1FhFA)aZ*M%n1Zc|M*p4dum6L9>%9^_;@5XMj$$sNfLd$gnb~~Z+6kVDJ zYxQ>T$k~I8OY9uT+1*U29&#}OYab@YI};!oMje57lb458;T^rT-B&Kz;`rP&)6Q%;-yhF8tD!Ca z^5gIpgHF@hJLc%2{6Mo#!DRQih`As&(8lOEEWE&>FePn@{5mAoN3zlFSH&-qeC2=7 zTd|B%A8wM3GBt4&(kzc*`^tsWAHriNb zgeAYzbExIj@{rx@KHrmz-pw>W;C<4qW?=`WtPFk&a)15EG>F21FGeJ-qpw6j{KGnd z!>(HI_6Y|IHZRXLz1-t0@fB-%6k#kEH* zl`y8CKql-@zrOzO)x;eLUF;2Ij-l`hV;?`dhl!8vKrZ$Mo*b!bU z0DJCOP7>V4sF6g`nUU4rS2YFT*{XH->-=K6Rbj{$Dr-JTcDO^O zU5Gv^CNx1!@;eiUfodB`G>_xUMMeB;%z~%d^;cb;Hxy4PFmA@5@o*qyHbv!HyAE|{ z(LMq2chPkY7?$y}w8b&(pj`Smzn-o-o`xo>PvSRF>;CiW5bpKM;>Otw*yQr93OuFn1Y!{hh=Ug<|WlPxyn9qiWl{t@w2RozQZOI>I-C>;bP`vSoQ8 z|Kh?LU)JhG$8fh=-|M4;p{)8tX&<}20&t6v1cO|tqt4tOfd+B0VbOcwRhij~4K3fk zoSZm`?i@?}(2#@`aGT^|wM9h)RJ7gj64ZUIh9?;7UK>NQ?i5fFsmkD_l(C{B8hDzo zG3sq|_idb*}t}2aL0{g;6 zxg&>&VDEJY?HtSZ0mlg@zM!MDBWAzy;S_e+YrE{-*fdsIPrjJ!6e8FjipQAyI1WSO zSKc&Dy)I-+nKO|voYVHsc~U;pCY6XawLgPMaEoh8DV z?GQzwPU-qU6c*eT3N5|zsT z2z?ALK@)MvJ-&>P7OLNqzf`tad*g9Yq`CGE89?5omHSU==z+eY2b<-lrfUnrMpULHjIJdIE@|uW)>|0=bCy*w5s4(7%AsRwD-iVk7QB6Q{Sw*wh zThl1g`~Jdu)yDX2<3Q4K_B4tfxBjH7+)a2nKTcO=N?dK6l1@G9OG%Fj69 zA4NFQ5mW4oahym674jiUh8zJSMECdj{i*WSfp4|xT2^z!D6&NtTSGZ;$iPp|l@~G^YZiEir7;;PHdLam2R=C&-^ zcD2NS%N|yw-ue#|6$W4Sy4WGSj+i5VKou<||JTy!n`@X>rQ#PWAPmcAjsKB+JoL-^ z-R!TS0lPxAm3TDI^HndOGrGiKpJ*%D2#Riq6-`GyqbIig<76{o`KNTPZn1_ICa82c zI#bxGU&7TtIX3eiqkpblyIqC%X&!6%8e;&2oW*KCGB4eIqPO{qq{8MDF*nXq#9oQu zA29%Mun)ESE##Nnih3H~&cc@!U({hH5lyHL17ICXeQ{!;zVTAe!k^y0^v5fhGP6do z89d`w$0GcVLY!wJSr)rky3fzRZ>9W745A%fZ)x$}-y7n7OIkYmPF%OyW?6m980hfH zR=(mvsM;JhbSS)rVC8|7EDIjtln%#C4DoESuQmhohYr{rb<z7M$ZOK+I)(k)c5nuc!V(%UYhbIgNizUKG5esa+CKfY!(} z6IQv-aBrq7LKjPmVKdnoK*Ytgj7Z*n#-ySe+-kM_+RgWIahz)P3fPLD zJ^|b*la+)7N@yhhfV+g2)^{oaWa-|Aa&Y+IV=NK%y9{sI3LFB33~vUM+|SMe&xgp! z3az5IHEsap42gzUC#rrYveOd$^PCr_QV&YI$P6kH zxDc{btm`=vqS3+!r@USqc*^;HPoq(l1H^i8pYAP$-jPm1)7ya$(_Pgmte>&+PVKH> z2P*F1h!n2+-si}Ajg|m-?MQhX=;dkje)TH=dxrFb*T(!B#g9A}+>|zkz?H~$h!o$n zFk#%CWC&pOY-h+jccqa~LYY*UQC5RfUy z(Jfq3io#zIB4f=mB_9Y)H0J2$F3C_L3&+#M*-_S}13gi1em*uZkhMvbi6akB~h!iM10+#+*s>|Ebuc547jYyBn zewNORRu*BaA9I+&UWrJ|nT^~+!vxwW@~wUU@y%E||JyksbFk=fv^!7dFcH=v3(WE! zKlN?!It#m%$!=O!ii@JdjUWCx`d^#hogGBM^k`4dksQW#-`4VT#g1`y4Y+eeQ5i2x zlf3yC)BS%Cn_l##Exy=mnP3c6RvqUU+8}*;c-IR1aDC5G5`8%W8gjV{oc*{WN-v(rLsZE7{}Sed(Oj#U z(8j+4(vf%LziR=LvDcvwPdvtuul#&IX|#!a8TaP8ioz?%QIg46*exWC82WMN(!I$5 z>ttxpy8FwH8gd}H*9)s&APKr0o3CWu=}6gO`3ajT1FUtj*X88^a?XrDz2!Os*g zVE9I4@X&2_p1hQPdT+d`MtftVM@j!4)W*Q?fyvKIi@{}I967PkA4Dy}%CbK52W4v5W8PB~&z_MBK8|r$$bw2#_lI+`AaKlI{H&7a@DAKP96?~W?PJMbvkZD!v2f7j5H#o9(qkvav0I6g*;(r2K7!E4LRx zqtDZvrWy6HpIP4`lTF|(u0=4 z?86nxXnX%pI{bFYl#A7H$d!QGnHtfb7W7|@8nH2V`Z>Y+wWt6s!ATs`>+>%HblRPz zV;QVn8HMg9iysw zZFym&<5{#~LgCcBS$>zabtmt7!+C+So0!h=CavEW)bD(yo)>3-n5|9{AxT-4){C3%DPdm(IHkpvizfBc5595r%jh0h}W`TW1RrOhOsYPQfA z!YzHa#&2k#P{q-3Z4$$Ob(};@q|evQB}`=w=>9DI9jU2#qn{sGg85i5-3>>ss#N~m zU)foIN|!vxRALnhj#jjM!T3ZuOS&CJ^|fbr!ZKQRd}2Bz^JVYqSctYb=jab7m~qgX zXiCJV_~|bNr$TKO?mW&wdCWUV1J5CH2#0cWV>D`R8bPNC!_QM7o@qT0!Nq_Z!e14FH$;YE@9|vj`bQqUvA-nx zMpgQDtgG{#3r;OhS1vf2S3CAd8AgfPd!Tcy2q(znU`rVK(&mOEI(|T`r6QtxGw7jZ>GWT7*0rht`E)qis*h2P< z1OKu4NnHsIUEXO?u~vZt{4moWnZ6+BG#PLiUem*!78!G1OzVAa9P&o`C{-1d`j5vZ zY(^^3be>dlEh;D%mz5hM`vz3Tvb7Z$ds%z=;8>rg4TRS2+U}Ou_r`7c!R2yCY}1-L zB*X>0l-2en`vm%r25?6eO9vT&rn#4ihZSg6M{1Q%$t#p4s($|-?FPe~qxNhjz#HhW zR_iG1>Pr}Y7Qr$&Jj@`^4%e!dt~2cplQ%tGvJhOZ$=bA6psMu zl6rrB9lRRht5coJBL+Cynh4)^XmW8?;Hk$l@_bn*v&ZvIjV!HCNcH5|*3G;j&X#Zpqlc!QRR3|Y zg6`eT&ryNo^$&J83NSH>!pnt()3hmMZ0?3a;>W|tR6fr3pqImDrZ}!VV=YYwgpWWb zyM%~+70GRZ8qn&;9fNh&d5>A#k^C14694A5fLGw)krh$7{9YD6pmV3^t2E|H9Y?cg z>Sw=yLyL+6&h)zztu4<488Otr3k~BxFp7x%RuOYoyPl6r8zUqHPTh}NY@K8%ZN{#(9E4V0?6g_PtUcfd2_-xl#z#F6}C-O#B44883B6r2!;C$w{U5n5U$M;kRA&Sf3C zg*P=F3b5pu3R%I}x?JytsnZ&S{-BYMK(S$9%^PrgkRgLM#Gb%~)8QMAe%!k7B(SD0 p$LPoKUdE?~?p^e=f7yR+wvR55liu+&|2|Uzs)||)RdVKm{|Ds58n^%e literal 30346 zcmeFZg;!Kx*grZ9Bi$j=9ijpP(kUHMf`~MNfP{i{&VbUL(jiEvbR(d2N~d&p=WmbS z_r2@hf8pM{7HjEpJaf+3@jRc}1gfdX;bKu>K_C!Z1$k)=2m}iL3WZ>xfj^F2{#-&J zbPxq;Nlh1&?G(%kl8%!*B^b;Og@mL%{h9!kT|I^oO@V;<^FAw#@GU`Rq(ytK9rLET z+DECDTsCP!-^_G21}Hmw07iMxHrrKGC&LxqNprPX>e0J=H@ENAo4X%Uc=q}`QqRu#~WJhUu9fW zC9ykGmk|&QI0OSGL063XQf&Qa{@qfGSQIt9lq5A=eNhj2<$kmT6-D~<^RI92+ zHy~g0kDuc_7zdZZ;kryKDZKKjNeFpir@w?I#aEB+7*|`p zP48$&GgEXrj-UZvi)%FGv{b{CZPjMtLQBpHZpB^p(*+#XBPN=?o0(Zw-geXs&Pgkpk zkn_mqQAztCpA8d+hDXI_Tk{t!n~jB!K~WMrz(M!!Q=G8#E{WB6F=7-4!B49J4_|&?j>)%Q>0T`F;UKQG8ozIz;ux3vrZPWQGcRi4oLwtFpxmryRhe-d zlVxKt08b(#Xl-t0bF`qtdES$?>Gsm-q7nI8a|C)07h6z?Z)?{LcHfiZz|gb*OD1k#BUrV zh3q^$F9TWD%elHnl>RQd(+AD}Fc1Iw%qs4ykYoM>ZqtCTVxD!_m>(Y^=kco)oU;7W zfT;Gv2uxf*jZ!EhcHW)$^?_WOQ7g1yj+WOV;;Z1NcZgc|PdZ@i?s;?6tuv_qc=y8Q zcOOS}&BkbPq0H~s7b>Wt8$DmJ$-0|7uM{_3%Y11)S|EH7%79qhhRe-@DfY75#gHyC z8%a`hr@gr+tSZTD^$r^*6-`@z@))nq_Bbs`-VAS9$S54EKUKHdHCZP#rJby_il-8F ztFRu;j~xoi(U213g5$QJVO1emUL?vF?>W#r_fdrMIIO(v7^!!^Xui8qwQr-S6soeB zuCo7=t8RaFx|5%2xs;jF0nPpsC$t2Sa=*JdGrPGwVaz$tC1+ojS;OTcXu?(g%0>U} z{`G}9VzkIE{zi}C>Vr}|N9=69bGXdx0OQz)ri<@04X!^tGe*KFas;ZO*|B}6kNB^T z4aB2F#Y{-BePsmGVJ(Plz%WbTz+JXbnn zda)kOn(AV*y>&>OQ3v{A3bt1O0|tE7tP&w7f znCakswjD^(QhZ7beaVJEhG6t z+{cDZdb(y5`a@QqNA9n#qa1d8cyTB@TVi`PF@RfJFz_XEkL>6|(cXt~NJ;(IZqT^lNncq(gJ!R;Dz*vaOo z)J>ZCjbYK7XBU0^^UFVb^xANph|2H0T#l5S%;d%blW4&tTJmw(O!3-OlH1y(dhbs8 z3?gbjt(ok_@iwmMl9e06rdG!A>}seX!d(`>#k%Ig51;V%%lTqb!g1S2(GvM=*zu_Z z(hG(1dLyyApHqbB@fG`9_n^E;D5 zi;^w{$0M|+o8lX+cm7~=vQhp5Z`S8rMkC2zOL}xm-o&`;R!*Mv=o2pcr``Ct?d*|tOzT`>lb^aGUh2m?ow`BYy zcg~+ecNW?zrq60zTOoW4(YX5>>$x8;3JUIO^}@w2*{pxFPInb1eW>5ztM$I~N)fu= zfUVmvofL95oioJHMjY~lqBIZLA#lHbKyCBG9ns3T)toRTF+eNYcYw3J@Izm15nDbke_ZL`XcI?i9Osi3?y*%WPIL3wpx;B> zVGHX#6p%S|^ZxVb-Jb#{cQlgkC*QO;Vw&HNvb(rp<#D&ZF#q)eT~q>J#d;x5*LFzj z+b?H`gU`r1XWTWp=3O-?HoKEQ@bKa=Cu9#&z;}s9kTAK=znp9IOM%Z5hCs8SH92;mS8o4P;w2TIiya9 z*k05=AA%(wF}og;Z&Ll()JqL%ww)CU9XtMnVy^;K=GU}8r@K7fh^G0nM+bp|A1o*@ z@1uT^Bjt|Bby?5DE><7bH2SYHaMq<}u%_oQvbSVIXvJwn#Zl9^<+ld0!P3V0fw;Z7 z+RE1$i!GC6Jr1K5E*%dx=987x+-@4bNHR*v$LT-7fYj2Eh`OI@W+McUNCtwyfmXOG z$@Z#>hi9aV7`ZH)r+Kni$O*M&D_6Nl`Q!CrOT^J{x?vf5U1VF#)YusWE}0@PlxIh= zA7)SyT!|@MOqxL%9KCZt+a(1(zm{(Alg^6dXC2sBp$=oez!FZjT0+&D1q?2SkA_Q; zrA!d{-z#=t>bdV!cK>QV*BQEa1}X^eEulJD?V9uByl;3dQOrv1a1>N3)*xa@uu|x{ zV2S)6Xp$C>P#0PdsBd4U){te%h12*{nLBCrnovV#_f^G2vE*tOnUGHx@DyQqdl(=2 zD5dz;u+HJ35QK1;#b%I+MK!fBM&RY|4k1YXqpA<{9Cgln#X_I|8w!+rD6@ynz0RdU zN}<7t0(O~p+>&(e(2}Ohd;$CAfExveid@u)NgjFqu4pl^Z~gzMUZekm;idFyphl|K z+M6Zu^a^Jc+<}TlXW(^Vb_Da2u7bHdg9v75q(&ESW#YjPm4lYEX)*pAgMN(bivjQZ z*^06DPUU~iJ+JO4#dOC)=RI8?i-C{=DqqXuXrTo{LJH;!{mI6+)a#i2;V1c!fujuvP;dzH7E9||vnZZU0yNuNlK zuv_{S2tJrjIUJ#aA3H-g%m-40`EOX8eE%WlWjeJy4dxZ{?<$Z#qj%eCXeIF2{1D~k zvw825m}l9arU@avx0>ZrOvsy9VCFX5S*r4#LuBE&ufn8;CJ@p3gHDi%6GoeN#?DW| z5dXe2i*RA`Zlxz)H8^m0T<6C-8EqGNTSAwclX06h6boU<)_4i}^Z(YP2u8*GQAH~E z?J`$A1c%P#jb9Czn+)RI*JUQ_+%EJI#VcpX7)ZjDf ze+y<3wpfZe*y@Y^7lli=GBWg`1s;4>CXyMY75P>za?ot0_|vB+Mp1J=%vHI_>Ek6Z zCPaI!G?rQR->jZXr<-;~ ziDgsim2acb(38W!$2H3D6#OXE6~QbKW3;#8ek>MUezAZo3etX+ZfY-C^0tLC%#7r zUkVfMw<3?A`ETj|g(=1iijh%p2)6gc!(WZqxx~kE;w0lEYojej``-=n67Sj95*5WV z=yY!`eJa2|qY($RU43$Z;P90~rG)|DtJJm>hJZyk{{I-g&&Af0<&*cMlpkY)XU<9U za(j#&@*KHL;fAoqL6jDvkIjXQ$qoa;dm=W!z)H)@NzHG>K>x2_m1DMNqZ;vBC+oj& z|Ej!@{HY%x{vAlN$6?o0@W+1(OM)&*g6ewxh#g)~T*qGjF(8l$p%}|*TO z7s;9jP1qzkpt1EZ&BE8}|FWccN2Z9STDlNS4FBuiqxWPJfJC(F?*Tv(ggtJf{M_@A?v5 zlNqA06D9odsHHcCvnwax3qw4ikK{=pm@EGx%I*32#^ts(hC3#YvTU= zCS;w(Cmq$O2M_&Uvj}bh#P!Fbau{e!&#cCHb*wvA;SwoAjxpxh4z|M37Bn?btIePR zuz%&dlcf|a_ig#0z(h`nm$OG3EPLU(?{1xsl&~=W?K1)> zF{=u%G|`y}C|2E`4D$3OP-jBJlNrnrRC?TXztM8!yC4dQBSd2l#$A$Y*zEO=#OuE*JVEgK$Ggxz^&`BEP482N z@hThL|7j-YhSh0Ob;ZF#kh(t;;UC9~^&R~Q|7{Gq2uUL_ZsbpguDg0#T_2J^ufUk` zzPriPtF;&W(m#o^KmwX*Di3|~ztN=ICq@8@^hjOWhJlVOQ_>f$yPR%V52~$a_l5Cq zkRxQ+A8okgcC^HcnS#&y>;HvKD4>k8Aq4*Tv}07yc;0B=9eEuBaGIO&Tq^%D6i}4= zKwjt%TEj>Q3szaB$!GW2Z$)oNVHN{;2+517CR(~(Q#@8lHnn z5N^syjop&N``+?K6Gn)2Y#j~Mog`nYAg;_0yA`?pT9}~o-gk`(ivm$H;I_mofWWP@ z;U<&NAV50^?%}9ceh62r)}e;1#FBI+VToMtx7D@%tJVOpFmgF={;4n&_g?w^Bh6c8 ziBc7<0aV*>^wvJv4SP*j_Qf{?fpYv_5=naUZwv@73D8L)-0*+ItO6I%bgA9>W<#Bn z)xytGB9afeWN1WO)C`)AYlm#zK|o!2aJC&Xfs` z(aJkY6iDWYeg1Me=Hbh9XLL8#qI><8+Y@C%m1U2+7tTo~HaG7-c@v-~jFa8p;f<`L z^4ti4C+Mc42KHUdivYDMlq-fl79JQl@B84jRAgPZ3p?XwWBreN!f_`iBQG8Oa3bXr(BCfGyM})9xGD@ecWA zi=vgZ`YIJW*@Z82@IvUA7$wjl)N~W@3qFFCamY->`sN+jx1Fzw-elb3*W5OrPFbx0 zdBO3$v8M~IL+y)X0YWr_Qj`d%Rw}@B3Cj>kwsi{Ho|i9m+zoH6gi(~@9!JJL()N3T zW{RYXvDXVl*kZZ2IZTe^_8xb)H^vYYatMXDgO?HN&<_MaU5^UX=Gm>oiCwM;op6rIibP*FP_uWPtkgh49=ImV5n8=R)ek zAmucCcHbtQw5F%m;p8q=)O~r@c|P=Ve(CbAb}cm;)ahYk^SM^EA|?m8s3EAdII;_6 zgb{wNB*?+4LU8EUSrqgeS$%Y_wZxW0cX7JZcb>f`eA20s=CX+Cy3m3myxc2vZp2FX zfjXp!amXlIE0X~Nw2VaDLc?YQ9Y-`n-})YPoq%tV4I=wvx*xvGjT{@u>swearEyaW zGa}L8_Fx8TNJ};$iHSfB8a4g|Jb{l35J{WLgnaF9hlaWYLM`qi;^zy#xp&xwcU?Vc z%Uvf2S`iSXg!bBYrzzguHW2s1;R2gRe!^qfQ-C%>ILYEI@iW|L$yOniU<7D&R70 z)0^gyR?yzG|Li96hrga|%WqfW!08Xo)PC?Vq#_d`Px(O1qoyi9MBcrG0J5L zzRBX&g5Hq!s6FJv_wfU#Lo*VYi)cAiKU_+d0?-w{3Pm^{U0ojy*oa%(1=#B-fbtk&EH|X(xnC=sb4g&7ZIQ(j(9!wFu~QNJ0vqSM_w75g4E&ahwMwBfV&)GvM)bEhZ4%%Hv|d@Vdnj<<6*k47=5dvk8r zZcHbfm17KX_hHQjjc#2)E?If$P!;Ur?_sfj>OUjAYRuh0Bhe=5EL#>t+}z5@!MA_# zo7Sq}mp~=P)N^*c{Q~1t+D}WN{IaV}ABHl&fDVUGjen98M9oSq%&wHbpmKNgITCbr zr8zS46co*CyS#ICyb11UB>Gv#7r#y~!lTy8Clpf9RqH_UB3Nd%Gz)nqS$4S$cZ~Km5`Nz=7#RNMal&GXcQGl>3q{xB9ibMhzMg8ivqG zB&`MfruEi~VN+*NN`1>_DkCeBIe6*4^ec4nYOk4WdRN^shbH%9KgU?Jf>U~t5`MWQ13 z0gOfYD;*G*vtoF*(WD;6phwzndQ(snR0Or;UuhSCt?x4lt&MA1}YJ4}Hax2+E?AlFyF3R24&m?Z~oK+0L?C z6cwHPonN*ex@e{^X;eJ+TKK&)HYD6FC)%mw!9TJz3l&4KU(=QCwHHTRS3X7AiloKidHFa z%ISB!n&+J*A4ic#IUOd@uv`>J0)OcgxMgSnt;o`=yQF-cx5AJOSyKMD@|=|an7Tw0 zOxZ^5@QHu)(KldVNyYA2Czj>F8N}N&EN{VY}Tw0{;(D1L*Sq|NOsa1Q1-9RK)LA zJFm>4Q9lQo?Y)J8qsgX~PjVbjN!kzIb3dU4XcA^!QOuuKe~#(}5;3cNSYaaV#Z;5# zN|tHDZ6GtDmTC=lh(H6VuN)Jm<4rB*@mkFs>ZlE2LGKikz&m``rS0K>b;#^@BuOU- zQ*&mP8`sltfQSrNckzc62Y~iN@SED1%31;)Luh9_aL;*^T9Td-JwQ5o_QPt?`1!g5SFh25RkF+=w1dyTp(LET> znI29@Rf98Q{?W0K zlg5E0>~;VF2P65qX0e`h2D$40W&tKI4KtqKqaj+F`&hPxeSuJsp#Sp`7vrnaLT4o7 zaBv+$sm6KF-~gyTZ%*!yo9TIj&iul9wr({4H&Qr_<21A#)djVRI9}f=LExyDM<$fw zSvz3$#-loV{&p#ji-D|fPU6Ux!APqPd0It!r$#n0%>VKRgwSNN+{|RI!PVq&xyxjI zFk|e+BKl`Q(SwjQX{ypH7|3NoKl+7~H1jlMVjgL8>}`MKSqa4Uheg#jbko%z z$gbh#ZYS@{fN57ilZ3Qn`E8SPRsb+-vKUN9Aoxt1hpUns^peF-?BaqvyTc98R zB<`)|Sl~KDV7U@l6gqVdmU8BMGqo>!lLcRfPz%3u*qfUjdghh-CsPJ{sKND<-R;F% zu#n^CYyQ~i>yJEw8J|B%v{*w`D7|UE=ry>Mos@FF>wWOlUuDlla~S@{I@F5lPI%huNx*@_p+C?Z^d_}tK+}Pg~tgyZI?c|U-Y}LM=+A{ zs{kfYlDVL~dLP`wM@k!!Gi>%dj5@Ta1mjhtHNNO^#IhToHU>kgd&(v2oOga*DhQmUnNP{BWvuK=aRno|J$gjTn?sCBwe>4iW|(w5C_JE>?z;kP`|lwl?Y*n& z$u0z?^_FB$-jMXD_Z$lqf@L11{cPfkiv>mY{ug-4-w5Kg3I5x>q`+iMg+oOPf7BF+ z;bVe89|>dFw(S_u61u@7F=yT`u7oW6ci^FK7XMU!e5<`t=of#H&{UOHv9y6ZS8k@H zU@PV*UwD453sb~^t`e8lD_qP92tto4Z0Q(ebDZ}Y&lH8{pR8Ju5TU6^I1?X4B>*nh zW#N0a-^Vlxp* z;Oa^F2kX#-E)A0g51^9Bi+S?uO=E{UHL|YxW1qZ|IDK!;C)DEtfaFKU>{?Q5}yDV+GpyC$D51Pj>6~HX|}n3BFxrrf23p_T|6G18mwhD}*u- z(la1-rTnEg=#e~14Ki%Q2_AkQ7~3)_*||S}+Qi|C57X+z_P|l)AZ+6ny1eI;fv*LUjyG=Nu}%ny9mA&)VMD`tkS_GO z<{NBvAPxUMQXeKnW=kZ8zp`S5L&4o8(CK`;02g_Boz}{9v{qxc#Qklb61;*mborR2 zeWq`~4OmS+d|2FuYVr?oP-a~Q{b{`dGI*0Rc!$H5ZG0UIP<)1H>`@S=L~5hD9-N1w z3ex*!#x0a}8_&6m6fi;{rWUtbCC&W-tpm!?<#(EcajgkM=eWQVfFc0!#b{zB+{Wxp z5gxz&45I-;_KS_>=P!|(l;zX&d`7NMtI8|%yT*_3>3{^=LW(lm_~q=bzch?SbZRnC z;L$BiQ%Vx#KRO5!`v@p>WC+uMiec$I9n^f1{+W(I1Vt;wak-Ol5-6~lS5a9%ohi}k zp7i^Uv)JQ=!Z&3X1q6mWOAcQ*do>c7Sp>=aq9b?<%})y5lVs->!y{Kt5z_iH6ck*x zVG-=74Y9O%H;|fgif#Cb@EmyRpHh65z>ta&wTOPDodGOu#aXgI<~N9U>OT} zj2JoedxS(Dho;CB0;$R)4oepBz;e&RvU$HG+yWsOyPiNB$W1j2rJ$Z`kF%aEfgyU7#i*1k2rrvE^(A&~D!zu6Ke@^lH>}81yMKLGib4QQ1GL9%)@uvdkzBY#f{ zkb*aVf&lVY-3x|;@vR2v=2TESYA`oE4b3^|E_?Fs0bkGCiIC%xD=5;X_a9IvX2@HR|8p72}s#B zI~5~76c@@%gOWy~ya2c+$v4?h_H#GAa~>2L6x;cxn*l=1tGEDdNWQEEs27>qB?g!; ztHnF?frx(oTl^MLS$Vr4lTW864L83#YW#IZ<>L+oM4rU`bh}GYe)OGb3W;yP1V{t~ zC36}3q)%==Rm&ikaRG*`%ygAa$Kgs(9|492T%s4FbZZ`uS_q?QoS=ce#TLU?f#&NQeLU=$<{bon)hw3z(!Vd3?`M7q$?d-WEnNe;IrGpA3&SWI5_Kaan<}H ztX-ipnL`!v7=tMoBA$Kw7vEcAX)k)}LUJD@J4U|Sj>lPW26ZA{pIUE|@HuX34y8-_ z2IR8VnM8fVwaOg+;B}O=ejgg;E71x2uAIQ&byh#$s;vNVGa8FGaLeP%5eSD_U{hD3 z&YW-k1iCd+d@5CD2{+@;^4ghO2a+`t#Sj1T!CHBtP87P0Zk1sB&{KGebRg9gAR@zya0jy_6y{#+ zB$71Iw30xb5;ITA%Yn;Ng_UE!An;FxLH<88R9;o(;c}(=?_UO_Fp}UYew~(n)^iPl zw(n>D{8OWW_!N)JYdI{vsdq1DDy4L~S$Zu^!)H@`N1YRdof6`IVzTt3BVPa+_$#$e z2R?MvSx6bSy6tDidYlN-Ow?w_tyhwie*!Y3{5Mr3MgFrQf5U*_z*O9P>t^@&3t12_ zB!WPW67%%i4`AR);^uu7b+1CE6$6IF9wXh4l7_<|0btixR+LJs1^>E2b!vS2{+ijf z_c=a|sLQ|G6GY&O?6;ssC3|<>T%Ap84UCncqT|VLVsrw!|YQ@lu3(GyLk?g1O@ z>ZeZh1+C9NJHxhHqP@LckNWuKent%Le_KKYzJ&B7+U8i%BV@u6pH|FT`-!kv)yKa- zm=gN!@Kp6Q)0royQ$`4Zjt8pmC}(PKsYm-myOhP()fZfKY)X<@{w zcp82XvRku+*M*!a8;uZZcryY3^|a+A9oz?W-za2Ns_i@&7d{S(3YINLyYANUa=})rQ%b01l`iO!XrDHqc zkA}b!Fb$z&|Ai$uq~Hr|wry)800f;z?dg6aA$?w58a318y+s>kHscT`KA*?BRm#^Z zoZe-EsQyTA4FYRmlHj@PV2;;YG>f{I?Fjr6tT<+NgzSslU>oQ!JvHpj;>Hv$pYmxQzKh3Q#pY<6PUL?@1lY{uTC+ird}fh(@18= z5{y3yUdu#29gx#sG5NsY{?)mtNidZr`;j$BgiWZCY5(Z?9%S9^`7)+rL_tRj;yl3^ z#O69^@6P4^?R6wY-XDBbYrj$`d-wHi7~!?TJ(?SN&(5yTbn($XeCY%g#IX}V85n(< z-o;|l0!PVH+NVVhrU;`Nu+|5L?UN!D%9mfp0SiYL32ieyE)I3#?WW}%ZwF$%#>g=P zj4<-|dwB+=->^C#DpJaghqvg*)8SgfHRt}kQZCLQZh80DhaO-5T>kLnBb*9IfheyQRAPl1%X&pX{stYMW}vn5_iP@3`NB=LtfkzBrcT35X-vkr z&2tR_CM*D1DG(P&YyNT0?|#*x@g9l1^cDx!oli2w!;U5Dd$H)y0GuM!boUcUDN!H3 zRE+fX)^~rk(cwz1pD+oK>#IcxdOS6p=)P>0_$5n*vMmsBVG{eir{fX+60M)AG!d-c z{-n=0AnSgjuZJ4lPOyT%lw4d+q6BQh$PE#UNNrIYcAhu=nRO39=YWlooOW;z35R&VHb_l%V`~e=8`9h%0bh#K-Q89Z@t$cLW^?JS$bW^(#1`V`6_?wvQN=Ve}(=4O|ZzVGl6|6N9g za%w?Vp>(J!exn&e$=_eX@Fi{+2u>XUtQPbdj?1#Ep3-p-;=xtsknq)+jqkwA334t< z{x33iE(16JD-P5M#1m{i;Dl`_w`Onsis9od#e)}{{{Rl~!B1??tRI0Z&fy);ic^ADYHT zA^b)5(*7W#R(WuXiF9VU?&JZ=8nizcWWh3(ohv@3#0J zE|silQw3tq6m;QKETv`H(A1iR-1y@N{Wwp(W*P5_s!9qGZDyLl=zehLM#mx4bnuIk z*+y$ufjUmn6sTe4z@QDx>#5oKHeQ{#NOq;_L?n-43WFP8Yb(;6%k6E}Cy%VTxpkJNIHAVh5u+n8pcn!}Cx)N)j)1zq-yYVDR} zf1i*GH)f0)9%lH{C{~D-G@iauz_(Mh%{%28zOzJUGW&a<(;%6xVpqeApZlR3iDnSo3tbh$WijIuRAZ-=a{? z5JL*fl!C_}bhtiD(@u2RDyo(Sx~lYpq`C_sOttD-ls+0#1)bY?ZlY!($O9C4!e9TQ z4goYMb9U-$#4UTn=U{!?*m61V>NWS6>0Pcv9^?>Vz>qaemcYpQJijFxs(E10aRL4t zX5KWeg0mOZqIq8;Gq7$pE!8LZ?mvFLV3{b7gDk`nbg!XyGe;66Ny9G3=sWvNkF<-E zJIT|xmrX#vo&B-v?}N>tyPG}lz-9SrmTp{RvO%KInhqyN;`jOJz~B2XVo#ALVBU`x z7YW4#2sou4Y!;LRA=9Pz;^XJ9j&3pUZqJ&rRZz*0wZb2nz>o&#Z;)!O^cO5r*Z_g} z>esihCzZt8!fA06Ix3^@`ja2dd7kN)feo}y!Xcs1b(MO)Wq8Nl>7Ku^*IN!+S{zIy zBQb@dNWXq;swkXw?VjMz?z;N*%-|Sa`SGU8(Qces*-aWtq^WGdk0+)75$Yn23U z8UIec)LGVfa8Sl|O(!6^hQ)iwWXSa82|g@M<$Rt1PJ`LX(h=5+$(&F>8uAequRaCe<2UKjA6$F(F%`S zfB@m*WUJT5yY^YMHx(Af&%`cxuk(d`4F%Cg;R(6KP6F*=fev^Zn!Vgh6M;jZdam4@ z&F@*w_N3Z5A|_-XSbb_I*j4 zvD6mP*NSi!ab^$$x_i5ILtObD(rv7tRGA~#fSy_ly#K>yxK>(buC0~MEd#z-QiVPy zlrHx1&;cle70Z8F^uK~M@A5dB!rJFU)+;dupIdZXisf~LgtqoX$B`7QPf}4@^m*8- z$CCWsre{I;q*gh5#Lg9wN5botduj?-V7mtc86_X@9*x|zP7t!0C%djDEY>WAEs7Bw9U92m$XY#aaw7?ft!f)#f)sqnK8cHJF_72ad40LaeTwO480 zxCvs$3UyD5FvS~w#A)v(yEL`#RL^q&rJ23$7 z{skla0}qeq9PFu!+Jkns;2@R0_N=5ElXF&3FU?IKUG#GOTiv!mi3Lm_(`8GFU2>iF zRdPIn_3QptsPJCHNObv-1$_Al-)y;wH#R7UiIqI@@hdAq`GBw$uYA%K)1$p@%o;{% zZu>qYb^&~tZZHP=NQzQs^HFnUfIo~ie`5^p?mGWH=cJ1@t$p{lai?mUsXh&#ol4-N zguQ-BNz+dMn!kj;TtxAa2<#LK?%$^>w81ohttRhNL0Xmz?nECyWzZ&d+Te8j!TTy{ z$5oPQxsN&3b(P#|wv_hbWOr6~2Gj*FCL51Lu+@pQ^&Mk@yX<9L#3=UnGjU;M`!#!@ zbMx{z%WoQYYjr`3W%+%y*Vk#bwyjQ4ZnNzruPihb2D3P~97h0@F0A~0v^H?&;Zi0~ zN860-r890@MLKOI6})|KlKQPuCeH-%9T~2rjjqoR7OR_YY|;fL?oWne%>TB-I4*tL zn7TZkAc@wbIv{@Mq51>ayUVm&^V%72z^kR?(q(wN2qX(JHaQZxc69orFzkhD2bIdvb1@Em0+BsBf#>s>%ftGxtn^iq?0VqRwZz~{KE zYiEBM&vL!$#?ZUp$rvtuE4HegB4W;7$mM!ys!ATkDrckK`A!rUVS^^Eik6CHU}3VB z;%q>7#c>Bj5rPVmY_+G@bzwsMNHquvyzl9!4ahXSp$p6ai~vDa5BP)6+y}JO4^8BU z-BB^RqaMX8hX)~>tZ5#@Q{t&{jc?`!8*BW5+%E8kVe?(GKf7jX!X2p8MAuk!g)NWr z8Y)KVrn_5&ATM)NaFxV64sr9L=Hq?KlL~_rcP1BCC%!DWL0&hP_na8_HCmbcN`=ID z1v_14MDFN4ccti|Jce_ezOtx=X4T8w({=t0g+|zsJ>ga^sr{BYDXVhBVI#|)IyJii z_6z-QzaqAt9}aFNVDQ#$>b$8X!pcHzvD!k%r%6_dlL$jUa7bpy(Dpm-e_c9&B97W; zMbO}PzWrn1lqbo=lI$=``!OQm7NcM(dYAU6ro#-%zWo5vJ5NCJ-b9aDY~(F;*>Be~ za{LW?RJm;EA(?@T@%lG5J&qDba?PX-OLTY+M}ADNRniMgW32`2+=_$noClrmUsqTrdW^Mm zpmm<(TfDR*{Y%eojX!faP{|4&bw#Jub#6pdmbi6^tDrKL_pT-43TYCLFoHtyz`LHn-zq6IreOZJag-kM8o{~c5^ zCrMc8yry>WXXLpn_3}UY^Xn=+iROIHq<-Hd^NI5x*AWgHL3hBY?lp@A>kc-q;npQ@ zzopMdcuMVylE-<6k?@OeI@8R86Vvb6u?=sp#GnL!++=ecT*fQYq476BGVouZ9=yhz z>B1QHjd{2?cZ>ud5+r5v3z#f@aql~!)hm; zCFg5!*fxQ1$J=O!NQaG+vv}!Ow8wyZq$ZnXXrsL~+ry_0z zecb{PLAfk&cYQIICn%=muCIsoT0-xT63?91l}+;x_Bb(BtmQyINt}%@&qxdkTj;MJ za2dhVsrR5=3H~FscFUL_)G=!*Y-t1+Gxop1HZHRI_x1X>aF5y3uTIw3l_9p|wY5!vT1HjdW&eGzK&_`B>ZnkH z#w41pl$dS1v!{ZquX5Y)%-_YY4O!o-S^if-XGx- zuif`FnUYV?bu5o&b9zcyZC|^RS(kc~b$vPB{EGVUN!V5aP|@T-y6$(ih>vm&$RLiL zZZ*`ZM<5I{_MKY1?$KCkxso%9KTfTjP3)42eaf|c1O~@iam_l?Zsk$=*kwI#k(s-9Ln^Bv%5fY`R^N=@7d%z zQEuB&ES{YJ7`{A=$k8^-(nk$uhi+!*ww)V%9{>o+bWkx~7{=T4hoXGdxX=Sy)D?I9 zc}=IbanawQw|+dG*j&hUw|33GiMxA^rcyY5tl$03hlI?x#nIq2ptZJxYWRVbP;-w; z0d@@c%cfM=fFI%OZskC+>wT$KDW30W?+J=hjx7w};6PaB0=+Jcj&XI^wp~a(&S5#H zmsyLH=r*FaWO4$Wl_b?R^sMYWe%Kd%-xc4Xx#8hq0YR##XTRXuYpJS+f>D4)AG`Px z(5NiwuWKl~98xyVxd2N6rYeBUbL@vfnqMsmwG0f+f@#;K+A4FnG7Ig z^q8kfF`VAl&}wc20EGdd#<*DA$pCX3=U0mtvTXHiBnn%uo_q9>g^~Tftjvc2KKgXw z#^vDrcqE7UpA*={H_tQ~8SiV&E@G)0j6bgNBA4W(_rG*^m5Ap3J+_hlvSro(P3_{a zb{8DU9ZiI0zm*+Sknf3yBBV(e67XwzV=IdF{7YVoG=JCx@gSxia;+PQU5hzw_3`O8 zd~xf>)JLySYR+2=QUSe5X>Y9Bnrp1jic}<94l?X^+>fA_f)@E&GC14O4|_$XBoPjq zvR`)Z#e!d~K+N_ylQ7}B<{;;94TFJ7)4s@O1S-1h_Yn1AbkorO#%P%SLFd9kt1q+Q zD|?M+Yy=_E_&b*LFuPIJyLk{THx_ zd+U3^PxH~)hsm5~o?dR1kR_vWfI~(=+;GbzMe+pXuiaR{tlu{G89)AUrk=_r0!|Sd z^3w#jN+vd1D9#I|W{_`~u zoHDw8PgkXWI)WqNlOROl=ubpB4?;MqJ^gqg#r3;Fsw2`S zNN)fFT_t#3`9Ai;&+{=9jQ56a^PMiqT>N7Isi)@T#j&aXJfvE+%={m*rsV;&!laj9 zNAWU}`-v7I5<}1`$no_7Ec$DTzJCiEQF5;&TG|cy%?m-0aHqo@knJ6_brN9^aX+;_ z07(_Bso)l^DTVs4+M#9cZk(%OuKg;{gd-a{)n(7Kp1NG^RBPqx{cfFyZsVL$Shv6^ z)6op^DEX8%-j+DF^?2b-piu0|%9n5s$!1j&ItiK1-^-U6|4ga*{DA0L6jmB9T18|8 zR_vC5frk8+PpeSqGi&@a8f!WMN~8F_d5@zPbM6oJQ_=M}!EdjCo@j?%T7ghxchygu zt-T&9$ebj8h5!Pv57O}cbuxTxeQ>UaCfm>SpF&QKLbI3#B8Dy?5mz*OrWn_|7s{RH zJ!uw?NkL5tq(r+o%jW}`gb+i;-F(y*4lFGVo4E!Z(v)?9Ig{~{{b0lEpCwt59LV`J zC0rjbNgMrm)P}Aq>qP9bb>Mw_l(zU|K#X|%(LMSkcz+3Az2AV?v}?$tzS#fM*>^uu z`G@_Va~#>(A$!jvDSKv@y~;>JNU~RnV`XJ$WseYrke$61l94TYXM8fs_+F>y`}_k> zKlGdXoO9pr`~AMI*SdK1lvBQguKx9|TBKF33>bG_@cRN_`{Fh|0akb|7mhd{rU4yf z1;ZQfdj-1(2iSIZsW)s!>(iKL;jE)@$G#c^gN3g)# zhCLq3Y>%kU5`HakORcOs6ZWNHeS%F=Wnb+0Ex&;%uzBygG&_^`I3)6{JbX5T{L%QL zenml9TE6<1olC;(um4<^qOt0hUCu!OeVWapT+=)03vSpAaWp>I7f4}tD8_zh(&cP1 zq-@B!ICs-b7quX+FZ@J~*k)`wtW5TQ5j2ye=MuP{h#yyUoOgZyyfrB;ln~{0 zZV+vaWmoaxFPUW|o<*y)!WUGg{0AGhrdhUodv5;tW~(euP+)K3?(mVamT()fN?~68 zG<{q9;ezL{83%{uIU0m4SI7}3{}3+hNEiLhPuGpIiJtFv&=4J6AZv}T8ri?tjHNk5 zX}_cI0$2Z|+A-7dp~XzFqiw7ZK1U)#w9Y2YS$TEIMwT19oNgttKS7?@nn?db05Wyu ziDu_glk1A6`7=jTZC}c^vl^_{1)=&PoJNeXI!fP?^>H8$+7h8aWO*%Mkn)O}n!ew>go=J3S# zujn#Q0&^dgixu6ww$1Ty*~;@zBTkvF{o?bmwbD%0TYI+nw7r%5{qyGwrW?el;)D_b0iT9%@UZ;#&UIs`YL^e!o(PT1+v^8rWhXQ0%{P~kWQgD~vVrNJu<997&Dt-A*@jF%8e|MQ3 z6m3)m=^k%*%o`g2|Y^Yq)L%prv33eH4@fmgTS#|dzZ_bON$y2;GlM9+Hz~;7t-{#8S zh=(>WcIP`vXrFoSf-v~=ovY<`pgiF98TX#f=4$|X&eXMLJYv)FW-RC@dw$}o#>mq1 z*Q}moI3-TRg-!N&krFE^sE;E#V4VG%`Y5#zSf3u~A=IkqN>S3E)ZQ>$ftsCycQO}` zLM`2{RH#OM1w=oQRFX~W1QQ%;eb>q|{51oB=^|8DSTHXmk=pBK-vf9xeo;it=3&W# z_!c&+2@tgR55!OFYGa>zrALG?JyRVL<{vvq;79het1}`m%l8>@%tn9j4$tEZt1*A) zur^*%km$L}hyk6BoZ2d4(E(?1U9TUstYa_D-N&3%vH-8~?u&RS(eQG@{s7id0`$xH z!v{5#>XY@o;32u}_`I^Bczu*WBx>VA>2Icy|Gdz8G=+Cs&FgXLRs4I3Z_gFmgdxMs7yCGL&^xJ0&!_Uw9 zu2iEZ#C4t5XPcV7y$Tp6`AYu1@e)b?@0B4w)CUA6j>0gk?%D~k_V=_-3H1m$AA_7b zu1Y$XguD5rN%hk!8nhFSZmoPnWTdt-QivYLXO5Ma)(XFV9(VmMwRSmZg*wZ3mM33ITNJ&RQmZ8-b0p_C@vv^e?aIn+`bIlZEeX_;gwkruUv|AuZSs(dP>N|C;J zus%ZcH%3Lt;rIXm(sHtc)2Lqw*S>u|6v)8 zzVWZCwjzq|V!O_87!XFwKZ<7mooZT@Q=Py1AvT|4U`B6hofXRd26eff1qM@_jR?mrVp zskMOt!duqS_d9pxeg zKg2!>*6(|rDKuJ>&iiDf%le)94A7R|t5C-F1i zt$fYOPiCT@uU=ZbF*?C_4Du8T@D)~6X)HM`>HZsoixc@0zivwNlbZz< zb+tG*D6yIalG0L*H&bd!WnWKH?cA?w7oG94)H#0e>(R`w2Dc}G!^c)$OCM~wQq@xu zu(gewC|OiKnZUnk$*vMLoI*6F6BWqahp;Pk@1mP;w<5CzPsn>hV-RP2gXeTNfj26+ z7EV0eXqgV)9m*TEg;7?qw&g4tJ1+(qYIP4e474N=l_B-qtt_!#WLWE+7_jjRI?0u~ zrf%Pq?3#8)6j9jNp0J0tiEHPlP3J2TBphVSsKwVk@vSx6h@JX$V9|ytEn-xq@J;2H|;#yj*W`1t95=lg5 zMPe2wLnlrkriDD~u&l-U(gRJYrey$hiG@_G5=fB;SzV=%=V_sj;I|jU8-IFZ)jW5>&`$ycO)V+TE7@p=2^sApvL%xq_D1tP;OFYeE!tSHVPcoYq$7WR^@~i7_b;iTc zFc!J&KNb(*b7)tJZceeupp(wtk4g4SD25~lCZoCGEPMvfDQ9_WYIT{-yWAzk3<}80 zyLY@plnn+yjTE^udLr~`T&Lhbb_*fPltY2gHT1>1Vxv-~zrxBNF**}_)ntuQE#xyi zM65Ie_6=S~9@EI9gGt8)HJZ14p>k7cWrZy5r)CvJUvxqvHV83p2Pc;iNObbQ9|e#7 zMJ}!MGm%OpN(ntLL)?eElzkVykAJjwVfyt@hEpp+eke*@feWjf9;2vPM}TPI>nDUN z%YAg5HUW3`tKIV6qu2RR%kT0MtIvlwAMGxf{Y5#AAa@?p1@NP4eu$wq>4dj`f|A); z@F7QEK}rEbPx)$4zJsUxzaRAU1rmE%P-*&i>sU#mPKom)Uoad4&ggYrM0W7I9}2frn&%2#^5x! zsH0U@kP_P@_UPcrRX02W>0ip)PtR6@RbpYyyC8$7E|_o67r+C{vc^4q+@Iu8AVqn1 zk@ade`sR}#Spv0sj_;!+5WNgME>Hl~-3ry>@vjk$Iyv*}d__kvQZn8#Q}0l)>GktPA5UY9->c2cmy-civk_0+g3JTLZaIFu`)ftw`y$ii6SVeTW3&~ z-Hr$wFk+~h#oQhCGvK$W#I1JB@HW_V*zhU2Ybb1xT4=n#u_dneC`iUE_7$9(g-0Axznkl4H{Yf*6FIfj33fkka z5vR=t@BMbrJNvK%bA0A%P9G4f#a%8q2aBM0B*9uo5T?}O8Y#Qg1rHL4M6vd`5lTvH z>o5mzRMMgt_jez*!_=))Y&cvZ<)Od#Z-n~~HX9p0f4iA5Y;@EU(%+*;7u$#Nkh{Nrk#8+IjO(WfRuWRucRKqWU0CA z52p3+X*cCc!}OQi#%hU*^zD=%Yx?sTrQuvC*U43m%Y2w~+4kiJ@Yu;b5f7-6a$6lN ze3Q;8O0v}p2MBo;jr=50-Kj~P+qn3zfGF0?A_>JM*?il8v&@y(waH&z!{KWg-Y+0ghnABvs3)@-t3`vQ&BWWK z50G|-*PK7zo}fU9ssM6YSI&$+17$slR84<VW-5R~DhgNa6l;#N5&*B!Dk zQ&)|Xgt!=r17P5#&QJCO3|(o>=YiEwHH9#i&OQR!$js;9Xi3g>Fir}Df*pST&D z+Y>v=_1mJhn1DMQywe4*30$T(4Zrs15^zJ9lg_0+jBvFWlxZ~1B?=g3ya#3N_ zz`LQ5d-e0D8@f3gBOzbEsGXS_4aQV~_2i?@lW`Tq=j-me=-GjvQQskN)-m_U%b`zI zF!>;^%ED-Ze^*eTP&b#c`oVkK6X^6uvRLP~)6_&GIEkP2SloWlMf_H)i(P z@%IoL@Z^!PYGy}IjbFFZkc?K?-N-1DGALiE3Zvxi1>C5vibn9sMZ20N$F@g>^ah-@ zghWMk55RmXbeELRdk9~Q$@-t>?O{8wc6UwvlYq`rb=$-y9R_V?r6w6B2-X;~B6@t9z^lW-RirqpedqHykgB}c z#&jdSy#H*f6RK0gMi3V$Z(Hv|UelPv?yIJZm21g2!;)3Fx_`zGlVm?bCa9$T2wVq? zn!~Va=sS1hVsBHr_fmq<>-=6y^Zji!k6w;yiBxvlNdnHJ{*>LaRTIb0oRBT>v&Tx5 zDPZ~MHQxcpAtARqjVb3Y#?F52u@T(h&V7Dny^u!8Ul!ojc(XXJDDM&Y^|{(k=iRkG zot`Vdk$1%{JF1F_+J&03Zm+iBF$b|)9?1yN+fG(}07**L2*z=$MrZGpU465bF(}B& zU%DSN{)*R<;XS6tx!3fOIfJ7szD1w4seZJf!oYgI1`<{;7n4>|&scnbe7I2#WnXtV zg`(2-g}r2uj;}kd7sN^7bx4Y3*Wj8ZiuthfEPR99Y;c6QYxSa&LXjmbieDYjFX@Mn z;bGym-z5P)1Xu-91UOwH00c65-c<3+%_Brj=7PZNX>eWVf1eR_bc3Nm*l^}TIG#IW zGkuw`E)}-ex@SQheqbeJTX2Z|t(dA1wm%?ijxCw6!BhY0=QJXn6}d9*o5n?9FWA{0 zCOK2bD@!UtTU!yH3F4TcJD|n_~rOlG750) z5aTb_>p9+MM7ShV;3)E-@PoAG0ED0xo%N{*J;HCYkHKQmSh#e<4VxK`Arryl6eRAw zh|tQ@eH-UEUnBzeNR1mC|N9Mcb9D0W&~Xw@Q&#LPhAK`ZyaU;J4s3PgyaerNq$|Oq zPnS~BNNCh*x5e{e!FK(GVPXdi1kFHS_rKXtt;NwXA1awXSCI#Ky zlAh(V=s0V{RUi`yI70SKRKYTqXxyFKILH>S*w%ZN9V>o2^7Ysjw?=m1CoWhpS)T;t^pN1|HD zyKQQH4MEo6TBJB#X&29T*%>g>%P2tU$o-D{%tcgiC6VEknSKr}dtzCZ&AtZ^`t@|T z8HaQ+_Od2GqEOgsJ8(3s+7W5RXow-1-n=~=Cn%VEe{?wWy!7a>>D;}*TCM{Qh)p7^iBwuO&DnFiSFC~0fsOXn9l1+jy*v(*-sEbZpHvT z=tRUj=i4XW{RpENi5~sPRUwr(*~r)II)}4a^Gy}grAq6MkT37|?Q`!TzsA%hpdm=o z1m5ndw;D~574AHY`^j?)HWi`kqR8v6j*uGP^EXqHB!WgTQD468X4J$5>5skOx|x{g zKiPhDnBXyZG_n{-DuXX6`PgPr-FRqpEN;3=k^r)YUNcI#A)3&`Ki}J!b>9mtyeb9p z_Iame7E;$lGq9}k(9AL)Wj9^*gO-4HBO%E8PFuWEv8B*YFZ7f9$4ASmXz7EyIUB6c z<_C%cGy3CyIlM87we@v--qCn+OYe%~O zu+Gd3WBKhD$0nGV?6|~>X-5qH>!-OuxsbvB+$%3KL%*ncUROC+nsov3fi@PlHI1OJ zF{IDMVeJy5#%1-0cW3GRp9FMR!m)B&t&y6-!g4@rAB^Zi1*}SUJ!NJ$D%q{sevn5f zCdPAZ@sDJdlWh5o7?`$jQd?2- zb>4-tyCdO%D;5sEP>1Q^N;^GqC}d4(!=s8rFEM^OYCV)nkJh?Fw=*SRpgpeoQEWuX z+-Db;m^1(79-!6sAte!X%AKSM>4oz@g8u`G_2KVIu&Y>$LtKJN+ef+|JJ+>Pe5vZu zmQ5?LPemG>wjcb4(t7a*bJs(#fH<9u< z*c^{#CYcKx6>K^wUwqzS*R2uFcU5C5pgHjNQWgnPbzQbHUzLOjJCaO zId^OG1J+9-VIxw}LV7}x3h(H20jsO-j>O+7Cf<9&;+>NlpVb`1LxWBeTKR_YobguK z6R_>&6K2ksI|PC4M1Px3f-G}d(T4ao)R$4j1w3maPws(KwMehF@#&b^E?9!vRN3^i z#jeR@5Ihmh70c}9bT8@m)!(hG4mttBp;g7Budk}EFh#xn>ci30>qOy|=pK%D_WU-6 zVOmVbpF_)b)RuDTX{Ey_yYHQkG3gVAMLWUT8fK}-nJIgQBl#5pKF8yGw*^1Hez%@8 zYy6j2f_;IAL3I&Nmay~j%BG4v%SBSFCXBK7ghITW z-rPo|Ou09Cn+$_wmi`7?b1tQ+cm-um@ZBn57m4k zW62@2W&ko@AJHyBB~_?*V`Dr%>ud8eqA7lHi~`^X72AW(ir(?07MM5igyXBsB7q3U ze6n2Ch5xQ?B35#vW#Yi$N!U^1Rm-MTl@87B;uuvhy6b^UT48VMERpPggSWEFSe;`_ zNr}Bm;;!0iD7qt?_JiW)E%QzqV?$=$DNpA=ixP}tRNfD2q8rZR3edT&QEY;Lju+@5ig6AiDlR$eP{+dOMf zNe+)w(~>-u-1@Q@RHl&rnwc!zJb@=koc#O4f?PWC1u!dy3>PT7uApPPeJD~lXQ z{y7;{k6f;j;fwBbtR1v35j%0Cg}Q`>6@PNbdH(r2)|)Ky_@|OijB+>Hc2TXC-L5W@ zx)^Ejvc;t7Z1()ryjw~B;653Yh%al7<|7i+-qHu}p`+Ois+OHEWpLAoun!Q$#Goxq zYNa-lNFncR#tUml{kr)0g9KB0?J zdMzP~(i*~iF3*ft@wqQizj(X2crL#%x}@exgLWWbsub%Uz(ZAD@$T1m^+4FB+x9Cu z1stORa2yQ?X*j)VmQ0;(Hm>V3o*rnqOd+J>$D4B06t<|ID8RejbnZ*36nMv*!fD83 zWfSmA{UBRPFQ^X{p$AL|7W%+OSRX(v>Gw8{Y%N^whXjeFAEQ*_ZTC$Gr-LSYH)x$~ zo=ve?ZPIKQ`5;=ms9bzasj%c$8XX$zmz}6`uzxA!tsZ;dd7ZCVD*lUvbf{Fhu#%!J zI$+R~%=?HW#t0|o9Mx1I|3?P<6=>WM>Pc5WP;tJv@O}@icv%C(5EBYTHox_M#X1I$ zmgTJ;b-X#7yz1>slj!^Ok7xaclfW5z$bt3rdC6hH+R7u}Xo?$&W}Lr363hj9{I?Kl z5lYrwjFZJriOrl|?%Iz(2bI5FV-}NY@;!or^ZX@DuX=yrlUT(&1Z7`;1Semrzx(k= zHS%wtTqqZk+rjf2KBgp8lj56M#E}z$6nID!M9bR}OlpQ$J)z{J#9v)U9puW(ENPID z3scE8$CD#mB8}xnYdD^urj9C-Bn<|qcZyuG=1(#|$UXUq9Vt^Os&ayCFAJ(1*YDR| zVn8+rKGb}voPixQVwrSGM?kCq{J0hQ1J6!S&3hV3v3=o|OO@gc&WrWWAvhP8MD$XT z*@++z)?O^9*zj2o|Nbw5n;mj5SgxVn+}i-e72*K6Sju|5$3wRJDcQu1d)o*BwGxQ=R>JECLHmTnv?tgh?uXvUj9V*t#Xg7eZ zj?x$r4XDtU<@b8~(5Ls$M@W=E{md^tG- zuik_4%#HjYiqaVw1ShOVJvh%9QlK5hy^Mj|6R zP8E}MS@h|YSeR1uos|8{$iajnup|LWDvD{wwxpWilz7Wg$JDTA^=}-J+y$f=qf09R zcPP-m)@hNMT;xu|&&)+oS(FTn2*#A11(1sg`u?4qeJO~~0qnUdgTMLtpRpg@%@01f za$hNBp|$`nWmA-v8HesmhO|lc$IP5PT`A3f!<6Vzb>WZTxUi)senPLB0M`2i^-ph$ z#aHl~p;}J!m1(3`z>F>2cWS{^w{vUr=#3{Qz{-xqVHv*$nmrVBCQCJ!L)uuhfh9dD zH}Ih0iQ{^nm1LtW7@auR4Up;Ta7UfOKe2%p!75)Gus%B2>>Gz5c?UG_{cR{6-<7-N zc8jB$xuN>%SR0#r-i`JepM@~4?AHoodPW)llX~u?DrZ#vTG0Hy6j);~>b2O(li3az z#yXV;4Cvrtssj~;0uhO)DcN|c5a_XU9XlTAfx_H?n8JA{rARtjg%Jbc0upLOD_~sf zJ40b!3BcNTjdsgLU>WclXhVLoYO7s2>IS-BqPOxco?O8c3~mxrC+0rBjpekBSLmVO z*%Nim`HDls_Y3w0x@ll0z+A>m7+rMR++ zV`_G@-|rB_B1^w$2d8mm)rBtD9?=n!sAYdm6&<^}_F#HZpHK7O?TsdIn$9JHfCLa} z#Y{v%_RGd_+=wAnD$WBNW-JLcZNab~i?!Q+x-H?hf76EwPYtU-LO9CauPpW9iUJ_; zzV@xxbdj@2vYNeK{^_Nhbr~PfAgq219?abU-XEI*tj-xXTV4BIqy)Qw{96gY(D?>{}p5vp~s$!}MqNqh*LXqhT7m_5X~J*onnd1?1pJ zd4`pDa?4%7Z93N)57o@Bp7x-pqRV1i`I=gwhr5CNcN<=@WEB^Bp|C@8UU{%*c`QIL zJ@l^CJ2m^Z1q8-wTgip{06yaOxNJVMW`h-tRcMhR>w6yqaZwH+rL82&RucIBw+2f0 zUlyt3o*@G0de;ZD1E+w7P{%biy&vA*18bTE-g<{%B|L1-=tVgMBL-*#zLA*fKL+o1 ztSaF_-HMgrE627#Sa0Krq3KL`JMO=~BSV^XbU3I0)&0%m=!XXu?3FnAA`NI%SO_f- zr;pD=A<3NZ!7C%E@8e4hZhYvs?RZd!2br0bi-G z=1N*sxiMd-6G#UbeCaj(a`=OZ(KZCjMNB5xt?F(~)n2Ds^+#b5K~cw<_iax)>UCMJ z{#yZL_&*FDOHCX@R%|ZGZWalhgj*qmlz-aL&5-qzdA*|R4YL*!PBgz*e?OJaW!bL>{0qka%y{VAFd`;oqML z!(w;}TuPjIa9rroVhhG>pIO39HDXjRVZ-I;A*ptnYnydavQ*g6Rj(p3jtkfg4sxlB z_W`(N@!r2qLCK6q%x6?0Fn+!Cs#nQVGvyN|yjx=ZuM%zSuR^|1$WZv9sk15>_MIhW zePDE)O*!|Tk=39ViPaI-zR9!cB;NAg3B z<`Ut>x^lS3wpvtM1l63tBz&LWpSG0fz)RToG*U)oxVbFpTQ+eoHVB-p=K%{mtiJCdIHHHBDUeT&H zm$*!QeqO!ExUIU`?&mc$`~F_Vrqi|Dxd2Uy49p-P9g6&$?UY)TTy{T>4{Ur}?1;p% zix_Y?HwS_)X0Qkz{F;^B-3oKAZ=c}Z0=#NZ_WW3jEuoY0F38Ltgmg(fTK<6l4sNC# zix;Yv?+f7ITrN4{vUfByWu`A_?Mz6#$xYXvBA^wq)y|PXNGuK`ROhRuh5j;vqu`iEim?@Edd(+ch+v1FaON62;IH94O9$ z6}2JodGHsDA_vT4?qLCz)oLF zcDE~VjMxP`?!e!c+(|dZ7lMsGGLm5B=TAhB)ON3_7xQMjogXJOgVOxrK2rgp1up$* z;&tKCa@6Dvt>I?hx~zjz(mR%(&1SYf$XnNK9Y0-(WPWzI%{cxI zG1KY^HpMte5zTPU;J`TP8o#YcSEplH=IX{e8%6LOOx3cv0IWVpMMVFjjkl@KC_bX{HiV^^1kpu z{kjA}>`+rYYFAvUB3>GQPf>y|%bEE=8LQZ|moEA)tfa0(cIn?e=bo$FUfKt%#^YlP zI~dpJyhUJb*H}ODJiX?D_gSnn zxJNV{v@V2imUyv~Gb0JYB~<{zfC>Y=Vu_1fOVimd}1|=zaPKa9%}VVRuuggRns?$EH^U zZ1qs~m3szv!>JCLZB?}5Lll(_h%VjmnZM>TQ#3rZU@V2_f`J1-~7~9-d$G`5{P!y!(ID(zqkB#$wpO7 z>4xz{74`K9{dut&Pj5TBM>*7D?sZL}GPX)fH)7Sa9|E^esiN5nq=H(lHc~ZnoMDZb^(Dm)v%*Nkh!>v;iJojJ0rCFTR v=V$^^E=yF>^#48!d%=HK{XhMOF`FZ`7eX2-*FKy_z&|x5O~n$02Lb;NIwC;c diff --git a/rpcs3/Icons/configure.png b/rpcs3/Icons/configure.png index c023e773df0f58522c2778c080a66016f9621665..4ac8730e97339edcde748839abcc1abfe4c0aa9e 100644 GIT binary patch literal 5788 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 IwHzY;2cWKXBme*a literal 9102 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 S%-4SJ0CPtitvYh<#{UDA+}Je$ diff --git a/rpcs3/Icons/controllers.png b/rpcs3/Icons/controllers.png index af31011fb6266fb82d61e45b39cd7d8e458b4959..9b15159c21b454a11a0980dfd3b185cab92d126d 100644 GIT binary patch literal 8058 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 BM700_ literal 24754 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 Ud8MJC|6jbZfvJA^4X4Qe12K(yaR2}S literal 17016 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