From b8ccfc4270a34e192b567ab47258d611abb1d542 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 9 Mar 2017 16:24:13 -0700 Subject: layers: Move desc set helper to descriptorset module Change-Id: I695cf51b6fa27df7585582f545c0077efb9fd432 --- layers/core_validation.cpp | 73 ++++------------------------------------------ layers/descriptor_sets.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++++ layers/descriptor_sets.h | 3 ++ 3 files changed, 78 insertions(+), 68 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 8d7cb016..c0243f86 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -11453,78 +11453,16 @@ VKAPI_ATTR void VKAPI_CALL DestroyDescriptorUpdateTemplateKHR(VkDevice device, dev_data->dispatch_table.DestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator); } -void PostCallRecordUpdateDescriptorSetWithTemplateKHR(layer_data *device_data, VkDescriptorSet descriptorSet, - VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const void *pData) { +// PostCallRecord* handles recording state updates following call down chain to UpdateDescriptorSetsWithTemplate() +static void PostCallRecordUpdateDescriptorSetWithTemplateKHR(layer_data *device_data, VkDescriptorSet descriptorSet, + VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, + const void *pData) { auto const template_map_entry = device_data->desc_template_map.find(descriptorUpdateTemplate); if (template_map_entry == device_data->desc_template_map.end()) { assert(0); } - auto const &create_info = template_map_entry->second->create_info; - - // Create a vector of write structs - std::vector desc_writes; - auto layout_obj = GetDescriptorSetLayout(device_data, create_info.descriptorSetLayout); - - // Create a WriteDescriptorSet struct for each template update entry - for (uint32_t i = 0; i < create_info.descriptorUpdateEntryCount; i++) { - auto binding_count = layout_obj->GetDescriptorCountFromBinding(create_info.pDescriptorUpdateEntries[i].dstBinding); - auto binding_being_updated = create_info.pDescriptorUpdateEntries[i].dstBinding; - auto dst_array_element = create_info.pDescriptorUpdateEntries[i].dstArrayElement; - - for (uint32_t j = 0; j < create_info.pDescriptorUpdateEntries[i].descriptorCount; j++) { - desc_writes.emplace_back(); - auto &write_entry = desc_writes.back(); - - size_t offset = create_info.pDescriptorUpdateEntries[i].offset + j * create_info.pDescriptorUpdateEntries[i].stride; - char *update_entry = (char *)(pData) + offset; - - if (dst_array_element >= binding_count) { - dst_array_element = 0; - // Move to next binding having a non-zero binding count - do { - binding_being_updated++; - binding_count = layout_obj->GetDescriptorCountFromBinding(binding_being_updated); - } while (binding_count == 0); - } - - write_entry.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - write_entry.pNext = NULL; - write_entry.dstSet = descriptorSet; - write_entry.dstBinding = binding_being_updated; - write_entry.dstArrayElement = dst_array_element; - write_entry.descriptorCount = 1; - write_entry.descriptorType = create_info.pDescriptorUpdateEntries[i].descriptorType; - - switch (create_info.pDescriptorUpdateEntries[i].descriptorType) { - case VK_DESCRIPTOR_TYPE_SAMPLER: - case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: - case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: - case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: - write_entry.pImageInfo = reinterpret_cast(update_entry); - break; - - case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: - case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: - write_entry.pBufferInfo = reinterpret_cast(update_entry); - break; - - case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: - case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: - write_entry.pTexelBufferView = reinterpret_cast(update_entry); - break; - default: - assert(0); - break; - } - dst_array_element++; - } - } - cvdescriptorset::PerformUpdateDescriptorSets(device_data, static_cast(desc_writes.size()), desc_writes.data(), 0, - NULL); + cvdescriptorset::PerformUpdateDescriptorSetsWithTemplateKHR(device_data, descriptorSet, template_map_entry->second, pData); } VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet, @@ -11534,7 +11472,6 @@ VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSetWithTemplateKHR(VkDevice device, V device_data->dispatch_table.UpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, pData); PostCallRecordUpdateDescriptorSetWithTemplateKHR(device_data, descriptorSet, descriptorUpdateTemplate, pData); - } VKAPI_ATTR void VKAPI_CALL CmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer, diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index ad3d720c..469eb4d2 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -1136,6 +1136,76 @@ void cvdescriptorset::PerformUpdateDescriptorSets(const layer_data *dev_data, ui } } } +// This helper function carries out the state updates for descriptor updates peformed via update templates. It basically collects +// data and leverages the PerformUpdateDescriptor helper functions to do this. +void cvdescriptorset::PerformUpdateDescriptorSetsWithTemplateKHR(layer_data *device_data, VkDescriptorSet descriptorSet, + std::unique_ptr const &template_state, + const void *pData) { + auto const &create_info = template_state->create_info; + + // Create a vector of write structs + std::vector desc_writes; + auto layout_obj = GetDescriptorSetLayout(device_data, create_info.descriptorSetLayout); + + // Create a WriteDescriptorSet struct for each template update entry + for (uint32_t i = 0; i < create_info.descriptorUpdateEntryCount; i++) { + auto binding_count = layout_obj->GetDescriptorCountFromBinding(create_info.pDescriptorUpdateEntries[i].dstBinding); + auto binding_being_updated = create_info.pDescriptorUpdateEntries[i].dstBinding; + auto dst_array_element = create_info.pDescriptorUpdateEntries[i].dstArrayElement; + + for (uint32_t j = 0; j < create_info.pDescriptorUpdateEntries[i].descriptorCount; j++) { + desc_writes.emplace_back(); + auto &write_entry = desc_writes.back(); + + size_t offset = create_info.pDescriptorUpdateEntries[i].offset + j * create_info.pDescriptorUpdateEntries[i].stride; + char *update_entry = (char *)(pData) + offset; + + if (dst_array_element >= binding_count) { + dst_array_element = 0; + // Move to next binding having a non-zero binding count + do { + binding_being_updated++; + binding_count = layout_obj->GetDescriptorCountFromBinding(binding_being_updated); + } while (binding_count == 0); + } + + write_entry.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + write_entry.pNext = NULL; + write_entry.dstSet = descriptorSet; + write_entry.dstBinding = binding_being_updated; + write_entry.dstArrayElement = dst_array_element; + write_entry.descriptorCount = 1; + write_entry.descriptorType = create_info.pDescriptorUpdateEntries[i].descriptorType; + + switch (create_info.pDescriptorUpdateEntries[i].descriptorType) { + case VK_DESCRIPTOR_TYPE_SAMPLER: + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: + write_entry.pImageInfo = reinterpret_cast(update_entry); + break; + + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: + write_entry.pBufferInfo = reinterpret_cast(update_entry); + break; + + case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: + write_entry.pTexelBufferView = reinterpret_cast(update_entry); + break; + default: + assert(0); + break; + } + dst_array_element++; + } + } + PerformUpdateDescriptorSets(device_data, static_cast(desc_writes.size()), desc_writes.data(), 0, NULL); +} // Validate the state for a given write update but don't actually perform the update // If an error would occur for this update, return false and fill in details in error_msg string bool cvdescriptorset::DescriptorSet::ValidateWriteUpdate(const debug_report_data *report_data, const VkWriteDescriptorSet *update, diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 7e0bc873..9d9a15df 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -285,6 +285,9 @@ bool ValidateUpdateDescriptorSets(const debug_report_data *, const core_validati // "Perform" does the update with the assumption that ValidateUpdateDescriptorSets() has passed for the given update void PerformUpdateDescriptorSets(const core_validation::layer_data *, uint32_t, const VkWriteDescriptorSet *, uint32_t, const VkCopyDescriptorSet *); +// Similar to PerformUpdateDescriptorSets, this function will do the same for updating via templates +void PerformUpdateDescriptorSetsWithTemplateKHR(layer_data *, VkDescriptorSet, std::unique_ptr const &, + const void *); // Validate that Allocation state is ok bool ValidateAllocateDescriptorSets(const debug_report_data *, const VkDescriptorSetAllocateInfo *, const core_validation::layer_data *, AllocateDescriptorSetsData *); -- cgit v1.2.3