diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index 6837baaa97..f0a8c9f7db 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -4357,16 +4357,6 @@ public: { switch (op.ra) { - case SPU_WrOutMbox: - { - res.value = wait_rchcnt(::offset32(&spu_thread::ch_out_mbox), true); - break; - } - case SPU_WrOutIntrMbox: - { - res.value = wait_rchcnt(::offset32(&spu_thread::ch_out_intr_mbox), true); - break; - } case SPU_RdSigNotify1: { res.value = wait_rchcnt(::offset32(&spu_thread::ch_snr1)); diff --git a/rpcs3/Emu/RSX/NV47/FW/draw_call.hpp b/rpcs3/Emu/RSX/NV47/FW/draw_call.hpp index 0fe726d417..7b2591f544 100644 --- a/rpcs3/Emu/RSX/NV47/FW/draw_call.hpp +++ b/rpcs3/Emu/RSX/NV47/FW/draw_call.hpp @@ -33,7 +33,7 @@ namespace rsx u32 draw_command_barrier_mask = 0; // Draw-time iterator to the draw_command_barriers struct - mutable rsx::simple_array::iterator current_barrier_it; + mutable rsx::simple_array::iterator current_barrier_it {}; // Subranges memory cache mutable rsx::simple_array subranges_store; diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index a7338cbf56..33fd4a662b 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2970,7 +2970,7 @@ namespace rsx auto& cfg = g_fxo->get(); - std::unique_lock hle_lock; + std::optional> hle_lock; for (u32 i = 0; i < std::size(unmap_status); i++) { @@ -3011,7 +3011,7 @@ namespace rsx if (hle_lock) { - hle_lock.unlock(); + hle_lock->unlock(); } // Pause RSX thread momentarily to handle unmapping diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index 7ab6fea717..721471834f 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -395,62 +395,87 @@ bool iso_file_decryption::decrypt(u64 offset, void* buffer, u64 size, const std: } template -inline T read_both_endian_int(fs::file& file) +inline T retrieve_endian_int(const u8* buf) { - T out; + T out {}; - if (std::endian::little == std::endian::native) + if constexpr (std::endian::little == std::endian::native) { - out = file.read(); - file.seek(sizeof(T), fs::seek_cur); + // first half = little-endian copy + std::memcpy(&out, buf, sizeof(T)); } else { - file.seek(sizeof(T), fs::seek_cur); - out = file.read(); + // second half = big-endian copy + std::memcpy(&out, buf + sizeof(T), sizeof(T)); } return out; } +<<<<<<< add_encrypted_iso // Assumed that directory entry is at file head static std::optional iso_read_directory_entry(fs::file& file, bool names_in_ucs2 = false) +======= +// assumed that directory_entry is at file head +static std::optional iso_read_directory_entry(fs::file& entry, bool names_in_ucs2 = false) +>>>>>>> master { - const auto start_pos = file.pos(); - const u8 entry_length = file.read(); + const auto start_pos = entry.pos(); + const u8 entry_length = entry.read(); if (entry_length == 0) return std::nullopt; - file.seek(1, fs::seek_cur); - const u32 start_sector = read_both_endian_int(file); - const u32 file_size = read_both_endian_int(file); + // Batch this set of file reads. This reduces overall time spent in iso_read_directory_entry by ~41% +#pragma pack(push, 1) + struct iso_entry_header + { + //u8 entry_length; // Handled separately + u8 extended_attribute_length; + u8 start_sector[8]; + u8 file_size[8]; + u8 year; + u8 month; + u8 day; + u8 hour; + u8 minute; + u8 second; + u8 timezone_value; + u8 flags; + u8 file_unit_size; + u8 interleave; + u8 volume_sequence_number[4]; + u8 file_name_length; + //u8 file_name[file_name_length]; // Handled separately + }; +#pragma pack(pop) + static_assert(sizeof(iso_entry_header) == 32); + + const iso_entry_header header = entry.read(); + + const u32 start_sector = retrieve_endian_int(header.start_sector); + const u32 file_size = retrieve_endian_int(header.file_size); std::tm file_date = {}; - file_date.tm_year = file.read(); - file_date.tm_mon = file.read() - 1; - file_date.tm_mday = file.read(); - file_date.tm_hour = file.read(); - file_date.tm_min = file.read(); - file_date.tm_sec = file.read(); - const s16 timezone_value = file.read(); + file_date.tm_year = header.year; + file_date.tm_mon = header.month - 1; + file_date.tm_mday = header.day; + file_date.tm_hour = header.hour; + file_date.tm_min = header.minute; + file_date.tm_sec = header.second; + const s16 timezone_value = header.timezone_value; const s16 timezone_offset = (timezone_value - 50) * 15 * 60; const std::time_t date_time = std::mktime(&file_date) + timezone_offset; - const u8 flags = file.read(); - // 2nd flag bit indicates whether a given fs node is a directory - const bool is_directory = flags & 0b00000010; - const bool has_more_extents = flags & 0b10000000; - - file.seek(6, fs::seek_cur); - - const u8 file_name_length = file.read(); + const bool is_directory = header.flags & 0b00000010; + const bool has_more_extents = header.flags & 0b10000000; std::string file_name; - file.read(file_name, file_name_length); + entry.read(file_name, header.file_name_length); - if (file_name_length == 1 && file_name[0] == 0) + if (header.file_name_length == 1 && file_name[0] == 0) { file_name = "."; } @@ -462,7 +487,7 @@ static std::optional iso_read_directory_entry(fs::file& file, b { // characters are stored in big endian format. std::u16string utf16; - utf16.resize(file_name_length / 2); + utf16.resize(header.file_name_length / 2); const u16* raw = reinterpret_cast(file_name.data()); for (size_t i = 0; i < utf16.size(); ++i, raw++) @@ -478,13 +503,13 @@ static std::optional iso_read_directory_entry(fs::file& file, b file_name.erase(file_name.end() - 2, file_name.end()); } - if (file_name_length > 1 && file_name.ends_with(".")) + if (header.file_name_length > 1 && file_name.ends_with(".")) { file_name.pop_back(); } // skip the rest of the entry. - file.seek(entry_length + start_pos); + entry.seek(entry_length + start_pos); return iso_fs_metadata { @@ -543,6 +568,7 @@ static void iso_form_hierarchy(fs::file& file, iso_fs_node& node, bool use_ucs2_ selected_node->metadata.extents.push_back(entry->extents[0]); extent_added = true; + break; } }