From f184dfee10bc5fbb84cb52c2a259922a4c7788fe Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Sun, 9 Mar 2025 00:02:19 -0600 Subject: [PATCH] nvk: Add an nvk_descriptor_writer This cleans things up a bit and will make it way easier to track memory ranges in the next commit. Part-of: --- src/nouveau/vulkan/nvk_descriptor_set.c | 242 +++++++++++++++--------- 1 file changed, 149 insertions(+), 93 deletions(-) diff --git a/src/nouveau/vulkan/nvk_descriptor_set.c b/src/nouveau/vulkan/nvk_descriptor_set.c index f83d592f97d..e0f8e4fb365 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set.c +++ b/src/nouveau/vulkan/nvk_descriptor_set.c @@ -26,28 +26,73 @@ align_u32(uint32_t v, uint32_t a) return (v + a - 1) & ~(a - 1); } -static inline void * -desc_ubo_data(struct nvk_descriptor_set *set, uint32_t binding, - uint32_t elem, uint32_t *size_B_out) +struct nvk_descriptor_writer { + const struct nvk_physical_device *pdev; + struct nvk_descriptor_set_layout *layout; + struct nvk_descriptor_set *set; + void *set_map; + uint32_t set_size_B; +}; + +static void +nvk_descriptor_writer_init(const struct nvk_physical_device *pdev, + struct nvk_descriptor_writer *w) { - const struct nvk_descriptor_set_binding_layout *binding_layout = - &set->layout->binding[binding]; - - uint32_t offset = binding_layout->offset + elem * binding_layout->stride; - assert(offset < set->size_B); - - if (size_B_out != NULL) - *size_B_out = set->size_B - offset; - - return (char *)set->map + offset; + *w = (struct nvk_descriptor_writer) { + .pdev = pdev, + }; } static void -write_desc(struct nvk_descriptor_set *set, uint32_t binding, uint32_t elem, +nvk_descriptor_writer_init_push(const struct nvk_physical_device *pdev, + struct nvk_descriptor_writer *w, + struct nvk_descriptor_set_layout *layout, + struct nvk_push_descriptor_set *push_set) +{ + nvk_descriptor_writer_init(pdev, w); + w->layout = layout; + w->set_map = push_set->data; + w->set_size_B = sizeof(push_set->data); +} + +static void +nvk_descriptor_writer_init_set(const struct nvk_physical_device *pdev, + struct nvk_descriptor_writer *w, + struct nvk_descriptor_set *set) +{ + nvk_descriptor_writer_init(pdev, w); + w->layout = set->layout; + w->set = set; + w->set_map = set->map; + w->set_size_B = set->size_B; +} + +static void +nvk_descriptor_writer_finish(struct nvk_descriptor_writer *w) +{ } + +static inline void * +desc_ubo_data(struct nvk_descriptor_writer *w, uint32_t binding, + uint32_t elem, uint32_t *size_B_out) +{ + const struct nvk_descriptor_set_binding_layout *binding_layout = + &w->layout->binding[binding]; + + uint32_t offset = binding_layout->offset + elem * binding_layout->stride; + assert(offset < w->set_size_B); + + if (size_B_out != NULL) + *size_B_out = w->set_size_B - offset; + + return (char *)w->set_map + offset; +} + +static void +write_desc(struct nvk_descriptor_writer *w, uint32_t binding, uint32_t elem, const void *desc_data, size_t desc_size) { ASSERTED uint32_t dst_size; - void *dst = desc_ubo_data(set, binding, elem, &dst_size); + void *dst = desc_ubo_data(w, binding, elem, &dst_size); assert(desc_size <= dst_size); memcpy(dst, desc_data, desc_size); } @@ -96,7 +141,7 @@ get_sampled_image_view_desc(VkDescriptorType descriptor_type, } static void -write_sampled_image_view_desc(struct nvk_descriptor_set *set, +write_sampled_image_view_desc(struct nvk_descriptor_writer *w, const VkDescriptorImageInfo *const _info, uint32_t binding, uint32_t elem, VkDescriptorType descriptor_type) @@ -106,7 +151,7 @@ write_sampled_image_view_desc(struct nvk_descriptor_set *set, if (descriptor_type == VK_DESCRIPTOR_TYPE_SAMPLER || descriptor_type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) { const struct nvk_descriptor_set_binding_layout *binding_layout = - &set->layout->binding[binding]; + &w->layout->binding[binding]; if (binding_layout->immutable_samplers != NULL) { info.sampler = nvk_sampler_to_handle( binding_layout->immutable_samplers[elem]); @@ -114,7 +159,7 @@ write_sampled_image_view_desc(struct nvk_descriptor_set *set, } uint32_t dst_size; - void *dst = desc_ubo_data(set, binding, elem, &dst_size); + void *dst = desc_ubo_data(w, binding, elem, &dst_size); get_sampled_image_view_desc(descriptor_type, &info, dst, dst_size); } @@ -161,14 +206,13 @@ get_storage_image_view_desc(const struct nvk_physical_device *pdev, } static void -write_storage_image_view_desc(const struct nvk_physical_device *pdev, - struct nvk_descriptor_set *set, +write_storage_image_view_desc(struct nvk_descriptor_writer *w, const VkDescriptorImageInfo *const info, uint32_t binding, uint32_t elem) { uint32_t dst_size; - void *dst = desc_ubo_data(set, binding, elem, &dst_size); - get_storage_image_view_desc(pdev, info, dst, dst_size); + void *dst = desc_ubo_data(w, binding, elem, &dst_size); + get_storage_image_view_desc(w->pdev, info, dst, dst_size); } static union nvk_buffer_descriptor @@ -202,8 +246,7 @@ ubo_desc(const struct nvk_physical_device *pdev, } static void -write_ubo_desc(const struct nvk_physical_device *pdev, - struct nvk_descriptor_set *set, +write_ubo_desc(struct nvk_descriptor_writer *w, const VkDescriptorBufferInfo *const info, uint32_t binding, uint32_t elem) { @@ -211,13 +254,12 @@ write_ubo_desc(const struct nvk_physical_device *pdev, struct nvk_addr_range addr_range = nvk_buffer_addr_range(buffer, info->offset, info->range); - const union nvk_buffer_descriptor desc = ubo_desc(pdev, addr_range); - write_desc(set, binding, elem, &desc, sizeof(desc)); + const union nvk_buffer_descriptor desc = ubo_desc(w->pdev, addr_range); + write_desc(w, binding, elem, &desc, sizeof(desc)); } static void -write_dynamic_ubo_desc(const struct nvk_physical_device *pdev, - struct nvk_descriptor_set *set, +write_dynamic_ubo_desc(struct nvk_descriptor_writer *w, const VkDescriptorBufferInfo *const info, uint32_t binding, uint32_t elem) { @@ -226,9 +268,9 @@ write_dynamic_ubo_desc(const struct nvk_physical_device *pdev, nvk_buffer_addr_range(buffer, info->offset, info->range); const struct nvk_descriptor_set_binding_layout *binding_layout = - &set->layout->binding[binding]; - set->dynamic_buffers[binding_layout->dynamic_buffer_index + elem] = - ubo_desc(pdev, addr_range); + &w->layout->binding[binding]; + w->set->dynamic_buffers[binding_layout->dynamic_buffer_index + elem] = + ubo_desc(w->pdev, addr_range); } static union nvk_buffer_descriptor @@ -247,7 +289,7 @@ ssbo_desc(struct nvk_addr_range addr_range) } static void -write_ssbo_desc(struct nvk_descriptor_set *set, +write_ssbo_desc(struct nvk_descriptor_writer *w, const VkDescriptorBufferInfo *const info, uint32_t binding, uint32_t elem) { @@ -256,11 +298,11 @@ write_ssbo_desc(struct nvk_descriptor_set *set, nvk_buffer_addr_range(buffer, info->offset, info->range); const union nvk_buffer_descriptor desc = ssbo_desc(addr_range); - write_desc(set, binding, elem, &desc, sizeof(desc)); + write_desc(w, binding, elem, &desc, sizeof(desc)); } static void -write_dynamic_ssbo_desc(struct nvk_descriptor_set *set, +write_dynamic_ssbo_desc(struct nvk_descriptor_writer *w, const VkDescriptorBufferInfo *const info, uint32_t binding, uint32_t elem) { @@ -269,8 +311,8 @@ write_dynamic_ssbo_desc(struct nvk_descriptor_set *set, nvk_buffer_addr_range(buffer, info->offset, info->range); const struct nvk_descriptor_set_binding_layout *binding_layout = - &set->layout->binding[binding]; - set->dynamic_buffers[binding_layout->dynamic_buffer_index + elem] = + &w->layout->binding[binding]; + w->set->dynamic_buffers[binding_layout->dynamic_buffer_index + elem] = ssbo_desc(addr_range); } @@ -291,25 +333,24 @@ get_edb_buffer_view_desc(struct nvk_device *dev, } static void -write_buffer_view_desc(const struct nvk_physical_device *pdev, - struct nvk_descriptor_set *set, +write_buffer_view_desc(struct nvk_descriptor_writer *w, const VkBufferView bufferView, uint32_t binding, uint32_t elem, VkDescriptorType descType) { VK_FROM_HANDLE(nvk_buffer_view, view, bufferView); - if (nvk_use_edb_buffer_views(pdev)) { + if (nvk_use_edb_buffer_views(w->pdev)) { struct nvk_edb_buffer_view_descriptor desc = { }; if (view != NULL) desc = view->edb_desc; - write_desc(set, binding, elem, &desc, sizeof(desc)); - } else if (pdev->info.cls_eng3d >= MAXWELL_A || + write_desc(w, binding, elem, &desc, sizeof(desc)); + } else if (w->pdev->info.cls_eng3d >= MAXWELL_A || descType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) { struct nvk_buffer_view_descriptor desc = { }; if (view != NULL) desc = view->desc; - write_desc(set, binding, elem, &desc, sizeof(desc)); + write_desc(w, binding, elem, &desc, sizeof(desc)); } else {// Kepler struct nvk_kepler_storage_buffer_view_descriptor desc = { }; assert(descType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER); @@ -317,19 +358,19 @@ write_buffer_view_desc(const struct nvk_physical_device *pdev, if (view != NULL) desc.su_info = view->su_info; else - desc.su_info = nil_fill_null_su_info(&pdev->info); + desc.su_info = nil_fill_null_su_info(&w->pdev->info); - write_desc(set, binding, elem, &desc, sizeof(desc)); + write_desc(w, binding, elem, &desc, sizeof(desc)); } } static void -write_inline_uniform_data(struct nvk_descriptor_set *set, +write_inline_uniform_data(struct nvk_descriptor_writer *w, const VkWriteDescriptorSetInlineUniformBlock *info, uint32_t binding, uint32_t offset) { - assert(set->layout->binding[binding].stride == 1); - write_desc(set, binding, offset, info->pData, info->dataSize); + assert(w->layout->binding[binding].stride == 1); + write_desc(w, binding, offset, info->pData, info->dataSize); } VKAPI_ATTR void VKAPI_CALL @@ -342,17 +383,20 @@ nvk_UpdateDescriptorSets(VkDevice device, VK_FROM_HANDLE(nvk_device, dev, device); const struct nvk_physical_device *pdev = nvk_device_physical(dev); - for (uint32_t w = 0; w < descriptorWriteCount; w++) { - const VkWriteDescriptorSet *write = &pDescriptorWrites[w]; + for (uint32_t i = 0; i < descriptorWriteCount; i++) { + const VkWriteDescriptorSet *write = &pDescriptorWrites[i]; VK_FROM_HANDLE(nvk_descriptor_set, set, write->dstSet); + struct nvk_descriptor_writer w; + nvk_descriptor_writer_init_set(pdev, &w, set); + switch (write->descriptorType) { case VK_DESCRIPTOR_TYPE_SAMPLER: case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_sampled_image_view_desc(set, write->pImageInfo + j, + write_sampled_image_view_desc(&w, write->pImageInfo + j, write->dstBinding, write->dstArrayElement + j, write->descriptorType); @@ -361,7 +405,7 @@ nvk_UpdateDescriptorSets(VkDevice device, case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_storage_image_view_desc(pdev, set, write->pImageInfo + j, + write_storage_image_view_desc(&w, write->pImageInfo + j, write->dstBinding, write->dstArrayElement + j); } @@ -370,7 +414,7 @@ nvk_UpdateDescriptorSets(VkDevice device, case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_buffer_view_desc(pdev, set, write->pTexelBufferView[j], + write_buffer_view_desc(&w, write->pTexelBufferView[j], write->dstBinding, write->dstArrayElement + j, write->descriptorType); } @@ -378,7 +422,7 @@ nvk_UpdateDescriptorSets(VkDevice device, case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_ubo_desc(pdev, set, write->pBufferInfo + j, + write_ubo_desc(&w, write->pBufferInfo + j, write->dstBinding, write->dstArrayElement + j); } @@ -386,7 +430,7 @@ nvk_UpdateDescriptorSets(VkDevice device, case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_ssbo_desc(set, write->pBufferInfo + j, + write_ssbo_desc(&w, write->pBufferInfo + j, write->dstBinding, write->dstArrayElement + j); } @@ -394,7 +438,7 @@ nvk_UpdateDescriptorSets(VkDevice device, case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_dynamic_ubo_desc(pdev, set, write->pBufferInfo + j, + write_dynamic_ubo_desc(&w, write->pBufferInfo + j, write->dstBinding, write->dstArrayElement + j); } @@ -402,7 +446,7 @@ nvk_UpdateDescriptorSets(VkDevice device, case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_dynamic_ssbo_desc(set, write->pBufferInfo + j, + write_dynamic_ssbo_desc(&w, write->pBufferInfo + j, write->dstBinding, write->dstArrayElement + j); } @@ -413,7 +457,7 @@ nvk_UpdateDescriptorSets(VkDevice device, vk_find_struct_const(write->pNext, WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK); assert(write_inline->dataSize == write->descriptorCount); - write_inline_uniform_data(set, write_inline, write->dstBinding, + write_inline_uniform_data(&w, write_inline, write->dstBinding, write->dstArrayElement); break; } @@ -421,6 +465,8 @@ nvk_UpdateDescriptorSets(VkDevice device, default: break; } + + nvk_descriptor_writer_finish(&w); } for (uint32_t i = 0; i < descriptorCopyCount; i++) { @@ -428,6 +474,11 @@ nvk_UpdateDescriptorSets(VkDevice device, VK_FROM_HANDLE(nvk_descriptor_set, src, copy->srcSet); VK_FROM_HANDLE(nvk_descriptor_set, dst, copy->dstSet); + /* One of these is actually a reader */ + struct nvk_descriptor_writer r, w; + nvk_descriptor_writer_init_set(pdev, &r, src); + nvk_descriptor_writer_init_set(pdev, &w, dst); + const struct nvk_descriptor_set_binding_layout *src_binding_layout = &src->layout->binding[copy->srcBinding]; const struct nvk_descriptor_set_binding_layout *dst_binding_layout = @@ -436,10 +487,10 @@ nvk_UpdateDescriptorSets(VkDevice device, if (dst_binding_layout->stride > 0 && src_binding_layout->stride > 0) { for (uint32_t j = 0; j < copy->descriptorCount; j++) { ASSERTED uint32_t dst_max_size, src_max_size; - void *dst_map = desc_ubo_data(dst, copy->dstBinding, + void *dst_map = desc_ubo_data(&w, copy->dstBinding, copy->dstArrayElement + j, &dst_max_size); - const void *src_map = desc_ubo_data(src, copy->srcBinding, + const void *src_map = desc_ubo_data(&r, copy->srcBinding, copy->srcArrayElement + j, &src_max_size); const uint32_t copy_size = MIN2(dst_binding_layout->stride, @@ -458,6 +509,8 @@ nvk_UpdateDescriptorSets(VkDevice device, &src->dynamic_buffers[src_dyn_start], copy->descriptorCount); } + + nvk_descriptor_writer_finish(&w); } } @@ -471,14 +524,11 @@ nvk_push_descriptor_set_update(struct nvk_device *dev, const struct nvk_physical_device *pdev = nvk_device_physical(dev); assert(layout->non_variable_descriptor_buffer_size < sizeof(push_set->data)); - struct nvk_descriptor_set set = { - .layout = layout, - .size_B = sizeof(push_set->data), - .map = push_set->data, - }; + struct nvk_descriptor_writer w; + nvk_descriptor_writer_init_push(pdev, &w, layout, push_set); - for (uint32_t w = 0; w < write_count; w++) { - const VkWriteDescriptorSet *write = &writes[w]; + for (uint32_t i = 0; i < write_count; i++) { + const VkWriteDescriptorSet *write = &writes[i]; assert(write->dstSet == VK_NULL_HANDLE); switch (write->descriptorType) { @@ -487,7 +537,7 @@ nvk_push_descriptor_set_update(struct nvk_device *dev, case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_sampled_image_view_desc(&set, write->pImageInfo + j, + write_sampled_image_view_desc(&w, write->pImageInfo + j, write->dstBinding, write->dstArrayElement + j, write->descriptorType); @@ -496,7 +546,7 @@ nvk_push_descriptor_set_update(struct nvk_device *dev, case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_storage_image_view_desc(pdev, &set, write->pImageInfo + j, + write_storage_image_view_desc(&w, write->pImageInfo + j, write->dstBinding, write->dstArrayElement + j); } @@ -505,7 +555,7 @@ nvk_push_descriptor_set_update(struct nvk_device *dev, case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_buffer_view_desc(pdev, &set, write->pTexelBufferView[j], + write_buffer_view_desc(&w, write->pTexelBufferView[j], write->dstBinding, write->dstArrayElement + j, write->descriptorType); } @@ -513,7 +563,7 @@ nvk_push_descriptor_set_update(struct nvk_device *dev, case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_ubo_desc(pdev, &set, write->pBufferInfo + j, + write_ubo_desc(&w, write->pBufferInfo + j, write->dstBinding, write->dstArrayElement + j); } @@ -521,7 +571,7 @@ nvk_push_descriptor_set_update(struct nvk_device *dev, case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_ssbo_desc(&set, write->pBufferInfo + j, + write_ssbo_desc(&w, write->pBufferInfo + j, write->dstBinding, write->dstArrayElement + j); } @@ -531,6 +581,8 @@ nvk_push_descriptor_set_update(struct nvk_device *dev, break; } } + + nvk_descriptor_writer_finish(&w); } static void @@ -748,6 +800,8 @@ nvk_descriptor_set_create(struct nvk_device *dev, vk_descriptor_set_layout_ref(&layout->vk); set->layout = layout; + struct nvk_descriptor_writer w; + nvk_descriptor_writer_init_set(pdev, &w, set); for (uint32_t b = 0; b < layout->binding_count; b++) { if (layout->binding[b].type != VK_DESCRIPTOR_TYPE_SAMPLER && layout->binding[b].type != VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) @@ -763,10 +817,11 @@ nvk_descriptor_set_create(struct nvk_device *dev, const VkDescriptorImageInfo empty = {}; for (uint32_t j = 0; j < array_size; j++) { - write_sampled_image_view_desc(set, &empty, b, j, + write_sampled_image_view_desc(&w, &empty, b, j, layout->binding[b].type); } } + nvk_descriptor_writer_finish(&w); list_addtail(&set->link, &pool->sets); *out_set = set; @@ -866,13 +921,10 @@ nvk_ResetDescriptorPool(VkDevice device, } static void -nvk_descriptor_set_write_template(struct nvk_device *dev, - struct nvk_descriptor_set *set, - const struct vk_descriptor_update_template *template, - const void *data) +write_from_template(struct nvk_descriptor_writer *w, + const struct vk_descriptor_update_template *template, + const void *data) { - const struct nvk_physical_device *pdev = nvk_device_physical(dev); - for (uint32_t i = 0; i < template->entry_count; i++) { const struct vk_descriptor_template_entry *entry = &template->entries[i]; @@ -886,7 +938,7 @@ nvk_descriptor_set_write_template(struct nvk_device *dev, const VkDescriptorImageInfo *info = data + entry->offset + j * entry->stride; - write_sampled_image_view_desc(set, info, + write_sampled_image_view_desc(w, info, entry->binding, entry->array_element + j, entry->type); @@ -898,7 +950,7 @@ nvk_descriptor_set_write_template(struct nvk_device *dev, const VkDescriptorImageInfo *info = data + entry->offset + j * entry->stride; - write_storage_image_view_desc(pdev, set, info, + write_storage_image_view_desc(w, info, entry->binding, entry->array_element + j); } @@ -910,7 +962,7 @@ nvk_descriptor_set_write_template(struct nvk_device *dev, const VkBufferView *bview = data + entry->offset + j * entry->stride; - write_buffer_view_desc(pdev, set, *bview, + write_buffer_view_desc(w, *bview, entry->binding, entry->array_element + j, entry->type); @@ -922,7 +974,7 @@ nvk_descriptor_set_write_template(struct nvk_device *dev, const VkDescriptorBufferInfo *info = data + entry->offset + j * entry->stride; - write_ubo_desc(pdev, set, info, + write_ubo_desc(w, info, entry->binding, entry->array_element + j); } @@ -933,7 +985,7 @@ nvk_descriptor_set_write_template(struct nvk_device *dev, const VkDescriptorBufferInfo *info = data + entry->offset + j * entry->stride; - write_ssbo_desc(set, info, + write_ssbo_desc(w, info, entry->binding, entry->array_element + j); } @@ -944,7 +996,7 @@ nvk_descriptor_set_write_template(struct nvk_device *dev, const VkDescriptorBufferInfo *info = data + entry->offset + j * entry->stride; - write_dynamic_ubo_desc(pdev, set, info, + write_dynamic_ubo_desc(w, info, entry->binding, entry->array_element + j); } @@ -955,14 +1007,14 @@ nvk_descriptor_set_write_template(struct nvk_device *dev, const VkDescriptorBufferInfo *info = data + entry->offset + j * entry->stride; - write_dynamic_ssbo_desc(set, info, + write_dynamic_ssbo_desc(w, info, entry->binding, entry->array_element + j); } break; case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK: - write_desc(set, + write_desc(w, entry->binding, entry->array_element, data + entry->offset, @@ -985,8 +1037,12 @@ nvk_UpdateDescriptorSetWithTemplate(VkDevice device, VK_FROM_HANDLE(nvk_descriptor_set, set, descriptorSet); VK_FROM_HANDLE(vk_descriptor_update_template, template, descriptorUpdateTemplate); + const struct nvk_physical_device *pdev = nvk_device_physical(dev); - nvk_descriptor_set_write_template(dev, set, template, pData); + struct nvk_descriptor_writer w; + nvk_descriptor_writer_init_set(pdev, &w, set); + write_from_template(&w, template, pData); + nvk_descriptor_writer_finish(&w); } void @@ -997,12 +1053,12 @@ nvk_push_descriptor_set_update_template( const struct vk_descriptor_update_template *template, const void *data) { - struct nvk_descriptor_set tmp_set = { - .layout = layout, - .size_B = sizeof(push_set->data), - .map = push_set->data, - }; - nvk_descriptor_set_write_template(dev, &tmp_set, template, data); + const struct nvk_physical_device *pdev = nvk_device_physical(dev); + + struct nvk_descriptor_writer w; + nvk_descriptor_writer_init_push(pdev, &w, layout, push_set); + write_from_template(&w, template, data); + nvk_descriptor_writer_finish(&w); } VKAPI_ATTR void VKAPI_CALL