i915: Calculate partial result to temp register first
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.
This commit is contained in:
@@ -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),
|
||||
|
Reference in New Issue
Block a user