nvk: Swizzle root_table.dynamic_buffers[]

Reviewed-by: Mary Guillemard <mary@mary.zone>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40639>
This commit is contained in:
Mel Henning 2026-03-13 19:21:40 -04:00 committed by Marge Bot
parent 54b41565a0
commit 398837aa58
4 changed files with 29 additions and 12 deletions

View file

@ -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;
}

View file

@ -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;

View file

@ -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

View file

@ -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);