Skip to content

Commit

Permalink
TEV: do not call GX_SetTevColor with GX_REGPREV
Browse files Browse the repository at this point in the history
It turns out that while this works on Dolphin, the GX_TEVPREV register
cannot be written to, on a real Wii. Therefore, write on a GX_TEVREGx
register, and allocate them dynamically.
  • Loading branch information
mardy authored and WinterMute committed Nov 16, 2024
1 parent 6e15089 commit 342d989
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 5 deletions.
7 changes: 5 additions & 2 deletions src/gc_gl.c
Original file line number Diff line number Diff line change
Expand Up @@ -2118,8 +2118,11 @@ bool _ogx_setup_render_stages()

// STAGE 0: ambient*vert_color -> cprev
// In data: d: Raster Color, a: emission color
GX_SetTevColor(GX_TEVPREV, ecol);
GX_SetTevColorIn(GX_TEVSTAGE0, GX_CC_CPREV, GX_CC_ZERO, GX_CC_ZERO, GX_CC_RASC);
u8 emission_reg = _ogx_gpu_resources->tevreg_first++;
GX_SetTevColor(GX_TEVREG0 + emission_reg, ecol);
/* Multiply by two because there are alpha registers in between */
GX_SetTevColorIn(GX_TEVSTAGE0, GX_CC_C0 + emission_reg * 2,
GX_CC_ZERO, GX_CC_ZERO, GX_CC_RASC);
GX_SetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_RASA);
// Operation: Pass d
GX_SetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
Expand Down
3 changes: 3 additions & 0 deletions src/gpu_resources.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ static void resources_init(OgxGpuResources *resources)
resources->kcolor_first = 0;
resources->kcolor_end = GX_KCOLOR_MAX;

resources->tevreg_first = 0;
resources->tevreg_end = GX_MAX_TEVREG - 1; /* we exclude GX_TEVPREV */

resources->texcoord_first = 0;
resources->texcoord_end = GX_MAXCOORD;

Expand Down
2 changes: 2 additions & 0 deletions src/gpu_resources.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ typedef struct {
uint8_t tevstage_end;
uint8_t kcolor_first;
uint8_t kcolor_end;
uint8_t tevreg_first;
uint8_t tevreg_end;
uint8_t texcoord_first;
uint8_t texcoord_end;
uint8_t pnmtx_first;
Expand Down
9 changes: 6 additions & 3 deletions src/stencil.c
Original file line number Diff line number Diff line change
Expand Up @@ -451,11 +451,14 @@ static bool draw_op(uint16_t op,
glparamstate.dirty.bits.dirty_color_update = 1;

u8 stage = GX_TEVSTAGE0 + _ogx_gpu_resources->tevstage_first++;
GX_SetTevColor(GX_TEVPREV, drawColor);
u8 tevreg_index = _ogx_gpu_resources->tevreg_first++;
GX_SetTevColor(GX_TEVREG0 + tevreg_index, drawColor);
GX_SetTevOrder(stage, GX_TEXCOORDNULL, GX_TEXMAP_DISABLE, GX_COLOR0A0);
/* Pass the constant color */
GX_SetTevColorIn(stage, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_CPREV);
GX_SetTevAlphaIn(stage, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_APREV);
GX_SetTevColorIn(stage, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO,
GX_CC_C0 + tevreg_index * 2);
GX_SetTevAlphaIn(stage, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO,
GX_CA_A0 + tevreg_index);
GX_SetTevColorOp(stage, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1,
GX_TRUE, GX_TEVPREV);
GX_SetTevAlphaOp(stage, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1,
Expand Down

0 comments on commit 342d989

Please sign in to comment.