summaryrefslogtreecommitdiff
path: root/libs/JSystem/src/JUtility/JUTGraphFifo.cpp
blob: 7950757e7c420a3b1d39c8533486cf66c57b8a19 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "JSystem/JSystem.h" // IWYU pragma: keep

#include "JSystem/JUtility/JUTGraphFifo.h"
#include "JSystem/JKernel/JKRHeap.h"
#include <stdint.h>

static bool data_804514B8;

JUTGraphFifo* JUTGraphFifo::sCurrentFifo;

JUTGraphFifo::JUTGraphFifo(u32 size) {
    mSize = ROUND(size, 0x20);
    if (data_804514B8) {
        u32 fifoSize = sizeof(GXFifoObj);
        mFifo = (GXFifoObj*)JKRAllocFromSysHeap(fifoSize + mSize, 32);
        mBase = (u8*)mFifo + fifoSize;
        GXInitFifoBase(mFifo, mBase, mSize);
        GXInitFifoPtrs(mFifo, mBase, mBase);
    } else {
        mBase = JKRAllocFromSysHeap(mSize + 0xA0, 32);
        mBase = (void*)ALIGN_NEXT((uintptr_t)mBase, 0x20);
        mFifo = GXInit(mBase, mSize);
        data_804514B8 = true;
        sCurrentFifo = this;
    }
}

bool JUTGraphFifo::mGpStatus[5];

JUTGraphFifo::~JUTGraphFifo() {
    sCurrentFifo->save();

    while (isGPActive()) {
        // nop
    }

    if (sCurrentFifo == this) {
        sCurrentFifo = NULL;
    }
    JKRFreeToSysHeap(mBase);
}