ac/nir/meta_cs_blit: use uint16 for coordinates to fix 64K blits
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

Reviewed-by: Pierre-Eric
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40565>
This commit is contained in:
Marek Olšák 2026-03-23 03:22:26 -04:00 committed by Marge Bot
parent 76eae60b07
commit dfbadedc02
2 changed files with 25 additions and 7 deletions

View file

@ -18,17 +18,17 @@ deref_ssa(nir_builder *b, nir_variable *var)
return &nir_build_deref_var(b, var)->def;
}
/* unpack_2x16_signed(src, x, y): x = (int32_t)((uint16_t)src); y = src >> 16; */
/* unpack_2x16_unsigned(src, x, y): x = (uint32_t)((uint16_t)src); y = src >> 16; */
static void
unpack_2x16_signed(nir_builder *b, unsigned bit_size, nir_def *src, nir_def **x, nir_def **y)
unpack_2x16_unsigned(nir_builder *b, unsigned bit_size, nir_def *src, nir_def **x, nir_def **y)
{
assert(bit_size == 32 || bit_size == 16);
*x = nir_unpack_32_2x16_split_x(b, src);
*y = nir_unpack_32_2x16_split_y(b, src);
if (bit_size == 32) {
*x = nir_i2i32(b, *x);
*y = nir_i2i32(b, *y);
*x = nir_u2u32(b, *x);
*y = nir_u2u32(b, *y);
}
}
@ -238,8 +238,8 @@ ac_create_blit_cs(const struct ac_cs_blit_options *options, const union ac_cs_bl
/* Add box.xyz. */
nir_def *base_coord_src = NULL, *base_coord_dst = NULL;
unpack_2x16_signed(&b, coord_bit_size, nir_trim_vector(&b, nir_load_user_data_amd(&b), 3),
&base_coord_src, &base_coord_dst);
unpack_2x16_unsigned(&b, coord_bit_size, nir_trim_vector(&b, nir_load_user_data_amd(&b), 3),
&base_coord_src, &base_coord_dst);
base_coord_dst = nir_iadd(&b, base_coord_dst, dst_xyz);
base_coord_src = nir_iadd(&b, base_coord_src, src_xyz);
@ -564,12 +564,17 @@ ac_prepare_compute_blit(const struct ac_cs_blit_options *options,
memset(out, 0, sizeof(*out));
/* Reject blits with invalid parameters. */
if (blit->dst.box.width < 0 || blit->dst.box.height < 0 || blit->dst.box.depth < 0 ||
if (blit->dst.box.x < 0 || blit->dst.box.y < 0 || blit->dst.box.z < 0 ||
blit->dst.box.width < 0 || blit->dst.box.height < 0 || blit->dst.box.depth < 0 ||
blit->src.box.depth < 0) {
assert(!"invalid box parameters"); /* this is reachable and prevents hangs */
return true;
}
/* Negative src is possible with piglit/copyteximage-clipping, but it's very rare. */
if (blit->src.box.x < 0 || blit->src.box.y < 0 || blit->src.box.z < 0)
return false;
/* Skip zero-area blits. */
if (!blit->dst.box.width || !blit->dst.box.height || !blit->dst.box.depth ||
(!is_clear && (!blit->src.box.width || !blit->src.box.height || !blit->src.box.depth)))
@ -1176,6 +1181,13 @@ ac_prepare_compute_blit(const struct ac_cs_blit_options *options,
dispatch->shader_key = key;
assert(util_is_uint16(blit->src.box.x));
assert(util_is_uint16(blit->src.box.y));
assert(util_is_uint16(blit->src.box.z));
assert(util_is_uint16(blit->dst.box.x));
assert(util_is_uint16(blit->dst.box.y));
assert(util_is_uint16(blit->dst.box.z));
dispatch->user_data[0] = (blit->src.box.x & 0xffff) | ((blit->dst.box.x & 0xffff) << 16);
dispatch->user_data[1] = (blit->src.box.y & 0xffff) | ((blit->dst.box.y & 0xffff) << 16);
dispatch->user_data[2] = (blit->src.box.z & 0xffff) | ((blit->dst.box.z & 0xffff) << 16);

View file

@ -873,6 +873,12 @@ util_is_sint16(int x)
return x >= INT16_MIN && x <= INT16_MAX;
}
static inline bool
util_is_uint16(int x)
{
return x >= 0 && x <= UINT16_MAX;
}
/* Heuristic to determine whether a uint32_t is probably actually a float
* (http://stackoverflow.com/a/2953466)
*/