mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-17 17:11:23 +00:00
Implement HLE cellSpursAddUrgentCommand
This commit is contained in:
parent
17f7f329a8
commit
019d2d5dcf
@ -17,6 +17,11 @@
|
|||||||
|
|
||||||
LOG_CHANNEL(cellSpurs);
|
LOG_CHANNEL(cellSpurs);
|
||||||
|
|
||||||
|
extern u64 ppu_ldarx(ppu_thread&, u32);
|
||||||
|
extern u32 ppu_lwarx(ppu_thread&, u32);
|
||||||
|
extern bool ppu_stwcx(ppu_thread&, u32, u32);
|
||||||
|
extern bool ppu_stdcx(ppu_thread&, u32, u64);
|
||||||
|
|
||||||
error_code sys_spu_image_close(ppu_thread&, vm::ptr<sys_spu_image> img);
|
error_code sys_spu_image_close(ppu_thread&, vm::ptr<sys_spu_image> img);
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@ -4087,9 +4092,60 @@ s32 cellSpursJobHeaderSetJobbin2Param()
|
|||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 cellSpursAddUrgentCommand()
|
s32 cellSpursAddUrgentCommand(ppu_thread& ppu, vm::ptr<CellSpursJobChain> jobChain, u64 newCmd)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED_FUNC(cellSpurs);
|
cellSpurs.trace("cellSpursAddUrgentCommand(jobChain=*0x%x, newCmd=0x%llx)", jobChain, newCmd);
|
||||||
|
|
||||||
|
if (!jobChain)
|
||||||
|
return CELL_SPURS_JOB_ERROR_NULL_POINTER;
|
||||||
|
|
||||||
|
if (!jobChain.aligned(128))
|
||||||
|
return CELL_SPURS_JOB_ERROR_ALIGN;
|
||||||
|
|
||||||
|
if (jobChain->workloadId >= 32)
|
||||||
|
return CELL_SPURS_JOB_ERROR_INVAL;
|
||||||
|
|
||||||
|
for (u32 i = 0;;)
|
||||||
|
{
|
||||||
|
if (i >= std::size(jobChain->urgentCmds))
|
||||||
|
{
|
||||||
|
// Exausted all slots
|
||||||
|
return CELL_SPURS_JOB_ERROR_BUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 currCmd = ppu_ldarx(ppu, jobChain.ptr(&CellSpursJobChain::urgentCmds, i).addr());
|
||||||
|
std::atomic_thread_fence(std::memory_order_acq_rel);
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
bool reset = false;
|
||||||
|
|
||||||
|
if (!currCmd)
|
||||||
|
{
|
||||||
|
if (i != 0 && !jobChain->urgentCmds[i - 1])
|
||||||
|
{
|
||||||
|
// Restart search, someone emptied out the previous one
|
||||||
|
reset = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
currCmd = newCmd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reset || !ppu_stdcx(ppu, jobChain.ptr(&CellSpursJobChain::urgentCmds, i).addr(), currCmd))
|
||||||
|
{
|
||||||
|
// Someone modified the job chain or the previous slot is empty, restart search
|
||||||
|
i = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found)
|
||||||
|
break;
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -410,6 +410,20 @@ struct alignas(16) CellSpursTracePacket
|
|||||||
|
|
||||||
CHECK_SIZE_ALIGN(CellSpursTracePacket, 16, 16);
|
CHECK_SIZE_ALIGN(CellSpursTracePacket, 16, 16);
|
||||||
|
|
||||||
|
struct alignas(128) CellSpursJobChain
|
||||||
|
{
|
||||||
|
u8 unk1[0x2C]; // 0x0
|
||||||
|
u8 val2C; // 0x2C
|
||||||
|
u8 val2D; // 0x2D
|
||||||
|
u8 val2E; // 0x2E
|
||||||
|
u8 val2F; // 0x2F
|
||||||
|
atomic_be_t<u64> urgentCmds[4]; // 0x30
|
||||||
|
u8 unk2[0x24]; // 0x50
|
||||||
|
be_t<u32> workloadId; // 0x74
|
||||||
|
vm::bptr<CellSpurs> spurs; // 0x78
|
||||||
|
u8 unk3[0x94]; // 0x7C
|
||||||
|
};
|
||||||
|
|
||||||
// Core CellSpurs structures
|
// Core CellSpurs structures
|
||||||
struct alignas(128) CellSpurs
|
struct alignas(128) CellSpurs
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user