diff options
| author | notyourav <65437533+notyourav@users.noreply.github.com> | 2021-09-27 11:36:18 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-09-27 11:36:18 -0700 |
| commit | 512cc73cd7dc9af497e698e0ddcbfad3de53bf37 (patch) | |
| tree | 62ee865e5073baf11eba91e47f5631445cbefc82 /libs/JSystem/JUtility/JUTVideo.cpp | |
| parent | a7ccd8816727059f6bd4f0047a58a9a69e73692c (diff) | |
| parent | 77ad390d8e9c6112329221ed864dead455182b4e (diff) | |
Merge pull request #150 from Julgodis/JUTVideo
Diffstat (limited to 'libs/JSystem/JUtility/JUTVideo.cpp')
| -rw-r--r-- | libs/JSystem/JUtility/JUTVideo.cpp | 264 |
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(); |
