@@ -78,7 +78,8 @@ typedef struct {
78
78
} TevSource ;
79
79
80
80
static TevSource gl_rgbsource_to_gx (GLenum source , GLenum operand ,
81
- u8 prev_rgb , u8 prev_alpha )
81
+ u8 prev_rgb , u8 prev_alpha ,
82
+ u8 raster_rgb , u8 raster_alpha )
82
83
{
83
84
TevSource ret = { GX_CC_ZERO , false };
84
85
if (operand == GL_ONE_MINUS_SRC_COLOR ) {
@@ -105,16 +106,16 @@ static TevSource gl_rgbsource_to_gx(GLenum source, GLenum operand,
105
106
case GL_CONSTANT : ret .source = GX_CC_KONST ; break ;
106
107
case GL_PRIMARY_COLOR :
107
108
switch (operand ) {
108
- case GL_SRC_COLOR : ret .source = GX_CC_RASC ; break ;
109
- case GL_SRC_ALPHA : ret .source = GX_CC_RASA ; break ;
109
+ case GL_SRC_COLOR : ret .source = raster_rgb ; break ;
110
+ case GL_SRC_ALPHA : ret .source = raster_alpha ; break ;
110
111
}
111
112
break ;
112
113
}
113
114
return ret ;
114
115
}
115
116
116
117
static TevSource gl_alphasource_to_gx (GLenum source , GLenum operand ,
117
- u8 prev_alpha )
118
+ u8 prev_alpha , u8 raster_alpha )
118
119
{
119
120
TevSource ret = { GX_CA_ZERO , false };
120
121
/* For the alpha channel, operand can only be either GL_SRC_ALPHA or
@@ -127,7 +128,7 @@ static TevSource gl_alphasource_to_gx(GLenum source, GLenum operand,
127
128
case GL_TEXTURE : ret .source = GX_CA_TEXA ; break ;
128
129
case GL_PREVIOUS : ret .source = prev_alpha ; break ;
129
130
case GL_CONSTANT : ret .source = GX_CA_KONST ; break ;
130
- case GL_PRIMARY_COLOR : ret .source = GX_CA_RASA ; break ;
131
+ case GL_PRIMARY_COLOR : ret .source = raster_alpha ; break ;
131
132
}
132
133
return ret ;
133
134
}
@@ -339,28 +340,21 @@ static TevInput compute_tev_input(GLenum combine_func, u8 stage, GXColor color,
339
340
return ret ;
340
341
}
341
342
342
- static void setup_combine_operation (const OgxTextureUnit * te ,
343
- u8 stage )
343
+ static void setup_combine_operation (const OgxTextureUnit * te , u8 stage ,
344
+ u8 prev_rgb , u8 prev_alpha ,
345
+ u8 raster_rgb , u8 raster_alpha )
344
346
{
345
347
TevSource source_rgb [3 ];
346
348
TevSource source_alpha [3 ];
347
349
348
- u8 prev_rgb , prev_alpha ;
349
- if (stage == GX_TEVSTAGE0 ) {
350
- prev_rgb = GX_CC_RASC ;
351
- prev_alpha = GX_CA_RASA ;
352
- } else {
353
- prev_rgb = GX_CC_CPREV ;
354
- prev_alpha = GX_CA_APREV ;
355
- }
356
-
357
350
for (int i = 0 ; i < 3 ; i ++ ) {
358
351
source_rgb [i ] = gl_rgbsource_to_gx (te -> source_rgb [i ],
359
352
te -> operand_rgb [i ],
360
- prev_rgb , prev_alpha );
353
+ prev_rgb , prev_alpha ,
354
+ raster_rgb , raster_alpha );
361
355
source_alpha [i ] = gl_alphasource_to_gx (te -> source_alpha [i ],
362
356
te -> operand_alpha [i ],
363
- prev_alpha );
357
+ prev_alpha , raster_alpha );
364
358
}
365
359
366
360
TevInput rgb = compute_tev_input (te -> combine_rgb , stage , te -> color ,
@@ -379,7 +373,8 @@ static void setup_combine_operation(const OgxTextureUnit *te,
379
373
380
374
static void setup_texture_stage (const OgxTextureUnit * tu ,
381
375
u8 stage , u8 tex_coord , u8 tex_map ,
382
- u8 raster_color , u8 raster_alpha ,
376
+ u8 prev_rgb , u8 prev_alpha ,
377
+ u8 raster_rgb , u8 raster_alpha ,
383
378
u8 channel )
384
379
{
385
380
switch (tu -> mode ) {
@@ -391,25 +386,26 @@ static void setup_texture_stage(const OgxTextureUnit *tu,
391
386
case GL_ADD :
392
387
/* In data: d: Texture Color a: raster value, Operation: a+d
393
388
* Alpha gets multiplied. */
394
- GX_SetTevColorIn (stage , raster_color , GX_CC_ZERO , GX_CC_ZERO , GX_CC_TEXC );
395
- GX_SetTevAlphaIn (stage , GX_CA_ZERO , raster_alpha , GX_CA_TEXA , GX_CA_ZERO );
389
+ GX_SetTevColorIn (stage , prev_rgb , GX_CC_ZERO , GX_CC_ZERO , GX_CC_TEXC );
390
+ GX_SetTevAlphaIn (stage , GX_CA_ZERO , prev_alpha , GX_CA_TEXA , GX_CA_ZERO );
396
391
break ;
397
392
case GL_BLEND :
398
393
/* In data: c: Texture Color, a: raster value, b: tex env
399
394
* Operation: a(1-c)+b*c
400
395
* Until we implement GL_TEXTURE_ENV_COLOR, use white (GX_CC_ONE) for
401
396
* the tex env color. */
402
- GX_SetTevColorIn (stage , raster_color , GX_CC_ONE , GX_CC_TEXC , GX_CC_ZERO );
403
- GX_SetTevAlphaIn (stage , GX_CA_ZERO , raster_alpha , GX_CA_TEXA , GX_CA_ZERO );
397
+ GX_SetTevColorIn (stage , prev_rgb , GX_CC_ONE , GX_CC_TEXC , GX_CC_ZERO );
398
+ GX_SetTevAlphaIn (stage , GX_CA_ZERO , prev_alpha , GX_CA_TEXA , GX_CA_ZERO );
404
399
break ;
405
400
case GL_COMBINE :
406
- setup_combine_operation (tu , stage );
401
+ setup_combine_operation (tu , stage , prev_rgb , prev_alpha ,
402
+ raster_rgb , raster_alpha );
407
403
break ;
408
404
case GL_MODULATE :
409
405
default :
410
406
// In data: c: Texture Color b: raster value, Operation: b*c
411
- GX_SetTevColorIn (stage , GX_CC_ZERO , raster_color , GX_CC_TEXC , GX_CC_ZERO );
412
- GX_SetTevAlphaIn (stage , GX_CA_ZERO , raster_alpha , GX_CA_TEXA , GX_CA_ZERO );
407
+ GX_SetTevColorIn (stage , GX_CC_ZERO , prev_rgb , GX_CC_TEXC , GX_CC_ZERO );
408
+ GX_SetTevAlphaIn (stage , GX_CA_ZERO , prev_alpha , GX_CA_TEXA , GX_CA_ZERO );
413
409
break ;
414
410
}
415
411
if (!tu -> mode != GL_COMBINE ) {
@@ -437,9 +433,20 @@ static void setup_texture_stage_matrix(const OgxTextureUnit *tu,
437
433
GX_LoadTexMtxImm (m , dtt_matrix , GX_MTX3x4 );
438
434
}
439
435
440
- void _ogx_setup_texture_stages (u8 raster_color , u8 raster_alpha ,
441
- u8 channel )
436
+ void _ogx_setup_texture_stages (u8 raster_reg_index , u8 channel )
442
437
{
438
+ u8 raster_rgb , raster_alpha ;
439
+ if (channel != GX_COLORNULL ) {
440
+ raster_rgb = GX_CC_RASC ;
441
+ raster_alpha = GX_CA_RASA ;
442
+ } else {
443
+ raster_rgb = GX_CC_C0 + raster_reg_index * 2 ;
444
+ raster_alpha = GX_CA_A0 + raster_reg_index ;
445
+ }
446
+
447
+ u8 prev_rgb = raster_rgb ;
448
+ u8 prev_alpha = raster_alpha ;
449
+
443
450
/* This variable holds the number of enabled texture units for which the
444
451
* client provided texture coordinates (not generated, but literally a
445
452
* GX_VA_TEX* array was specified). */
@@ -466,7 +473,8 @@ void _ogx_setup_texture_stages(u8 raster_color, u8 raster_alpha,
466
473
u8 dtt_matrix = GX_DTTMTX0 + _ogx_gpu_resources -> dttmtx_first ++ * 3 ;
467
474
468
475
setup_texture_stage (tu , stage , tex_coord , tex_map ,
469
- raster_color , raster_alpha , channel );
476
+ prev_rgb , prev_alpha ,
477
+ raster_rgb , raster_alpha , channel );
470
478
471
479
setup_texture_stage_matrix (tu , dtt_matrix );
472
480
if (tu -> gen_enabled ) {
@@ -478,7 +486,7 @@ void _ogx_setup_texture_stages(u8 raster_color, u8 raster_alpha,
478
486
479
487
/* All texture stages after the first one get their vertex color from
480
488
* the previous stage */
481
- raster_color = GX_CC_CPREV ;
482
- raster_alpha = GX_CA_APREV ;
489
+ prev_rgb = GX_CC_CPREV ;
490
+ prev_alpha = GX_CA_APREV ;
483
491
}
484
492
}
0 commit comments