layers: Update BufferView state tracking
authorTobin Ehlis <tobine@google.com>
Wed, 14 Sep 2016 14:12:08 +0000 (08:12 -0600)
committerTobin Ehlis <tobine@google.com>
Thu, 22 Sep 2016 13:21:24 +0000 (07:21 -0600)
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.

layers/core_validation.cpp
layers/core_validation_types.h
layers/descriptor_sets.cpp

index eb2e136..4ab2b2d 100644 (file)
@@ -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;
index f913848..48642a7 100644 (file)
@@ -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);
index 79d9c28..df5dac2 100644 (file)
@@ -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();