intel: Only set VectorMaskEnable when needed
For cases with lots of very small primitives, this may improve performance because we're not executing those dead channels all the time. Shader-db reports no instruction or cycle-count changes. However, by hacking up the driver to report when this optimization triggers, it appears to affect about 10% of shader-db. v2 (Kenneth Graunke): Always enable VMask prior to XeHP for now, because using VMask on those platforms allows us to perform the eliminate_find_live_channel() optimization. However, XeHP doesn't seem to have packed fragment shader dispatch, so we lose that optimization regardless, and there's no reason not to avoid vmask. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/1054>
This commit is contained in:
committed by
Marge Bot
parent
7c1498daba
commit
dfedeccc13
@@ -2411,21 +2411,27 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width,
|
||||
break;
|
||||
|
||||
case SHADER_OPCODE_FIND_LIVE_CHANNEL: {
|
||||
const bool uses_vmask =
|
||||
stage == MESA_SHADER_FRAGMENT &&
|
||||
brw_wm_prog_data(this->prog_data)->uses_vmask;
|
||||
const struct brw_reg mask =
|
||||
brw_stage_has_packed_dispatch(devinfo, stage,
|
||||
prog_data) ? brw_imm_ud(~0u) :
|
||||
stage == MESA_SHADER_FRAGMENT ? brw_vmask_reg() :
|
||||
brw_dmask_reg();
|
||||
uses_vmask ? brw_vmask_reg() : brw_dmask_reg();
|
||||
|
||||
brw_find_live_channel(p, dst, mask, false);
|
||||
break;
|
||||
}
|
||||
case SHADER_OPCODE_FIND_LAST_LIVE_CHANNEL: {
|
||||
const bool uses_vmask =
|
||||
stage == MESA_SHADER_FRAGMENT &&
|
||||
brw_wm_prog_data(this->prog_data)->uses_vmask;
|
||||
|
||||
/* ce0 doesn't consider the thread dispatch mask, so if we want
|
||||
* to find the true last enabled channel, we need to apply that too.
|
||||
*/
|
||||
const struct brw_reg mask =
|
||||
stage == MESA_SHADER_FRAGMENT ? brw_vmask_reg() : brw_dmask_reg();
|
||||
uses_vmask ? brw_vmask_reg() : brw_dmask_reg();
|
||||
|
||||
brw_find_live_channel(p, dst, mask, true);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user