Citro3d
Loading...
Searching...
No Matches
attribs.c
Go to the documentation of this file.
1#include "internal.h"
2#include <c3d/attribs.h>
3
4void AttrInfo_Init(C3D_AttrInfo* info)
5{
6 memset(info, 0, sizeof(*info));
7 info->flags[1] = 0xFFF << 16;
8}
9
10int AttrInfo_AddLoader(C3D_AttrInfo* info, int regId, GPU_FORMATS format, int count)
11{
12 if (info->attrCount == 12) return -1;
13 int id = info->attrCount++;
14 if (regId < 0) regId = id;
15 if (id < 8)
16 info->flags[0] |= GPU_ATTRIBFMT(id, count, format);
17 else
18 info->flags[1] |= GPU_ATTRIBFMT(id-8, count, format);
19
20 info->flags[1] = (info->flags[1] &~ (0xF0000000 | BIT(id+16))) | (id << 28);
21 info->permutation |= regId << (id*4);
22 return id;
23}
24
25int AttrInfo_AddFixed(C3D_AttrInfo* info, int regId)
26{
27 if (info->attrCount == 12) return -1;
28 int id = info->attrCount++;
29 if (regId < 0) regId = id;
30
31 info->flags[1] = (info->flags[1] &~ 0xF0000000) | (id << 28);
32 info->permutation |= regId << (id*4);
33 return id;
34}
35
36C3D_AttrInfo* C3D_GetAttrInfo(void)
37{
38 C3D_Context* ctx = C3Di_GetContext();
39
40 if (!(ctx->flags & C3DiF_Active))
41 return NULL;
42
43 ctx->flags |= C3DiF_AttrInfo;
44 return &ctx->attrInfo;
45}
46
47void C3D_SetAttrInfo(C3D_AttrInfo* info)
48{
49 C3D_Context* ctx = C3Di_GetContext();
50
51 if (!(ctx->flags & C3DiF_Active))
52 return;
53
54 if (info != &ctx->attrInfo)
55 memcpy(&ctx->attrInfo, info, sizeof(*info));
56 ctx->flags |= C3DiF_AttrInfo;
57}
58
59void C3Di_AttrInfoBind(C3D_AttrInfo* info)
60{
61 GPUCMD_AddIncrementalWrites(GPUREG_ATTRIBBUFFERS_FORMAT_LOW, (u32*)info->flags, sizeof(info->flags)/sizeof(u32));
62 GPUCMD_AddMaskedWrite(GPUREG_VSH_INPUTBUFFER_CONFIG, 0xB, 0xA0000000 | (info->attrCount - 1));
63 GPUCMD_AddWrite(GPUREG_VSH_NUM_ATTR, info->attrCount - 1);
64 GPUCMD_AddIncrementalWrites(GPUREG_VSH_ATTRIBUTES_PERMUTATION_LOW, (u32*)&info->permutation, 2);
65}
int AttrInfo_AddLoader(C3D_AttrInfo *info, int regId, GPU_FORMATS format, int count)
Definition: attribs.c:10
void C3D_SetAttrInfo(C3D_AttrInfo *info)
Definition: attribs.c:47
int AttrInfo_AddFixed(C3D_AttrInfo *info, int regId)
Definition: attribs.c:25
void AttrInfo_Init(C3D_AttrInfo *info)
Definition: attribs.c:4
void C3Di_AttrInfoBind(C3D_AttrInfo *info)
Definition: attribs.c:59
C3D_AttrInfo * C3D_GetAttrInfo(void)
Definition: attribs.c:36
@ C3DiF_AttrInfo
Definition: internal.h:77
@ C3DiF_Active
Definition: internal.h:75
u32 flags
Definition: internal.h:38
C3D_AttrInfo attrInfo
Definition: internal.h:41
int count
Definition: uniforms.c:15