nvk: Split write_[dynamic_]buffer_desc into UBO and SSBO variants

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29591>
This commit is contained in:
Faith Ekstrand 2024-06-07 20:00:51 -05:00 committed by Marge Bot
parent 6387ae7dfb
commit 5685de8795

View file

@ -124,10 +124,9 @@ write_storage_image_view_desc(struct nvk_descriptor_set *set,
write_desc(set, binding, elem, &desc, sizeof(desc));
}
static void
write_buffer_desc(struct nvk_descriptor_set *set,
const VkDescriptorBufferInfo *const info,
uint32_t binding, uint32_t elem)
static struct nvk_buffer_address
ubo_desc(const VkDescriptorBufferInfo *const info,
uint32_t binding, uint32_t elem)
{
VK_FROM_HANDLE(nvk_buffer, buffer, info->buffer);
@ -135,34 +134,68 @@ write_buffer_desc(struct nvk_descriptor_set *set,
nvk_buffer_addr_range(buffer, info->offset, info->range);
assert(addr_range.range <= UINT32_MAX);
const struct nvk_buffer_address desc = {
return (struct nvk_buffer_address) {
.base_addr = addr_range.addr,
.size = addr_range.range,
};
}
static void
write_ubo_desc(struct nvk_descriptor_set *set,
const VkDescriptorBufferInfo *const info,
uint32_t binding, uint32_t elem)
{
const struct nvk_buffer_address desc = ubo_desc(info, binding, elem);
write_desc(set, binding, elem, &desc, sizeof(desc));
}
static void
write_dynamic_buffer_desc(struct nvk_descriptor_set *set,
const VkDescriptorBufferInfo *const info,
uint32_t binding, uint32_t elem)
write_dynamic_ubo_desc(struct nvk_descriptor_set *set,
const VkDescriptorBufferInfo *const info,
uint32_t binding, uint32_t elem)
{
VK_FROM_HANDLE(nvk_buffer, buffer, info->buffer);
const struct nvk_descriptor_set_binding_layout *binding_layout =
&set->layout->binding[binding];
set->dynamic_buffers[binding_layout->dynamic_buffer_index + elem] =
ubo_desc(info, binding, elem);
}
static struct nvk_buffer_address
ssbo_desc(const VkDescriptorBufferInfo *const info,
uint32_t binding, uint32_t elem)
{
VK_FROM_HANDLE(nvk_buffer, buffer, info->buffer);
const struct nvk_addr_range addr_range =
nvk_buffer_addr_range(buffer, info->offset, info->range);
assert(addr_range.range <= UINT32_MAX);
struct nvk_buffer_address *desc =
&set->dynamic_buffers[binding_layout->dynamic_buffer_index + elem];
*desc = (struct nvk_buffer_address){
return (struct nvk_buffer_address) {
.base_addr = addr_range.addr,
.size = addr_range.range,
};
}
static void
write_ssbo_desc(struct nvk_descriptor_set *set,
const VkDescriptorBufferInfo *const info,
uint32_t binding, uint32_t elem)
{
const struct nvk_buffer_address desc = ssbo_desc(info, binding, elem);
write_desc(set, binding, elem, &desc, sizeof(desc));
}
static void
write_dynamic_ssbo_desc(struct nvk_descriptor_set *set,
const VkDescriptorBufferInfo *const info,
uint32_t binding, uint32_t elem)
{
const struct nvk_descriptor_set_binding_layout *binding_layout =
&set->layout->binding[binding];
set->dynamic_buffers[binding_layout->dynamic_buffer_index + elem] =
ssbo_desc(info, binding, elem);
}
static void
write_buffer_view_desc(struct nvk_descriptor_set *set,
const VkBufferView bufferView,
@ -228,19 +261,34 @@ nvk_UpdateDescriptorSets(VkDevice device,
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
for (uint32_t j = 0; j < write->descriptorCount; j++) {
write_ubo_desc(set, write->pBufferInfo + j,
write->dstBinding,
write->dstArrayElement + j);
}
break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
for (uint32_t j = 0; j < write->descriptorCount; j++) {
write_buffer_desc(set, write->pBufferInfo + j, write->dstBinding,
write->dstArrayElement + j);
write_ssbo_desc(set, write->pBufferInfo + j,
write->dstBinding,
write->dstArrayElement + j);
}
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
for (uint32_t j = 0; j < write->descriptorCount; j++) {
write_dynamic_ubo_desc(set, write->pBufferInfo + j,
write->dstBinding,
write->dstArrayElement + j);
}
break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
for (uint32_t j = 0; j < write->descriptorCount; j++) {
write_dynamic_buffer_desc(set, write->pBufferInfo + j,
write->dstBinding,
write->dstArrayElement + j);
write_dynamic_ssbo_desc(set, write->pBufferInfo + j,
write->dstBinding,
write->dstArrayElement + j);
}
break;
@ -350,10 +398,18 @@ nvk_push_descriptor_set_update(struct nvk_push_descriptor_set *push_set,
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
for (uint32_t j = 0; j < write->descriptorCount; j++) {
write_ubo_desc(&set, write->pBufferInfo + j,
write->dstBinding,
write->dstArrayElement + j);
}
break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
for (uint32_t j = 0; j < write->descriptorCount; j++) {
write_buffer_desc(&set, write->pBufferInfo + j, write->dstBinding,
write->dstArrayElement + j);
write_ssbo_desc(&set, write->pBufferInfo + j,
write->dstBinding,
write->dstArrayElement + j);
}
break;
@ -724,26 +780,46 @@ nvk_descriptor_set_write_template(struct nvk_descriptor_set *set,
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
for (uint32_t j = 0; j < entry->array_count; j++) {
const VkDescriptorBufferInfo *info =
data + entry->offset + j * entry->stride;
write_ubo_desc(set, info,
entry->binding,
entry->array_element + j);
}
break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
for (uint32_t j = 0; j < entry->array_count; j++) {
const VkDescriptorBufferInfo *info =
data + entry->offset + j * entry->stride;
write_buffer_desc(set, info,
entry->binding,
entry->array_element + j);
write_ssbo_desc(set, info,
entry->binding,
entry->array_element + j);
}
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
for (uint32_t j = 0; j < entry->array_count; j++) {
const VkDescriptorBufferInfo *info =
data + entry->offset + j * entry->stride;
write_dynamic_ubo_desc(set, info,
entry->binding,
entry->array_element + j);
}
break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
for (uint32_t j = 0; j < entry->array_count; j++) {
const VkDescriptorBufferInfo *info =
data + entry->offset + j * entry->stride;
write_dynamic_buffer_desc(set, info,
entry->binding,
entry->array_element + j);
write_dynamic_ssbo_desc(set, info,
entry->binding,
entry->array_element + j);
}
break;