diff --git a/rpcs3/Emu/RSX/Common/simple_array.hpp b/rpcs3/Emu/RSX/Common/simple_array.hpp index 7d3d331686..633cae62c9 100644 --- a/rpcs3/Emu/RSX/Common/simple_array.hpp +++ b/rpcs3/Emu/RSX/Common/simple_array.hpp @@ -178,11 +178,24 @@ namespace rsx return; } - // Use memcpy to allow compiler optimizations - Ty _stack_alloc[_local_capacity]; - std::memcpy(_stack_alloc, that._data, that.size_bytes()); - std::memcpy(that._data, _data, size_bytes()); - std::memcpy(_data, _stack_alloc, that.size_bytes()); + if constexpr (std::is_trivially_copyable_v) + { + // Use memcpy to allow compiler optimizations + Ty _stack_alloc[_local_capacity]; + std::memcpy(_stack_alloc, that._data, that.size_bytes()); + std::memcpy(that._data, _data, size_bytes()); + std::memcpy(_data, _stack_alloc, that.size_bytes()); + } + else + { + // Safe path: use element-wise std::swap + const usz count = std::max(size(), that.size()); + for (usz i = 0; i < count; ++i) + { + std::swap(_data[i], that._data[i]); + } + } + std::swap(_size, that._size); } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_utils.cpp b/rpcs3/Emu/RSX/Overlays/overlay_utils.cpp index 65dde9a8a7..18eac492e9 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_utils.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_utils.cpp @@ -201,7 +201,7 @@ std::u32string utf16_to_u32string(const std::u16string& utf16_string) for (const auto& code : utf16_string) { - result.push_back(code); + result.push_back(static_cast(code)); } return result; diff --git a/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp b/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp index 02d0f0f407..ba7e4add41 100644 --- a/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp +++ b/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp @@ -453,7 +453,7 @@ namespace vk } m_descriptor_slots.resize(bind_slots_count); - std::memset(m_descriptor_slots.data(), 0, sizeof(descriptor_slot_t) * bind_slots_count); + std::fill(m_descriptor_slots.begin(), m_descriptor_slots.end(), descriptor_slot_t{}); m_descriptors_dirty.resize(bind_slots_count); std::fill(m_descriptors_dirty.begin(), m_descriptors_dirty.end(), false); @@ -534,7 +534,7 @@ namespace vk auto update_descriptor_slot = [this](unsigned idx) { const auto& slot = m_descriptor_slots[idx]; - const VkDescriptorType type = m_descriptor_types[idx]; + if (auto ptr = std::get_if(&slot)) { m_descriptor_template[idx].pImageInfo = m_descriptor_set.store(*ptr);