mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-06 18:40:36 +00:00
rsx: Write 4-byte long data to all semaphores (#8246)
* rsx: Write 4-byte long data to all semaphores
This commit is contained in:
parent
a2653532ef
commit
377e2ce3e8
@ -198,17 +198,18 @@ error_code sys_rsx_context_allocate(vm::ptr<u32> context_id, vm::ptr<u64> lpar_d
|
||||
auto &reports = vm::_ref<RsxReports>(vm::cast(*lpar_reports, HERE));
|
||||
std::memset(&reports, 0, sizeof(RsxReports));
|
||||
|
||||
for (int i = 0; i < 64; ++i)
|
||||
for (size_t i = 0; i < std::size(reports.notify); ++i)
|
||||
reports.notify[i].timestamp = -1;
|
||||
|
||||
for (int i = 0; i < 256; ++i)
|
||||
for (size_t i = 0; i < std::size(reports.semaphore); i += 4)
|
||||
{
|
||||
reports.semaphore[i].val = 0x1337C0D3;
|
||||
reports.semaphore[i].zero = 0x1337BABE;
|
||||
reports.semaphore[i].zero2 = 0x1337BEEF1337F001;
|
||||
reports.semaphore[i + 0].val.raw() = 0x1337C0D3;
|
||||
reports.semaphore[i + 1].val.raw() = 0x1337BABE;
|
||||
reports.semaphore[i + 2].val.raw() = 0x1337BEEF;
|
||||
reports.semaphore[i + 3].val.raw() = 0x1337F001;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 2048; ++i)
|
||||
for (size_t i = 0; i < std::size(reports.report); ++i)
|
||||
{
|
||||
reports.report[i].val = 0;
|
||||
reports.report[i].timestamp = -1;
|
||||
|
@ -84,11 +84,9 @@ struct RsxDmaControl
|
||||
be_t<u32> unk1;
|
||||
};
|
||||
|
||||
struct alignas(16) RsxSemaphore
|
||||
struct RsxSemaphore
|
||||
{
|
||||
be_t<u32> val;
|
||||
be_t<u32> zero;
|
||||
be_t<u64> zero2;
|
||||
atomic_be_t<u32> val;
|
||||
};
|
||||
|
||||
struct alignas(16) RsxNotify
|
||||
@ -106,7 +104,7 @@ struct alignas(16) RsxReport
|
||||
|
||||
struct RsxReports
|
||||
{
|
||||
RsxSemaphore semaphore[0x100];
|
||||
RsxSemaphore semaphore[0x400];
|
||||
RsxNotify notify[64];
|
||||
RsxReport report[2048];
|
||||
};
|
||||
|
@ -55,7 +55,7 @@ namespace rsx
|
||||
rsx->sync_point_request.release(true);
|
||||
const u32 addr = get_address(method_registers.semaphore_offset_406e(), method_registers.semaphore_context_dma_406e(), HERE);
|
||||
|
||||
const auto& sema = vm::_ref<atomic_be_t<u32>>(addr);
|
||||
const auto& sema = vm::_ref<RsxSemaphore>(addr).val;
|
||||
|
||||
// TODO: Remove vblank semaphore hack
|
||||
if (addr == rsx->device_addr + 0x30) return;
|
||||
@ -126,7 +126,14 @@ namespace rsx
|
||||
{
|
||||
rsx->sync();
|
||||
|
||||
const u32 offset = method_registers.semaphore_offset_406e() & -16;
|
||||
const u32 offset = method_registers.semaphore_offset_406e();
|
||||
|
||||
if (offset % 4)
|
||||
{
|
||||
rsx_log.warning("NV406E semaphore release is using unaligned semaphore, ignoring. (offset=0x%x)", offset);
|
||||
return;
|
||||
}
|
||||
|
||||
const u32 ctxt = method_registers.semaphore_context_dma_406e();
|
||||
|
||||
// By avoiding doing this on flip's semaphore release
|
||||
@ -147,7 +154,7 @@ namespace rsx
|
||||
res = &vm::reservation_lock(addr, 4);
|
||||
}
|
||||
|
||||
vm::_ref<atomic_t<RsxSemaphore>>(addr).store({arg, 0, 0});
|
||||
vm::_ref<RsxSemaphore>(addr).val = arg;
|
||||
|
||||
if (res)
|
||||
{
|
||||
@ -225,13 +232,16 @@ namespace rsx
|
||||
|
||||
// lle-gcm likes to inject system reserved semaphores, presumably for system/vsh usage
|
||||
// Avoid calling render to avoid any havoc(flickering) they may cause from invalid flush/write
|
||||
const u32 offset = method_registers.semaphore_offset_4097() & -16;
|
||||
vm::_ref<atomic_t<RsxSemaphore>>(get_address(offset, method_registers.semaphore_context_dma_4097(), HERE)).store(
|
||||
const u32 offset = method_registers.semaphore_offset_4097();
|
||||
|
||||
if (offset % 16)
|
||||
{
|
||||
arg,
|
||||
0,
|
||||
0
|
||||
});
|
||||
rsx_log.error("NV4097 semaphore using unaligned offset, recovering. (offset=0x%x)", offset);
|
||||
rsx->recover_fifo();
|
||||
return;
|
||||
}
|
||||
|
||||
vm::_ref<RsxSemaphore>(get_address(offset, method_registers.semaphore_context_dma_4097(), HERE)).val = arg;
|
||||
}
|
||||
|
||||
void back_end_write_semaphore_release(thread* rsx, u32 _reg, u32 arg)
|
||||
@ -240,14 +250,17 @@ namespace rsx
|
||||
g_fxo->get<rsx::dma_manager>()->sync();
|
||||
rsx->sync();
|
||||
|
||||
const u32 offset = method_registers.semaphore_offset_4097() & -16;
|
||||
const u32 val = (arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff);
|
||||
vm::_ref<atomic_t<RsxSemaphore>>(get_address(offset, method_registers.semaphore_context_dma_4097(), HERE)).store(
|
||||
const u32 offset = method_registers.semaphore_offset_4097();
|
||||
|
||||
if (offset % 16)
|
||||
{
|
||||
val,
|
||||
0,
|
||||
0
|
||||
});
|
||||
rsx_log.error("NV4097 semaphore using unaligned offset, recovering. (offset=0x%x)", offset);
|
||||
rsx->recover_fifo();
|
||||
return;
|
||||
}
|
||||
|
||||
const u32 val = (arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff);
|
||||
vm::_ref<RsxSemaphore>(get_address(offset, method_registers.semaphore_context_dma_4097(), HERE)).val = val;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user