From 737df499a7c7b9576fe4addfe22f3316b0b93f38 Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Wed, 20 Sep 2023 20:04:59 -0700 Subject: [PATCH] JUTXfb --- src/JSystem/JUtility/JUTXfb.cpp | 84 ++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 13 deletions(-) diff --git a/src/JSystem/JUtility/JUTXfb.cpp b/src/JSystem/JUtility/JUTXfb.cpp index 485ca221f..50352ff0a 100644 --- a/src/JSystem/JUtility/JUTXfb.cpp +++ b/src/JSystem/JUtility/JUTXfb.cpp @@ -4,44 +4,102 @@ // #include "JSystem/JUtility/JUTXfb.h" -#include "dolphin/types.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "dolphin/gx/GX.h" + +JUTXfb* JUTXfb::sManager; /* 802C81D8-802C81EC .text clearIndex__6JUTXfbFv */ void JUTXfb::clearIndex() { - /* Nonmatching */ + mDrawingXfbIndex = -1; + mDrawnXfbIndex = -1; + mDisplayingXfbIndex = -1; } /* 802C81EC-802C8224 .text common_init__6JUTXfbFi */ -void JUTXfb::common_init(int) { - /* Nonmatching */ +void JUTXfb::common_init(int bufNum) { + mBufferNum = bufNum; + clearIndex(); + mSDrawingFlag = 99; } /* 802C8224-802C82CC .text __ct__6JUTXfbFPC16_GXRenderModeObjP7JKRHeapQ26JUTXfb10EXfbNumber */ -JUTXfb::JUTXfb(const _GXRenderModeObj*, JKRHeap*, JUTXfb::EXfbNumber) { +JUTXfb::JUTXfb(const _GXRenderModeObj* pObj, JKRHeap* pHeap, JUTXfb::EXfbNumber xfbNum) { /* Nonmatching */ + common_init(xfbNum); + + if (pObj) { + initiate(pObj->fb_width, pObj->xfb_height, pHeap, xfbNum); + } else { + u16 fb_width = JUTVideo::getManager()->getRenderMode()->fb_width; + u16 efb_height = JUTVideo::getManager()->getRenderMode()->efb_height; + u16 xfb_height = JUTVideo::getManager()->getRenderMode()->xfb_height; + f32 scale_factor = GXGetYScaleFactor(efb_height, xfb_height); + u16 xfb_lines = GXGetNumXfbLines(efb_height, scale_factor); + + initiate(fb_width, xfb_lines, pHeap, xfbNum); + } } /* 802C82CC-802C833C .text __dt__6JUTXfbFv */ JUTXfb::~JUTXfb() { - /* Nonmatching */ + for (int i = 0; i < 3; i++) { + delXfb(i); + } + sManager = NULL; } /* 802C833C-802C837C .text delXfb__6JUTXfbFi */ -void JUTXfb::delXfb(int) { - /* Nonmatching */ +void JUTXfb::delXfb(int xfbIdx) { + if (mXfbAllocated[xfbIdx] && mBuffer[xfbIdx]) { + delete mBuffer[xfbIdx]; + } } /* 802C837C-802C8410 .text createManager__6JUTXfbFPC16_GXRenderModeObjP7JKRHeapQ26JUTXfb10EXfbNumber */ -void JUTXfb::createManager(const _GXRenderModeObj*, JKRHeap*, JUTXfb::EXfbNumber) { - /* Nonmatching */ +JUTXfb* JUTXfb::createManager(const _GXRenderModeObj* pObj, JKRHeap* pHeap, JUTXfb::EXfbNumber xfbNum) { + JUT_CONFIRM(203, sManager == 0); + if (sManager == NULL) { + sManager = new JUTXfb(pObj, pHeap, xfbNum); + } + return sManager; } /* 802C8410-802C8468 .text destroyManager__6JUTXfbFv */ void JUTXfb::destroyManager() { - /* Nonmatching */ + JUT_CONFIRM(344, sManager); + delete sManager; + sManager = NULL; } /* 802C8468-802C8544 .text initiate__6JUTXfbFUsUsP7JKRHeapQ26JUTXfb10EXfbNumber */ -void JUTXfb::initiate(unsigned short, unsigned short, JKRHeap*, JUTXfb::EXfbNumber) { - /* Nonmatching */ +void JUTXfb::initiate(u16 width, u16 height, JKRHeap* pHeap, JUTXfb::EXfbNumber xfbNum) { + if (pHeap == NULL) { + pHeap = JKRHeap::getSystemHeap(); + } + + int size = ((u32)width + 0xf & 0xfff0) * (u32)height * 2; + + void* buf = ::operator new[](size, pHeap, 0x20); + mBuffer[0] = buf; + mXfbAllocated[0] = true; + + if (xfbNum >= 2) { + buf = ::operator new[](size, pHeap, 0x20); + mBuffer[1] = buf; + mXfbAllocated[1] = true; + } else { + mBuffer[1] = NULL; + mXfbAllocated[1] = false; + } + + if (xfbNum >= 3) { + buf = ::operator new[](size, pHeap, 0x20); + mBuffer[2] = buf; + mXfbAllocated[2] = true; + } else { + mBuffer[2] = NULL; + mXfbAllocated[2] = false; + } }