aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/brw_fs.cpp
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2011-03-26 22:04:23 -0700
committerKenneth Graunke <[email protected]>2011-03-26 22:20:11 -0700
commit0c8beb0ab5e72a9d2ecaad51db16a7d5291e120b (patch)
tree8b7efe6e30a2ff86f015592ec531f477c8c4c97c /src/mesa/drivers/dri/i965/brw_fs.cpp
parent62d5f7a04a0b3b11dc3bcf1f416f3b7646eef4f5 (diff)
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.
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_fs.cpp')
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs.cpp8
1 files 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 74596e91c35..b2336b70f0a 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);