Skip to content

Commit 9d51a94

Browse files
committed
Gas changes:
- Separate gas reg writes according to stages - Related: Properly support C3D_GasAccMax - Add C3D_GasBeginAcc - Set correct gas depth function matching depth test in C3Di_EffectBind
1 parent ebf41b6 commit 9d51a94

File tree

5 files changed

+54
-16
lines changed

5 files changed

+54
-16
lines changed

include/c3d/fog.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@ void C3D_FogLutBind(C3D_FogLut* lut);
2727

2828
void GasLut_FromArray(C3D_GasLut* lut, const u32 data[9]);
2929

30-
void C3D_GasAttn(float value);
31-
void C3D_GasAccMax(float value);
30+
void C3D_GasBeginAcc(void);
3231
void C3D_GasDeltaZ(float value);
32+
33+
void C3D_GasAccMax(float value);
34+
void C3D_GasAttn(float value);
3335
void C3D_GasLightPlanar(float min, float max, float attn);
3436
void C3D_GasLightView(float min, float max, float attn);
3537
void C3D_GasLightDirection(float dotp);

source/base.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ static void C3Di_AptEventHook(APT_HookType hookType, C3D_UNUSED void* param)
6262
C3Di_DirtyUniforms(GPU_GEOMETRY_SHADER);
6363

6464
ctx->fixedAttribDirty |= ctx->fixedAttribEverDirty;
65+
ctx->gasFlags |= C3DiG_BeginAcc | C3DiG_AccStage | C3DiG_RenderStage;
6566

6667
C3D_LightEnv* env = ctx->lightEnv;
6768
if (ctx->fogLut)

source/effect.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ void C3Di_EffectBind(C3D_Effect* e)
9393
GPUCMD_AddWrite(GPUREG_FACECULLING_CONFIG, e->cullMode & 0x3);
9494
GPUCMD_AddIncrementalWrites(GPUREG_DEPTHMAP_SCALE, (u32*)&e->zScale, 2);
9595
GPUCMD_AddIncrementalWrites(GPUREG_FRAGOP_ALPHA_TEST, (u32*)&e->alphaTest, 4);
96+
GPUCMD_AddMaskedWrite(GPUREG_GAS_DELTAZ_DEPTH, 0x8, (u32)GPU_MAKEGASDEPTHFUNC((e->depthTest>>4)&7) << 24);
9697
GPUCMD_AddWrite(GPUREG_BLEND_COLOR, e->blendClr);
9798
GPUCMD_AddWrite(GPUREG_BLEND_FUNC, e->alphaBlend);
9899
GPUCMD_AddWrite(GPUREG_LOGIC_OP, e->clrLogicOp);

source/gas.c

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,26 @@ void GasLut_FromArray(C3D_GasLut* lut, const u32 data[9])
3939
}
4040
}
4141

42-
void C3D_GasAttn(float value)
42+
void C3D_GasBeginAcc(void)
43+
{
44+
C3D_Context* ctx = C3Di_GetContext();
45+
46+
if (!(ctx->flags & C3DiF_Active))
47+
return;
48+
49+
ctx->gasFlags |= C3DiG_BeginAcc;
50+
}
51+
52+
void C3D_GasDeltaZ(float value)
4353
{
4454
C3D_Context* ctx = C3Di_GetContext();
4555

4656
if (!(ctx->flags & C3DiF_Active))
4757
return;
4858

4959
ctx->flags |= C3DiF_Gas;
50-
ctx->gasAttn = f32tof16(value);
60+
ctx->gasDeltaZ = (u32)(value*0x100);
61+
ctx->gasFlags |= C3DiG_AccStage;
5162
}
5263

5364
void C3D_GasAccMax(float value)
@@ -59,18 +70,19 @@ void C3D_GasAccMax(float value)
5970

6071
ctx->flags |= C3DiF_Gas;
6172
ctx->gasAccMax = f32tof16(1.0f / value);
73+
ctx->gasFlags |= C3DiG_SetAccMax;
6274
}
6375

64-
void C3D_GasDeltaZ(float value)
76+
void C3D_GasAttn(float value)
6577
{
6678
C3D_Context* ctx = C3Di_GetContext();
6779

6880
if (!(ctx->flags & C3DiF_Active))
6981
return;
7082

7183
ctx->flags |= C3DiF_Gas;
72-
ctx->gasDeltaZ = (u32)(value*0x100) & 0xFFFFFF;
73-
ctx->gasDeltaZ |= 2<<24;
84+
ctx->gasAttn = f32tof16(value);
85+
ctx->gasFlags |= C3DiG_RenderStage;
7486
}
7587

7688
void C3D_GasLightPlanar(float min, float max, float attn)
@@ -82,6 +94,7 @@ void C3D_GasLightPlanar(float min, float max, float attn)
8294

8395
ctx->flags |= C3DiF_Gas;
8496
ctx->gasLightXY = conv_u8(min,0) | conv_u8(max,8) | conv_u8(attn,16);
97+
ctx->gasFlags |= C3DiG_RenderStage;
8598
}
8699

87100
void C3D_GasLightView(float min, float max, float attn)
@@ -93,6 +106,7 @@ void C3D_GasLightView(float min, float max, float attn)
93106

94107
ctx->flags |= C3DiF_Gas;
95108
ctx->gasLightZ = conv_u8(min,0) | conv_u8(max,8) | conv_u8(attn,16);
109+
ctx->gasFlags |= C3DiG_RenderStage;
96110
}
97111

98112
void C3D_GasLightDirection(float dotp)
@@ -105,6 +119,7 @@ void C3D_GasLightDirection(float dotp)
105119
ctx->flags |= C3DiF_Gas;
106120
ctx->gasLightZColor &= ~0xFF;
107121
ctx->gasLightZColor |= conv_u8(dotp,0);
122+
ctx->gasFlags |= C3DiG_RenderStage;
108123
}
109124

110125
void C3D_GasLutInput(GPU_GASLUTINPUT input)
@@ -117,6 +132,7 @@ void C3D_GasLutInput(GPU_GASLUTINPUT input)
117132
ctx->flags |= C3DiF_Gas;
118133
ctx->gasLightZColor &= ~0x100;
119134
ctx->gasLightZColor |= (input&1)<<8;
135+
ctx->gasFlags |= C3DiG_RenderStage;
120136
}
121137

122138
void C3D_GasLutBind(C3D_GasLut* lut)
@@ -136,17 +152,25 @@ void C3D_GasLutBind(C3D_GasLut* lut)
136152

137153
void C3Di_GasUpdate(C3D_Context* ctx)
138154
{
139-
//__builtin_printf("updgasstate %08lX\n", ctx->flags);
140-
//for(;;);
141155
if (ctx->flags & C3DiF_Gas)
142156
{
143157
ctx->flags &= ~C3DiF_Gas;
144-
GPUCMD_AddWrite(GPUREG_GAS_ATTENUATION, ctx->gasAttn);
145-
//GPUCMD_AddWrite(GPUREG_GAS_ACCMAX, ctx->gasAccMax);
146-
GPUCMD_AddWrite(GPUREG_GAS_LIGHT_XY, ctx->gasLightXY);
147-
GPUCMD_AddWrite(GPUREG_GAS_LIGHT_Z, ctx->gasLightZ);
148-
GPUCMD_AddWrite(GPUREG_GAS_LIGHT_Z_COLOR, ctx->gasLightZColor);
149-
GPUCMD_AddWrite(GPUREG_GAS_DELTAZ_DEPTH, ctx->gasDeltaZ);
158+
u32 gasFlags = ctx->gasFlags;
159+
ctx->gasFlags = 0;
160+
161+
if (gasFlags & C3DiG_BeginAcc)
162+
GPUCMD_AddMaskedWrite(GPUREG_GAS_ACCMAX_FEEDBACK, 0x3, 0);
163+
if (gasFlags & C3DiG_AccStage)
164+
GPUCMD_AddMaskedWrite(GPUREG_GAS_DELTAZ_DEPTH, 0x7, ctx->gasDeltaZ);
165+
if (gasFlags & C3DiG_SetAccMax)
166+
GPUCMD_AddWrite(GPUREG_GAS_ACCMAX, ctx->gasAccMax);
167+
if (gasFlags & C3DiG_RenderStage)
168+
{
169+
GPUCMD_AddWrite(GPUREG_GAS_ATTENUATION, ctx->gasAttn);
170+
GPUCMD_AddWrite(GPUREG_GAS_LIGHT_XY, ctx->gasLightXY);
171+
GPUCMD_AddWrite(GPUREG_GAS_LIGHT_Z, ctx->gasLightZ);
172+
GPUCMD_AddWrite(GPUREG_GAS_LIGHT_Z_COLOR, ctx->gasLightZColor);
173+
}
150174
}
151175
if (ctx->flags & C3DiF_GasLut)
152176
{

source/internal.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ typedef struct
5353
C3D_FogLut* fogLut;
5454

5555
u16 gasAttn, gasAccMax;
56-
u32 gasLightXY, gasLightZ, gasLightZColor, gasDeltaZ;
56+
u32 gasLightXY, gasLightZ, gasLightZColor;
57+
u32 gasDeltaZ : 24;
58+
u32 gasFlags : 8;
5759
C3D_GasLut* gasLut;
5860

5961
C3D_ProcTex* procTex;
@@ -98,6 +100,14 @@ enum
98100
C3DiF_TexEnvAll = 0x3F << 26,
99101
};
100102

103+
enum
104+
{
105+
C3DiG_BeginAcc = BIT(0),
106+
C3DiG_AccStage = BIT(1),
107+
C3DiG_SetAccMax = BIT(2),
108+
C3DiG_RenderStage = BIT(3),
109+
};
110+
101111
static inline C3D_Context* C3Di_GetContext(void)
102112
{
103113
extern C3D_Context __C3D_Context;

0 commit comments

Comments
 (0)