mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-13 02:08:49 +12:00
- Improved sc function binder.
- Improved GLGSRender.
This commit is contained in:
parent
3bb7a299ca
commit
5753edf6ef
133 changed files with 13624 additions and 3898 deletions
|
@ -1,81 +1,14 @@
|
|||
#include "stdafx.h"
|
||||
#include "RSXThread.h"
|
||||
|
||||
enum MethodFlag
|
||||
{
|
||||
CELL_GCM_METHOD_FLAG_NON_INCREMENT = 0x40000000,
|
||||
CELL_GCM_METHOD_FLAG_JUMP = 0x20000000,
|
||||
CELL_GCM_METHOD_FLAG_CALL = 0x00000002,
|
||||
CELL_GCM_METHOD_FLAG_RETURN = 0x00020000,
|
||||
};
|
||||
|
||||
RSXThread::RSXThread(
|
||||
CellGcmControl* ctrl,
|
||||
u32 ioAddress,
|
||||
void (&cmd)(const u32 fcmd, const u32 cmd, mem32_t& args, const u32 count),
|
||||
bool (&_flip)(),
|
||||
bool (&_TestExit)()
|
||||
)
|
||||
RSXThread::RSXThread(CellGcmControl* ctrl, u32 ioAddress)
|
||||
: m_ctrl(*ctrl)
|
||||
, m_ioAddress(ioAddress)
|
||||
, DoCmd(cmd)
|
||||
, flip(_flip)
|
||||
, TestExit(_TestExit)
|
||||
{
|
||||
}
|
||||
|
||||
void RSXThread::Task()
|
||||
{
|
||||
while(!TestDestroy() && !TestExit())
|
||||
{
|
||||
if(m_ctrl.get == m_ctrl.put)
|
||||
{
|
||||
flip();
|
||||
|
||||
Sleep(1);
|
||||
continue;
|
||||
}
|
||||
|
||||
const u32 get = re(m_ctrl.get);
|
||||
const u32 cmd = Memory.Read32(m_ioAddress + get);
|
||||
const u32 count = (cmd >> 18) & 0x7ff;
|
||||
mem32_t data(m_ioAddress + get + 4);
|
||||
|
||||
if(cmd & CELL_GCM_METHOD_FLAG_JUMP)
|
||||
{
|
||||
m_ctrl.get = re32(cmd & ~(CELL_GCM_METHOD_FLAG_JUMP | CELL_GCM_METHOD_FLAG_NON_INCREMENT));
|
||||
continue;
|
||||
}
|
||||
if(cmd & CELL_GCM_METHOD_FLAG_CALL)
|
||||
{
|
||||
call_stack.AddCpy(get + 4);
|
||||
m_ctrl.get = re32(cmd & ~CELL_GCM_METHOD_FLAG_CALL);
|
||||
continue;
|
||||
}
|
||||
if(cmd & CELL_GCM_METHOD_FLAG_RETURN)
|
||||
{
|
||||
const u32 pos = call_stack.GetCount() - 1;
|
||||
m_ctrl.get = re32(call_stack[pos]);
|
||||
call_stack.RemoveAt(pos);
|
||||
continue;
|
||||
}
|
||||
if(cmd & CELL_GCM_METHOD_FLAG_NON_INCREMENT)
|
||||
{
|
||||
//ConLog.Warning("non increment cmd! 0x%x", cmd);
|
||||
}
|
||||
|
||||
#if 0
|
||||
wxString debug = getMethodName(cmd & 0x3ffff);
|
||||
debug += "(";
|
||||
for(u32 i=0; i<count; ++i) debug += (i ? ", " : "") + wxString::Format("0x%x", data[i]);
|
||||
debug += ")";
|
||||
ConLog.Write(debug);
|
||||
#endif
|
||||
DoCmd(cmd, cmd & 0x3ffff, data, count);
|
||||
|
||||
m_ctrl.get = re32(get + (count + 1) * 4);
|
||||
memset(Memory.GetMemFromAddr(m_ioAddress + get), 0, (count + 1) * 4);
|
||||
}
|
||||
}
|
||||
|
||||
void RSXThread::OnExit()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue