diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-09-14 08:12:08 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-09-22 07:21:24 -0600 |
| commit | 43da0bd4137df812a76b7f1488f641a4c8299f35 (patch) | |
| tree | 8b82cf375d52890b2e4538319eafee259d409c63 /layers | |
| parent | c30003c040c09cb29506cd552254230cdc375844 (diff) | |
| download | usermoji-43da0bd4137df812a76b7f1488f641a4c8299f35.tar.xz | |
layers: Update BufferView state tracking
Create BUFFER_VIEW_STATE class to hold VkBufferViewCreateInfo and update related
state tracking. This class derives from BASE_NODE in preparation for tracking
in_use for BufferViews consistent to other object in_use tracking.
Diffstat (limited to 'layers')
| -rw-r--r-- | layers/core_validation.cpp | 12 | ||||
| -rw-r--r-- | layers/core_validation_types.h | 14 | ||||
| -rw-r--r-- | layers/descriptor_sets.cpp | 24 |
3 files changed, 31 insertions, 19 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index eb2e136e..4ab2b2de 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -115,7 +115,7 @@ struct layer_data { unordered_map<VkSampler, unique_ptr<SAMPLER_NODE>> samplerMap; unordered_map<VkImageView, unique_ptr<IMAGE_VIEW_STATE>> imageViewMap; unordered_map<VkImage, unique_ptr<IMAGE_NODE>> imageMap; - unordered_map<VkBufferView, unique_ptr<VkBufferViewCreateInfo>> bufferViewMap; + unordered_map<VkBufferView, unique_ptr<BUFFER_VIEW_STATE>> bufferViewMap; unordered_map<VkBuffer, unique_ptr<BUFFER_NODE>> bufferMap; unordered_map<VkPipeline, PIPELINE_NODE *> pipelineMap; unordered_map<VkCommandPool, COMMAND_POOL_NODE> commandPoolMap; @@ -302,7 +302,7 @@ VkSwapchainKHR getSwapchainFromImage(const layer_data *dev_data, VkImage image) return img_it->second; } // Return buffer node ptr for specified buffer or else NULL -VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *my_data, VkBufferView buffer_view) { +BUFFER_VIEW_STATE *getBufferViewState(const layer_data *my_data, VkBufferView buffer_view) { auto bv_it = my_data->bufferViewMap.find(buffer_view); if (bv_it == my_data->bufferViewMap.end()) { return nullptr; @@ -5612,9 +5612,9 @@ DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCa layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); std::unique_lock<std::mutex> lock(global_lock); - auto item = dev_data->bufferViewMap.find(bufferView); - if (item != dev_data->bufferViewMap.end()) { - dev_data->bufferViewMap.erase(item); + auto view_state = getBufferViewState(dev_data, bufferView); + if (view_state) { + dev_data->bufferViewMap.erase(bufferView); } lock.unlock(); dev_data->device_dispatch_table->DestroyBufferView(device, bufferView, pAllocator); @@ -6106,7 +6106,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferV VkResult result = dev_data->device_dispatch_table->CreateBufferView(device, pCreateInfo, pAllocator, pView); if (VK_SUCCESS == result) { lock.lock(); - dev_data->bufferViewMap[*pView] = unique_ptr<VkBufferViewCreateInfo>(new VkBufferViewCreateInfo(*pCreateInfo)); + dev_data->bufferViewMap[*pView] = unique_ptr<BUFFER_VIEW_STATE>(new BUFFER_VIEW_STATE(*pView, pCreateInfo)); lock.unlock(); } return result; diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index f913848b..48642a72 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -160,6 +160,18 @@ class BUFFER_NODE : public BASE_NODE { createInfo(rh_obj.createInfo){}; }; +class BUFFER_VIEW_STATE : public BASE_NODE { + public: + using BASE_NODE::in_use; + VkBufferView buffer_view; + VkBufferViewCreateInfo create_info; + BUFFER_VIEW_STATE() : buffer_view(VK_NULL_HANDLE), create_info{} {}; + BUFFER_VIEW_STATE(VkBufferView bv, const VkBufferViewCreateInfo *ci) : buffer_view(bv), create_info(*ci){}; + BUFFER_VIEW_STATE(const BUFFER_VIEW_STATE &rh_obj) : buffer_view(rh_obj.buffer_view), create_info(rh_obj.create_info) { + in_use.store(rh_obj.in_use.load()); + }; +}; + struct SAMPLER_NODE : public BASE_NODE { VkSampler sampler; VkSamplerCreateInfo createInfo; @@ -659,7 +671,7 @@ DESCRIPTOR_POOL_NODE *getPoolNode(const layer_data *, const VkDescriptorPool); BUFFER_NODE *getBufferNode(const layer_data *, VkBuffer); IMAGE_NODE *getImageNode(const layer_data *, VkImage); DEVICE_MEM_INFO *getMemObjInfo(const layer_data *, VkDeviceMemory); -VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *, VkBufferView); +BUFFER_VIEW_STATE *getBufferViewState(const layer_data *, VkBufferView); SAMPLER_NODE *getSamplerNode(const layer_data *, VkSampler); IMAGE_VIEW_STATE *getImageViewState(const layer_data *, VkImageView); VkSwapchainKHR getSwapchainFromImage(const layer_data *, VkImage); diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 79d9c286..df5dac29 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -498,9 +498,9 @@ uint32_t cvdescriptorset::DescriptorSet::GetStorageUpdates(const std::map<uint32 for (uint32_t i = 0; i < p_layout_->GetDescriptorCountFromBinding(binding); ++i) { if (descriptors_[start_idx + i]->updated) { auto bufferview = static_cast<TexelDescriptor *>(descriptors_[start_idx + i].get())->GetBufferView(); - auto bv_info = getBufferViewInfo(device_data_, bufferview); - if (bv_info) { - buffer_set->insert(bv_info->buffer); + auto bv_state = getBufferViewState(device_data_, bufferview); + if (bv_state) { + buffer_set->insert(bv_state->create_info.buffer); num_updates++; } } @@ -972,9 +972,9 @@ void cvdescriptorset::TexelDescriptor::CopyUpdate(const Descriptor *src) { } void cvdescriptorset::TexelDescriptor::BindCommandBuffer(const core_validation::layer_data *dev_data, GLOBAL_CB_NODE *cb_node) { - auto bv_info = getBufferViewInfo(dev_data, buffer_view_); - if (bv_info) { - auto buffer_node = getBufferNode(dev_data, bv_info->buffer); + auto bv_state = getBufferViewState(dev_data, buffer_view_); + if (bv_state) { + auto buffer_node = getBufferNode(dev_data, bv_state->create_info.buffer); if (buffer_node) core_validation::AddCommandBufferBindingBuffer(dev_data, cb_node, buffer_node); } @@ -1273,14 +1273,14 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: { for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto buffer_view = update->pTexelBufferView[di]; - auto bv_info = getBufferViewInfo(device_data_, buffer_view); - if (!bv_info) { + auto bv_state = getBufferViewState(device_data_, buffer_view); + if (!bv_state) { std::stringstream error_str; error_str << "Attempted write update to texel buffer descriptor with invalid buffer view: " << buffer_view; *error = error_str.str(); return false; } - auto buffer = bv_info->buffer; + auto buffer = bv_state->create_info.buffer; if (!ValidateBufferUsage(getBufferNode(device_data_, buffer), update->descriptorType, error)) { std::stringstream error_str; error_str << "Attempted write update to texel buffer descriptor failed due to: " << error->c_str(); @@ -1374,14 +1374,14 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri case TexelBuffer: { for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto buffer_view = static_cast<TexelDescriptor *>(src_set->descriptors_[index + di].get())->GetBufferView(); - auto bv_info = getBufferViewInfo(device_data_, buffer_view); - if (!bv_info) { + auto bv_state = getBufferViewState(device_data_, buffer_view); + if (!bv_state) { std::stringstream error_str; error_str << "Attempted copy update to texel buffer descriptor with invalid buffer view: " << buffer_view; *error = error_str.str(); return false; } - auto buffer = bv_info->buffer; + auto buffer = bv_state->create_info.buffer; if (!ValidateBufferUsage(getBufferNode(device_data_, buffer), type, error)) { std::stringstream error_str; error_str << "Attempted copy update to texel buffer descriptor failed due to: " << error->c_str(); |
