Module: Mesa Branch: main Commit: ba8d3afa56936971270a0759b5f57140f406b61e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ba8d3afa56936971270a0759b5f57140f406b61e
Author: Konstantin Seurer <konstantin.seu...@gmail.com> Date: Fri Jul 21 08:27:01 2023 +0200 radv/nir: Handle boolean hit attribs Reviewed-by: Friedrich Vock <friedrich.v...@gmx.de> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24271> --- src/amd/vulkan/nir/radv_nir_lower_hit_attrib_derefs.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/amd/vulkan/nir/radv_nir_lower_hit_attrib_derefs.c b/src/amd/vulkan/nir/radv_nir_lower_hit_attrib_derefs.c index 601a40a81c6..0052c98641a 100644 --- a/src/amd/vulkan/nir/radv_nir_lower_hit_attrib_derefs.c +++ b/src/amd/vulkan/nir/radv_nir_lower_hit_attrib_derefs.c @@ -33,7 +33,7 @@ lower_hit_attrib_deref(nir_builder *b, nir_instr *instr, void *data) nir_def *components[NIR_MAX_VEC_COMPONENTS]; for (uint32_t comp = 0; comp < num_components; comp++) { - uint32_t offset = deref->var->data.driver_location + comp * bit_size / 8; + uint32_t offset = deref->var->data.driver_location + comp * DIV_ROUND_UP(bit_size, 8); uint32_t base = offset / 4; uint32_t comp_offset = offset % 4; @@ -49,7 +49,8 @@ lower_hit_attrib_deref(nir_builder *b, nir_instr *instr, void *data) components[comp] = nir_channel(b, nir_unpack_bits(b, nir_load_hit_attrib_amd(b, .base = base), 8), comp_offset); } else { - unreachable("Invalid bit_size"); + assert(bit_size == 1); + components[comp] = nir_i2b(b, nir_load_hit_attrib_amd(b, .base = base)); } } @@ -60,7 +61,7 @@ lower_hit_attrib_deref(nir_builder *b, nir_instr *instr, void *data) uint32_t bit_size = value->bit_size; for (uint32_t comp = 0; comp < num_components; comp++) { - uint32_t offset = deref->var->data.driver_location + comp * bit_size / 8; + uint32_t offset = deref->var->data.driver_location + comp * DIV_ROUND_UP(bit_size, 8); uint32_t base = offset / 4; uint32_t comp_offset = offset % 4; @@ -84,7 +85,8 @@ lower_hit_attrib_deref(nir_builder *b, nir_instr *instr, void *data) components[byte] = (byte == comp_offset) ? nir_channel(b, value, comp) : nir_channel(b, prev, byte); nir_store_hit_attrib_amd(b, nir_pack_32_4x8(b, nir_vec(b, components, 4)), .base = base); } else { - unreachable("Invalid bit_size"); + assert(bit_size == 1); + nir_store_hit_attrib_amd(b, nir_b2i32(b, component), .base = base); } } }