From 1bfc0a11027449ae7ab7c28eb695f26de530eccf Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Sat, 28 Jun 2014 23:32:05 -0700 Subject: [PATCH] i965/fs: Mark predicated PLN instructions with dependency hints. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit To implement the unlit_centroid_workaround, previously we emitted (+f0) pln(8) g20<1>F g16.4<0,1,0>F g4<8,8,1>F { align1 1Q }; (-f0) pln(8) g20<1>F g16.4<0,1,0>F g2<8,8,1>F { align1 1Q }; where the flag register contains the channel enable bits from g0. Since the predicates are complementary, the pair of pln instructions write to non-overlapping components of the destination, which is the case that the dependency control hints are designed for. Typically setting dependency control hints on predicated instructions isn't safe (if an instruction doesn't execute due to the predicate, it won't update the scoreboard, leaving it in a bad state) but since we must have at least one channel executing (i.e., +f0 is true for some channel) by virtue of the fact that the thread is running, we can put the +f0 pln instruction last and set the hints: (-f0) pln(8) g20<1>F g16.4<0,1,0>F g2<8,8,1>F { align1 NoDDClr 1Q }; (+f0) pln(8) g20<1>F g16.4<0,1,0>F g4<8,8,1>F { align1 NoDDChk 1Q }; Reviewed-by: Kristian Høgsberg --- src/mesa/drivers/dri/i965/brw_fs.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 45b75cb2f70..8d98b0d30ab 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -1177,16 +1177,21 @@ fs_visitor::emit_general_interpolation(ir_variable *ir) emit(FS_OPCODE_MOV_DISPATCH_TO_FLAGS); fs_inst *inst; + inst = emit_linterp(attr, fs_reg(interp), interpolation_mode, + false, false); + inst->predicate = BRW_PREDICATE_NORMAL; + inst->predicate_inverse = true; + if (brw->has_pln) + inst->no_dd_clear = true; + inst = emit_linterp(attr, fs_reg(interp), interpolation_mode, ir->data.centroid && !key->persample_shading, ir->data.sample || key->persample_shading); inst->predicate = BRW_PREDICATE_NORMAL; inst->predicate_inverse = false; + if (brw->has_pln) + inst->no_dd_check = true; - inst = emit_linterp(attr, fs_reg(interp), interpolation_mode, - false, false); - inst->predicate = BRW_PREDICATE_NORMAL; - inst->predicate_inverse = true; } else { emit_linterp(attr, fs_reg(interp), interpolation_mode, ir->data.centroid && !key->persample_shading, -- 2.30.2