i965: fix the constant interp bitmask for flat mode
authorYuanhan Liu <yuanhan.liu@linux.intel.com>
Tue, 6 Sep 2011 01:29:37 +0000 (09:29 +0800)
committerYuanhan Liu <yuanhan.liu@linux.intel.com>
Fri, 23 Sep 2011 02:49:42 +0000 (10:49 +0800)
Fix the constant interpolation enable bit mask for flat light mode.
FRAG_BIT_COL0 attribute bit might be 0, in which case we need to
shift one more bit right.

This would fix the oglc specularColor test fail on both Sandybridge and
Ivybridge.

v2: move the constant interp bitmask setup code into for(; attr <
FRAG_ATTRIB_MAX; attr++) loop suggested by Eric.

Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
src/mesa/drivers/dri/i965/gen6_sf_state.c
src/mesa/drivers/dri/i965/gen7_sf_state.c

index 4482e9cc09fd9ae5e0b640f5cd3619651fdb9ee7..5cbfe78c6f0f8c852fdee0d35da5febcad885ba6 100644 (file)
@@ -263,12 +263,6 @@ upload_sf_state(struct brw_context *brw)
         (1 << GEN6_SF_TRIFAN_PROVOKE_SHIFT);
    }
 
-   /* flat shading */
-   if (ctx->Light.ShadeModel == GL_FLAT) {
-       dw17 |= ((brw->fragment_program->Base.InputsRead & (FRAG_BIT_COL0 | FRAG_BIT_COL1)) >>
-                ((brw->fragment_program->Base.InputsRead & FRAG_BIT_WPOS) ? 0 : 1));
-   }
-
    /* Create the mapping from the FS inputs we produce to the VS outputs
     * they source from.
     */
@@ -286,6 +280,19 @@ upload_sf_state(struct brw_context *brw)
       if (attr == FRAG_ATTRIB_PNTC)
         dw16 |= (1 << input_index);
 
+      /* flat shading */
+      if (ctx->Light.ShadeModel == GL_FLAT) {
+         /*
+          * Setup the Constant Interpolation Enable bit mask for each
+          * corresponding attribute(currently, we only care two attrs:
+          * FRAG_BIT_COL0 and FRAG_BIT_COL1).
+          *
+          * FIXME: should we care other attributes?
+          */
+         if (attr == FRAG_ATTRIB_COL0 || attr == FRAG_ATTRIB_COL1)
+             dw17 |= (1 << input_index);
+      }
+
       /* The hardware can only do the overrides on 16 overrides at a
        * time, and the other up to 16 have to be lined up so that the
        * input index = the output index.  We'll need to do some
index 85d2d87313e49f722ce04a194245e2fe69dc07a5..b1bec1a0a228980dcb4b79a968dc2aabee06d4e9 100644 (file)
@@ -68,13 +68,7 @@ upload_sbe_state(struct brw_context *brw)
       dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT;
 
    dw10 = 0;
-
-   /* _NEW_LIGHT (flat shading) */
    dw11 = 0;
-   if (ctx->Light.ShadeModel == GL_FLAT) {
-       dw11 |= ((brw->fragment_program->Base.InputsRead & (FRAG_BIT_COL0 | FRAG_BIT_COL1)) >>
-                ((brw->fragment_program->Base.InputsRead & FRAG_BIT_WPOS) ? 0 : 1));
-   }
 
    /* Create the mapping from the FS inputs we produce to the VS outputs
     * they source from.
@@ -92,6 +86,19 @@ upload_sbe_state(struct brw_context *brw)
       if (attr == FRAG_ATTRIB_PNTC)
         dw10 |= (1 << input_index);
 
+      /* flat shading */
+      if (ctx->Light.ShadeModel == GL_FLAT) {
+         /*
+          * Setup the Constant Interpolation Enable bit mask for each
+          * corresponding attribute(currently, we only care two attrs:
+          * FRAG_BIT_COL0 and FRAG_BIT_COL1).
+          *
+          * FIXME: should we care other attributes?
+          */
+         if (attr == FRAG_ATTRIB_COL0 || attr == FRAG_ATTRIB_COL1)
+             dw11 |= (1 << input_index);
+      }
+
       /* The hardware can only do the overrides on 16 overrides at a
        * time, and the other up to 16 have to be lined up so that the
        * input index = the output index.  We'll need to do some