diff --git a/examples/gputest/source/main.c b/examples/gputest/source/main.c index 142dd39..02d13b7 100644 --- a/examples/gputest/source/main.c +++ b/examples/gputest/source/main.c @@ -125,9 +125,9 @@ int main() C3D_Init(C3D_DEFAULT_CMDBUF_SIZE); MtxStack_Init(&projMtx); - MtxStack_Bind(&projMtx, VSH_FVEC_projMtx, VSH_ULEN_projMtx); + MtxStack_Bind(&projMtx, GPU_VERTEX_SHADER, VSH_FVEC_projMtx, VSH_ULEN_projMtx); MtxStack_Init(&mdlvMtx); - MtxStack_Bind(&mdlvMtx, VSH_FVEC_mdlvMtx, VSH_ULEN_mdlvMtx); + MtxStack_Bind(&mdlvMtx, GPU_VERTEX_SHADER, VSH_FVEC_mdlvMtx, VSH_ULEN_mdlvMtx); C3D_TexInit(&myTex, 64, 64, GPU_RGBA8); C3D_TexUpload(&myTex, grass_bin); diff --git a/include/c3d/mtxstack.h b/include/c3d/mtxstack.h index 7d42ce9..afd4ccf 100644 --- a/include/c3d/mtxstack.h +++ b/include/c3d/mtxstack.h @@ -6,7 +6,7 @@ typedef struct { C3D_Mtx m[C3D_MTXSTACK_SIZE]; int pos; - u8 unifPos, unifLen; + u8 unifType, unifPos, unifLen; bool isDirty; } C3D_MtxStack; @@ -17,7 +17,7 @@ static inline C3D_Mtx* MtxStack_Cur(C3D_MtxStack* stk) } void MtxStack_Init(C3D_MtxStack* stk); -void MtxStack_Bind(C3D_MtxStack* stk, int unifPos, int unifLen); +void MtxStack_Bind(C3D_MtxStack* stk, GPU_SHADER_TYPE unifType, int unifPos, int unifLen); void MtxStack_Push(C3D_MtxStack* stk); void MtxStack_Pop(C3D_MtxStack* stk); void MtxStack_Update(C3D_MtxStack* stk); diff --git a/include/c3d/uniforms.h b/include/c3d/uniforms.h index 0cc9cf4..aa55bc0 100644 --- a/include/c3d/uniforms.h +++ b/include/c3d/uniforms.h @@ -3,41 +3,41 @@ #define C3D_FVUNIF_COUNT 96 #define C3D_IVUNIF_COUNT 4 -extern C3D_FVec C3D_FVUnif[C3D_FVUNIF_COUNT]; -extern C3D_IVec C3D_IVUnif[C3D_IVUNIF_COUNT]; -extern u16 C3D_BoolUnifs; +extern C3D_FVec C3D_FVUnif[2][C3D_FVUNIF_COUNT]; +extern C3D_IVec C3D_IVUnif[2][C3D_IVUNIF_COUNT]; +extern u16 C3D_BoolUnifs[2]; -extern bool C3D_FVUnifDirty[C3D_FVUNIF_COUNT]; -extern bool C3D_IVUnifDirty[C3D_IVUNIF_COUNT]; -extern bool C3D_BoolUnifsDirty; +extern bool C3D_FVUnifDirty[2][C3D_FVUNIF_COUNT]; +extern bool C3D_IVUnifDirty[2][C3D_IVUNIF_COUNT]; +extern bool C3D_BoolUnifsDirty[2]; -static inline C3D_FVec* C3D_FVUnifWritePtr(int id, int size) +static inline C3D_FVec* C3D_FVUnifWritePtr(GPU_SHADER_TYPE type, int id, int size) { int i; for (i = 0; i < size; i ++) - C3D_FVUnifDirty[id+i] = true; - return &C3D_FVUnif[id]; + C3D_FVUnifDirty[type][id+i] = true; + return &C3D_FVUnif[type][id]; } -static inline C3D_IVec* C3D_IVUnifWritePtr(int id) +static inline C3D_IVec* C3D_IVUnifWritePtr(GPU_SHADER_TYPE type, int id) { - C3D_IVUnifDirty[id] = true; - return &C3D_IVUnif[id]; + C3D_IVUnifDirty[type][id] = true; + return &C3D_IVUnif[type][id]; } -static inline void C3D_FVUnifSet(int id, float x, float y, float z, float w) +static inline void C3D_FVUnifSet(GPU_SHADER_TYPE type, int id, float x, float y, float z, float w) { - C3D_FVec* ptr = C3D_FVUnifWritePtr(id, 1); + C3D_FVec* ptr = C3D_FVUnifWritePtr(type, id, 1); ptr->x = x; ptr->y = y; ptr->z = z; ptr->w = w; } -static inline void C3D_IVUnifSet(int id, int x, int y, int z, int w) +static inline void C3D_IVUnifSet(GPU_SHADER_TYPE type, int id, int x, int y, int z, int w) { - C3D_IVec* ptr = C3D_IVUnifWritePtr(id); + C3D_IVec* ptr = C3D_IVUnifWritePtr(type, id); *ptr = IVec_Pack(x, y, z, w); } -void C3D_UpdateUniforms(void); +void C3D_UpdateUniforms(GPU_SHADER_TYPE type); diff --git a/source/base.c b/source/base.c index f76c551..48abea0 100644 --- a/source/base.c +++ b/source/base.c @@ -134,7 +134,8 @@ void C3Di_UpdateContext(void) ctx->flags &= ~C3DiF_TexEnvAll; } - C3D_UpdateUniforms(); + C3D_UpdateUniforms(GPU_VERTEX_SHADER); + C3D_UpdateUniforms(GPU_GEOMETRY_SHADER); } void C3D_FlushAsync(void) diff --git a/source/mtxstack.c b/source/mtxstack.c index 8acabaf..b4bc4a6 100644 --- a/source/mtxstack.c +++ b/source/mtxstack.c @@ -9,8 +9,9 @@ void MtxStack_Init(C3D_MtxStack* stk) Mtx_Identity(&stk->m[0]); } -void MtxStack_Bind(C3D_MtxStack* stk, int unifPos, int unifLen) +void MtxStack_Bind(C3D_MtxStack* stk, GPU_SHADER_TYPE unifType, int unifPos, int unifLen) { + stk->unifType = unifType; stk->unifPos = unifPos; stk->unifLen = unifLen; stk->isDirty = true; @@ -36,7 +37,7 @@ void MtxStack_Update(C3D_MtxStack* stk) if (stk->unifPos != 0xFF) { - C3D_FVec* out = C3D_FVUnifWritePtr(stk->unifPos, stk->unifLen); + C3D_FVec* out = C3D_FVUnifWritePtr(stk->unifType, stk->unifPos, stk->unifLen); memcpy(out, &stk->m[stk->pos], (u32)stk->unifLen * sizeof(C3D_FVec)); } diff --git a/source/uniforms.c b/source/uniforms.c index 49cb988..d0c3101 100644 --- a/source/uniforms.c +++ b/source/uniforms.c @@ -1,21 +1,23 @@ #include //#include -C3D_FVec C3D_FVUnif[C3D_FVUNIF_COUNT]; -C3D_IVec C3D_IVUnif[C3D_IVUNIF_COUNT]; -u16 C3D_BoolUnifs; +C3D_FVec C3D_FVUnif[2][C3D_FVUNIF_COUNT]; +C3D_IVec C3D_IVUnif[2][C3D_IVUNIF_COUNT]; +u16 C3D_BoolUnifs[2]; -bool C3D_FVUnifDirty[C3D_FVUNIF_COUNT]; -bool C3D_IVUnifDirty[C3D_IVUNIF_COUNT]; -bool C3D_BoolUnifsDirty; +bool C3D_FVUnifDirty[2][C3D_FVUNIF_COUNT]; +bool C3D_IVUnifDirty[2][C3D_IVUNIF_COUNT]; +bool C3D_BoolUnifsDirty[2]; -void C3D_UpdateUniforms(void) +void C3D_UpdateUniforms(GPU_SHADER_TYPE type) { + int offset = type == GPU_GEOMETRY_SHADER ? (GPUREG_GSH_BOOLUNIFORM-GPUREG_VSH_BOOLUNIFORM) : 0; + // Update FVec uniforms int i = 0; while (i < C3D_FVUNIF_COUNT) { - if (!C3D_FVUnifDirty[i]) + if (!C3D_FVUnifDirty[type][i]) { i ++; continue; @@ -23,7 +25,7 @@ void C3D_UpdateUniforms(void) // Find the number of consecutive dirty uniforms int j; - for (j = i; j < C3D_FVUNIF_COUNT && C3D_FVUnifDirty[j]; j ++); + for (j = i; j < C3D_FVUNIF_COUNT && C3D_FVUnifDirty[type][j]; j ++); /* consoleClear(); @@ -34,12 +36,12 @@ void C3D_UpdateUniforms(void) */ // Upload the uniforms - GPU_SetFloatUniform(GPU_VERTEX_SHADER, i, (u32*)&C3D_FVUnif[i], j-i); + GPU_SetFloatUniform(type, i, (u32*)&C3D_FVUnif[i], j-i); // Clear the dirty flag int k; for (k = i; k < j; k ++) - C3D_FVUnifDirty[k] = false; + C3D_FVUnifDirty[type][k] = false; // Advance i += j; @@ -48,16 +50,16 @@ void C3D_UpdateUniforms(void) // Update IVec uniforms for (i = 0; i < C3D_IVUNIF_COUNT; i ++) { - if (!C3D_IVUnifDirty[i]) continue; + if (!C3D_IVUnifDirty[type][i]) continue; - GPUCMD_AddWrite(GPUREG_VSH_INTUNIFORM_I0+i, C3D_IVUnif[i]); - C3D_IVUnifDirty[i] = false; + GPUCMD_AddWrite(GPUREG_VSH_INTUNIFORM_I0+offset+i, C3D_IVUnif[type][i]); + C3D_IVUnifDirty[type][i] = false; } // Update bool uniforms - if (C3D_BoolUnifsDirty) + if (C3D_BoolUnifsDirty[type]) { - GPUCMD_AddWrite(GPUREG_VSH_BOOLUNIFORM, 0x7FFF0000 | (u32)C3D_BoolUnifs); - C3D_BoolUnifsDirty = false; + GPUCMD_AddWrite(GPUREG_VSH_BOOLUNIFORM+offset, 0x7FFF0000 | (u32)C3D_BoolUnifs[type]); + C3D_BoolUnifsDirty[type] = false; } }