Bring the texcombine fixes to the trunk.
authorKeith Whitwell <keith@tungstengraphics.com>
Wed, 19 Jan 2005 12:09:33 +0000 (12:09 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Wed, 19 Jan 2005 12:09:33 +0000 (12:09 +0000)
src/mesa/drivers/dri/unichrome/via_3d_reg.h
src/mesa/drivers/dri/unichrome/via_context.c
src/mesa/drivers/dri/unichrome/via_context.h
src/mesa/drivers/dri/unichrome/via_state.c
src/mesa/drivers/dri/unichrome/via_tex.h
src/mesa/drivers/dri/unichrome/via_texcombine.c
src/mesa/drivers/dri/unichrome/via_tris.c

index 7e4536d70bf47799e6df250132998d5654aa77e5..77b24dc6156a62633e231782e61c7475d400e9a2 100644 (file)
 #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
 #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
 #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
index b82ffb669a9c73c5439d53a3e9acfdc6bcced6e0..297bf69775229eb7085da92f585f49d35c94a49e 100644 (file)
@@ -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,
 };
index 09494cd3adfb174f59ed14c589044170cef136a8..28da220029dff18b8391445db13ed88cd8627a85 100644 (file)
@@ -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:
  */
index 2d7a2a3b10964e2b5a088c6f867d33d34d755999..97f9a030436428f1710f4b536fe02d397cba9065 100644 (file)
@@ -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)
index 6a5c959c4cb891ac8dff5d021da1ad8b8c851bf3..1b5611a2158b1999762585206897f07451c550c7 100644 (file)
@@ -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);
 
index b0afb57364ee4cbd5115a71fc45de631c928916c..d30cc0562904263251ee1512f4a77724f7de444e 100644 (file)
@@ -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;
 }
 
index b49449137a55dd8c43e88a7aa58bf6ba7d169443..2d9bf37f0395eb0dc5ff1f6160e63e38eaa209bb 100644 (file)
@@ -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;