mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 13:50:11 +01:00
intel/fs: fix residency handling on Xe2
We're missing a few reg_unit() scaling when dealing with residency data. Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Rohan Garg <rohan.garg@intel.com> Reviewed-by: Sagar Ghuge <sagar.ghuge@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26208>
This commit is contained in:
parent
0bd23d6263
commit
295734bf88
3 changed files with 9 additions and 6 deletions
|
|
@ -5626,6 +5626,8 @@ emit_zip(const fs_builder &lbld_before, const fs_builder &lbld_after,
|
||||||
assert(lbld_before.group() == lbld_after.group());
|
assert(lbld_before.group() == lbld_after.group());
|
||||||
assert(lbld_after.group() >= inst->group);
|
assert(lbld_after.group() >= inst->group);
|
||||||
|
|
||||||
|
const struct intel_device_info *devinfo = lbld_before.shader->devinfo;
|
||||||
|
|
||||||
/* Specified channel group from the destination region. */
|
/* Specified channel group from the destination region. */
|
||||||
const fs_reg dst = horiz_offset(inst->dst, lbld_after.group() - inst->group);
|
const fs_reg dst = horiz_offset(inst->dst, lbld_after.group() - inst->group);
|
||||||
|
|
||||||
|
|
@ -5637,7 +5639,8 @@ emit_zip(const fs_builder &lbld_before, const fs_builder &lbld_after,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deal with the residency data part later */
|
/* Deal with the residency data part later */
|
||||||
const unsigned residency_size = inst->has_sampler_residency() ? REG_SIZE : 0;
|
const unsigned residency_size = inst->has_sampler_residency() ?
|
||||||
|
(reg_unit(devinfo) * REG_SIZE) : 0;
|
||||||
const unsigned dst_size = (inst->size_written - residency_size) /
|
const unsigned dst_size = (inst->size_written - residency_size) /
|
||||||
inst->dst.component_size(inst->exec_size);
|
inst->dst.component_size(inst->exec_size);
|
||||||
|
|
||||||
|
|
@ -5715,8 +5718,8 @@ fs_visitor::lower_simd_width()
|
||||||
* original or the lowered instruction, whichever is lower.
|
* original or the lowered instruction, whichever is lower.
|
||||||
*/
|
*/
|
||||||
const unsigned n = DIV_ROUND_UP(inst->exec_size, lower_width);
|
const unsigned n = DIV_ROUND_UP(inst->exec_size, lower_width);
|
||||||
const unsigned residency_size =
|
const unsigned residency_size = inst->has_sampler_residency() ?
|
||||||
inst->has_sampler_residency() ? REG_SIZE : 0;
|
(reg_unit(devinfo) * REG_SIZE) : 0;
|
||||||
const unsigned dst_size =
|
const unsigned dst_size =
|
||||||
(inst->size_written - residency_size) /
|
(inst->size_written - residency_size) /
|
||||||
inst->dst.component_size(inst->exec_size);
|
inst->dst.component_size(inst->exec_size);
|
||||||
|
|
|
||||||
|
|
@ -6702,14 +6702,14 @@ fs_visitor::nir_emit_texture(const fs_builder &bld, nir_tex_instr *instr)
|
||||||
if (instr->is_sparse) {
|
if (instr->is_sparse) {
|
||||||
inst->size_written = (util_last_bit(write_mask) - 1) *
|
inst->size_written = (util_last_bit(write_mask) - 1) *
|
||||||
inst->dst.component_size(inst->exec_size) +
|
inst->dst.component_size(inst->exec_size) +
|
||||||
REG_SIZE;
|
(reg_unit(devinfo) * REG_SIZE);
|
||||||
} else {
|
} else {
|
||||||
inst->size_written = util_last_bit(write_mask) *
|
inst->size_written = util_last_bit(write_mask) *
|
||||||
inst->dst.component_size(inst->exec_size);
|
inst->dst.component_size(inst->exec_size);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
inst->size_written = 4 * inst->dst.component_size(inst->exec_size) +
|
inst->size_written = 4 * inst->dst.component_size(inst->exec_size) +
|
||||||
(instr->is_sparse ? REG_SIZE : 0);
|
(instr->is_sparse ? (reg_unit(devinfo) * REG_SIZE) : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srcs[TEX_LOGICAL_SRC_SHADOW_C].file != BAD_FILE)
|
if (srcs[TEX_LOGICAL_SRC_SHADOW_C].file != BAD_FILE)
|
||||||
|
|
|
||||||
|
|
@ -995,7 +995,7 @@ lower_sampler_logical_send_gfx7(const fs_builder &bld, fs_inst *inst, opcode op,
|
||||||
* and we have an explicit header, we need to set up the sampler
|
* and we have an explicit header, we need to set up the sampler
|
||||||
* writemask. It's reversed from normal: 1 means "don't write".
|
* writemask. It's reversed from normal: 1 means "don't write".
|
||||||
*/
|
*/
|
||||||
unsigned reg_count = regs_written(inst) - residency;
|
unsigned reg_count = regs_written(inst) - reg_unit(devinfo) * residency;
|
||||||
if (!inst->eot && reg_count < 4 * reg_width) {
|
if (!inst->eot && reg_count < 4 * reg_width) {
|
||||||
assert(reg_count % reg_width == 0);
|
assert(reg_count % reg_width == 0);
|
||||||
unsigned mask = ~((1 << (reg_count / reg_width)) - 1) & 0xf;
|
unsigned mask = ~((1 << (reg_count / reg_width)) - 1) & 0xf;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue