i965/fs: Fix linear gl_Color interpolation on pre-gen6 hardware.
authorKenneth Graunke <kenneth@whitecape.org>
Sun, 27 Mar 2011 05:04:23 +0000 (22:04 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Sun, 27 Mar 2011 05:20:11 +0000 (22:20 -0700)
Civilization 4's shaders make heavy use of gl_Color and don't use
perspective interpolation.  This resulted in rivers, units, trees, and
so on being rendered almost entirely white.  This is a regression
compared to the old fragment shader backend.

Found by inspection (comparing the old and new FS backend code).

References: https://bugs.freedesktop.org/show_bug.cgi?id=32949

NOTE: This is a candidate for the 7.10 branch.

src/mesa/drivers/dri/i965/brw_fs.cpp

index 74596e91c3523d43a13811e1342a9198db83428f..b2336b70f0a50feb9e3ce9803e72f26c9f9897df 100644 (file)
@@ -539,8 +539,10 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)
            continue;
         }
 
-        if (c->key.flat_shade && (location == FRAG_ATTRIB_COL0 ||
-                                  location == FRAG_ATTRIB_COL1)) {
+        bool is_gl_Color =
+           location == FRAG_ATTRIB_COL0 || location == FRAG_ATTRIB_COL1;
+
+        if (c->key.flat_shade && is_gl_Color) {
            /* Constant interpolation (flat shading) case. The SF has
             * handed us defined values in only the constant offset
             * field of the setup reg.
@@ -560,7 +562,7 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)
               attr.reg_offset++;
            }
 
-           if (intel->gen < 6) {
+           if (intel->gen < 6 && !(is_gl_Color && c->key.linear_color)) {
               attr.reg_offset -= type->vector_elements;
               for (unsigned int c = 0; c < type->vector_elements; c++) {
                  emit(BRW_OPCODE_MUL, attr, attr, this->pixel_w);