summaryrefslogtreecommitdiff
path: root/src/code/THA_GA.c
blob: 51d5c287cf7340e3973dbda8cd6cc5516da01a56 (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
 * @file THA_GA.c
 *
 * This file implements a particular use of the double-ended stack allocator from TwoHeadArena.c for graphics data.
 *
 * Display list commands are allocated from the head while other graphics data such as matrices and vertices are
 * allocated from the tail end.
 *
 * @see TwoHeadArena.c
 */

#include "global.h"
#include "THA_GA.h"

void THA_GA_ct(TwoHeadGfxArena* thga, void* start, size_t size) {
    THA_ct(&thga->tha, start, size);
}

void THGA_dt(TwoHeadGfxArena* thga) {
    THA_dt(&thga->tha);
}

u32 THA_GA_isCrash(TwoHeadGfxArena* thga) {
    return THA_isCrash(&thga->tha);
}

void THA_GA_init(TwoHeadGfxArena* thga) {
    THA_init(&thga->tha);
}

s32 THA_GA_getFreeBytes(TwoHeadGfxArena* thga) {
    return THA_getFreeBytes(&thga->tha);
}

Gfx* THA_GA_getHeadPtr(TwoHeadGfxArena* thga) {
    return THA_getHeadPtr(&thga->tha);
}

void THA_GA_setHeadPtr(TwoHeadGfxArena* thga, Gfx* newHead) {
    THA_setHeadPtr(&thga->tha, newHead);
}

void* THA_GA_getTailPtr(TwoHeadGfxArena* thga) {
    return THA_getTailPtr(&thga->tha);
}

/**
 * Allocates a display list of `num` Gfx commands to the head of the Two Head Gfx Arena.
 */
Gfx* THA_GA_nextPtrN(TwoHeadGfxArena* thga, size_t num) {
    THA_nextPtrN(&thga->tha, num * sizeof(Gfx));
}

/**
 * Allocates a single Gfx command to the head of the Two Head Gfx Arena.
 */
Gfx* THA_GA_nextPtr1(TwoHeadGfxArena* thga) {
    return THA_GA_nextPtrN(thga, 1);
}

/**
 * Allocates a single Gfx command to the head of the Two Head Gfx Arena.
 */
Gfx* THA_GA_NEXT_DISP(TwoHeadGfxArena* thga) {
    return THA_GA_nextPtr1(thga);
}

/**
 * Allocates to the end of the Two Head Gfx Arena. Intended for data complementary to the display lists such as
 * matrices and vertices that are only needed for a single graphics task.
 */
void* THA_GA_alloc(TwoHeadGfxArena* thga, size_t size) {
    return THA_alloc(&thga->tha, size);
}

/**
 * Allocates `num` matrices to the tail end of the Two Head Gfx Arena.
 */
Mtx* THA_GA_allocMtxN(TwoHeadGfxArena* thga, size_t num) {
    return THA_GA_alloc(thga, num * sizeof(Mtx));
}

/**
 * Allocates a matrix to the tail end of the Two Head Gfx Arena.
 */
Mtx* THA_GA_allocMtx1(TwoHeadGfxArena* thga) {
    return THA_GA_alloc(thga, sizeof(Mtx));
}

/**
 * Allocates `num` vertices to the tail end of the Two Head Gfx Arena.
 */
Vtx* THA_GA_allocVtxN(TwoHeadGfxArena* thga, u32 num) {
    return THA_GA_alloc(thga, num * sizeof(Vtx));
}

/**
 * Allocates a vertex to the tail end of the Two Head Gfx Arena.
 */
Vtx* THA_GA_allocVtx1(TwoHeadGfxArena* thga) {
    return THA_GA_alloc(thga, sizeof(Vtx));
}