mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 04:58:05 +02:00
intel/fs: fixup sampler header message
If you look at the sampler message header on Gfx9+, you'll see that we
mostly only use 2 dwords (dw2 & dw3). DW2 has a bunch of sampler
parameters, DW3 is the sampler handle.
On Gfx9 we can micro optimize by copying r0 into the header because
the HW mostly doesn't care about other DWs. We just have to clear dw2
on non VS/FS stages.
On Gfx11+, we always have to do a careful copy of the r0.3 bits to
mask out the bottom unrelated bits. So there, just clearing the entire
header makes more sense.
On Xe2+, the dw4 of the header references the sampler feedback surface
handle and bit0 is a boolean to know whether to use that surface or
not. So it *REALLY* matters to have that as 0. If we copy r0, we'll
get random bits in dw4, leading to enable that surface.
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Cc: mesa-stable
Reviewed-by: Rohan Garg <rohan.garg@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28082>
(cherry picked from commit 75c6ad9907)
This commit is contained in:
parent
640932a664
commit
29afc1c53e
2 changed files with 7 additions and 3 deletions
|
|
@ -1344,7 +1344,7 @@
|
|||
"description": "intel/fs: fixup sampler header message",
|
||||
"nominated": true,
|
||||
"nomination_type": 0,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": null,
|
||||
"notes": null
|
||||
|
|
|
|||
|
|
@ -1009,10 +1009,14 @@ lower_sampler_logical_send_gfx7(const fs_builder &bld, fs_inst *inst, opcode op,
|
|||
/* Build the actual header */
|
||||
const fs_builder ubld = bld.exec_all().group(8 * reg_unit(devinfo), 0);
|
||||
const fs_builder ubld1 = ubld.group(1, 0);
|
||||
ubld.MOV(header, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD));
|
||||
if (devinfo->ver >= 11)
|
||||
ubld.MOV(header, brw_imm_ud(0));
|
||||
else
|
||||
ubld.MOV(header, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD));
|
||||
if (inst->offset) {
|
||||
ubld1.MOV(component(header, 2), brw_imm_ud(inst->offset));
|
||||
} else if (bld.shader->stage != MESA_SHADER_VERTEX &&
|
||||
} else if (devinfo->ver < 11 &&
|
||||
bld.shader->stage != MESA_SHADER_VERTEX &&
|
||||
bld.shader->stage != MESA_SHADER_FRAGMENT) {
|
||||
/* The vertex and fragment stages have g0.2 set to 0, so
|
||||
* header0.2 is 0 when g0 is copied. Other stages may not, so we
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue