pan/bi: Fix load_const of 1-bit booleans
For historical reasons, we ingest 1-bit booleans in NIR but expand them
to 16/32-bit booleans in the backend IR. We need to handle this case
when loading boolean constants, extending from 1-bit to 16/32-bit as
required. This issue is masked by effective constant folding for
booleans, but is visible in a shader from Firefox WebRender.
Fixes: 646e03c451
("pan/bi: Temporarily switch back to 0/~0 bools")
Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Reported-by: Icecream95
Closes: #5797
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14371>
This commit is contained in:
parent
78ef08a061
commit
29d319c767
|
@ -1458,7 +1458,9 @@ bi_emit_load_const(bi_builder *b, nir_load_const_instr *instr)
|
|||
uint32_t acc = 0;
|
||||
|
||||
for (unsigned i = 0; i < instr->def.num_components; ++i) {
|
||||
unsigned v = nir_const_value_as_uint(instr->value[i], instr->def.bit_size);
|
||||
uint32_t v = nir_const_value_as_uint(instr->value[i], instr->def.bit_size);
|
||||
|
||||
v = bi_extend_constant(v, instr->def.bit_size);
|
||||
acc |= (v << (i * instr->def.bit_size));
|
||||
}
|
||||
|
||||
|
|
|
@ -739,6 +739,19 @@ bi_temp_reg(bi_context *ctx)
|
|||
return bi_get_index(ctx->reg_alloc++, true, 0);
|
||||
}
|
||||
|
||||
/* NIR booleans are 1-bit (0/1). For now, backend IR booleans are N-bit
|
||||
* (0/~0) where N depends on the context. This requires us to sign-extend
|
||||
* when converting constants from NIR to the backend IR.
|
||||
*/
|
||||
static inline uint32_t
|
||||
bi_extend_constant(uint32_t constant, unsigned bit_size)
|
||||
{
|
||||
if (bit_size == 1 && constant != 0)
|
||||
return ~0;
|
||||
else
|
||||
return constant;
|
||||
}
|
||||
|
||||
/* Inline constants automatically, will be lowered out by bi_lower_fau where a
|
||||
* constant is not allowed. load_const_to_scalar gaurantees that this makes
|
||||
* sense */
|
||||
|
@ -746,11 +759,13 @@ bi_temp_reg(bi_context *ctx)
|
|||
static inline bi_index
|
||||
bi_src_index(nir_src *src)
|
||||
{
|
||||
if (nir_src_is_const(*src) && nir_src_bit_size(*src) <= 32)
|
||||
return bi_imm_u32(nir_src_as_uint(*src));
|
||||
else if (src->is_ssa)
|
||||
if (nir_src_is_const(*src) && nir_src_bit_size(*src) <= 32) {
|
||||
uint32_t v = nir_src_as_uint(*src);
|
||||
|
||||
return bi_imm_u32(bi_extend_constant(v, nir_src_bit_size(*src)));
|
||||
} else if (src->is_ssa) {
|
||||
return bi_get_index(src->ssa->index, false, 0);
|
||||
else {
|
||||
} else {
|
||||
assert(!src->reg.indirect);
|
||||
return bi_get_index(src->reg.reg->index, true, 0);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue