From 82b9eea4108b0afb0920798d7370a2719a5f36ab Mon Sep 17 00:00:00 2001 From: fincs Date: Tue, 14 Feb 2017 18:40:58 +0100 Subject: [PATCH] Refactor GPUREG_TEXUNIT_CONFIG state (in preparation of future changes) --- source/base.c | 22 +++++++++++++++------- source/internal.h | 4 +++- source/texture.c | 8 ++++---- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/source/base.c b/source/base.c index 5dfcf53..ced26a9 100644 --- a/source/base.c +++ b/source/base.c @@ -70,6 +70,7 @@ bool C3D_Init(size_t cmdBufSize) C3D_FragOpMode(GPU_FRAGOPMODE_GL); C3D_FragOpShadow(0.0, 1.0); + ctx->texConfig = BIT(12); ctx->texEnvBuf = 0; ctx->texEnvBufClr = 0xFFFFFFFF; @@ -165,22 +166,29 @@ void C3Di_UpdateContext(void) if (ctx->flags & C3DiF_TexAll) { - GPU_TEXUNIT units = 0; - + u32 units = 0; for (i = 0; i < 3; i ++) { - static const u8 parm[] = { GPU_TEXUNIT0, GPU_TEXUNIT1, GPU_TEXUNIT2 }; - if (ctx->tex[i]) { - units |= parm[i]; + units |= BIT(i); if (ctx->flags & C3DiF_Tex(i)) - C3Di_SetTex(parm[i], ctx->tex[i]); + C3Di_SetTex(i, ctx->tex[i]); } } + // Enable texture units and clear texture cache + ctx->texConfig &= ~7; + ctx->texConfig |= units | BIT(16); ctx->flags &= ~C3DiF_TexAll; - GPUCMD_AddWrite(GPUREG_TEXUNIT_CONFIG, 0x00011000|units); // Enable texture units + ctx->flags |= C3DiF_TexStatus; + } + + if (ctx->flags & C3DiF_TexStatus) + { + ctx->flags &= ~C3DiF_TexStatus; + GPUCMD_AddWrite(GPUREG_TEXUNIT_CONFIG, ctx->texConfig); + ctx->texConfig &= ~BIT(16); // Remove clear-texture-cache flag } if (ctx->flags & C3DiF_TexEnvBuf) diff --git a/source/internal.h b/source/internal.h index 66d802e..475cd90 100644 --- a/source/internal.h +++ b/source/internal.h @@ -38,6 +38,7 @@ typedef struct C3D_Effect effect; C3D_LightEnv* lightEnv; + u32 texConfig; C3D_Tex* tex[3]; C3D_TexEnv texEnv[6]; @@ -71,6 +72,7 @@ enum C3DiF_VshCode = BIT(11), C3DiF_GshCode = BIT(12), C3DiF_CmdBuffer = BIT(13), + C3DiF_TexStatus = BIT(14), #define C3DiF_Tex(n) BIT(23+(n)) C3DiF_TexAll = 7 << 23, @@ -99,7 +101,7 @@ void C3Di_AttrInfoBind(C3D_AttrInfo* info); void C3Di_BufInfoBind(C3D_BufInfo* info); void C3Di_FrameBufBind(C3D_FrameBuf* fb); void C3Di_TexEnvBind(int id, C3D_TexEnv* env); -void C3Di_SetTex(GPU_TEXUNIT unit, C3D_Tex* tex); +void C3Di_SetTex(int unit, C3D_Tex* tex); void C3Di_EffectBind(C3D_Effect* effect); void C3Di_LightMtlBlend(C3D_Light* light); diff --git a/source/texture.c b/source/texture.c index edd27a1..89af640 100644 --- a/source/texture.c +++ b/source/texture.c @@ -255,7 +255,7 @@ void C3D_TexDelete(C3D_Tex* tex) tex->data = NULL; } -void C3Di_SetTex(GPU_TEXUNIT unit, C3D_Tex* tex) +void C3Di_SetTex(int unit, C3D_Tex* tex) { u32 reg[10]; u32 regcount = 5; @@ -277,15 +277,15 @@ void C3Di_SetTex(GPU_TEXUNIT unit, C3D_Tex* tex) switch (unit) { - case GPU_TEXUNIT0: + case 0: GPUCMD_AddIncrementalWrites(GPUREG_TEXUNIT0_BORDER_COLOR, reg, regcount); GPUCMD_AddWrite(GPUREG_TEXUNIT0_TYPE, tex->fmt); break; - case GPU_TEXUNIT1: + case 1: GPUCMD_AddIncrementalWrites(GPUREG_TEXUNIT1_BORDER_COLOR, reg, 5); GPUCMD_AddWrite(GPUREG_TEXUNIT1_TYPE, tex->fmt); break; - case GPU_TEXUNIT2: + case 2: GPUCMD_AddIncrementalWrites(GPUREG_TEXUNIT2_BORDER_COLOR, reg, 5); GPUCMD_AddWrite(GPUREG_TEXUNIT2_TYPE, tex->fmt); break;