Citro3d
Loading...
Searching...
No Matches
buffers.c
Go to the documentation of this file.
1#include "internal.h"
2
3#define BUFFER_BASE_PADDR 0x18000000
4
5void BufInfo_Init(C3D_BufInfo* info)
6{
7 memset(info, 0, sizeof(*info));
8 info->base_paddr = BUFFER_BASE_PADDR;
9}
10
11int BufInfo_Add(C3D_BufInfo* info, const void* data, ptrdiff_t stride, int attribCount, u64 permutation)
12{
13 if (info->bufCount == 12) return -1;
14 int id = info->bufCount++;
15
16 u32 pa = osConvertVirtToPhys(data);
17 if (pa < info->base_paddr) return -2;
18
19 C3D_BufCfg* buf = &info->buffers[id];
20 buf->offset = pa - info->base_paddr;
21 buf->flags[0] = permutation & 0xFFFFFFFF;
22 buf->flags[1] = (permutation >> 32) | (stride << 16) | (attribCount << 28);
23 return id;
24}
25
26C3D_BufInfo* C3D_GetBufInfo(void)
27{
28 C3D_Context* ctx = C3Di_GetContext();
29
30 if (!(ctx->flags & C3DiF_Active))
31 return NULL;
32
33 ctx->flags |= C3DiF_BufInfo;
34 return &ctx->bufInfo;
35}
36
37void C3D_SetBufInfo(C3D_BufInfo* info)
38{
39 C3D_Context* ctx = C3Di_GetContext();
40
41 if (!(ctx->flags & C3DiF_Active))
42 return;
43
44 if (info != &ctx->bufInfo)
45 memcpy(&ctx->bufInfo, info, sizeof(*info));
46 ctx->flags |= C3DiF_BufInfo;
47}
48
49void C3Di_BufInfoBind(C3D_BufInfo* info)
50{
51 GPUCMD_AddWrite(GPUREG_ATTRIBBUFFERS_LOC, info->base_paddr >> 3);
52 GPUCMD_AddIncrementalWrites(GPUREG_ATTRIBBUFFER0_OFFSET, (u32*)info->buffers, sizeof(info->buffers)/sizeof(u32));
53}
void C3D_SetBufInfo(C3D_BufInfo *info)
Definition: buffers.c:37
void C3Di_BufInfoBind(C3D_BufInfo *info)
Definition: buffers.c:49
void BufInfo_Init(C3D_BufInfo *info)
Definition: buffers.c:5
#define BUFFER_BASE_PADDR
Definition: buffers.c:3
int BufInfo_Add(C3D_BufInfo *info, const void *data, ptrdiff_t stride, int attribCount, u64 permutation)
Definition: buffers.c:11
C3D_BufInfo * C3D_GetBufInfo(void)
Definition: buffers.c:26
@ C3DiF_Active
Definition: internal.h:75
@ C3DiF_BufInfo
Definition: internal.h:78
u32 flags
Definition: internal.h:38
C3D_BufInfo bufInfo
Definition: internal.h:42
float24Uniform_s * data
Definition: uniforms.c:16