mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-07 07:21:25 +12:00
Compilation fix + CellSpursAttribute
This commit is contained in:
parent
201f0f3a9f
commit
c9132a4bdb
5 changed files with 149 additions and 128 deletions
|
@ -530,6 +530,24 @@ template<typename T, typename T1, T1 value> struct _se<be_t<T>, T1, value> : pub
|
||||||
#define se32(x) _se<u32, decltype(x), x>::value
|
#define se32(x) _se<u32, decltype(x), x>::value
|
||||||
#define se64(x) _se<u64, decltype(x), x>::value
|
#define se64(x) _se<u64, decltype(x), x>::value
|
||||||
|
|
||||||
|
// template that helps to define be_t arrays in unions
|
||||||
|
template<typename T, size_t size>
|
||||||
|
class be_array_t
|
||||||
|
{
|
||||||
|
be_t<T> data[size];
|
||||||
|
|
||||||
|
public:
|
||||||
|
__forceinline be_t<T>& operator [] (size_t index)
|
||||||
|
{
|
||||||
|
return data[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
__forceinline const be_t<T>& operator [] (size_t index) const
|
||||||
|
{
|
||||||
|
return data[index];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<typename T> __forceinline static u8 Read8(T& f)
|
template<typename T> __forceinline static u8 Read8(T& f)
|
||||||
{
|
{
|
||||||
u8 ret;
|
u8 ret;
|
||||||
|
|
|
@ -3,37 +3,6 @@
|
||||||
|
|
||||||
#include "SPURSManager.h"
|
#include "SPURSManager.h"
|
||||||
|
|
||||||
SPURSManagerAttribute::SPURSManagerAttribute(int nSpus, int spuPriority, int ppuPriority, bool exitIfNoWork)
|
|
||||||
{
|
|
||||||
this->nSpus = nSpus;
|
|
||||||
this->spuThreadGroupPriority = spuPriority;
|
|
||||||
this->ppuThreadPriority = ppuPriority;
|
|
||||||
this->exitIfNoWork = exitIfNoWork;
|
|
||||||
|
|
||||||
memset(this->namePrefix, 0, CELL_SPURS_NAME_MAX_LENGTH + 1);
|
|
||||||
this->threadGroupType = 0;
|
|
||||||
this->container = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SPURSManagerAttribute::_setNamePrefix(const char *name, u32 size)
|
|
||||||
{
|
|
||||||
strncpy(this->namePrefix, name, size);
|
|
||||||
this->namePrefix[0] = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SPURSManagerAttribute::_setSpuThreadGroupType(int type)
|
|
||||||
{
|
|
||||||
this->threadGroupType = type;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SPURSManagerAttribute::_setMemoryContainerForSpuThread(u32 container)
|
|
||||||
{
|
|
||||||
this->container = container;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SPURSManagerEventFlag::SPURSManagerEventFlag(u32 flagClearMode, u32 flagDirection)
|
SPURSManagerEventFlag::SPURSManagerEventFlag(u32 flagClearMode, u32 flagDirection)
|
||||||
{
|
{
|
||||||
this->flagClearMode = flagClearMode;
|
this->flagClearMode = flagClearMode;
|
||||||
|
@ -46,14 +15,12 @@ SPURSManagerTasksetAttribute::SPURSManagerTasksetAttribute(u64 args, vm::ptr<con
|
||||||
this->maxContention = maxContention;
|
this->maxContention = maxContention;
|
||||||
}
|
}
|
||||||
|
|
||||||
SPURSManager::SPURSManager(SPURSManagerAttribute *attr)
|
SPURSManager::SPURSManager()
|
||||||
{
|
{
|
||||||
this->attr = attr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPURSManager::Finalize()
|
void SPURSManager::Finalize()
|
||||||
{
|
{
|
||||||
delete this->attr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPURSManager::AttachLv2EventQueue(u32 queue, vm::ptr<u8> port, int isDynamic)
|
void SPURSManager::AttachLv2EventQueue(u32 queue, vm::ptr<u8> port, int isDynamic)
|
||||||
|
|
|
@ -2,28 +2,6 @@
|
||||||
|
|
||||||
#include "Emu/SysCalls/Modules/cellSpurs.h"
|
#include "Emu/SysCalls/Modules/cellSpurs.h"
|
||||||
|
|
||||||
// Internal class to shape a SPURS attribute.
|
|
||||||
class SPURSManagerAttribute
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SPURSManagerAttribute(int nSpus, int spuPriority, int ppuPriority, bool exitIfNoWork);
|
|
||||||
|
|
||||||
int _setNamePrefix(const char *name, u32 size);
|
|
||||||
|
|
||||||
int _setSpuThreadGroupType(int type);
|
|
||||||
|
|
||||||
int _setMemoryContainerForSpuThread(u32 container);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
be_t<int> nSpus;
|
|
||||||
be_t<int> spuThreadGroupPriority;
|
|
||||||
be_t<int> ppuThreadPriority;
|
|
||||||
bool exitIfNoWork;
|
|
||||||
char namePrefix[CELL_SPURS_NAME_MAX_LENGTH+1];
|
|
||||||
be_t<int> threadGroupType;
|
|
||||||
be_t<u32> container;
|
|
||||||
};
|
|
||||||
|
|
||||||
class SPURSManagerEventFlag
|
class SPURSManagerEventFlag
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -68,12 +46,9 @@ protected:
|
||||||
class SPURSManager
|
class SPURSManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SPURSManager(SPURSManagerAttribute *attr);
|
SPURSManager();
|
||||||
|
|
||||||
void Finalize();
|
void Finalize();
|
||||||
void AttachLv2EventQueue(u32 queue, vm::ptr<u8> port, int isDynamic);
|
void AttachLv2EventQueue(u32 queue, vm::ptr<u8> port, int isDynamic);
|
||||||
void DetachLv2EventQueue(u8 port);
|
void DetachLv2EventQueue(u8 port);
|
||||||
|
|
||||||
protected:
|
|
||||||
SPURSManagerAttribute *attr;
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -15,23 +15,23 @@ extern u32 libsre_rtoc;
|
||||||
|
|
||||||
s64 spursInit(
|
s64 spursInit(
|
||||||
vm::ptr<CellSpurs2> spurs,
|
vm::ptr<CellSpurs2> spurs,
|
||||||
u32 arg2,
|
u32 revision,
|
||||||
u64 arg3,
|
u32 sdkVersion,
|
||||||
s32 nSpus,
|
s32 nSpus,
|
||||||
s32 spuPriority,
|
s32 spuPriority,
|
||||||
s32 ppuPriority,
|
s32 ppuPriority,
|
||||||
u32 flags,
|
u32 flags,
|
||||||
u32 arg8,
|
const char prefix[],
|
||||||
u32 arg9,
|
u32 prefixSize,
|
||||||
u32 arg10,
|
u32 container,
|
||||||
u32 arg11,
|
u32 arg11,
|
||||||
u32 arg12,
|
u32 arg12,
|
||||||
u32 arg13)
|
u32 arg13)
|
||||||
{
|
{
|
||||||
// internal function
|
// internal function
|
||||||
#ifdef PRX_DEBUG
|
#ifdef PRX_DEBUG
|
||||||
return cb_caller<s32,vm::ptr<CellSpurs2>, u32, u64, s32, s32, s32, u32, u32, u32, u32, u32, u32, u32>::call(GetCurrentPPUThread(), libsre + 0x74E4, libsre_rtoc,
|
return cb_caller<s32,vm::ptr<CellSpurs2>, u32, u32, s32, s32, s32, u32, u32, u32, u32, u32, u32, u32>::call(GetCurrentPPUThread(), libsre + 0x74E4, libsre_rtoc,
|
||||||
spurs, arg2, arg3, nSpus, spuPriority, ppuPriority, flags, arg8, arg9, arg10, arg11, arg12, arg13);
|
spurs, revision, sdkVersion, nSpus, spuPriority, ppuPriority, flags, Memory.RealToVirtualAddr(prefix), prefixSize, container, arg11, arg12, arg13);
|
||||||
#else
|
#else
|
||||||
//spurs->spurs = new SPURSManager(attr);
|
//spurs->spurs = new SPURSManager(attr);
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
|
@ -54,7 +54,7 @@ s64 cellSpursInitialize(vm::ptr<CellSpurs> spurs, s32 nSpus, s32 spuPriority, s3
|
||||||
spuPriority,
|
spuPriority,
|
||||||
ppuPriority,
|
ppuPriority,
|
||||||
exitIfNoWork ? 1 : 0,
|
exitIfNoWork ? 1 : 0,
|
||||||
0,
|
nullptr,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -78,25 +78,25 @@ s64 cellSpursInitializeWithAttribute(vm::ptr<CellSpurs> spurs, vm::ptr<const Cel
|
||||||
{
|
{
|
||||||
return CELL_SPURS_CORE_ERROR_ALIGN;
|
return CELL_SPURS_CORE_ERROR_ALIGN;
|
||||||
}
|
}
|
||||||
if (attr->m.arg1 > 2)
|
if (attr->m.revision > 2)
|
||||||
{
|
{
|
||||||
return CELL_SPURS_CORE_ERROR_INVAL;
|
return CELL_SPURS_CORE_ERROR_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return spursInit(
|
return spursInit(
|
||||||
vm::ptr<CellSpurs2>::make(spurs.addr()),
|
vm::ptr<CellSpurs2>::make(spurs.addr()),
|
||||||
attr->m.arg1,
|
attr->m.revision,
|
||||||
attr->m.arg2,
|
attr->m.sdkVersion,
|
||||||
attr->m.nSpus,
|
attr->m.nSpus,
|
||||||
attr->m.spuPriority,
|
attr->m.spuPriority,
|
||||||
attr->m.ppuPriority,
|
attr->m.ppuPriority,
|
||||||
(u32)attr->_u32.raw[10] | (u32)attr->_u8[20],
|
(u32)attr->m.flags | (attr->m.exitIfNoWork ? 1 : 0),
|
||||||
attr.addr() + 0x15,
|
attr->m.prefix,
|
||||||
attr->_u32.raw[9],
|
attr->m.prefixSize,
|
||||||
attr->_u32.raw[11],
|
attr->m.container,
|
||||||
attr.addr() + 0x38,
|
attr.addr() + 0x38,
|
||||||
attr->_u32.raw[16],
|
attr->_u32[16],
|
||||||
attr->_u32.raw[17]);
|
attr->_u32[17]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,83 +115,106 @@ s64 cellSpursInitializeWithAttribute2(vm::ptr<CellSpurs2> spurs, vm::ptr<const C
|
||||||
{
|
{
|
||||||
return CELL_SPURS_CORE_ERROR_ALIGN;
|
return CELL_SPURS_CORE_ERROR_ALIGN;
|
||||||
}
|
}
|
||||||
if (attr->m.arg1 > 2)
|
if (attr->m.revision > 2)
|
||||||
{
|
{
|
||||||
return CELL_SPURS_CORE_ERROR_INVAL;
|
return CELL_SPURS_CORE_ERROR_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return spursInit(
|
return spursInit(
|
||||||
spurs,
|
spurs,
|
||||||
attr->m.arg1,
|
attr->m.revision,
|
||||||
attr->m.arg2,
|
attr->m.sdkVersion,
|
||||||
attr->m.nSpus,
|
attr->m.nSpus,
|
||||||
attr->m.spuPriority,
|
attr->m.spuPriority,
|
||||||
attr->m.ppuPriority,
|
attr->m.ppuPriority,
|
||||||
(u32)attr->_u32.raw[10] | (u32)attr->_u8[20] | 4,
|
(u32)attr->m.flags | (attr->m.exitIfNoWork ? 1 : 0) | 4,
|
||||||
attr.addr() + 0x15,
|
attr->m.prefix,
|
||||||
attr->_u32.raw[9],
|
attr->m.prefixSize,
|
||||||
attr->_u32.raw[11],
|
attr->m.container,
|
||||||
attr.addr() + 0x38,
|
attr.addr() + 0x38,
|
||||||
attr->_u32.raw[16],
|
attr->_u32[16],
|
||||||
attr->_u32.raw[17]);
|
attr->_u32[17]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
s64 cellSpursFinalize(vm::ptr<CellSpurs> spurs)
|
s64 _cellSpursAttributeInitialize(vm::ptr<CellSpursAttribute> attr, u32 revision, u32 sdkVersion, u32 nSpus, s32 spuPriority, s32 ppuPriority, bool exitIfNoWork)
|
||||||
{
|
{
|
||||||
cellSpurs->Warning("cellSpursFinalize(spurs_addr=0x%x)", spurs.addr());
|
cellSpurs->Warning("_cellSpursAttributeInitialize(attr_addr=0x%x, revision=%d, sdkVersion=0x%x, nSpus=%d, spuPriority=%d, ppuPriority=%d, exitIfNoWork=%d)",
|
||||||
|
attr.addr(), revision, sdkVersion, nSpus, spuPriority, ppuPriority, exitIfNoWork ? 1 : 0);
|
||||||
|
|
||||||
#ifdef PRX_DEBUG
|
#ifdef PRX_DEBUG_XXX
|
||||||
return GetCurrentPPUThread().FastCall2(libsre + 0x8568, libsre_rtoc);
|
|
||||||
#else
|
|
||||||
spurs->spurs->Finalize();
|
|
||||||
|
|
||||||
return CELL_OK;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
s64 _cellSpursAttributeInitialize(vm::ptr<CellSpursAttribute> attr, s32 nSpus, s32 spuPriority, s32 ppuPriority, bool exitIfNoWork)
|
|
||||||
{
|
|
||||||
cellSpurs->Warning("_cellSpursAttributeInitialize(attr_addr=0x%x, nSpus=%d, spuPriority=%d, ppuPriority=%d, exitIfNoWork=%d)",
|
|
||||||
attr.addr(), nSpus, spuPriority, ppuPriority, exitIfNoWork);
|
|
||||||
|
|
||||||
#ifdef PRX_DEBUG
|
|
||||||
return GetCurrentPPUThread().FastCall2(libsre + 0x72CC, libsre_rtoc);
|
return GetCurrentPPUThread().FastCall2(libsre + 0x72CC, libsre_rtoc);
|
||||||
#else
|
#else
|
||||||
attr->attr = new SPURSManagerAttribute(nSpus, spuPriority, ppuPriority, exitIfNoWork);
|
if (!attr)
|
||||||
|
{
|
||||||
|
return CELL_SPURS_CORE_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
if (attr.addr() % 8)
|
||||||
|
{
|
||||||
|
return CELL_SPURS_CORE_ERROR_ALIGN;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(attr.get_ptr(), 0, attr->size);
|
||||||
|
attr->m.revision = revision;
|
||||||
|
attr->m.sdkVersion = sdkVersion;
|
||||||
|
attr->m.nSpus = nSpus;
|
||||||
|
attr->m.spuPriority = spuPriority;
|
||||||
|
attr->m.ppuPriority = ppuPriority;
|
||||||
|
attr->m.exitIfNoWork = exitIfNoWork;
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
s64 cellSpursAttributeSetMemoryContainerForSpuThread(vm::ptr<CellSpursAttribute> attr, u32 container)
|
s64 cellSpursAttributeSetMemoryContainerForSpuThread(vm::ptr<CellSpursAttribute> attr, u32 container)
|
||||||
{
|
{
|
||||||
cellSpurs->Warning("cellSpursAttributeSetMemoryContainerForSpuThread(attr_addr=0x%x, container=0x%x)", attr.addr(), container);
|
cellSpurs->Warning("cellSpursAttributeSetMemoryContainerForSpuThread(attr_addr=0x%x, container=%d)", attr.addr(), container);
|
||||||
|
|
||||||
#ifdef PRX_DEBUG
|
#ifdef PRX_DEBUG_XXX
|
||||||
return GetCurrentPPUThread().FastCall2(libsre + 0x6FF8, libsre_rtoc);
|
return GetCurrentPPUThread().FastCall2(libsre + 0x6FF8, libsre_rtoc);
|
||||||
#else
|
#else
|
||||||
attr->attr->_setMemoryContainerForSpuThread(container);
|
if (!attr)
|
||||||
|
{
|
||||||
|
return CELL_SPURS_CORE_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
if (attr.addr() % 8)
|
||||||
|
{
|
||||||
|
return CELL_SPURS_CORE_ERROR_ALIGN;
|
||||||
|
}
|
||||||
|
CellSpursAttribute a = *attr;
|
||||||
|
if ((u32)a.m.flags & 0x20000000) // check unknown flag
|
||||||
|
{
|
||||||
|
return CELL_SPURS_CORE_ERROR_STAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
attr->_u32[11] = container;
|
||||||
|
attr->m.flags |= 0x40000000; // set unknown flag
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
s64 cellSpursAttributeSetNamePrefix(vm::ptr<CellSpursAttribute> attr, vm::ptr<const char> prefix, u32 size)
|
s64 cellSpursAttributeSetNamePrefix(vm::ptr<CellSpursAttribute> attr, vm::ptr<const char> prefix, u32 size)
|
||||||
{
|
{
|
||||||
cellSpurs->Warning("cellSpursAttributeSetNamePrefix(attr_addr=0x%x, prefix_addr=0x%x, size=0x%x)", attr.addr(), prefix.addr(), size);
|
cellSpurs->Warning("cellSpursAttributeSetNamePrefix(attr_addr=0x%x, prefix_addr=0x%x, size=%d)", attr.addr(), prefix.addr(), size);
|
||||||
|
|
||||||
#ifdef PRX_DEBUG
|
#ifdef PRX_DEBUG_XXX
|
||||||
return GetCurrentPPUThread().FastCall2(libsre + 0x7234, libsre_rtoc);
|
return GetCurrentPPUThread().FastCall2(libsre + 0x7234, libsre_rtoc);
|
||||||
#else
|
#else
|
||||||
|
if (!attr || !prefix)
|
||||||
|
{
|
||||||
|
return CELL_SPURS_CORE_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
if (attr.addr() % 8)
|
||||||
|
{
|
||||||
|
return CELL_SPURS_CORE_ERROR_ALIGN;
|
||||||
|
}
|
||||||
|
|
||||||
if (size > CELL_SPURS_NAME_MAX_LENGTH)
|
if (size > CELL_SPURS_NAME_MAX_LENGTH)
|
||||||
{
|
{
|
||||||
cellSpurs->Error("cellSpursAttributeSetNamePrefix : CELL_SPURS_CORE_ERROR_INVAL");
|
|
||||||
return CELL_SPURS_CORE_ERROR_INVAL;
|
return CELL_SPURS_CORE_ERROR_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
attr->attr->_setNamePrefix(prefix.get_ptr(), size);
|
memcpy(attr->m.prefix, prefix.get_ptr(), size);
|
||||||
|
attr->m.prefixSize = size;
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -211,12 +234,37 @@ s64 cellSpursAttributeSetSpuThreadGroupType(vm::ptr<CellSpursAttribute> attr, s3
|
||||||
{
|
{
|
||||||
cellSpurs->Warning("cellSpursAttributeSetSpuThreadGroupType(attr_addr=0x%x, type=%d)", attr.addr(), type);
|
cellSpurs->Warning("cellSpursAttributeSetSpuThreadGroupType(attr_addr=0x%x, type=%d)", attr.addr(), type);
|
||||||
|
|
||||||
#ifdef PRX_DEBUG
|
#ifdef PRX_DEBUG_XXX
|
||||||
return GetCurrentPPUThread().FastCall2(libsre + 0x70C8, libsre_rtoc);
|
return GetCurrentPPUThread().FastCall2(libsre + 0x70C8, libsre_rtoc);
|
||||||
#else
|
#else
|
||||||
attr->attr->_setSpuThreadGroupType(type);
|
if (!attr)
|
||||||
|
{
|
||||||
|
return CELL_SPURS_CORE_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
if (attr.addr() % 8)
|
||||||
|
{
|
||||||
|
return CELL_SPURS_CORE_ERROR_ALIGN;
|
||||||
|
}
|
||||||
|
|
||||||
return CELL_OK;
|
if (type == 0x18)
|
||||||
|
{
|
||||||
|
if (attr->m.flags & 0x40000000) // check unknown flag
|
||||||
|
{
|
||||||
|
return CELL_SPURS_CORE_ERROR_STAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
attr->m.flags |= 0x20000000; // set unknown flag
|
||||||
|
return CELL_OK;
|
||||||
|
}
|
||||||
|
else if (type)
|
||||||
|
{
|
||||||
|
return CELL_SPURS_CORE_ERROR_INVAL;
|
||||||
|
}
|
||||||
|
else // if type == 0
|
||||||
|
{
|
||||||
|
attr->m.flags &= ~0x20000000; // clear unknown flag
|
||||||
|
return CELL_OK;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,6 +288,19 @@ s64 cellSpursAttributeEnableSystemWorkload(vm::ptr<CellSpursAttribute> attr, vm:
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s64 cellSpursFinalize(vm::ptr<CellSpurs> spurs)
|
||||||
|
{
|
||||||
|
cellSpurs->Warning("cellSpursFinalize(spurs_addr=0x%x)", spurs.addr());
|
||||||
|
|
||||||
|
#ifdef PRX_DEBUG
|
||||||
|
return GetCurrentPPUThread().FastCall2(libsre + 0x8568, libsre_rtoc);
|
||||||
|
#else
|
||||||
|
spurs->spurs->Finalize();
|
||||||
|
|
||||||
|
return CELL_OK;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
s64 cellSpursGetSpuThreadGroupId(vm::ptr<CellSpurs> spurs, vm::ptr<be_t<u32>> group)
|
s64 cellSpursGetSpuThreadGroupId(vm::ptr<CellSpurs> spurs, vm::ptr<be_t<u32>> group)
|
||||||
{
|
{
|
||||||
#ifdef PRX_DEBUG
|
#ifdef PRX_DEBUG
|
||||||
|
|
|
@ -77,7 +77,6 @@ enum TaskConstants
|
||||||
};
|
};
|
||||||
|
|
||||||
class SPURSManager;
|
class SPURSManager;
|
||||||
class SPURSManagerAttribute;
|
|
||||||
class SPURSManagerEventFlag;
|
class SPURSManagerEventFlag;
|
||||||
class SPURSManagerTaskset;
|
class SPURSManagerTaskset;
|
||||||
|
|
||||||
|
@ -100,27 +99,28 @@ struct CellSpursAttribute
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
// raw data
|
// raw data
|
||||||
u8 _u8[size / sizeof(u8)];
|
u8 _u8[size];
|
||||||
|
be_array_t<u32, size / sizeof(u32)> _u32;
|
||||||
struct
|
|
||||||
{
|
|
||||||
be_t<u32> raw[size / sizeof(u32)];
|
|
||||||
} _u32;
|
|
||||||
|
|
||||||
// real structure
|
// real structure
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
be_t<u32> arg1;
|
be_t<u32> revision; // 0x0
|
||||||
be_t<u32> arg2;
|
be_t<u32> sdkVersion; // 0x4
|
||||||
be_t<u32> nSpus;
|
be_t<u32> nSpus; // 0x8
|
||||||
be_t<s32> spuPriority;
|
be_t<s32> spuPriority; // 0xC
|
||||||
be_t<s32> ppuPriority;
|
be_t<s32> ppuPriority; // 0x10
|
||||||
|
bool exitIfNoWork; // 0x14
|
||||||
|
char prefix[15]; // 0x15 (not a NTS)
|
||||||
|
be_t<u32> prefixSize; // 0x24
|
||||||
|
be_t<u32> flags; // 0x28
|
||||||
|
be_t<u32> container; // 0x2C
|
||||||
|
// ...
|
||||||
} m;
|
} m;
|
||||||
|
|
||||||
// alternative implementation
|
// alternative implementation
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
SPURSManagerAttribute *attr;
|
|
||||||
} c;
|
} c;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue