summaryrefslogtreecommitdiff
path: root/src/egg/core/eggDisplay.cpp
diff options
context:
space:
mode:
authorElijah Thomas <elijahthomas774@gmail.com>2023-10-06 07:49:50 -0400
committerElijah Thomas <elijahthomas774@gmail.com>2023-10-06 07:49:50 -0400
commit4ae5fe5753537264872e09562acb2e853dd41850 (patch)
tree079b314512b286f666376a05abaafbb49b0c99f9 /src/egg/core/eggDisplay.cpp
parent99d473d1aaecbd343871793e1c2002c89f08e227 (diff)
Fix includes and removed libs folder
Diffstat (limited to 'src/egg/core/eggDisplay.cpp')
-rw-r--r--src/egg/core/eggDisplay.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/egg/core/eggDisplay.cpp b/src/egg/core/eggDisplay.cpp
new file mode 100644
index 00000000..16031605
--- /dev/null
+++ b/src/egg/core/eggDisplay.cpp
@@ -0,0 +1,102 @@
+#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(),
+ mRetraceCount(0),
+ mFrameCount(0),
+ mClearColor(0x808080ff),
+ mClearZ(0xFFFFFF),
+ mBeginTick(0),
+ mFlag()
+{
+ 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 \ No newline at end of file