mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-04 22:11:26 +12:00
rsx: Implement atomic vertex upload (with Strict Rendering Mode)
This commit is contained in:
parent
fb01ed55e5
commit
ee1384341e
4 changed files with 8 additions and 3 deletions
|
@ -6563,7 +6563,7 @@ public:
|
||||||
break;
|
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.video.strict_rendering_mode || !g_use_rtm)
|
||||||
{
|
{
|
||||||
// TODO: don't require TSX (current implementation is TSX-only)
|
// TODO: don't require TSX (current implementation is TSX-only)
|
||||||
if (cmdh == MFC_PUT_CMD || cmdh == MFC_SNDSIG_CMD)
|
if (cmdh == MFC_PUT_CMD || cmdh == MFC_SNDSIG_CMD)
|
||||||
|
|
|
@ -2063,7 +2063,7 @@ void spu_thread::do_dma_transfer(spu_thread* _this, const spu_mfc_cmd& args, u8*
|
||||||
src = zero_buf;
|
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.video.strict_rendering_mode || (g_cfg.core.rsx_fifo_accuracy && !g_cfg.core.spu_accurate_dma && eal < rsx::constants::local_mem_base)));
|
||||||
|
|
||||||
if ((!g_use_rtm && !is_get) || g_cfg.core.spu_accurate_dma) [[unlikely]]
|
if ((!g_use_rtm && !is_get) || g_cfg.core.spu_accurate_dma) [[unlikely]]
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "Emu/Memory/vm.h"
|
||||||
#include "Common/BufferUtils.h"
|
#include "Common/BufferUtils.h"
|
||||||
#include "RSXOffload.h"
|
#include "RSXOffload.h"
|
||||||
#include "RSXThread.h"
|
#include "RSXThread.h"
|
||||||
|
@ -44,6 +45,8 @@ namespace rsx
|
||||||
{
|
{
|
||||||
case raw_copy:
|
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.video.strict_rendering_mode && vm_addr);
|
||||||
std::memcpy(job.dst, job.src, job.length);
|
std::memcpy(job.dst, job.src, job.length);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -108,6 +111,8 @@ namespace rsx
|
||||||
{
|
{
|
||||||
if (length <= max_immediate_transfer_size || !g_cfg.video.multithreaded_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.video.strict_rendering_mode && vm_addr);
|
||||||
std::memcpy(dst, src, length);
|
std::memcpy(dst, src, length);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -879,7 +879,7 @@ namespace rsx
|
||||||
|
|
||||||
reservation_lock(u32 addr, u32 length, bool setting)
|
reservation_lock(u32 addr, u32 length, bool setting)
|
||||||
{
|
{
|
||||||
if (setting && addr < constants::local_mem_base)
|
if (setting)
|
||||||
{
|
{
|
||||||
lock_range(addr, length);
|
lock_range(addr, length);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue