Refactor GPUREG_TEXUNIT_CONFIG state (in preparation of future changes)

This commit is contained in:
fincs 2017-02-14 18:40:58 +01:00
parent 73f4039a9c
commit 82b9eea410
3 changed files with 22 additions and 12 deletions

View File

@ -70,6 +70,7 @@ bool C3D_Init(size_t cmdBufSize)
C3D_FragOpMode(GPU_FRAGOPMODE_GL); C3D_FragOpMode(GPU_FRAGOPMODE_GL);
C3D_FragOpShadow(0.0, 1.0); C3D_FragOpShadow(0.0, 1.0);
ctx->texConfig = BIT(12);
ctx->texEnvBuf = 0; ctx->texEnvBuf = 0;
ctx->texEnvBufClr = 0xFFFFFFFF; ctx->texEnvBufClr = 0xFFFFFFFF;
@ -165,22 +166,29 @@ void C3Di_UpdateContext(void)
if (ctx->flags & C3DiF_TexAll) if (ctx->flags & C3DiF_TexAll)
{ {
GPU_TEXUNIT units = 0; u32 units = 0;
for (i = 0; i < 3; i ++) for (i = 0; i < 3; i ++)
{ {
static const u8 parm[] = { GPU_TEXUNIT0, GPU_TEXUNIT1, GPU_TEXUNIT2 };
if (ctx->tex[i]) if (ctx->tex[i])
{ {
units |= parm[i]; units |= BIT(i);
if (ctx->flags & C3DiF_Tex(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; 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) if (ctx->flags & C3DiF_TexEnvBuf)

View File

@ -38,6 +38,7 @@ typedef struct
C3D_Effect effect; C3D_Effect effect;
C3D_LightEnv* lightEnv; C3D_LightEnv* lightEnv;
u32 texConfig;
C3D_Tex* tex[3]; C3D_Tex* tex[3];
C3D_TexEnv texEnv[6]; C3D_TexEnv texEnv[6];
@ -71,6 +72,7 @@ enum
C3DiF_VshCode = BIT(11), C3DiF_VshCode = BIT(11),
C3DiF_GshCode = BIT(12), C3DiF_GshCode = BIT(12),
C3DiF_CmdBuffer = BIT(13), C3DiF_CmdBuffer = BIT(13),
C3DiF_TexStatus = BIT(14),
#define C3DiF_Tex(n) BIT(23+(n)) #define C3DiF_Tex(n) BIT(23+(n))
C3DiF_TexAll = 7 << 23, C3DiF_TexAll = 7 << 23,
@ -99,7 +101,7 @@ void C3Di_AttrInfoBind(C3D_AttrInfo* info);
void C3Di_BufInfoBind(C3D_BufInfo* info); void C3Di_BufInfoBind(C3D_BufInfo* info);
void C3Di_FrameBufBind(C3D_FrameBuf* fb); void C3Di_FrameBufBind(C3D_FrameBuf* fb);
void C3Di_TexEnvBind(int id, C3D_TexEnv* env); 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_EffectBind(C3D_Effect* effect);
void C3Di_LightMtlBlend(C3D_Light* light); void C3Di_LightMtlBlend(C3D_Light* light);

View File

@ -255,7 +255,7 @@ void C3D_TexDelete(C3D_Tex* tex)
tex->data = NULL; tex->data = NULL;
} }
void C3Di_SetTex(GPU_TEXUNIT unit, C3D_Tex* tex) void C3Di_SetTex(int unit, C3D_Tex* tex)
{ {
u32 reg[10]; u32 reg[10];
u32 regcount = 5; u32 regcount = 5;
@ -277,15 +277,15 @@ void C3Di_SetTex(GPU_TEXUNIT unit, C3D_Tex* tex)
switch (unit) switch (unit)
{ {
case GPU_TEXUNIT0: case 0:
GPUCMD_AddIncrementalWrites(GPUREG_TEXUNIT0_BORDER_COLOR, reg, regcount); GPUCMD_AddIncrementalWrites(GPUREG_TEXUNIT0_BORDER_COLOR, reg, regcount);
GPUCMD_AddWrite(GPUREG_TEXUNIT0_TYPE, tex->fmt); GPUCMD_AddWrite(GPUREG_TEXUNIT0_TYPE, tex->fmt);
break; break;
case GPU_TEXUNIT1: case 1:
GPUCMD_AddIncrementalWrites(GPUREG_TEXUNIT1_BORDER_COLOR, reg, 5); GPUCMD_AddIncrementalWrites(GPUREG_TEXUNIT1_BORDER_COLOR, reg, 5);
GPUCMD_AddWrite(GPUREG_TEXUNIT1_TYPE, tex->fmt); GPUCMD_AddWrite(GPUREG_TEXUNIT1_TYPE, tex->fmt);
break; break;
case GPU_TEXUNIT2: case 2:
GPUCMD_AddIncrementalWrites(GPUREG_TEXUNIT2_BORDER_COLOR, reg, 5); GPUCMD_AddIncrementalWrites(GPUREG_TEXUNIT2_BORDER_COLOR, reg, 5);
GPUCMD_AddWrite(GPUREG_TEXUNIT2_TYPE, tex->fmt); GPUCMD_AddWrite(GPUREG_TEXUNIT2_TYPE, tex->fmt);
break; break;