mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-02 09:30:11 +01:00
i965: Fix fp-dst-aliasing-[12].vpfp.
There's no pretty way to avoid the overwriting of the src operands, so just use a temporary destination and rely on the MOV optimization. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
parent
e3ea5bc08e
commit
46a7639174
1 changed files with 19 additions and 4 deletions
|
|
@ -563,13 +563,14 @@ static void precalc_dst( struct brw_wm_compile *c,
|
|||
struct prog_src_register src0 = inst->SrcReg[0];
|
||||
struct prog_src_register src1 = inst->SrcReg[1];
|
||||
struct prog_dst_register dst = inst->DstReg;
|
||||
|
||||
struct prog_dst_register temp = get_temp(c);
|
||||
|
||||
if (dst.WriteMask & WRITEMASK_Y) {
|
||||
/* dst.y = mul src0.y, src1.y
|
||||
*/
|
||||
emit_op(c,
|
||||
OPCODE_MUL,
|
||||
dst_mask(dst, WRITEMASK_Y),
|
||||
dst_mask(temp, WRITEMASK_Y),
|
||||
inst->SaturateMode,
|
||||
src0,
|
||||
src1,
|
||||
|
|
@ -584,7 +585,7 @@ static void precalc_dst( struct brw_wm_compile *c,
|
|||
*/
|
||||
swz = emit_op(c,
|
||||
OPCODE_SWZ,
|
||||
dst_mask(dst, WRITEMASK_XZ),
|
||||
dst_mask(temp, WRITEMASK_XZ),
|
||||
inst->SaturateMode,
|
||||
src_swizzle(src0, SWIZZLE_ONE, z, z, z),
|
||||
src_undef(),
|
||||
|
|
@ -597,12 +598,26 @@ static void precalc_dst( struct brw_wm_compile *c,
|
|||
*/
|
||||
emit_op(c,
|
||||
OPCODE_MOV,
|
||||
dst_mask(dst, WRITEMASK_W),
|
||||
dst_mask(temp, WRITEMASK_W),
|
||||
inst->SaturateMode,
|
||||
src1,
|
||||
src_undef(),
|
||||
src_undef());
|
||||
}
|
||||
|
||||
/* This will get optimized out in general, but it ensures that we
|
||||
* don't overwrite src operands in our channel-wise splitting
|
||||
* above. See piglit fp-dst-aliasing-[12].
|
||||
*/
|
||||
emit_op(c,
|
||||
OPCODE_MOV,
|
||||
dst,
|
||||
0,
|
||||
src_reg_from_dst(temp),
|
||||
src_undef(),
|
||||
src_undef());
|
||||
|
||||
release_temp(c, temp);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue