From 0c8beb0ab5e72a9d2ecaad51db16a7d5291e120b Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Sat, 26 Mar 2011 22:04:23 -0700 Subject: [PATCH] i965/fs: Fix linear gl_Color interpolation on pre-gen6 hardware. 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 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 74596e9..b2336b7 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -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); -- 2.7.4