i965/fs: Respect ARB_color_buffer_float clamping.
authorEric Anholt <eric@anholt.net>
Tue, 26 Jul 2011 01:50:43 +0000 (18:50 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 29 Jul 2011 03:58:18 +0000 (20:58 -0700)
This was done in the old codegen path, but not the new one.  Caught by
piglit fbo tests after the conversion to GLSL ff_fragment_shader.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp

index b82dfd5ead4122444e5637aa16af16c5710f073b..4f599fb477e77bc519374e742c741b34de16ceba 100644 (file)
@@ -1745,6 +1745,7 @@ void
 fs_visitor::emit_color_write(int index, int first_color_mrf, fs_reg color)
 {
    int reg_width = c->dispatch_width / 8;
+   fs_inst *inst;
 
    if (c->dispatch_width == 8 || intel->gen == 6) {
       /* SIMD8 write looks like:
@@ -1763,8 +1764,10 @@ fs_visitor::emit_color_write(int index, int first_color_mrf, fs_reg color)
        * m + 6: a0
        * m + 7: a1
        */
-      emit(BRW_OPCODE_MOV, fs_reg(MRF, first_color_mrf + index * reg_width),
-          color);
+      inst = emit(BRW_OPCODE_MOV,
+                 fs_reg(MRF, first_color_mrf + index * reg_width),
+                 color);
+      inst->saturate = c->key.clamp_fragment_color;
    } else {
       /* pre-gen6 SIMD16 single source DP write looks like:
        * m + 0: r0
@@ -1782,16 +1785,22 @@ fs_visitor::emit_color_write(int index, int first_color_mrf, fs_reg color)
          * usual destination + 1 for the second half we get
          * destination + 4.
          */
-        emit(BRW_OPCODE_MOV,
-             fs_reg(MRF, BRW_MRF_COMPR4 + first_color_mrf + index), color);
+        inst = emit(BRW_OPCODE_MOV,
+                    fs_reg(MRF, BRW_MRF_COMPR4 + first_color_mrf + index),
+                    color);
+        inst->saturate = c->key.clamp_fragment_color;
       } else {
         push_force_uncompressed();
-        emit(BRW_OPCODE_MOV, fs_reg(MRF, first_color_mrf + index), color);
+        inst = emit(BRW_OPCODE_MOV, fs_reg(MRF, first_color_mrf + index),
+                    color);
+        inst->saturate = c->key.clamp_fragment_color;
         pop_force_uncompressed();
 
         push_force_sechalf();
         color.sechalf = true;
-        emit(BRW_OPCODE_MOV, fs_reg(MRF, first_color_mrf + index + 4), color);
+        inst = emit(BRW_OPCODE_MOV, fs_reg(MRF, first_color_mrf + index + 4),
+                    color);
+        inst->saturate = c->key.clamp_fragment_color;
         pop_force_sechalf();
         color.sechalf = false;
       }