mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 15:48:36 +02:00
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:
parent
54b41565a0
commit
398837aa58
4 changed files with 29 additions and 12 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue