Skip to content

Commit

Permalink
rsx: Implement Atomic Vertex Upload (via setting)
Browse files Browse the repository at this point in the history
  • Loading branch information
elad335 committed Sep 1, 2022
1 parent 2cd7238 commit ed60ccd
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 2 deletions.
2 changes: 1 addition & 1 deletion rpcs3/Emu/Cell/SPURecompiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6563,7 +6563,7 @@ class spu_llvm_recompiler : public spu_recompiler_base, public cpu_translator
break;
}

if (u64 cmdh = ci->getZExtValue() & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK | MFC_RESULT_MASK); g_cfg.core.rsx_fifo_accuracy || !g_use_rtm)
if (u64 cmdh = ci->getZExtValue() & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK | MFC_RESULT_MASK); g_cfg.core.rsx_fifo_accuracy || g_cfg.core.rsx_atomic_vertex_upload || !g_use_rtm)
{
// TODO: don't require TSX (current implementation is TSX-only)
if (cmdh == MFC_PUT_CMD || cmdh == MFC_SNDSIG_CMD)
Expand Down
2 changes: 1 addition & 1 deletion rpcs3/Emu/Cell/SPUThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2063,7 +2063,7 @@ void spu_thread::do_dma_transfer(spu_thread* _this, const spu_mfc_cmd& args, u8*
src = zero_buf;
}

rsx::reservation_lock<false, 1> rsx_lock(eal, args.size, !is_get && g_cfg.core.rsx_fifo_accuracy && !g_cfg.core.spu_accurate_dma);
rsx::reservation_lock<false, 1> rsx_lock(eal, args.size, !is_get && (g_cfg.core.rsx_fifo_accuracy || g_cfg.core.rsx_atomic_vertex_upload) && !g_cfg.core.spu_accurate_dma);

if ((!g_use_rtm && !is_get) || g_cfg.core.spu_accurate_dma) [[unlikely]]
{
Expand Down
5 changes: 5 additions & 0 deletions rpcs3/Emu/RSX/RSXOffload.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "stdafx.h"

#include "Emu/Memory/vm.h"
#include "Common/BufferUtils.h"
#include "RSXOffload.h"
#include "RSXThread.h"
Expand Down Expand Up @@ -44,6 +45,8 @@ namespace rsx
{
case raw_copy:
{
const u32 vm_addr = vm::try_get_addr(job.src).first;
rsx::reservation_lock<true, 1> rsx_lock(vm_addr, job.length, g_cfg.core.rsx_atomic_vertex_upload && vm_addr);
std::memcpy(job.dst, job.src, job.length);
break;
}
Expand Down Expand Up @@ -108,6 +111,8 @@ namespace rsx
{
if (length <= max_immediate_transfer_size || !g_cfg.video.multithreaded_rsx)
{
const u32 vm_addr = vm::try_get_addr(src).first;
rsx::reservation_lock<true, 1> rsx_lock(vm_addr, length, g_cfg.core.rsx_atomic_vertex_upload && vm_addr);
std::memcpy(dst, src, length);
}
else
Expand Down
1 change: 1 addition & 0 deletions rpcs3/Emu/system_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,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 rsx_atomic_vertex_upload{this, "Atomic RSX Vertex Upload", false };

struct fifo_setting : public cfg::_enum<rsx_fifo_mode>
{
Expand Down

0 comments on commit ed60ccd

Please sign in to comment.