mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-13 18:28:35 +12: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
3 changed files with 39 additions and 27 deletions
|
@ -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));
|
auto &reports = vm::_ref<RsxReports>(vm::cast(*lpar_reports, HERE));
|
||||||
std::memset(&reports, 0, sizeof(RsxReports));
|
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;
|
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 + 0].val.raw() = 0x1337C0D3;
|
||||||
reports.semaphore[i].zero = 0x1337BABE;
|
reports.semaphore[i + 1].val.raw() = 0x1337BABE;
|
||||||
reports.semaphore[i].zero2 = 0x1337BEEF1337F001;
|
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].val = 0;
|
||||||
reports.report[i].timestamp = -1;
|
reports.report[i].timestamp = -1;
|
||||||
|
|
|
@ -84,11 +84,9 @@ struct RsxDmaControl
|
||||||
be_t<u32> unk1;
|
be_t<u32> unk1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct alignas(16) RsxSemaphore
|
struct RsxSemaphore
|
||||||
{
|
{
|
||||||
be_t<u32> val;
|
atomic_be_t<u32> val;
|
||||||
be_t<u32> zero;
|
|
||||||
be_t<u64> zero2;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct alignas(16) RsxNotify
|
struct alignas(16) RsxNotify
|
||||||
|
@ -106,7 +104,7 @@ struct alignas(16) RsxReport
|
||||||
|
|
||||||
struct RsxReports
|
struct RsxReports
|
||||||
{
|
{
|
||||||
RsxSemaphore semaphore[0x100];
|
RsxSemaphore semaphore[0x400];
|
||||||
RsxNotify notify[64];
|
RsxNotify notify[64];
|
||||||
RsxReport report[2048];
|
RsxReport report[2048];
|
||||||
};
|
};
|
||||||
|
|
|
@ -55,7 +55,7 @@ namespace rsx
|
||||||
rsx->sync_point_request.release(true);
|
rsx->sync_point_request.release(true);
|
||||||
const u32 addr = get_address(method_registers.semaphore_offset_406e(), method_registers.semaphore_context_dma_406e(), HERE);
|
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
|
// TODO: Remove vblank semaphore hack
|
||||||
if (addr == rsx->device_addr + 0x30) return;
|
if (addr == rsx->device_addr + 0x30) return;
|
||||||
|
@ -126,7 +126,14 @@ namespace rsx
|
||||||
{
|
{
|
||||||
rsx->sync();
|
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();
|
const u32 ctxt = method_registers.semaphore_context_dma_406e();
|
||||||
|
|
||||||
// By avoiding doing this on flip's semaphore release
|
// By avoiding doing this on flip's semaphore release
|
||||||
|
@ -147,7 +154,7 @@ namespace rsx
|
||||||
res = &vm::reservation_lock(addr, 4);
|
res = &vm::reservation_lock(addr, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
vm::_ref<atomic_t<RsxSemaphore>>(addr).store({arg, 0, 0});
|
vm::_ref<RsxSemaphore>(addr).val = arg;
|
||||||
|
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
|
@ -225,13 +232,16 @@ namespace rsx
|
||||||
|
|
||||||
// lle-gcm likes to inject system reserved semaphores, presumably for system/vsh usage
|
// 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
|
// Avoid calling render to avoid any havoc(flickering) they may cause from invalid flush/write
|
||||||
const u32 offset = method_registers.semaphore_offset_4097() & -16;
|
const u32 offset = method_registers.semaphore_offset_4097();
|
||||||
vm::_ref<atomic_t<RsxSemaphore>>(get_address(offset, method_registers.semaphore_context_dma_4097(), HERE)).store(
|
|
||||||
|
if (offset % 16)
|
||||||
{
|
{
|
||||||
arg,
|
rsx_log.error("NV4097 semaphore using unaligned offset, recovering. (offset=0x%x)", offset);
|
||||||
0,
|
rsx->recover_fifo();
|
||||||
0
|
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)
|
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();
|
g_fxo->get<rsx::dma_manager>()->sync();
|
||||||
rsx->sync();
|
rsx->sync();
|
||||||
|
|
||||||
const u32 offset = method_registers.semaphore_offset_4097() & -16;
|
const u32 offset = method_registers.semaphore_offset_4097();
|
||||||
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(
|
if (offset % 16)
|
||||||
{
|
{
|
||||||
val,
|
rsx_log.error("NV4097 semaphore using unaligned offset, recovering. (offset=0x%x)", offset);
|
||||||
0,
|
rsx->recover_fifo();
|
||||||
0
|
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…
Add table
Add a link
Reference in a new issue