diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.c b/src/nouveau/vulkan/nvk_cmd_buffer.c index e5cfca4a67d..9f2fa5b12f6 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.c +++ b/src/nouveau/vulkan/nvk_cmd_buffer.c @@ -841,7 +841,7 @@ nvk_bind_descriptor_sets(struct nvk_cmd_buffer *cmd, struct nvk_device *dev = nvk_cmd_buffer_device(cmd); const struct nvk_physical_device *pdev = nvk_device_physical(dev); - union nvk_buffer_descriptor dynamic_buffers[NVK_MAX_DYNAMIC_BUFFERS]; + uint32_t dynamic_buffers[4][NVK_MAX_DYNAMIC_BUFFERS]; uint8_t set_dynamic_buffer_start[NVK_MAX_SETS]; /* Read off the current dynamic buffer start array so we can use it to @@ -910,7 +910,8 @@ nvk_bind_descriptor_sets(struct nvk_cmd_buffer *cmd, } else { db.addr.base_addr += offset; } - dynamic_buffers[dyn_buffer_end + j] = db; + for (int k = 0; k < 4; k++) + dynamic_buffers[k][dyn_buffer_end + j] = db.values[k]; } next_dyn_offset += set->layout->vk.dynamic_descriptor_count; } @@ -923,9 +924,10 @@ nvk_bind_descriptor_sets(struct nvk_cmd_buffer *cmd, assert(dyn_buffer_end <= NVK_MAX_DYNAMIC_BUFFERS); assert(next_dyn_offset <= info->dynamicOffsetCount); - nvk_descriptor_state_set_root_array(cmd, desc, dynamic_buffers, - dyn_buffer_start, dyn_buffer_end - dyn_buffer_start, - &dynamic_buffers[dyn_buffer_start]); + for (int i = 0; i < 4; i++) + nvk_descriptor_state_set_root_array(cmd, desc, dynamic_buffers[i], + dyn_buffer_start, dyn_buffer_end - dyn_buffer_start, + &dynamic_buffers[i][dyn_buffer_start]); /* We need to at least sync everything from first_set to NVK_MAX_SETS. * However, we only save anything if firstSet >= 4 so we may as well sync @@ -1225,7 +1227,8 @@ nvk_cmd_buffer_get_cbuf_addr(struct nvk_cmd_buffer *cmd, desc, set_dynamic_buffer_start[cbuf->desc_set], &dyn_idx); dyn_idx += cbuf->dynamic_idx; union nvk_buffer_descriptor ubo_desc; - nvk_descriptor_state_get_root(desc, dynamic_buffers[dyn_idx], &ubo_desc); + for (int i = 0; i < 4; i++) + nvk_descriptor_state_get_root(desc, dynamic_buffers[i][dyn_idx], &ubo_desc.values[i]); *addr_out = nvk_ubo_descriptor_addr(pdev, ubo_desc); return true; } diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.h b/src/nouveau/vulkan/nvk_cmd_buffer.h index 194d3fe905d..03169c68621 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.h +++ b/src/nouveau/vulkan/nvk_cmd_buffer.h @@ -57,8 +57,8 @@ struct nvk_root_descriptor_table { */ uint8_t set_dynamic_buffer_start[NVK_MAX_SETS]; - /* Dynamic buffer bindings */ - union nvk_buffer_descriptor dynamic_buffers[NVK_MAX_DYNAMIC_BUFFERS]; + /* Dynamic buffer bindings (swizzled form of nvk_buffer_descriptor) */ + uint32_t dynamic_buffers[4][NVK_MAX_DYNAMIC_BUFFERS]; uint64_t printf_buffer_addr; diff --git a/src/nouveau/vulkan/nvk_descriptor_types.h b/src/nouveau/vulkan/nvk_descriptor_types.h index 39b61c90362..aea2500be87 100644 --- a/src/nouveau/vulkan/nvk_descriptor_types.h +++ b/src/nouveau/vulkan/nvk_descriptor_types.h @@ -114,6 +114,7 @@ union nvk_buffer_descriptor { struct nvk_buffer_address addr; struct nvk_bindless_cbuf cbuf; struct nvk_bindless_cbuf_2 cbuf2; + uint32_t values[4]; }; static inline bool diff --git a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c index 733357edc0b..6c266892c12 100644 --- a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c +++ b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c @@ -668,8 +668,14 @@ load_descriptor(nir_builder *b, unsigned num_components, unsigned bit_size, nir_iadd_imm(b, dynamic_buffer_start, binding_layout->dynamic_buffer_index)); - return load_root_table_array(b, num_components, bit_size, - dynamic_buffers, index, ctx); + nir_def *dest_comps[NIR_MAX_VEC_COMPONENTS]; + assert(bit_size % 32 == 0); + int components32 = num_components * bit_size / 32; + for (unsigned i = 0; i < components32; i++) { + dest_comps[i] = load_root_table_array(b, 1, 32, + dynamic_buffers[i], index, ctx); + } + return nir_bitcast_vector(b, nir_vec(b, dest_comps, components32), bit_size); } case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK: { @@ -1439,8 +1445,15 @@ lower_load_ssbo_descriptor(nir_builder *b, nir_intrinsic_instr *intrin, nir_push_if(b, nir_ieq_imm(b, base_hi, ROOT_DESC_DYNAMIC_BUFFERS_BASE_ADDR_HI)); { - desc_root = load_root_table_array(b, 4, 32, dynamic_buffers, - nir_iadd(b, base_lo, offset), ctx); + nir_def *desc_root_comps[4]; + nir_def *index = nir_iadd(b, base_lo, offset); + for (unsigned i = 0; i < 4; i++) { + desc_root_comps[i] = load_root_table_array(b, 1, 32, + dynamic_buffers[i], + index, ctx); + } + desc_root = nir_vec(b, desc_root_comps, 4); + if (size != NULL) { /* assert(binding_layout->array_size >= 1); */ nir_def *is_oob = nir_ult(b, nir_iadd_imm(b, size, -16), offset);