diff options
author | Francisco Jerez <currojerez@riseup.net> | 2016-09-15 17:20:23 -0700 |
---|---|---|
committer | Francisco Jerez <currojerez@riseup.net> | 2016-09-21 13:45:46 +0300 |
commit | f57f526fc5cfaedf26b2becf8f1899d5de0d0461 (patch) | |
tree | 5bbd786fffec71aac38a61002d85bf69a175e443 /src/mesa/drivers/dri/i965/brw_fs.cpp | |
parent | 8a468d186e6fc27c26dd12ba989192e7596f667a (diff) | |
download | external_mesa3d-f57f526fc5cfaedf26b2becf8f1899d5de0d0461.zip external_mesa3d-f57f526fc5cfaedf26b2becf8f1899d5de0d0461.tar.gz external_mesa3d-f57f526fc5cfaedf26b2becf8f1899d5de0d0461.tar.bz2 |
i965/ir: Skip eliminate_find_live_channel() for stages with sparse thread dispatch.
The eliminate_find_live_channel optimization eliminates
FIND_LIVE_CHANNEL instructions in cases where control flow is known to
be uniform, and replaces them with 'MOV 0', which in turn unblocks
subsequent elimination of the BROADCAST instruction frequently used on
the result of FIND_LIVE_CHANNEL. This is however not correct in
per-sample fragment shader dispatch because the PSD can dispatch a
fully unlit sample under certain conditions. Disable the optimization
in that case.
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
v2: Add devinfo argument to brw_stage_has_packed_dispatch() to
implement hardware generation check.
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_fs.cpp')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 5c44007..b60ec71 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -2835,6 +2835,14 @@ fs_visitor::eliminate_find_live_channel() bool progress = false; unsigned depth = 0; + if (!brw_stage_has_packed_dispatch(devinfo, stage, stage_prog_data)) { + /* The optimization below assumes that channel zero is live on thread + * dispatch, which may not be the case if the fixed function dispatches + * threads sparsely. + */ + return false; + } + foreach_block_and_inst_safe(block, fs_inst, inst, cfg) { switch (inst->opcode) { case BRW_OPCODE_IF: |