diff --git a/Utilities/BEType.h b/Utilities/BEType.h index 0e9367bcd9..e845ad05e9 100644 --- a/Utilities/BEType.h +++ b/Utilities/BEType.h @@ -490,6 +490,11 @@ public: return storage::from(m_data); } + stype& raw() + { + return m_data; + } + se_t& operator=(const se_t&) = default; se_t& operator=(type value) @@ -533,6 +538,11 @@ public: return std::bit_cast(m_data); } + stype& raw() + { + return m_data; + } + se_t& operator=(const se_t& value) = default; se_t& operator=(type value) diff --git a/rpcs3/Emu/RSX/Capture/rsx_capture.cpp b/rpcs3/Emu/RSX/Capture/rsx_capture.cpp index 7cc3721d2a..fc547631b8 100644 --- a/rpcs3/Emu/RSX/Capture/rsx_capture.cpp +++ b/rpcs3/Emu/RSX/Capture/rsx_capture.cpp @@ -370,26 +370,24 @@ namespace rsx frame_capture_data::tile_state tilestate; for (u32 i = 0; i < limits::tiles_count; ++i) { - // Avoid byteswapping - auto tile = rsx->tiles[i].pack(); + const auto tile = rsx->tiles[i].pack(); auto& tstate = tilestate.tiles[i]; - tstate.tile = std::bit_cast(tile.tile); - tstate.limit = std::bit_cast(tile.limit); - tstate.pitch = rsx->tiles[i].binded ? std::bit_cast(tile.pitch) : 0; - tstate.format = rsx->tiles[i].binded ? std::bit_cast(tile.format) : 0; + tstate.tile = tile.tile; + tstate.limit = tile.limit; + tstate.pitch = rsx->tiles[i].binded ? u32{tile.pitch} : 0; + tstate.format = rsx->tiles[i].binded ? u32{tile.format} : 0; } for (u32 i = 0; i < limits::zculls_count; ++i) { - // Avoid byteswapping - auto zc = rsx->zculls[i].pack(); + const auto zc = rsx->zculls[i].pack(); auto& zcstate = tilestate.zculls[i]; - zcstate.region = std::bit_cast(zc.region); - zcstate.size = std::bit_cast(zc.size); - zcstate.start = std::bit_cast(zc.start); - zcstate.offset = std::bit_cast(zc.offset); - zcstate.status0 = rsx->zculls[i].binded ? std::bit_cast(zc.status0) : 0; - zcstate.status1 = rsx->zculls[i].binded ? std::bit_cast(zc.status1) : 0; + zcstate.region = zc.region; + zcstate.size = zc.size; + zcstate.start = zc.start; + zcstate.offset = zc.offset; + zcstate.status0 = rsx->zculls[i].binded ? u32{zc.status0} : 0; + zcstate.status1 = rsx->zculls[i].binded ? u32{zc.status1} : 0; } const u64 tsnum = XXH64(&tilestate, sizeof(frame_capture_data::tile_state), 0); diff --git a/rpcs3/Emu/RSX/CgBinaryFragmentProgram.cpp b/rpcs3/Emu/RSX/CgBinaryFragmentProgram.cpp index b7d6c3ca46..3626288526 100644 --- a/rpcs3/Emu/RSX/CgBinaryFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/CgBinaryFragmentProgram.cpp @@ -228,7 +228,8 @@ void CgBinaryDisasm::TaskFP() verify(HERE), ((m_buffer_size - m_offset) % sizeof(u32) == 0); for (u32 i = 0; i < (m_buffer_size - m_offset) / sizeof(u32); i++) { - data[i] = se_storage::swap(data[i]); // WTF, cannot use be_t<> there? + // Get BE data + data[i] = be_t{data[i]}.raw(); } enum diff --git a/rpcs3/Emu/RSX/CgBinaryProgram.h b/rpcs3/Emu/RSX/CgBinaryProgram.h index 5a2a2e33c2..a54261f387 100644 --- a/rpcs3/Emu/RSX/CgBinaryProgram.h +++ b/rpcs3/Emu/RSX/CgBinaryProgram.h @@ -375,7 +375,7 @@ public: verify(HERE), (m_buffer_size - m_offset) % sizeof(u32) == 0; for (u32 i = 0; i < (m_buffer_size - m_offset) / sizeof(u32); i++) { - vdata[i] = se_storage::swap(vdata[i]); // WTF, cannot use be_t<> there? + vdata[i] = be_t{vdata[i]}.raw(); } for (u32 i = 0; i < prog.ucodeSize / sizeof(u32); i++) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 6448b45128..31baf60a43 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -325,7 +325,7 @@ namespace rsx { //Endianness is swapped because common upload code expects input in BE //TODO: Implement fast upload path for LE inputs and do away with this - element_push_buffer.push_back(se_storage::swap(index)); + element_push_buffer.push_back(be_t{index}.raw()); } u32 thread::get_push_buffer_index_count() const diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index cdc8efa928..730aa668ac 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -64,12 +64,10 @@ namespace rsx rsx->sync_point_request = true; const u32 addr = get_address(method_registers.semaphore_offset_406e(), method_registers.semaphore_context_dma_406e()); -#ifdef IS_LE_MACHINE - arg = se_storage::swap(arg); - const auto& sema = vm::_ref>(addr); -#else - const auto& sema = vm::_ref(addr); -#endif + // Get raw BE value + arg = be_t{arg}.raw(); + const auto& sema = vm::_ref>(addr); + // TODO: Remove vblank semaphore hack if (sema == arg || addr == rsx->ctxt_addr + 0x30) return; @@ -244,8 +242,8 @@ namespace rsx { case rsx::vertex_base_type::ub: case rsx::vertex_base_type::ub256: - // One-way byteswap - arg = se_storage::swap(arg); + // Get BE data + arg = be_t{arg}.raw(); break; }