aco: Force tex operand to have the correct sub dword size before packing.
get_ssa_temp's and NIR's bit size can differ for scalar sources.
This causes broken packing of the MIMG operands with A16/G16.
Fixes: f5f73db846
("aco: Support 16bit sources for texture ops.")
Signed-off-by: Georg Lehmann <dadschoorse@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18008>
This commit is contained in:
@@ -589,6 +589,17 @@ byte_align_vector(isel_context* ctx, Temp vec, Operand offset, Temp dst, unsigne
|
|||||||
ctx->allocated_vec.emplace(dst.id(), elems);
|
ctx->allocated_vec.emplace(dst.id(), elems);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Temp
|
||||||
|
get_ssa_temp_tex(struct isel_context* ctx, nir_ssa_def* def, bool is_16bit)
|
||||||
|
{
|
||||||
|
RegClass rc = RegClass::get(RegType::vgpr, (is_16bit ? 2 : 4) * def->num_components);
|
||||||
|
Temp tmp = get_ssa_temp(ctx, def);
|
||||||
|
if (tmp.bytes() != rc.bytes())
|
||||||
|
return emit_extract_vector(ctx, tmp, 0, rc);
|
||||||
|
else
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
Temp
|
Temp
|
||||||
bool_to_vector_condition(isel_context* ctx, Temp val, Temp dst = Temp(0, s2))
|
bool_to_vector_condition(isel_context* ctx, Temp val, Temp dst = Temp(0, s2))
|
||||||
{
|
{
|
||||||
@@ -9452,11 +9463,12 @@ visit_tex(isel_context* ctx, nir_tex_instr* instr)
|
|||||||
switch (instr->src[i].src_type) {
|
switch (instr->src[i].src_type) {
|
||||||
case nir_tex_src_coord: {
|
case nir_tex_src_coord: {
|
||||||
assert(instr->src[i].src.ssa->bit_size == (a16 ? 16 : 32));
|
assert(instr->src[i].src.ssa->bit_size == (a16 ? 16 : 32));
|
||||||
coord = get_ssa_temp(ctx, instr->src[i].src.ssa);
|
coord = get_ssa_temp_tex(ctx, instr->src[i].src.ssa, a16);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case nir_tex_src_bias:
|
case nir_tex_src_bias:
|
||||||
assert(instr->src[i].src.ssa->bit_size == (a16 ? 16 : 32));
|
assert(instr->src[i].src.ssa->bit_size == (a16 ? 16 : 32));
|
||||||
|
/* Doesn't need get_ssa_temp_tex because we pack it into its own dword anyway. */
|
||||||
bias = get_ssa_temp(ctx, instr->src[i].src.ssa);
|
bias = get_ssa_temp(ctx, instr->src[i].src.ssa);
|
||||||
has_bias = true;
|
has_bias = true;
|
||||||
break;
|
break;
|
||||||
@@ -9465,14 +9477,14 @@ visit_tex(isel_context* ctx, nir_tex_instr* instr)
|
|||||||
level_zero = true;
|
level_zero = true;
|
||||||
} else {
|
} else {
|
||||||
assert(instr->src[i].src.ssa->bit_size == (a16 ? 16 : 32));
|
assert(instr->src[i].src.ssa->bit_size == (a16 ? 16 : 32));
|
||||||
lod = get_ssa_temp(ctx, instr->src[i].src.ssa);
|
lod = get_ssa_temp_tex(ctx, instr->src[i].src.ssa, a16);
|
||||||
has_lod = true;
|
has_lod = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case nir_tex_src_min_lod:
|
case nir_tex_src_min_lod:
|
||||||
assert(instr->src[i].src.ssa->bit_size == (a16 ? 16 : 32));
|
assert(instr->src[i].src.ssa->bit_size == (a16 ? 16 : 32));
|
||||||
clamped_lod = get_ssa_temp(ctx, instr->src[i].src.ssa);
|
clamped_lod = get_ssa_temp_tex(ctx, instr->src[i].src.ssa, a16);
|
||||||
has_clamped_lod = true;
|
has_clamped_lod = true;
|
||||||
break;
|
break;
|
||||||
case nir_tex_src_comparator:
|
case nir_tex_src_comparator:
|
||||||
@@ -9490,17 +9502,17 @@ visit_tex(isel_context* ctx, nir_tex_instr* instr)
|
|||||||
break;
|
break;
|
||||||
case nir_tex_src_ddx:
|
case nir_tex_src_ddx:
|
||||||
assert(instr->src[i].src.ssa->bit_size == (g16 ? 16 : 32));
|
assert(instr->src[i].src.ssa->bit_size == (g16 ? 16 : 32));
|
||||||
ddx = get_ssa_temp(ctx, instr->src[i].src.ssa);
|
ddx = get_ssa_temp_tex(ctx, instr->src[i].src.ssa, g16);
|
||||||
has_ddx = true;
|
has_ddx = true;
|
||||||
break;
|
break;
|
||||||
case nir_tex_src_ddy:
|
case nir_tex_src_ddy:
|
||||||
assert(instr->src[i].src.ssa->bit_size == (g16 ? 16 : 32));
|
assert(instr->src[i].src.ssa->bit_size == (g16 ? 16 : 32));
|
||||||
ddy = get_ssa_temp(ctx, instr->src[i].src.ssa);
|
ddy = get_ssa_temp_tex(ctx, instr->src[i].src.ssa, g16);
|
||||||
has_ddy = true;
|
has_ddy = true;
|
||||||
break;
|
break;
|
||||||
case nir_tex_src_ms_index:
|
case nir_tex_src_ms_index:
|
||||||
assert(instr->src[i].src.ssa->bit_size == (a16 ? 16 : 32));
|
assert(instr->src[i].src.ssa->bit_size == (a16 ? 16 : 32));
|
||||||
sample_index = get_ssa_temp(ctx, instr->src[i].src.ssa);
|
sample_index = get_ssa_temp_tex(ctx, instr->src[i].src.ssa, a16);
|
||||||
has_sample_index = true;
|
has_sample_index = true;
|
||||||
break;
|
break;
|
||||||
case nir_tex_src_texture_offset:
|
case nir_tex_src_texture_offset:
|
||||||
|
Reference in New Issue
Block a user