summaryrefslogtreecommitdiff
path: root/src/code/TwoHeadGfxArena.c
blob: ce7b8a45fbeeff16d3c9b7cd597ab082ad43c397 (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 TwoHeadGfxArena.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"

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

void THGA_Destroy(TwoHeadGfxArena* thga) {
    THA_Destroy(&thga->tha);
}

u32 THGA_IsCrash(TwoHeadGfxArena* thga) {
    return THA_IsCrash(&thga->tha);
}

void THGA_Reset(TwoHeadGfxArena* thga) {
    THA_Reset(&thga->tha);
}

s32 THGA_GetRemaining(TwoHeadGfxArena* thga) {
    return THA_GetRemaining(&thga->tha);
}

Gfx* THGA_GetHead(TwoHeadGfxArena* thga) {
    return THA_GetHead(&thga->tha);
}

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

void* THGA_GetTail(TwoHeadGfxArena* thga) {
    return THA_GetTail(&thga->tha);
}

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

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

/**
 * Identical to `THGA_AllocGfx`
 *
 * @see THGA_AllocGfx
 */
Gfx* THGA_AllocGfx2(TwoHeadGfxArena* thga) {
    return THGA_AllocGfx(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* THGA_AllocTail(TwoHeadGfxArena* thga, size_t size) {
    return THA_AllocTail(&thga->tha, size);
}

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

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

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

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