intel/fs: Check if the whole ubo load range is in the push const range
Before this, we were checking only the beginning of the ubo range, so
partially overlapping loads were trying to load undefined data.
Fixes: b2da1238 ("i965: Use pushed UBO data in the scalar backend.")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/9748
Signed-off-by: Sviatoslav Peleshko <sviatoslav.peleshko@globallogic.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25111>
This commit is contained in:
parent
2bd86f8048
commit
b1a63d5418
1 changed files with 3 additions and 1 deletions
|
|
@ -4955,6 +4955,8 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
|
|||
const unsigned ubo_block =
|
||||
brw_nir_ubo_surface_index_get_push_block(instr->src[0]);
|
||||
const unsigned offset_256b = load_offset / 32;
|
||||
const unsigned end_256b =
|
||||
DIV_ROUND_UP(load_offset + type_size * instr->num_components, 32);
|
||||
|
||||
/* See if we've selected this as a push constant candidate */
|
||||
fs_reg push_reg;
|
||||
|
|
@ -4962,7 +4964,7 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
|
|||
const struct brw_ubo_range *range = &prog_data->ubo_ranges[i];
|
||||
if (range->block == ubo_block &&
|
||||
offset_256b >= range->start &&
|
||||
offset_256b < range->start + range->length) {
|
||||
end_256b <= range->start + range->length) {
|
||||
|
||||
push_reg = fs_reg(UNIFORM, UBO_START + i, dest.type);
|
||||
push_reg.offset = load_offset - 32 * range->start;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue