Fix colormaterial flag calculations.
authorKeith Whitwell <keith@tungstengraphics.com>
Fri, 10 Jun 2005 08:33:37 +0000 (08:33 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Fri, 10 Jun 2005 08:33:37 +0000 (08:33 +0000)
Fix lighting alpha result.

src/mesa/tnl/t_vp_build.c

index 53e1d6f..e306fc8 100644 (file)
@@ -131,15 +131,16 @@ static struct state_key *make_state_key( GLcontext *ctx )
       if (ctx->Light.Model.TwoSide)
         key->light_twoside = 1;
 
-      if (ctx->Light.ColorMaterialEnabled)
+      if (ctx->Light.ColorMaterialEnabled) {
         key->light_color_material = 1;
-
-      if (ctx->Light.ColorMaterialBitmask)
-        key->light_color_material_mask = 1;
+        key->light_color_material_mask = ctx->Light.ColorMaterialBitmask;
+        _mesa_printf("ColorMaterialBitmask %x / %x\n", ctx->Light.ColorMaterialBitmask,
+                     key->light_color_material_mask);
+      }
 
       for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT ; i < _TNL_ATTRIB_INDEX ; i++) 
         if (VB->AttribPtr[i]->stride) 
-           key->light_material_mask |= 1<<i;
+           key->light_material_mask |= 1<<(i-_TNL_ATTRIB_MAT_FRONT_AMBIENT);
 
       for (i = 0; i < MAX_LIGHTS; i++) {
         struct gl_light *light = &ctx->Light.Light[i];
@@ -708,8 +709,7 @@ static void build_hpos( struct tnl_program *p )
 
 static GLuint material_attrib( GLuint side, GLuint property )
 {
-   return (_TNL_ATTRIB_MAT_FRONT_AMBIENT + 
-          (property - STATE_AMBIENT) * 2 + 
+   return ((property - STATE_AMBIENT) * 2 + 
           side);
 }
 
@@ -735,14 +735,14 @@ static struct ureg get_material( struct tnl_program *p, GLuint side,
    if (p->color_materials & (1<<attrib))
       return register_input(p, VERT_ATTRIB_COLOR0);
    else if (p->materials & (1<<attrib)) 
-      return register_input( p, attrib );
+      return register_input( p, attrib + _TNL_ATTRIB_MAT_FRONT_AMBIENT );
    else
       return register_param3( p, STATE_MATERIAL, side, property );
 }
 
-#define SCENE_COLOR_BITS(side) (( _TNL_BIT_MAT_FRONT_EMISSION | \
-                                  _TNL_BIT_MAT_FRONT_AMBIENT | \
-                                  _TNL_BIT_MAT_FRONT_DIFFUSE) << (side))
+#define SCENE_COLOR_BITS(side) (( MAT_BIT_FRONT_EMISSION | \
+                                  MAT_BIT_FRONT_AMBIENT | \
+                                  MAT_BIT_FRONT_DIFFUSE) << (side))
 
 /* Either return a precalculated constant value or emit code to
  * calculate these values dynamically in the case where material calls
@@ -894,7 +894,6 @@ static void build_lighting( struct tnl_program *p )
 
    /* If no lights, still need to emit the scenecolor.
     */
-   if (nr_lights == 0) {
       {
         struct ureg res0 = register_output( p, VERT_RESULT_COL0 );
         emit_op1(p, VP_OPCODE_MOV, res0, 0, _col0);
@@ -915,6 +914,7 @@ static void build_lighting( struct tnl_program *p )
         emit_op1(p, VP_OPCODE_MOV, res1, 0, _bfc1);
       }
       
+   if (nr_lights == 0) {
       release_temps(p);
       return;
    }
@@ -993,6 +993,7 @@ static void build_lighting( struct tnl_program *p )
            struct ureg diffuse = get_lightprod(p, i, 0, STATE_DIFFUSE);
            struct ureg specular = get_lightprod(p, i, 0, STATE_SPECULAR);
            struct ureg res0, res1;
+           GLuint mask0, mask1;
 
            emit_op1(p, VP_OPCODE_LIT, lit, 0, dots);
    
@@ -1002,21 +1003,27 @@ static void build_lighting( struct tnl_program *p )
            
            if (count == nr_lights) {
               if (separate) {
+                 mask0 = WRITEMASK_XYZ;
+                 mask1 = WRITEMASK_XYZ;
                  res0 = register_output( p, VERT_RESULT_COL0 );
                  res1 = register_output( p, VERT_RESULT_COL1 );
               }
               else {
+                 mask0 = 0;
+                 mask1 = WRITEMASK_XYZ;
                  res0 = _col0;
                  res1 = register_output( p, VERT_RESULT_COL0 );
               }
            } else {
+              mask0 = 0;
+              mask1 = 0;
               res0 = _col0;
               res1 = _col1;
            }
 
            emit_op3(p, VP_OPCODE_MAD, _col0, 0, swizzle1(lit,X), ambient, _col0);
-           emit_op3(p, VP_OPCODE_MAD, res0, 0, swizzle1(lit,Y), diffuse, _col0);
-           emit_op3(p, VP_OPCODE_MAD, res1, 0, swizzle1(lit,Z), specular, _col1);
+           emit_op3(p, VP_OPCODE_MAD, res0, mask0, swizzle1(lit,Y), diffuse, _col0);
+           emit_op3(p, VP_OPCODE_MAD, res1, mask1, swizzle1(lit,Z), specular, _col1);
       
            release_temp(p, ambient);
            release_temp(p, diffuse);
@@ -1030,6 +1037,7 @@ static void build_lighting( struct tnl_program *p )
            struct ureg diffuse = get_lightprod(p, i, 1, STATE_DIFFUSE);
            struct ureg specular = get_lightprod(p, i, 1, STATE_SPECULAR);
            struct ureg res0, res1;
+           GLuint mask0, mask1;
               
            emit_op1(p, VP_OPCODE_LIT, lit, 0, negate(swizzle(dots,X,Y,W,Z)));
 
@@ -1038,22 +1046,27 @@ static void build_lighting( struct tnl_program *p )
 
            if (count == nr_lights) {
               if (separate) {
+                 mask0 = WRITEMASK_XYZ;
+                 mask1 = WRITEMASK_XYZ;
                  res0 = register_output( p, VERT_RESULT_BFC0 );
                  res1 = register_output( p, VERT_RESULT_BFC1 );
               }
               else {
+                 mask0 = 0;
+                 mask1 = WRITEMASK_XYZ;
                  res0 = _bfc0;
                  res1 = register_output( p, VERT_RESULT_BFC0 );
               }
            } else {
               res0 = _bfc0;
               res1 = _bfc1;
+              mask0 = 0;
+              mask1 = 0;
            }
 
-
            emit_op3(p, VP_OPCODE_MAD, _bfc0, 0, swizzle1(lit,X), ambient, _bfc0);
-           emit_op3(p, VP_OPCODE_MAD, res0, 0, swizzle1(lit,Y), diffuse, _bfc0);
-           emit_op3(p, VP_OPCODE_MAD, res1, 0, swizzle1(lit,Z), specular, _bfc1);
+           emit_op3(p, VP_OPCODE_MAD, res0, mask0, swizzle1(lit,Y), diffuse, _bfc0);
+           emit_op3(p, VP_OPCODE_MAD, res1, mask1, swizzle1(lit,Z), specular, _bfc1);
 
            release_temp(p, ambient);
            release_temp(p, diffuse);