Files
Petari/include/Game/System/DrawSyncManager.hpp

92 lines
2.1 KiB
C++

#pragma once
#include <revolution.h>
class DrawSyncCallback {
public:
DrawSyncCallback() {
}
virtual void drawSyncCallback(u16 token) = 0;
};
class Fifo {
public:
Fifo(u32 capacity) : mCount(capacity), mLoopIdx(), mWriteIndex() {
mArray = new void*[capacity + 1];
}
void push(void* pValue) {
mArray[mWriteIndex] = pValue;
mWriteIndex = getLoopIdx(mWriteIndex + 1);
}
void* pop();
u32 getLoopIdx(u32 index);
u32 getCount();
void* peek(u32 offset) {
return mArray[getLoopIdx(mLoopIdx + offset)];
}
/* 0x00 */ void** mArray;
/* 0x04 */ u32 mCount;
/* 0x08 */ u32 mLoopIdx;
/* 0x0C */ u32 mWriteIndex;
};
class DrawSyncManager {
public:
struct TDrawSyncTokenRange {
TDrawSyncTokenRange() : mStart(), mEnd(), mCallback() {
}
TDrawSyncTokenRange(u16 start, u16 end, DrawSyncCallback* pCallback) : mStart(start), mEnd(end), mCallback(pCallback) {
}
/* 0x00 */ u16 mStart;
/* 0x02 */ u16 mEnd;
/* 0x04 */ DrawSyncCallback* mCallback;
};
DrawSyncManager(u32 capacity, s32 priority);
~DrawSyncManager();
void reset(bool preparing);
static DrawSyncManager* start(u32 capacity, s32 priority);
static void prepareReset();
static void resetIfAborted();
void clearFifo();
static void end();
void drawSyncCallbackSub(u16 token);
void pushBreakPoint();
#if (VERSION == RMGJ01 || VERSION == RMGE01 || VERSION == RMGP01)
void clearSceneCallback();
#endif
static void drawSyncCallback(u16 token);
static void* threadFunc(void* pArg);
u16 setCallback(u32 index, u16 count, DrawSyncCallback* pCallback);
static DrawSyncManager* sInstance;
/* 0x000 */ TDrawSyncTokenRange mTokenRanges[5];
/* 0x028 */ OSThread mThread;
/* 0x340 */ OSMessageQueue mQueue;
/* 0x360 */ u8* mStack;
/* 0x364 */ OSMessage* mMessageBuffer;
/* 0x368 */ Fifo* mFifo;
/* 0x36C */ u16 mFlags;
/* 0x36E */ u16 mLowTokenCount;
/* 0x370 */ u16 mHighTokenCount;
/* 0x372 */ bool mPreparingReset;
/* 0x373 */ volatile bool mAborted;
/* 0x374 */ u32 _374;
};