mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 17:58:26 +02:00
intel/fs: Don't use NoDDClk/NoDDClr for split SHUFFLEs
When I copied and pasted the code from MOV_INDIRECT for handling the dependency controls, I missed a subtle difference between MOV_INDIRECT and SHUFFLE. Specifically, MOV_INDIRECT gets lowered to a narrow instruction on Gen7 by the SIMD width lowering whereas SHUFFLE has to split it in the generator. Therefore, the check safety check for whether or not we can use dependency control has to be based on the lowered width rather than the width of the original instruction. Fixes:a8ac61b0ee"intel/fs: NoMask initialize the address..." Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3593 Reviewed-by: Matt Turner <mattst88@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6989> (cherry picked from commit8427e56067)
This commit is contained in:
parent
b7c3713706
commit
6ea01cd07a
2 changed files with 16 additions and 4 deletions
|
|
@ -391,7 +391,7 @@
|
|||
"description": "intel/fs: Don't use NoDDClk/NoDDClr for split SHUFFLEs",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"master_sha": null,
|
||||
"because_sha": "a8ac61b0ee2fdf4e8bc7b47aee9c24f96c40435c"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -652,11 +652,23 @@ fs_generator::generate_shuffle(fs_inst *inst,
|
|||
|
||||
uint32_t src_start_offset = src.nr * REG_SIZE + src.subnr;
|
||||
|
||||
/* Whether we can use destination dependency control without running
|
||||
* the risk of a hang if an instruction gets shot down.
|
||||
/* From the Haswell PRM:
|
||||
*
|
||||
* "When a sequence of NoDDChk and NoDDClr are used, the last
|
||||
* instruction that completes the scoreboard clear must have a
|
||||
* non-zero execution mask. This means, if any kind of predication
|
||||
* can change the execution mask or channel enable of the last
|
||||
* instruction, the optimization must be avoided. This is to
|
||||
* avoid instructions being shot down the pipeline when no writes
|
||||
* are required."
|
||||
*
|
||||
* Whenever predication is enabled or the instructions being emitted
|
||||
* aren't the full width, it's possible that it will be run with zero
|
||||
* channels enabled so we can't use dependency control without
|
||||
* running the risk of a hang if an instruction gets shot down.
|
||||
*/
|
||||
const bool use_dep_ctrl = !inst->predicate &&
|
||||
inst->exec_size == dispatch_width;
|
||||
lower_width == dispatch_width;
|
||||
brw_inst *insn;
|
||||
|
||||
/* Due to a hardware bug some platforms (particularly Gen11+) seem
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue