OSDN Git Service

i915: Calculate partial result to temp register first
authorIan Romanick <ian.d.romanick@intel.com>
Thu, 10 Feb 2011 19:48:59 +0000 (11:48 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 10 Feb 2011 21:26:49 +0000 (13:26 -0800)
Previously the SNE and SEQ instructions would calculate the partial
result to the destination register.  This would cause problems if the
destination register was also one of the source registers.

Fixes piglit tests glsl-fs-any, glsl-fs-struct-equal,
glsl-fs-struct-notequal, glsl-fs-vec4-operator-equal,
glsl-fs-vec4-operator-notequal.

NOTE: This is a candidate for the 7.9 and 7.10 branches.

src/mesa/drivers/dri/i915/i915_fragprog.c

index 624f18d..8bc88a8 100644 (file)
@@ -809,18 +809,18 @@ upload_program(struct i915_fragment_program *p)
         flags = get_result_flags(inst);
         dst = get_result_vector(p, inst);
 
-        /* dst = src1 >= src2 */
+        /* tmp = src1 >= src2 */
         i915_emit_arith(p,
                         A0_SGE,
-                        dst,
+                        tmp,
                         flags, 0,
                         src_vector(p, &inst->SrcReg[0], program),
                         src_vector(p, &inst->SrcReg[1], program),
                         0);
-        /* tmp = src1 <= src2 */
+        /* dst = src1 <= src2 */
         i915_emit_arith(p,
                         A0_SGE,
-                        tmp,
+                        dst,
                         flags, 0,
                         negate(src_vector(p, &inst->SrcReg[0], program),
                                1, 1, 1, 1),
@@ -958,18 +958,18 @@ upload_program(struct i915_fragment_program *p)
         flags = get_result_flags(inst);
         dst = get_result_vector(p, inst);
 
-        /* dst = src1 < src2 */
+        /* tmp = src1 < src2 */
         i915_emit_arith(p,
                         A0_SLT,
-                        dst,
+                        tmp,
                         flags, 0,
                         src_vector(p, &inst->SrcReg[0], program),
                         src_vector(p, &inst->SrcReg[1], program),
                         0);
-        /* tmp = src1 > src2 */
+        /* dst = src1 > src2 */
         i915_emit_arith(p,
                         A0_SLT,
-                        tmp,
+                        dst,
                         flags, 0,
                         negate(src_vector(p, &inst->SrcReg[0], program),
                                1, 1, 1, 1),