diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index b8ea27c4cd3..5eb77ab6ab5 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -4687,6 +4687,8 @@ void visit_load_input(isel_context *ctx, nir_intrinsic_instr *instr) unsigned desc_index = ctx->program->info->vs.use_per_attribute_vb_descs ? location : attrib_binding; + desc_index = util_bitcount(ctx->program->info->vs.vb_desc_usage_mask & + u_bit_consecutive(0, desc_index)); Operand off = bld.copy(bld.def(s1), Operand(desc_index * 16u)); Temp list = bld.smem(aco_opcode::s_load_dwordx4, bld.def(s4), vertex_buffers, off); diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 2118e004ffd..1a4c9e11756 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -2840,8 +2840,9 @@ radv_flush_vertex_descriptors(struct radv_cmd_buffer *cmd_buffer, bool pipeline_ struct radv_pipeline *pipeline = cmd_buffer->state.pipeline; unsigned vb_offset; void *vb_ptr; + unsigned desc_index = 0; uint32_t mask = pipeline->vb_desc_usage_mask; - uint32_t count = util_last_bit(mask); + uint32_t count = util_bitcount(mask); uint64_t va; /* allocate some descriptor state for vertex buffers */ @@ -2850,7 +2851,7 @@ radv_flush_vertex_descriptors(struct radv_cmd_buffer *cmd_buffer, bool pipeline_ while (mask) { unsigned i = u_bit_scan(&mask); - uint32_t *desc = &((uint32_t *)vb_ptr)[i * 4]; + uint32_t *desc = &((uint32_t *)vb_ptr)[desc_index++ * 4]; uint32_t offset; unsigned binding = pipeline->use_per_attribute_vb_descs ? pipeline->attrib_bindings[i] : i; struct radv_buffer *buffer = cmd_buffer->vertex_bindings[binding].buffer; diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c index e965535fbff..797a22ea4d5 100644 --- a/src/amd/vulkan/radv_debug.c +++ b/src/amd/vulkan/radv_debug.c @@ -447,7 +447,7 @@ static void radv_dump_vertex_descriptors(struct radv_pipeline *pipeline, FILE *f) { void *ptr = (uint64_t *)pipeline->device->trace_id_ptr; - uint32_t count = util_last_bit(pipeline->vb_desc_usage_mask); + uint32_t count = util_bitcount(pipeline->vb_desc_usage_mask); uint32_t *vb_ptr = &((uint32_t *)ptr)[3]; if (!count) diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index aa64ea67a38..60157b3cdd0 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -758,6 +758,8 @@ handle_vs_input_decl(struct radv_shader_context *ctx, struct nir_variable *varia unsigned desc_index = ctx->args->shader_info->vs.use_per_attribute_vb_descs ? attrib_index : attrib_binding; + desc_index = util_bitcount(ctx->args->shader_info->vs.vb_desc_usage_mask & + u_bit_consecutive(0, desc_index)); t_offset = LLVMConstInt(ctx->ac.i32, desc_index, false); t_list = ac_build_load_to_sgpr(&ctx->ac, t_list_ptr, t_offset);