summaryrefslogtreecommitdiff
path: root/libs/JSystem/JUtility/JUTVideo.cpp
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2021-09-27 11:36:18 -0700
committerGitHub <noreply@github.com>2021-09-27 11:36:18 -0700
commit512cc73cd7dc9af497e698e0ddcbfad3de53bf37 (patch)
tree62ee865e5073baf11eba91e47f5631445cbefc82 /libs/JSystem/JUtility/JUTVideo.cpp
parenta7ccd8816727059f6bd4f0047a58a9a69e73692c (diff)
parent77ad390d8e9c6112329221ed864dead455182b4e (diff)
Merge pull request #150 from Julgodis/JUTVideo
Diffstat (limited to 'libs/JSystem/JUtility/JUTVideo.cpp')
-rw-r--r--libs/JSystem/JUtility/JUTVideo.cpp264
1 files changed, 137 insertions, 127 deletions
diff --git a/libs/JSystem/JUtility/JUTVideo.cpp b/libs/JSystem/JUtility/JUTVideo.cpp
index e1191a10ff..cff1fe483e 100644
--- a/libs/JSystem/JUtility/JUTVideo.cpp
+++ b/libs/JSystem/JUtility/JUTVideo.cpp
@@ -4,72 +4,41 @@
//
#include "JSystem/JUtility/JUTVideo.h"
+#include "JSystem/JUtility/JUTDirectPrint.h"
+#include "JSystem/JUtility/JUTXfb.h"
#include "dol2asm.h"
#include "dolphin/types.h"
-
-//
-// Types:
-//
-
-struct JUTXfb {
- static u8 sManager[4 + 4 /* padding */];
-};
-
-struct JUTDirectPrint {
- /* 802E456C */ void changeFrameBuffer(void*, u16, u16);
-
- static u8 sDirectPrint[4 + 4 /* padding */];
-};
-
-//
-// Forward References:
-//
-
-extern "C" void createManager__8JUTVideoFPC16_GXRenderModeObj();
-extern "C" void destroyManager__8JUTVideoFv();
-extern "C" void __ct__8JUTVideoFPC16_GXRenderModeObj();
-extern "C" void __dt__8JUTVideoFv();
-extern "C" void preRetraceProc__8JUTVideoFUl();
-extern "C" void drawDoneStart__8JUTVideoFv();
-extern "C" void dummyNoDrawWait__8JUTVideoFv();
-extern "C" void drawDoneCallback__8JUTVideoFv();
-extern "C" void postRetraceProc__8JUTVideoFUl();
-extern "C" void setRenderMode__8JUTVideoFPC16_GXRenderModeObj();
-extern "C" void waitRetraceIfNeed__8JUTVideoFv();
-extern "C" u8 sManager__8JUTVideo[4];
-extern "C" u8 sVideoLastTick__8JUTVideo[4];
-extern "C" u8 sVideoInterval__8JUTVideo[4];
+#include "dolphin/vi/vi.h"
//
// External References:
//
-extern "C" void* __nw__FUl();
-extern "C" void __dl__FPv();
-extern "C" void changeFrameBuffer__14JUTDirectPrintFPvUsUs();
-extern "C" void VISetPreRetraceCallback(VIRetraceCallback);
-extern "C" void VISetPostRetraceCallback(VIRetraceCallback);
-extern "C" void VIInit();
-extern "C" void VIWaitForRetrace();
-extern "C" void VIConfigure(_GXRenderModeObj*);
-extern "C" void VIFlush();
-extern "C" void VISetNextFrameBuffer();
-extern "C" void VIGetNextFrameBuffer();
-extern "C" void VISetBlack(s32);
-extern "C" u32 VIGetRetraceCount();
extern "C" void GXSetDrawDone();
-extern "C" void GXCopyDisp();
-extern "C" u8 sDirectPrint__14JUTDirectPrint[4 + 4 /* padding */];
-extern "C" u8 sManager__6JUTXfb[4 + 4 /* padding */];
+extern "C" void GXCopyDisp(void*, BOOL);
//
// Declarations:
//
-/* ############################################################################################## */
/* 80451538-8045153C 000A38 0004+00 4/4 18/18 1/1 .sbss sManager__8JUTVideo */
JUTVideo* JUTVideo::sManager;
+/* 8045153C-80451540 000A3C 0004+00 2/2 1/1 0/0 .sbss sVideoLastTick__8JUTVideo */
+OSTick JUTVideo::sVideoLastTick;
+
+/* 80451540-80451544 000A40 0004+00 2/2 1/1 0/0 .sbss sVideoInterval__8JUTVideo */
+OSTick JUTVideo::sVideoInterval;
+
+/* 80451544-80451548 000A44 0004+00 4/4 0/0 0/0 .sbss None */
+static bool data_80451544;
+
+/* 80451548-8045154C 000A48 0004+00 1/1 0/0 0/0 .sbss frameBuffer$2222 */
+static void* frameBuffer;
+
+/* 8045154C-80451550 000A4C 0004+00 1/1 0/0 0/0 .sbss None */
+static s8 data_8045154C;
+
/* 802E4C54-802E4CAC 2DF594 0058+00 0/0 1/1 0/0 .text
* createManager__8JUTVideoFPC16_GXRenderModeObj */
JUTVideo* JUTVideo::createManager(_GXRenderModeObj const* param_0) {
@@ -87,25 +56,8 @@ void JUTVideo::destroyManager() {
}
}
-/* ############################################################################################## */
-/* 803CC980-803CC990 029AA0 000C+04 2/2 0/0 0/0 .data __vt__8JUTVideo */
-SECTION_DATA extern void* __vt__8JUTVideo[3 + 1 /* padding */] = {
- (void*)NULL /* RTTI */,
- (void*)NULL,
- (void*)__dt__8JUTVideoFv,
- /* padding */
- NULL,
-};
-
-/* 8045153C-80451540 000A3C 0004+00 2/2 1/1 0/0 .sbss sVideoLastTick__8JUTVideo */
-u32 JUTVideo::sVideoLastTick;
-
-/* 80451540-80451544 000A40 0004+00 2/2 1/1 0/0 .sbss sVideoInterval__8JUTVideo */
-u32 JUTVideo::sVideoInterval;
-
/* 802E4CF4-802E4DE8 2DF634 00F4+00 1/1 0/0 0/0 .text __ct__8JUTVideoFPC16_GXRenderModeObj */
-#ifdef NONMATCHING
-JUTVideo::JUTVideo(_GXRenderModeObj const* param_0) {
+JUTVideo::JUTVideo(GXRenderModeObj const* param_0) {
mRenderObj = NULL;
VIInit();
mSetBlack = true;
@@ -120,22 +72,12 @@ JUTVideo::JUTVideo(_GXRenderModeObj const* param_0) {
sVideoLastTick = OSGetTick();
sVideoInterval = 670000;
mPreRetraceCallback = VISetPreRetraceCallback(preRetraceProc);
- mPostRetraceCallback = VISetPreRetraceCallback(postRetraceProc);
- unknown_callback_1 = NULL;
- unknown_callback_2 = NULL;
- OSInitMessageQueue(mMessageQueue, mMessage, 1);
+ mPostRetraceCallback = VISetPostRetraceCallback(postRetraceProc);
+ mPreCallback = NULL;
+ mPostCallback = NULL;
+ OSInitMessageQueue(&mMessageQueue, &mMessage, 1);
GXSetDrawDoneCallback(drawDoneCallback);
}
-#else
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm JUTVideo::JUTVideo(_GXRenderModeObj const* param_0) {
- nofralloc
-#include "asm/JSystem/JUtility/JUTVideo/__ct__8JUTVideoFPC16_GXRenderModeObj.s"
-}
-#pragma pop
-#endif
/* 802E4DE8-802E4E50 2DF728 0068+00 1/0 0/0 0/0 .text __dt__8JUTVideoFv */
JUTVideo::~JUTVideo() {
@@ -143,78 +85,146 @@ JUTVideo::~JUTVideo() {
VISetPostRetraceCallback(mPostRetraceCallback);
}
-/* ############################################################################################## */
-/* 80451544-80451548 000A44 0004+00 4/4 0/0 0/0 .sbss None */
-static u8 data_80451544[4];
+/* 802E4E50-802E5088 2DF790 0238+00 1/1 0/0 0/0 .text preRetraceProc__8JUTVideoFUl */
+void JUTVideo::preRetraceProc(u32 retrace_count) {
+ if (!sManager) {
+ return;
+ }
-/* 80451548-8045154C 000A48 0004+00 1/1 0/0 0/0 .sbss frameBuffer$2222 */
-static void* frameBuffer;
+ if (sManager->mPreCallback) {
+ (*sManager->mPreCallback)(retrace_count);
+ }
-/* 8045154C-80451550 000A4C 0004+00 1/1 0/0 0/0 .sbss None */
-static u8 data_8045154C[4];
+ OSTick tick = OSGetTick();
+ sVideoInterval = tick - sVideoLastTick;
+ sVideoLastTick = tick;
-/* 802E4E50-802E5088 2DF790 0238+00 1/1 0/0 0/0 .text preRetraceProc__8JUTVideoFUl */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JUTVideo::preRetraceProc(u32 param_0) {
- nofralloc
-#include "asm/JSystem/JUtility/JUTVideo/preRetraceProc__8JUTVideoFUl.s"
+ JUTXfb* xfb = JUTXfb::getManager();
+ if (!xfb) {
+ VISetBlack(TRUE);
+ VIFlush();
+ return;
+ }
+
+ if (!data_8045154C) {
+ frameBuffer = NULL;
+ data_8045154C = true;
+ }
+
+ if (frameBuffer) {
+ JUTVideo* videoManager = JUTGetVideoManager();
+ const GXRenderModeObj* renderMode = videoManager->getRenderMode();
+ JUTDirectPrint* directPrint = JUTDirectPrint::getManager();
+ directPrint->changeFrameBuffer(frameBuffer, renderMode->fb_width, renderMode->efb_height);
+ }
+
+ if (sManager->mSetBlack == 1) {
+ s32 frame_count = sManager->mSetBlackFrameCount;
+ if (frame_count > 0) {
+ frame_count--;
+ }
+
+ sManager->mSetBlackFrameCount = frame_count;
+ sManager->mSetBlack = frame_count != 0;
+ VISetBlack(TRUE);
+ VIFlush();
+ return;
+ }
+
+ if (!xfb) {
+ VISetBlack(TRUE);
+ VIFlush();
+ return;
+ }
+
+ if (xfb->getBufferNum() == 3 || xfb->getBufferNum() == 2) {
+ if (!data_80451544) {
+ s16 index = xfb->getDrawnXfbIndex();
+ xfb->setDisplayingXfbIndex(index);
+ if (index < 0) {
+ VISetBlack(1);
+ VIFlush();
+ } else {
+ VISetNextFrameBuffer(xfb->getDisplayingXfb());
+ VIFlush();
+ VISetBlack(FALSE);
+ frameBuffer = xfb->getDisplayingXfb();
+ }
+ }
+ } else if (xfb->getBufferNum() == 1) {
+ if (xfb->getSDrawingFlag() == 0) {
+ s16 index = xfb->getDrawnXfbIndex();
+ if (index >= 0) {
+ xfb->setDisplayingXfbIndex(index);
+ GXCopyDisp(xfb->getDisplayingXfb(), 1);
+ GXFlush();
+ xfb->setSDrawingFlag(2);
+ frameBuffer = xfb->getDisplayingXfb();
+ if (VIGetNextFrameBuffer()) {
+ VISetBlack(FALSE);
+ }
+ } else {
+ VISetBlack(TRUE);
+ }
+ }
+ VIFlush();
+ }
}
-#pragma pop
/* 802E5088-802E50B0 2DF9C8 0028+00 0/0 1/1 0/0 .text drawDoneStart__8JUTVideoFv */
void JUTVideo::drawDoneStart() {
- data_80451544[0] = 1;
+ data_80451544 = true;
GXSetDrawDone();
}
/* 802E50B0-802E50BC 2DF9F0 000C+00 0/0 1/1 0/0 .text dummyNoDrawWait__8JUTVideoFv */
void JUTVideo::dummyNoDrawWait() {
- data_80451544[0] = 0;
+ data_80451544 = false;
}
/* 802E50BC-802E5144 2DF9FC 0088+00 1/1 0/0 0/0 .text drawDoneCallback__8JUTVideoFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JUTVideo::drawDoneCallback() {
- nofralloc
-#include "asm/JSystem/JUtility/JUTVideo/drawDoneCallback__8JUTVideoFv.s"
-}
-#pragma pop
+void JUTVideo::drawDoneCallback() {
+ JUTXfb* xfb = JUTXfb::getManager();
+ if (!xfb) {
+ return;
+ }
-/* 802E5144-802E5198 2DFA84 0054+00 1/1 0/0 0/0 .text postRetraceProc__8JUTVideoFUl */
-#ifdef NONMATCHING
-void JUTVideo::postRetraceProc(u32 param_0) {
- void* message;
- if (sManager != NULL) {
- if (sManager->unknown_callback_2 != NULL) {
- sManager->unknown_callback_2();
+ data_80451544 = false;
+ if (xfb->getBufferNum() == 1) {
+ if (xfb->getSDrawingFlag() == 1) {
+ xfb->setSDrawingFlag(0);
+
+ void* frameBuffer = xfb->getDrawnXfb();
+ if (frameBuffer) {
+ VISetNextFrameBuffer(xfb->getDrawnXfb());
+ VIFlush();
+ }
}
- message = (void*)VIGetRetraceCount();
- OSSendMessage(&sManager->mMessageQueue, message, OS_MESSAGE_NON_BLOCKING);
}
}
-#else
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JUTVideo::postRetraceProc(u32 param_0) {
- nofralloc
-#include "asm/JSystem/JUtility/JUTVideo/postRetraceProc__8JUTVideoFUl.s"
+
+/* 802E5144-802E5198 2DFA84 0054+00 1/1 0/0 0/0 .text postRetraceProc__8JUTVideoFUl */
+void JUTVideo::postRetraceProc(u32 retrace_count) {
+ if (!sManager) {
+ return;
+ }
+
+ if (sManager->mPostCallback != NULL) {
+ sManager->mPostCallback(retrace_count);
+ }
+
+ OSMessage message = (OSMessage*)VIGetRetraceCount();
+ OSSendMessage(&sManager->mMessageQueue, message, OS_MESSAGE_NON_BLOCKING);
}
-#pragma pop
-#endif
/* 802E5198-802E5210 2DFAD8 0078+00 1/1 2/2 0/0 .text
* setRenderMode__8JUTVideoFPC16_GXRenderModeObj */
-void JUTVideo::setRenderMode(_GXRenderModeObj const* pObj) {
+void JUTVideo::setRenderMode(GXRenderModeObj const* pObj) {
if (mRenderObj != NULL && pObj->vi_tv_mode != mRenderObj->vi_tv_mode) {
mSetBlack = true;
mSetBlackFrameCount = 4;
}
- mRenderObj = (_GXRenderModeObj*)pObj;
+ mRenderObj = (GXRenderModeObj*)pObj;
VIConfigure(mRenderObj);
VIFlush();