summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2005-01-19 12:09:33 +0000
committerKeith Whitwell <keith@tungstengraphics.com>2005-01-19 12:09:33 +0000
commit2aa34ea98430047e28b4ac47d09421d53c4b77a2 (patch)
treea64dc912375a697028646320132c1f5a4f3073df
parentbdb5725bab0fdfffb20bbfb4f2c3d7aa3482c1bc (diff)
Bring the texcombine fixes to the trunk.
-rw-r--r--src/mesa/drivers/dri/unichrome/via_3d_reg.h8
-rw-r--r--src/mesa/drivers/dri/unichrome/via_context.c6
-rw-r--r--src/mesa/drivers/dri/unichrome/via_context.h5
-rw-r--r--src/mesa/drivers/dri/unichrome/via_state.c25
-rw-r--r--src/mesa/drivers/dri/unichrome/via_tex.h2
-rw-r--r--src/mesa/drivers/dri/unichrome/via_texcombine.c218
-rw-r--r--src/mesa/drivers/dri/unichrome/via_tris.c17
7 files changed, 185 insertions, 96 deletions
diff --git a/src/mesa/drivers/dri/unichrome/via_3d_reg.h b/src/mesa/drivers/dri/unichrome/via_3d_reg.h
index 7e4536d70b..77b24dc615 100644
--- a/src/mesa/drivers/dri/unichrome/via_3d_reg.h
+++ b/src/mesa/drivers/dri/unichrome/via_3d_reg.h
@@ -1038,8 +1038,8 @@
#define HC_HTXnTBA_MASK 0x000000ff
#define HC_HTXnTRAH_SHIFT 16
#define HC_HTXnTRAL_SHIFT 8
-/* HC_SubA_HTXnTBLCsat 0x0080
- *-- Define the input texture.
+
+/*-- Define the input texture, for below
*/
#define HC_XTC_TOPC 0x00000000
#define HC_XTC_InvTOPC 0x00000010
@@ -1057,7 +1057,7 @@
#define HC_XTC_Acur 0x00000008
#define HC_XTC_HTXnTBLRC 0x00000009
#define HC_XTC_Ctexnext 0x0000000a
-/*--
+/** HC_SubA_HTXnTBLCsat 0x0080
*/
#define HC_HTXnTBLCsat_MASK 0x00800000
#define HC_HTXnTBLCa_MASK 0x000fc000
@@ -1137,8 +1137,6 @@
#define HC_HTXnTBLCshift_2 0x00000800
#define HC_HTXnTBLCshift_No 0x00001000
#define HC_HTXnTBLCshift_DotP 0x00001800
-/*=* John Sheng [2003.7.18] texture combine *=*/
-
#define HC_HTXnTBLAop_Add 0x00000000
#define HC_HTXnTBLAop_Sub 0x00000080
#define HC_HTXnTBLAop_Min 0x00000100
diff --git a/src/mesa/drivers/dri/unichrome/via_context.c b/src/mesa/drivers/dri/unichrome/via_context.c
index b82ffb669a..297bf69775 100644
--- a/src/mesa/drivers/dri/unichrome/via_context.c
+++ b/src/mesa/drivers/dri/unichrome/via_context.c
@@ -250,11 +250,11 @@ static const char * const card_extensions[] =
"GL_ARB_point_parameters",
"GL_ARB_texture_env_add",
"GL_ARB_texture_env_combine",
- "GL_ARB_texture_env_dot3",
+/* "GL_ARB_texture_env_dot3", */
"GL_ARB_texture_mirrored_repeat",
"GL_EXT_stencil_wrap",
"GL_EXT_texture_env_combine",
- "GL_EXT_texture_env_dot3",
+/* "GL_EXT_texture_env_dot3", */
"GL_EXT_texture_lod_bias",
"GL_EXT_secondary_color",
"GL_EXT_fog_coord",
@@ -273,7 +273,9 @@ static const struct tnl_pipeline_stage *via_pipeline[] = {
&_tnl_texgen_stage,
&_tnl_texture_transform_stage,
/* REMOVE: point attenuation stage */
+#if 0
&_via_fastrender_stage, /* ADD: unclipped rastersetup-to-dma */
+#endif
&_tnl_render_stage,
0,
};
diff --git a/src/mesa/drivers/dri/unichrome/via_context.h b/src/mesa/drivers/dri/unichrome/via_context.h
index 09494cd3ad..28da220029 100644
--- a/src/mesa/drivers/dri/unichrome/via_context.h
+++ b/src/mesa/drivers/dri/unichrome/via_context.h
@@ -355,8 +355,9 @@ extern void viaXMesaSetFrontClipRects(viaContextPtr vmesa);
extern void viaReAllocateBuffers(GLframebuffer *drawbuffer);
extern void viaXMesaWindowMoved(viaContextPtr vmesa);
-extern void viaTexCombineState(viaContextPtr vmesa,
- const struct gl_tex_env_combine_state * combine, unsigned unit );
+extern GLboolean viaTexCombineState(viaContextPtr vmesa,
+ const struct gl_tex_env_combine_state * combine,
+ unsigned unit );
/* Via hw already adjusted for GL pixel centers:
*/
diff --git a/src/mesa/drivers/dri/unichrome/via_state.c b/src/mesa/drivers/dri/unichrome/via_state.c
index 2d7a2a3b10..97f9a03043 100644
--- a/src/mesa/drivers/dri/unichrome/via_state.c
+++ b/src/mesa/drivers/dri/unichrome/via_state.c
@@ -325,6 +325,16 @@ void viaEmitState(viaContextPtr vmesa)
OUT_RING( (HC_SubA_HTXnTBLRCa << 24) | vmesa->regHTXnTBLRCa_0 );
OUT_RING( (HC_SubA_HTXnTBLRCc << 24) | vmesa->regHTXnTBLRCc_0 );
OUT_RING( (HC_SubA_HTXnTBLRCbias << 24) | vmesa->regHTXnTBLRCbias_0 );
+
+ if (0) {
+ fprintf(stderr, "emitted Ca_0 %08x\n", vmesa->regHTXnTBLRCa_0);
+ fprintf(stderr, "emitted Cb_0 %08x\n", vmesa->regHTXnTBLRCb_0);
+ fprintf(stderr, "emitted Cc_0 %08x\n", vmesa->regHTXnTBLRCc_0);
+ fprintf(stderr, "emitted Cbias_0 %08x\n", vmesa->regHTXnTBLRCbias_0);
+ fprintf(stderr, "emitted Aa_0 %08x\n", vmesa->regHTXnTBLRAa_0);
+ fprintf(stderr, "emitted Fog_0 %08x\n", vmesa->regHTXnTBLRFog_0);
+ }
+
ADVANCE_RING();
if (t->regTexFM == HC_HTXnFM_Index8) {
@@ -841,7 +851,7 @@ get_wrap_mode( GLenum sWrap, GLenum tWrap )
}
-static void viaChooseTextureState(GLcontext *ctx)
+static GLboolean viaChooseTextureState(GLcontext *ctx)
{
viaContextPtr vmesa = VIA_CONTEXT(ctx);
struct gl_texture_unit *texUnit0 = &ctx->Texture.Unit[0];
@@ -928,7 +938,8 @@ static void viaChooseTextureState(GLcontext *ctx)
if (VIA_DEBUG) fprintf(stderr, "texUnit0->EnvMode %x\n",texUnit0->EnvMode);
- viaTexCombineState( vmesa, texUnit0->_CurrentCombine, 0 );
+ if (!viaTexCombineState( vmesa, texUnit0->_CurrentCombine, 0 ))
+ return GL_FALSE;
}
if (texUnit1->_ReallyEnabled) {
@@ -986,7 +997,8 @@ static void viaChooseTextureState(GLcontext *ctx)
vmesa->regHTXnMPMD_1 |= get_wrap_mode( texObj->WrapS,
texObj->WrapT );
- viaTexCombineState( vmesa, texUnit1->_CurrentCombine, 1 );
+ if (!viaTexCombineState( vmesa, texUnit1->_CurrentCombine, 1 ))
+ return GL_FALSE;
}
if (VIA_DEBUG) {
@@ -1007,6 +1019,7 @@ static void viaChooseTextureState(GLcontext *ctx)
}
if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
+ return GL_TRUE;
}
static void viaChooseColorState(GLcontext *ctx)
@@ -1533,8 +1546,10 @@ void viaValidateState( GLcontext *ctx )
viaContextPtr vmesa = VIA_CONTEXT(ctx);
if (vmesa->newState & _NEW_TEXTURE) {
- viaChooseTextureState(ctx);
- viaUpdateTextureState(ctx); /* May modify vmesa->Fallback */
+ GLboolean ok = (viaChooseTextureState(ctx) &&
+ viaUpdateTextureState(ctx));
+
+ FALLBACK(vmesa, VIA_FALLBACK_TEXTURE, !ok);
}
if (vmesa->newState & _NEW_COLOR)
diff --git a/src/mesa/drivers/dri/unichrome/via_tex.h b/src/mesa/drivers/dri/unichrome/via_tex.h
index 6a5c959c4c..1b5611a215 100644
--- a/src/mesa/drivers/dri/unichrome/via_tex.h
+++ b/src/mesa/drivers/dri/unichrome/via_tex.h
@@ -92,7 +92,7 @@ struct via_texture_object_t {
};
viaTextureObjectPtr viaAllocTextureObject(struct gl_texture_object *texObj);
-void viaUpdateTextureState(GLcontext *ctx);
+GLboolean viaUpdateTextureState(GLcontext *ctx);
void viaInitTextureFuncs(struct dd_function_table * functions);
void viaInitTextures(GLcontext *ctx);
diff --git a/src/mesa/drivers/dri/unichrome/via_texcombine.c b/src/mesa/drivers/dri/unichrome/via_texcombine.c
index b0afb57364..d30cc05629 100644
--- a/src/mesa/drivers/dri/unichrome/via_texcombine.c
+++ b/src/mesa/drivers/dri/unichrome/via_texcombine.c
@@ -58,7 +58,6 @@
#define INPUT_B_SHIFT 7
#define INPUT_C_SHIFT 0
#define INPUT_CBias_SHIFT 14
-#define INPUT_ABias_SHIFT 3
#define CONST_ONE (HC_XTC_0 | HC_XTC_InvTOPC)
@@ -73,6 +72,11 @@ static const unsigned alpha_operand_modifier[2] = {
0, HC_XTA_InvTOPA
};
+static const unsigned bias_alpha_operand_modifier[2] = {
+ 0, HC_HTXnTBLAbias_Inv
+};
+
+
static const unsigned c_shift_table[3] = {
HC_HTXnTBLCshift_No, HC_HTXnTBLCshift_1, HC_HTXnTBLCshift_2
};
@@ -102,15 +106,16 @@ static const unsigned a_shift_table[3] = {
* KW: needs attention to the case where texunit 1 is enabled but
* texunit 0 is not.
*/
-void
+GLboolean
viaTexCombineState( viaContextPtr vmesa,
const struct gl_tex_env_combine_state * combine,
unsigned unit )
{
unsigned color_arg[3];
unsigned alpha_arg[3];
- unsigned color = 0;
- unsigned alpha = 0;
+ unsigned bias_alpha_arg[3];
+ unsigned color = HC_HTXnTBLCsat_MASK;
+ unsigned alpha = HC_HTXnTBLAsat_MASK;
unsigned bias = 0;
unsigned op = 0;
unsigned a_shift = combine->ScaleShiftA;
@@ -118,11 +123,18 @@ viaTexCombineState( viaContextPtr vmesa,
unsigned i;
unsigned constant_color[3];
unsigned ordered_constant_color[4];
- unsigned constant_alpha = 0;
+ unsigned constant_alpha[3];
unsigned bias_alpha = 0;
+ unsigned abc_alpha = 0;
const struct gl_texture_unit const * texUnit = & vmesa->glCtx->Texture.Unit[unit];
unsigned env_color[4];
+ /* It seems that the color clamping can be overwhelmed at the 4x
+ * scale settings, necessitating this fallback:
+ */
+ if (c_shift == 2 || a_shift == 2) {
+ return GL_FALSE;
+ }
CLAMPED_FLOAT_TO_UBYTE(env_color[0], texUnit->EnvColor[0]);
CLAMPED_FLOAT_TO_UBYTE(env_color[1], texUnit->EnvColor[1]);
@@ -131,6 +143,7 @@ viaTexCombineState( viaContextPtr vmesa,
(void) memset( constant_color, 0, sizeof( constant_color ) );
(void) memset( ordered_constant_color, 0, sizeof( ordered_constant_color ) );
+ (void) memset( constant_alpha, 0, sizeof( constant_alpha ) );
for ( i = 0 ; i < combine->_NumArgsRGB ; i++ ) {
const GLint op = combine->OperandRGB[i] - GL_SRC_COLOR;
@@ -177,30 +190,6 @@ viaTexCombineState( viaContextPtr vmesa,
}
}
- for ( i = 0 ; i < combine->_NumArgsA ; i++ ) {
- const GLint op = combine->OperandA[i] - GL_SRC_ALPHA;
-
- switch ( combine->SourceA[i] ) {
- case GL_TEXTURE:
- alpha_arg[i] = HC_XTA_Atex;
- alpha_arg[i] += alpha_operand_modifier[op];
- break;
- case GL_CONSTANT:
- alpha_arg[i] = HC_XTA_HTXnTBLRA;
- constant_alpha = (op == 0)
- ? env_color[3] : ~(env_color[3]) & 0x000000ff;
- break;
- case GL_PRIMARY_COLOR:
- alpha_arg[i] = HC_XTA_Adif;
- alpha_arg[i] += alpha_operand_modifier[op];
- break;
- case GL_PREVIOUS:
- alpha_arg[i] = (unit == 0) ? HC_XTA_Adif : HC_XTA_Acur;
- alpha_arg[i] += alpha_operand_modifier[op];
- break;
- }
- }
-
/* On the Unichrome, all combine operations take on some form of:
*
@@ -210,30 +199,32 @@ viaTexCombineState( viaContextPtr vmesa,
* and mask modes are currently unused. With the exception of DOT3, all
* standard GL_COMBINE modes can be implemented simply by selecting the
* correct inputs for A, B, C, and Bias and the correct operation for op.
+ *
+ * NOTE: xBias (when read from the constant registers) is signed,
+ * and scaled to fit -255..255 in 8 bits, ie 0x1 == 2.
*/
- color = HC_HTXnTBLCsat_MASK;
- alpha = HC_HTXnTBLAsat_MASK;
-
switch( combine->ModeRGB ) {
- /* Ca = 0, Cb = 0, Cc = 0, Cbias = arg0
+ /* Ca = 1.0, Cb = arg0, Cc = 0, Cbias = 0
*/
case GL_REPLACE:
- bias |= (color_arg[0] << INPUT_CBias_SHIFT);
- ordered_constant_color[3] = constant_color[0];
+ color |= ((CONST_ONE << INPUT_A_SHIFT) |
+ (color_arg[0] << INPUT_B_SHIFT));
+
+ ordered_constant_color[1] = constant_color[0];
break;
/* Ca = arg[0], Cb = arg[1], Cc = 0, Cbias = 0
*/
case GL_MODULATE:
- color |= (color_arg[0] << INPUT_A_SHIFT)
- | (color_arg[1] << INPUT_B_SHIFT);
+ color |= ((color_arg[0] << INPUT_A_SHIFT) |
+ (color_arg[1] << INPUT_B_SHIFT));
ordered_constant_color[0] = constant_color[0];
ordered_constant_color[1] = constant_color[1];
break;
- /* Ca = 1.0, Cb = arg[0], Cc = 0, Cbias = arg[1]
+ /* Ca = 1.0, Cb = arg[0], Cc = arg[1], Cbias = 0
*/
case GL_ADD:
case GL_SUBTRACT:
@@ -241,25 +232,26 @@ viaTexCombineState( viaContextPtr vmesa,
op |= HC_HTXnTBLCop_Sub;
}
- color |= (color_arg[0] << INPUT_B_SHIFT)
- | (CONST_ONE << INPUT_A_SHIFT);
+ color |= ((CONST_ONE << INPUT_A_SHIFT) |
+ (color_arg[0] << INPUT_B_SHIFT) |
+ (color_arg[1] << INPUT_C_SHIFT));
- bias |= (color_arg[1] << INPUT_CBias_SHIFT);
ordered_constant_color[1] = constant_color[0];
- ordered_constant_color[3] = constant_color[1];
+ ordered_constant_color[2] = constant_color[1];
break;
- /* Ca = 0, Cb = arg[0], Cc = arg[1], Cbias = 0.5
+ /* Ca = 1.0, Cb = arg[0], Cc = arg[1], Cbias = -0.5
*/
case GL_ADD_SIGNED:
- color |= (color_arg[0] << INPUT_B_SHIFT)
- | (color_arg[1] << INPUT_C_SHIFT);
+ color |= ((CONST_ONE << INPUT_A_SHIFT) |
+ (color_arg[0] << INPUT_B_SHIFT) |
+ (color_arg[1] << INPUT_C_SHIFT));
+
bias |= HC_HTXnTBLCbias_HTXnTBLRC;
- op |= HC_HTXnTBLCop_Sub;
ordered_constant_color[1] = constant_color[0];
ordered_constant_color[2] = constant_color[1];
- ordered_constant_color[3] = 0x00808080;
+ ordered_constant_color[3] = 0x00bfbfbf; /* -.5 */
break;
/* Ca = arg[2], Cb = arg[0], Cc = arg[1], Cbias = arg[1]
@@ -267,17 +259,19 @@ viaTexCombineState( viaContextPtr vmesa,
case GL_INTERPOLATE:
op |= HC_HTXnTBLCop_Sub;
- color |= (color_arg[2] << INPUT_A_SHIFT) |
- (color_arg[0] << INPUT_B_SHIFT) |
- (color_arg[1] << INPUT_C_SHIFT);
+ color |= ((color_arg[2] << INPUT_A_SHIFT) |
+ (color_arg[0] << INPUT_B_SHIFT) |
+ (color_arg[1] << INPUT_C_SHIFT));
+
bias |= (color_arg[1] << INPUT_CBias_SHIFT);
ordered_constant_color[0] = constant_color[2];
ordered_constant_color[1] = constant_color[0];
ordered_constant_color[2] = constant_color[1];
- ordered_constant_color[3] = constant_color[1];
+ ordered_constant_color[3] = (constant_color[1] >> 1) & 0x7f7f7f;
break;
+#if 0
/* At this point this code is completely untested. It appears that the
* Unichrome has the same limitation as the Radeon R100. The only
* supported post-scale when doing DOT3 bumpmapping is 1x.
@@ -288,41 +282,88 @@ viaTexCombineState( viaContextPtr vmesa,
case GL_DOT3_RGBA:
c_shift = 2;
a_shift = 2;
- color |= (color_arg[0] << INPUT_A_SHIFT) |
- (color_arg[1] << INPUT_B_SHIFT);
+ color |= ((color_arg[0] << INPUT_A_SHIFT) |
+ (color_arg[1] << INPUT_B_SHIFT));
op |= HC_HTXnTBLDOT4;
break;
+#endif
+
+ default:
+ assert(0);
+ break;
}
+
+
/* The alpha blend stage has the annoying quirk of not having a
* hard-wired 0 input, like the color stage. As a result, we have
* to program the constant register with 0 and use that as our
* 0 input.
+ *
+ * (xA * (xB op xC) + xBias) << xShift
+ *
*/
+ for ( i = 0 ; i < combine->_NumArgsA ; i++ ) {
+ const GLint op = combine->OperandA[i] - GL_SRC_ALPHA;
+
+ switch ( combine->SourceA[i] ) {
+ case GL_TEXTURE:
+ alpha_arg[i] = HC_XTA_Atex;
+ alpha_arg[i] += alpha_operand_modifier[op];
+ bias_alpha_arg[i] = HC_HTXnTBLAbias_Atex;
+ bias_alpha_arg[i] += bias_alpha_operand_modifier[op];
+ break;
+ case GL_CONSTANT:
+ alpha_arg[i] = HC_XTA_HTXnTBLRA;
+ bias_alpha_arg[i] = HC_HTXnTBLAbias_HTXnTBLRAbias;
+ constant_alpha[i] = (op == 0) ? env_color[3] : (~env_color[3] & 0xff);
+ break;
+ case GL_PRIMARY_COLOR:
+ alpha_arg[i] = HC_XTA_Adif;
+ alpha_arg[i] += alpha_operand_modifier[op];
+ bias_alpha_arg[i] = HC_HTXnTBLAbias_Adif;
+ bias_alpha_arg[i] += bias_alpha_operand_modifier[op];
+ break;
+ case GL_PREVIOUS:
+ alpha_arg[i] = (unit == 0) ? HC_XTA_Adif : HC_XTA_Acur;
+ alpha_arg[i] += alpha_operand_modifier[op];
+ bias_alpha_arg[i] = (unit == 0) ? HC_HTXnTBLAbias_Adif : HC_HTXnTBLAbias_Acur;
+ bias_alpha_arg[i] += bias_alpha_operand_modifier[op];
+ break;
+ }
+ }
+
switch( combine->ModeA ) {
/* Aa = 0, Ab = 0, Ac = 0, Abias = arg0
*/
case GL_REPLACE:
- bias |= (alpha_arg[0] << INPUT_ABias_SHIFT);
+ alpha |= ((HC_XTA_HTXnTBLRA << INPUT_A_SHIFT) |
+ (HC_XTA_HTXnTBLRA << INPUT_B_SHIFT) |
+ (HC_XTA_HTXnTBLRA << INPUT_C_SHIFT));
+ abc_alpha = 0;
- alpha |= (HC_XTA_HTXnTBLRA << INPUT_A_SHIFT) |
- (HC_XTA_HTXnTBLRA << INPUT_B_SHIFT) |
- (HC_XTA_HTXnTBLRA << INPUT_C_SHIFT);
+ bias |= bias_alpha_arg[0];
+ bias_alpha = constant_alpha[0] >> 1;
break;
/* Aa = arg[0], Ab = arg[1], Ac = 0, Abias = 0
*/
case GL_MODULATE:
- alpha |= (alpha_arg[1] << INPUT_A_SHIFT)
- | (alpha_arg[0] << INPUT_B_SHIFT)
- | (HC_XTA_HTXnTBLRA << INPUT_C_SHIFT);
+ alpha |= ((alpha_arg[1] << INPUT_A_SHIFT) |
+ (alpha_arg[0] << INPUT_B_SHIFT) |
+ (HC_XTA_HTXnTBLRA << INPUT_C_SHIFT));
+
+ abc_alpha = ((constant_alpha[1] << HC_HTXnTBLRAa_SHIFT) |
+ (constant_alpha[0] << HC_HTXnTBLRAb_SHIFT) |
+ (0 << HC_HTXnTBLRAc_SHIFT));
- bias |= (HC_XTA_HTXnTBLRA << INPUT_ABias_SHIFT);
+ bias |= HC_HTXnTBLAbias_HTXnTBLRAbias;
+ bias_alpha = 0;
break;
- /* Aa = 0, Ab = arg[0], Ac = 0, Abias = arg[1]
+ /* Aa = 1.0, Ab = arg[0], Ac = arg[1], Abias = 0
*/
case GL_ADD:
case GL_SUBTRACT:
@@ -330,22 +371,30 @@ viaTexCombineState( viaContextPtr vmesa,
op |= HC_HTXnTBLAop_Sub;
}
- alpha |= (HC_XTA_HTXnTBLRA << INPUT_A_SHIFT) |
- (alpha_arg[0] << INPUT_B_SHIFT) |
- (HC_XTA_HTXnTBLRA << INPUT_C_SHIFT);
- bias |= (alpha_arg[1] << INPUT_ABias_SHIFT);
+ alpha |= ((HC_XTA_HTXnTBLRA << INPUT_A_SHIFT) |
+ (alpha_arg[0] << INPUT_B_SHIFT) |
+ (alpha_arg[1] << INPUT_C_SHIFT));
+
+ abc_alpha = ((0xff << HC_HTXnTBLRAa_SHIFT) |
+ (constant_alpha[0] << HC_HTXnTBLRAb_SHIFT) |
+ (constant_alpha[1] << HC_HTXnTBLRAc_SHIFT));
+
+ bias |= HC_HTXnTBLAbias_HTXnTBLRAbias;
+ bias_alpha = 0;
break;
- /* Aa = 0, Ab = arg[0], Ac = arg[1], Abias = 0.5
+ /* Aa = 1.0, Ab = arg[0], Ac = arg[1], Abias = -0.5
*/
case GL_ADD_SIGNED:
- op |= HC_HTXnTBLAop_Sub;
-
- alpha |= (alpha_arg[0] << INPUT_B_SHIFT)
- | (alpha_arg[1] << INPUT_C_SHIFT);
- bias |= (HC_XTA_HTXnTBLRA << INPUT_ABias_SHIFT);
-
- bias_alpha = 0x00000080;
+ alpha |= ((HC_XTA_HTXnTBLRA << INPUT_A_SHIFT) |
+ (alpha_arg[0] << INPUT_B_SHIFT) |
+ (alpha_arg[1] << INPUT_C_SHIFT));
+ abc_alpha = ((0xff << HC_HTXnTBLRAa_SHIFT) |
+ (constant_alpha[0] << HC_HTXnTBLRAb_SHIFT) |
+ (constant_alpha[1] << HC_HTXnTBLRAc_SHIFT));
+
+ bias |= HC_HTXnTBLAbias_HTXnTBLRAbias;
+ bias_alpha = 0xbf;
break;
/* Aa = arg[2], Ab = arg[0], Ac = arg[1], Abias = arg[1]
@@ -353,10 +402,15 @@ viaTexCombineState( viaContextPtr vmesa,
case GL_INTERPOLATE:
op |= HC_HTXnTBLAop_Sub;
- alpha |= (alpha_arg[2] << INPUT_A_SHIFT) |
- (alpha_arg[0] << INPUT_B_SHIFT) |
- (alpha_arg[1] << INPUT_C_SHIFT);
- bias |= (alpha_arg[1] << INPUT_ABias_SHIFT);
+ alpha |= ((alpha_arg[2] << INPUT_A_SHIFT) |
+ (alpha_arg[0] << INPUT_B_SHIFT) |
+ (alpha_arg[1] << INPUT_C_SHIFT));
+ abc_alpha = ((constant_alpha[2] << HC_HTXnTBLRAa_SHIFT) |
+ (constant_alpha[0] << HC_HTXnTBLRAb_SHIFT) |
+ (constant_alpha[1] << HC_HTXnTBLRAc_SHIFT));
+
+ bias |= bias_alpha_arg[1];
+ bias_alpha = constant_alpha[1] >> 1;
break;
}
@@ -370,7 +424,8 @@ viaTexCombineState( viaContextPtr vmesa,
vmesa->regHTXnTBLCsat_0 = color;
vmesa->regHTXnTBLAsat_0 = alpha;
vmesa->regHTXnTBLCop_0 = op | bias;
- vmesa->regHTXnTBLRAa_0 = bias_alpha | (constant_alpha << 16);
+ vmesa->regHTXnTBLRAa_0 = abc_alpha;
+ vmesa->regHTXnTBLRFog_0 = bias_alpha;
vmesa->regHTXnTBLRCa_0 = ordered_constant_color[0];
vmesa->regHTXnTBLRCb_0 = ordered_constant_color[1];
@@ -383,12 +438,15 @@ viaTexCombineState( viaContextPtr vmesa,
vmesa->regHTXnTBLCsat_1 = color;
vmesa->regHTXnTBLAsat_1 = alpha;
vmesa->regHTXnTBLCop_1 = op | bias;
- vmesa->regHTXnTBLRAa_1 = bias_alpha | (constant_alpha << 16);
+ vmesa->regHTXnTBLRAa_1 = abc_alpha;
+ vmesa->regHTXnTBLRFog_1 = bias_alpha;
vmesa->regHTXnTBLRCa_1 = ordered_constant_color[0];
vmesa->regHTXnTBLRCb_1 = ordered_constant_color[1];
vmesa->regHTXnTBLRCc_1 = ordered_constant_color[2];
vmesa->regHTXnTBLRCbias_1 = ordered_constant_color[3];
}
+
+ return GL_TRUE;
}
diff --git a/src/mesa/drivers/dri/unichrome/via_tris.c b/src/mesa/drivers/dri/unichrome/via_tris.c
index b49449137a..2d9bf37f03 100644
--- a/src/mesa/drivers/dri/unichrome/via_tris.c
+++ b/src/mesa/drivers/dri/unichrome/via_tris.c
@@ -1052,6 +1052,7 @@ void viaFallback(viaContextPtr vmesa, GLuint bit, GLboolean mode)
vmesa->Fallback |= bit;
if (oldfallback == 0) {
VIA_FLUSH_DMA(vmesa);
+ if (0) fprintf(stderr, "ENTER FALLBACK %x\n", bit);
_swsetup_Wakeup(ctx);
vmesa->renderIndex = ~0;
}
@@ -1061,6 +1062,8 @@ void viaFallback(viaContextPtr vmesa, GLuint bit, GLboolean mode)
if (oldfallback == bit) {
_swrast_flush( ctx );
+ if (0) fprintf(stderr, "LEAVE FALLBACK %x\n", bit);
+
tnl->Driver.Render.Start = viaRenderStart;
tnl->Driver.Render.PrimitiveNotify = viaRenderPrimitive;
tnl->Driver.Render.Finish = viaRenderFinish;
@@ -1082,6 +1085,18 @@ void viaFallback(viaContextPtr vmesa, GLuint bit, GLboolean mode)
}
}
+static void viaRunPipeline( GLcontext *ctx )
+{
+ viaContextPtr vmesa = VIA_CONTEXT(ctx);
+
+ if (vmesa->newState) {
+ vmesa->newRenderState |= vmesa->newState;
+ viaValidateState( ctx );
+ }
+
+ _tnl_run_pipeline( ctx );
+}
+
/**********************************************************************/
/* Initialization. */
@@ -1099,7 +1114,7 @@ void viaInitTriFuncs(GLcontext *ctx)
firsttime = 0;
}
- tnl->Driver.RunPipeline = _tnl_run_pipeline;
+ tnl->Driver.RunPipeline = viaRunPipeline;
tnl->Driver.Render.Start = viaRenderStart;
tnl->Driver.Render.Finish = viaRenderFinish;
tnl->Driver.Render.PrimitiveNotify = viaRenderPrimitive;