5#include <c3d/uniforms.h>
9static aptHookCookie hookCookie;
36static void C3Di_AptEventHook(APT_HookType hookType,
C3D_UNUSED void* param)
42 case APTHOOK_ONSUSPEND:
48 case APTHOOK_ONRESTORE:
84 cmdBufSize = (cmdBufSize + 0xF) &~ 0xF;
86 ctx->
cmdBuf = (u32*)linearAlloc(cmdBufSize);
92 ctx->
gxQueue.entries = (gxCmdEntry_s*)malloc(ctx->
gxQueue.maxEntries*
sizeof(gxCmdEntry_s));
105 C3D_StencilOp(GPU_STENCIL_KEEP, GPU_STENCIL_KEEP, GPU_STENCIL_KEEP);
110 C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA);
121 for (i = 0; i < 3; i ++)
124 for (i = 0; i < 6; i ++)
125 C3D_TexEnvInit(&ctx->
texEnv[i]);
131 aptHook(&hookCookie, C3Di_AptEventHook, NULL);
140 ctx->
viewport[0] = f32tof24(w / 2.0f);
141 ctx->
viewport[1] = f32tof31(2.0f / w) << 1;
142 ctx->
viewport[2] = f32tof24(h / 2.0f);
143 ctx->
viewport[3] = f32tof31(2.0f / h) << 1;
144 ctx->
viewport[4] = (y << 16) | (x & 0xFFFF);
145 ctx->
scissor[0] = GPU_SCISSOR_DISABLE;
148void C3D_SetScissor(GPU_SCISSORMODE mode, u32 left, u32 top, u32 right, u32 bottom)
153 if (mode == GPU_SCISSOR_DISABLE)
return;
154 ctx->
scissor[1] = (top << 16) | (left & 0xFFFF);
155 ctx->
scissor[2] = ((bottom-1) << 16) | ((right-1) & 0xFFFF);
165 ctx->
flags &= ~C3DiF_FrameBuf;
168 ctx->
flags &= ~C3DiF_DrawUsed;
169 GPUCMD_AddWrite(GPUREG_FRAMEBUFFER_FLUSH, 1);
170 GPUCMD_AddWrite(GPUREG_EARLYDEPTH_CLEAR, 1);
177 ctx->
flags &= ~C3DiF_Viewport;
178 GPUCMD_AddIncrementalWrites(GPUREG_VIEWPORT_WIDTH, ctx->
viewport, 4);
179 GPUCMD_AddWrite(GPUREG_VIEWPORT_XY, ctx->
viewport[4]);
184 ctx->
flags &= ~C3DiF_Scissor;
185 GPUCMD_AddIncrementalWrites(GPUREG_SCISSORTEST_MODE, ctx->
scissor, 3);
196 ctx->
flags &= ~C3DiF_AttrInfo;
202 ctx->
flags &= ~C3DiF_BufInfo;
208 ctx->
flags &= ~C3DiF_Effect;
215 for (i = 0; i < 3; i ++)
228 ctx->
flags &= ~C3DiF_TexAll;
234 ctx->
flags &= ~C3DiF_TexStatus;
235 GPUCMD_AddMaskedWrite(GPUREG_TEXUNIT_CONFIG, 0xB, ctx->
texConfig);
240 GPUCMD_AddMaskedWrite(GPUREG_TEXUNIT_CONFIG, 0x4, BIT(16));
242 GPUCMD_AddWrite(GPUREG_TEXUNIT0_SHADOW, ctx->
texShadow);
250 ctx->
flags &= ~C3DiF_TexEnvBuf;
251 GPUCMD_AddMaskedWrite(GPUREG_TEXENV_UPDATE_BUFFER, 0x7, ctx->
texEnvBuf);
252 GPUCMD_AddWrite(GPUREG_TEXENV_BUFFER_COLOR, ctx->
texEnvBufClr);
253 GPUCMD_AddWrite(GPUREG_FOG_COLOR, ctx->
fogClr);
258 ctx->
flags &= ~C3DiF_FogLut;
261 GPUCMD_AddWrite(GPUREG_FOG_LUT_INDEX, 0);
262 GPUCMD_AddWrites(GPUREG_FOG_LUT_DATA0, ctx->
fogLut->data, 128);
271 for (i = 0; i < 6; i ++)
276 ctx->
flags &= ~C3DiF_TexEnvAll;
283 u32 enable = env != NULL;
284 GPUCMD_AddWrite(GPUREG_LIGHTING_ENABLE0, enable);
285 GPUCMD_AddWrite(GPUREG_LIGHTING_ENABLE1, !enable);
286 ctx->
flags &= ~C3DiF_LightEnv;
294 for (i = 0; i < 12; i ++)
299 GPUCMD_AddWrite(GPUREG_FIXEDATTRIB_INDEX, i);
313 if (!gpuCmdBufOffset)
318 ctx->
flags &= ~C3DiF_DrawUsed;
319 GPUCMD_AddWrite(GPUREG_FRAMEBUFFER_FLUSH, 1);
320 GPUCMD_AddWrite(GPUREG_FRAMEBUFFER_INVALIDATE, 1);
321 GPUCMD_AddWrite(GPUREG_EARLYDEPTH_CLEAR, 1);
324 GPUCMD_Split(pBuf, pSize);
325 u32 totalCmdBufSize = *pBuf + *pSize - ctx->
cmdBuf;
332 return C3Di_GetContext()->cmdBufUsage;
342 aptUnhook(&hookCookie);
356 shaderProgram_s* oldProg = ctx->
program;
357 shaderInstance_s* newGsh = program->geometryShader;
358 if (oldProg != program)
367 shaderInstance_s* oldGsh = oldProg->geometryShader;
369 DVLP_s* oldProgV = oldProg->vertexShader->dvle->dvlp;
370 DVLP_s* oldProgG = oldGsh ? oldGsh->dvle->dvlp : oldProgV;
372 DVLP_s* newProgV = program->vertexShader->dvle->dvlp;
373 DVLP_s* newProgG = newGsh ? newGsh->dvle->dvlp : newProgV;
375 if (oldProgV != newProgV || (!newGsh && oldProgG != newProgG))
377 if (oldProgG != newProgG || (newProgG==oldProgV && newProgG->codeSize >= 512))
391 if (id < 0 || id >= 12)
void C3Di_AttrInfoBind(C3D_AttrInfo *info)
bool C3Di_SplitFrame(u32 **pBuf, u32 *pSize)
void C3D_BindProgram(shaderProgram_s *program)
void C3Di_UpdateContext(void)
C3D_Context __C3D_Context
C3D_FVec * C3D_FixedAttribGetWritePtr(int id)
void C3D_SetScissor(GPU_SCISSORMODE mode, u32 left, u32 top, u32 right, u32 bottom)
bool C3D_Init(size_t cmdBufSize)
float C3D_GetCmdBufUsage(void)
void C3D_SetViewport(u32 x, u32 y, u32 w, u32 h)
void C3Di_BufInfoBind(C3D_BufInfo *info)
void C3D_DepthMap(bool bIsZBuffer, float zScale, float zOffset)
void C3D_AlphaTest(bool enable, GPU_TESTFUNC function, int ref)
void C3Di_EffectBind(C3D_Effect *e)
void C3D_CullFace(GPU_CULLMODE mode)
void C3D_FragOpMode(GPU_FRAGOPMODE mode)
void C3D_StencilTest(bool enable, GPU_TESTFUNC function, int ref, int inputMask, int writeMask)
void C3D_FragOpShadow(float scale, float bias)
void C3D_StencilOp(GPU_STENCILOP sfail, GPU_STENCILOP dfail, GPU_STENCILOP pass)
void C3D_AlphaBlend(GPU_BLENDEQUATION colorEq, GPU_BLENDEQUATION alphaEq, GPU_BLENDFACTOR srcClr, GPU_BLENDFACTOR dstClr, GPU_BLENDFACTOR srcAlpha, GPU_BLENDFACTOR dstAlpha)
void C3D_BlendingColor(u32 color)
void C3D_DepthTest(bool enable, GPU_TESTFUNC function, GPU_WRITEMASK writemask)
void C3D_EarlyDepthTest(bool enable, GPU_EARLYDEPTHFUNC function, u32 ref)
void C3Di_FrameBufBind(C3D_FrameBuf *fb)
void C3Di_GasUpdate(C3D_Context *ctx)
void C3Di_RenderQueueInit(void)
void C3Di_DirtyUniforms(GPU_SHADER_TYPE type)
void C3Di_LoadShaderUniforms(shaderInstance_s *si)
void C3Di_RenderQueueDisableVBlank(void)
void C3Di_RenderQueueEnableVBlank(void)
void C3Di_RenderQueueWaitDone(void)
void C3Di_SetTex(int unit, C3D_Tex *tex)
void C3Di_RenderQueueExit(void)
void C3Di_TexEnvBind(int id, C3D_TexEnv *env)
void C3Di_ClearShaderUniforms(GPU_SHADER_TYPE type)
void C3Di_LightEnvDirty(C3D_LightEnv *env)
void C3Di_LightEnvUpdate(C3D_LightEnv *env)
void C3Di_ProcTexUpdate(C3D_Context *ctx)
void C3Di_ProcTexDirty(C3D_Context *ctx)
C3D_FVec fixedAttribs[12]
shaderProgram_s * program