citro3d  1.2.0
internal.h
Go to the documentation of this file.
1 #pragma once
2 #include <c3d/attribs.h>
3 #include <c3d/buffers.h>
4 #include <c3d/proctex.h>
5 #include <c3d/light.h>
6 #include <c3d/framebuffer.h>
7 #include <c3d/texenv.h>
8 #include <c3d/fog.h>
9 
10 #define C3D_UNUSED __attribute__((unused))
11 
12 typedef struct
13 {
16  u32 zScale, zOffset;
17  GPU_CULLMODE cullMode;
18  bool zBuffer, earlyDepth;
19  GPU_EARLYDEPTHFUNC earlyDepthFunc;
21 
22  u32 alphaTest;
23  u32 stencilMode, stencilOp;
24  u32 depthTest;
25 
26  u32 blendClr;
28  GPU_LOGICOP clrLogicOp;
29 } C3D_Effect;
30 
31 typedef struct
32 {
33  gxCmdQueue_s gxQueue;
34  u32* cmdBuf;
35  size_t cmdBufSize;
36  float cmdBufUsage;
37 
38  u32 flags;
39  shaderProgram_s* program;
40 
44  C3D_LightEnv* lightEnv;
45 
46  u32 texConfig;
47  u32 texShadow;
48  C3D_Tex* tex[3];
49  C3D_TexEnv texEnv[6];
50 
51  u32 texEnvBuf, texEnvBufClr;
52  u32 fogClr;
54 
55  u16 gasAttn, gasAccMax;
56  u32 gasLightXY, gasLightZ, gasLightZColor;
57  u32 gasDeltaZ : 24;
58  u32 gasFlags : 8;
60 
62  C3D_ProcTexLut* procTexLut[3];
64 
66  u32 viewport[5];
67  u32 scissor[3];
68 
69  u16 fixedAttribDirty, fixedAttribEverDirty;
70  C3D_FVec fixedAttribs[12];
71 } C3D_Context;
72 
73 enum
74 {
75  C3DiF_Active = BIT(0),
76  C3DiF_DrawUsed = BIT(1),
77  C3DiF_AttrInfo = BIT(2),
78  C3DiF_BufInfo = BIT(3),
79  C3DiF_Effect = BIT(4),
80  C3DiF_FrameBuf = BIT(5),
81  C3DiF_Viewport = BIT(6),
82  C3DiF_Scissor = BIT(7),
83  C3DiF_Program = BIT(8),
84  C3DiF_TexEnvBuf = BIT(9),
85  C3DiF_LightEnv = BIT(10),
86  C3DiF_VshCode = BIT(11),
87  C3DiF_GshCode = BIT(12),
88  C3DiF_TexStatus = BIT(14),
89  C3DiF_ProcTex = BIT(15),
91  C3DiF_FogLut = BIT(17),
92  C3DiF_Gas = BIT(18),
93  C3DiF_GasLut = BIT(19),
94 
95 #define C3DiF_ProcTexLut(n) BIT(20+(n))
97 #define C3DiF_Tex(n) BIT(23+(n))
98  C3DiF_TexAll = 7 << 23,
99 #define C3DiF_TexEnv(n) BIT(26+(n))
100  C3DiF_TexEnvAll = 0x3F << 26,
101 };
102 
103 enum
104 {
105  C3DiG_BeginAcc = BIT(0),
106  C3DiG_AccStage = BIT(1),
107  C3DiG_SetAccMax = BIT(2),
109 };
110 
111 static inline C3D_Context* C3Di_GetContext(void)
112 {
113  extern C3D_Context __C3D_Context;
114  return &__C3D_Context;
115 }
116 
117 static inline bool typeIsCube(GPU_TEXTURE_MODE_PARAM type)
118 {
119  return type == GPU_TEX_CUBE_MAP || type == GPU_TEX_SHADOW_CUBE;
120 }
121 
122 static inline bool C3Di_TexIs2D(C3D_Tex* tex)
123 {
124  return !typeIsCube(C3D_TexGetType(tex));
125 }
126 
127 void C3Di_UpdateContext(void);
128 void C3Di_AttrInfoBind(C3D_AttrInfo* info);
129 void C3Di_BufInfoBind(C3D_BufInfo* info);
131 void C3Di_TexEnvBind(int id, C3D_TexEnv* env);
132 void C3Di_SetTex(int unit, C3D_Tex* tex);
133 void C3Di_EffectBind(C3D_Effect* effect);
134 void C3Di_GasUpdate(C3D_Context* ctx);
135 
136 void C3Di_LightMtlBlend(C3D_Light* light);
137 
138 void C3Di_DirtyUniforms(GPU_SHADER_TYPE type);
139 void C3Di_LoadShaderUniforms(shaderInstance_s* si);
140 void C3Di_ClearShaderUniforms(GPU_SHADER_TYPE type);
141 
142 bool C3Di_SplitFrame(u32** pBuf, u32* pSize);
143 
144 void C3Di_RenderQueueInit(void);
145 void C3Di_RenderQueueExit(void);
146 void C3Di_RenderQueueWaitDone(void);
C3D_Context __C3D_Context
Definition: base.c:7
bool C3Di_SplitFrame(u32 **pBuf, u32 *pSize)
Definition: base.c:309
void C3Di_RenderQueueInit(void)
Definition: renderqueue.c:114
static bool C3Di_TexIs2D(C3D_Tex *tex)
Definition: internal.h:122
void C3Di_DirtyUniforms(GPU_SHADER_TYPE type)
Definition: uniforms.c:87
void C3Di_BufInfoBind(C3D_BufInfo *info)
Definition: buffers.c:49
void C3Di_UpdateContext(void)
Definition: base.c:158
void C3Di_EffectBind(C3D_Effect *effect)
Definition: effect.c:90
void C3Di_LoadShaderUniforms(shaderInstance_s *si)
Definition: uniforms.c:99
void C3Di_LightMtlBlend(C3D_Light *light)
Definition: light.c:3
void C3Di_RenderQueueDisableVBlank(void)
Definition: renderqueue.c:108
void C3Di_RenderQueueEnableVBlank(void)
Definition: renderqueue.c:102
void C3Di_RenderQueueWaitDone(void)
Definition: renderqueue.c:146
void C3Di_GasUpdate(C3D_Context *ctx)
Definition: gas.c:153
static bool typeIsCube(GPU_TEXTURE_MODE_PARAM type)
Definition: internal.h:117
void C3Di_SetTex(int unit, C3D_Tex *tex)
Definition: texture.c:271
void C3Di_RenderQueueExit(void)
Definition: renderqueue.c:125
void C3Di_FrameBufBind(C3D_FrameBuf *fb)
Definition: framebuffer.c:49
void C3Di_AttrInfoBind(C3D_AttrInfo *info)
Definition: attribs.c:59
void C3Di_TexEnvBind(int id, C3D_TexEnv *env)
Definition: texenv.c:40
void C3Di_ClearShaderUniforms(GPU_SHADER_TYPE type)
Definition: uniforms.c:129
@ C3DiF_Gas
Definition: internal.h:92
@ C3DiF_AttrInfo
Definition: internal.h:77
@ C3DiF_TexAll
Definition: internal.h:98
@ C3DiF_Scissor
Definition: internal.h:82
@ C3DiF_VshCode
Definition: internal.h:86
@ C3DiF_Effect
Definition: internal.h:79
@ C3DiF_Viewport
Definition: internal.h:81
@ C3DiF_Active
Definition: internal.h:75
@ C3DiF_GshCode
Definition: internal.h:87
@ C3DiF_TexEnvBuf
Definition: internal.h:84
@ C3DiF_FogLut
Definition: internal.h:91
@ C3DiF_ProcTexColorLut
Definition: internal.h:90
@ C3DiF_LightEnv
Definition: internal.h:85
@ C3DiF_DrawUsed
Definition: internal.h:76
@ C3DiF_TexStatus
Definition: internal.h:88
@ C3DiF_BufInfo
Definition: internal.h:78
@ C3DiF_ProcTex
Definition: internal.h:89
@ C3DiF_FrameBuf
Definition: internal.h:80
@ C3DiF_GasLut
Definition: internal.h:93
@ C3DiF_ProcTexLutAll
Definition: internal.h:96
@ C3DiF_Program
Definition: internal.h:83
@ C3DiF_TexEnvAll
Definition: internal.h:100
static C3D_Context * C3Di_GetContext(void)
Definition: internal.h:111
@ C3DiG_BeginAcc
Definition: internal.h:105
@ C3DiG_RenderStage
Definition: internal.h:108
@ C3DiG_SetAccMax
Definition: internal.h:107
@ C3DiG_AccStage
Definition: internal.h:106
u32 C3D_ProcTexLut[128]
Definition: proctex.h:90
Definition: attribs.h:5
Definition: buffers.h:11
Definition: internal.h:32
u32 flags
Definition: internal.h:38
C3D_BufInfo bufInfo
Definition: internal.h:42
u32 gasLightXY
Definition: internal.h:56
u16 fixedAttribDirty
Definition: internal.h:69
u32 * cmdBuf
Definition: internal.h:34
u32 texConfig
Definition: internal.h:46
u16 gasAccMax
Definition: internal.h:55
u32 gasFlags
Definition: internal.h:58
gxCmdQueue_s gxQueue
Definition: internal.h:33
u32 texEnvBuf
Definition: internal.h:51
u32 gasDeltaZ
Definition: internal.h:57
C3D_AttrInfo attrInfo
Definition: internal.h:41
C3D_ProcTexColorLut * procTexColorLut
Definition: internal.h:63
C3D_GasLut * gasLut
Definition: internal.h:59
shaderProgram_s * program
Definition: internal.h:39
u32 fogClr
Definition: internal.h:52
C3D_FogLut * fogLut
Definition: internal.h:53
float cmdBufUsage
Definition: internal.h:36
C3D_Effect effect
Definition: internal.h:43
u32 texShadow
Definition: internal.h:47
C3D_LightEnv * lightEnv
Definition: internal.h:44
size_t cmdBufSize
Definition: internal.h:35
C3D_FrameBuf fb
Definition: internal.h:65
C3D_ProcTex * procTex
Definition: internal.h:61
Definition: internal.h:13
u32 stencilMode
Definition: internal.h:23
u32 blendClr
Definition: internal.h:26
u32 alphaTest
Definition: internal.h:22
bool earlyDepth
Definition: internal.h:18
GPU_CULLMODE cullMode
Definition: internal.h:17
u32 zOffset
Definition: internal.h:16
u32 depthTest
Definition: internal.h:24
u32 fragOpMode
Definition: internal.h:14
u32 earlyDepthRef
Definition: internal.h:20
GPU_LOGICOP clrLogicOp
Definition: internal.h:28
GPU_EARLYDEPTHFUNC earlyDepthFunc
Definition: internal.h:19
u32 alphaBlend
Definition: internal.h:27
u32 fragOpShadow
Definition: internal.h:15
Definition: fog.h:6
Definition: framebuffer.h:5
Definition: fog.h:11
Definition: proctex.h:5
Definition: proctex.h:11
Definition: texenv.h:5
Definition: texture.h:10
static GPU_TEXTURE_MODE_PARAM C3D_TexGetType(C3D_Tex *tex)
Definition: texture.h:130
Float vector.
Definition: types.h:37