mirror of
https://github.com/zeldaret/ss
synced 2026-06-03 02:29:00 -04:00
103 lines
2.6 KiB
C++
103 lines
2.6 KiB
C++
#include "egg/core/eggDisplay.h"
|
|
#include "nw4r/db/db_directPrint.h"
|
|
#include "egg/core/eggXfbManager.h"
|
|
#include "rvl/GX.h"
|
|
#include "rvl/OS/OSHardware.h"
|
|
|
|
extern "C" {
|
|
void PreRetraceCallback(u32 retraceCount) {
|
|
EGG::BaseSystem::getDisplay()->preVRetrace();
|
|
}
|
|
}
|
|
namespace EGG {
|
|
|
|
u32 Display::sTickPeriod = ((OS_BUS_CLOCK_SPEED >> 2)/125000)*300 >> 3;
|
|
|
|
/* 80497570 */
|
|
Display::Display(u8 maxRetrace) :
|
|
mMaxRetraces(maxRetrace),
|
|
mScreenStateFlag(0),
|
|
mRetraceCount(0),
|
|
mFrameCount(0),
|
|
mClearColor(0x808080ff),
|
|
mClearZ(0xFFFFFF),
|
|
mBeginTick(0),
|
|
mFlag(0)
|
|
{
|
|
mFlag.setBit(mFlag_SetClear);
|
|
mFlag.setBit(mFlag_WaitForRetrace);
|
|
nw4r::db::DirectPrint_Init();
|
|
VISetPreRetraceCallback(PreRetraceCallback);
|
|
}
|
|
|
|
/* vt 0x18 | 804975f0 */
|
|
u32 Display::getTickPerFrame() {
|
|
return Video::getTickPerVRetrace();
|
|
}
|
|
/* vt 0x08 | 80497600 */
|
|
void Display::beginFrame() {
|
|
|
|
GXDrawDone();
|
|
if (
|
|
mFlag.onBit(mFlag_WaitForRetrace)
|
|
|| (BaseSystem::getXfbMgr()->mNumXfbs == 1
|
|
&& OSGetTick()-mLastTick > sTickPeriod)) {
|
|
VIWaitForRetrace();
|
|
}
|
|
// Holds while the next XFB gets to its copy state
|
|
while (BaseSystem::getXfbMgr()->mToCopyXfb == 0 ) {
|
|
VIWaitForRetrace();
|
|
}
|
|
copyEFBtoXFB();
|
|
calcFrequency();
|
|
mFrameCount++;
|
|
}
|
|
|
|
/* vt 0x0C | 804976c0 */
|
|
void Display::beginRender() {
|
|
return;
|
|
}
|
|
|
|
/* vt 0x10 | 804976d0 */
|
|
void Display::endRender() {
|
|
return;
|
|
}
|
|
|
|
/* vt 0x14 | 804976e0 */
|
|
void Display::endFrame() {
|
|
return;
|
|
}
|
|
|
|
|
|
/* vt 0x1C | 804976f0 */
|
|
void Display::preVRetrace() {
|
|
mLastTick = OSGetTick();
|
|
if (VIGetRetraceCount() - mRetraceCount < mMaxRetraces) return;
|
|
if (mScreenStateFlag.onBit(mScreenStateFlag_SetBlack)) {
|
|
BaseSystem::getVideo()->setBlack(1);
|
|
mScreenStateFlag.resetBit(mScreenStateFlag_SetBlack);
|
|
}
|
|
BaseSystem::getXfbMgr()->setNextFrameBuffer();
|
|
mRetraceCount = VIGetRetraceCount();
|
|
}
|
|
|
|
/* 804977d0 */
|
|
void Display::copyEFBtoXFB() {
|
|
if (mFlag.onBit(mFlag_SetClear)) {
|
|
GXSetCopyClear(mClearColor, mClearZ);
|
|
}
|
|
GXRenderModeObj const* renderObj = BaseSystem::getVideo()->pRenderMode;
|
|
GXSetCopyFilter(renderObj->aa, renderObj->sample_pattern, renderObj->aa == 0, renderObj->vfilter);
|
|
BaseSystem::getXfbMgr()->copyEFB(mFlag.onBit(mFlag_SetClear));
|
|
}
|
|
|
|
/* 80497870 */
|
|
void Display::calcFrequency() {
|
|
s32 endTick = OSGetTick();
|
|
mDeltaTick = endTick-mBeginTick;
|
|
mFrequency = 1000000.0f / ((mDeltaTick * 8) / ((OS_BUS_CLOCK_SPEED >> 2) / 125000));
|
|
mBeginTick = endTick;
|
|
}
|
|
|
|
} // namespace EGG
|