From 758a96f329c1f7dcc1ec6bd289022545c3a7981c Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Mon, 19 Sep 2016 14:02:58 -0600 Subject: layer: Add in-use validation for imageView Bind imageView from a descriptor to the command buffer at CmdBindDescriptorSets time and check for an in-use imageView at DestroyImageView time. Also use new AddCommandBufferBindingImageView() helper to bind children of framebuffer in AddFrameBufferBinding(). --- layers/core_validation.cpp | 23 ++++++++++++++--------- layers/core_validation_types.h | 1 + layers/descriptor_sets.cpp | 8 ++------ 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 12bc8a09..485ccc53 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -586,6 +586,19 @@ void AddCommandBufferBindingImage(const layer_data *dev_data, GLOBAL_CB_NODE *cb img_node->cb_bindings.insert(cb_node); } +// Create binding link between given image view node and its image with command buffer node +void AddCommandBufferBindingImageView(const layer_data *dev_data, GLOBAL_CB_NODE *cb_node, IMAGE_VIEW_STATE *view_state) { + // First add bindings for imageView + view_state->cb_bindings.insert(cb_node); + auto image_node = getImageNode(dev_data, view_state->create_info.image); + cb_node->object_bindings.insert( + {reinterpret_cast(view_state->image_view), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT}); + // Add bindings for image within imageView + if (image_node) { + AddCommandBufferBindingImage(dev_data, cb_node, image_node); + } +} + // Create binding link between given buffer node and command buffer node void AddCommandBufferBindingBuffer(const layer_data *dev_data, GLOBAL_CB_NODE *cb_node, BUFFER_NODE *buff_node) { // First update CB binding in MemObj mini CB list @@ -6767,15 +6780,7 @@ static void AddFramebufferBinding(layer_data *dev_data, GLOBAL_CB_NODE *cb_state for (auto attachment : fb_state->attachments) { auto view_state = attachment.view_state; if (view_state) { - addCommandBufferBinding( - &view_state->cb_bindings, - {reinterpret_cast(view_state->image_view), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT}, cb_state); - } - auto img_node = getImageNode(dev_data, attachment.image); - if (img_node) { - addCommandBufferBinding(&img_node->cb_bindings, - {reinterpret_cast(img_node->image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT}, - cb_state); + AddCommandBufferBindingImageView(dev_data, cb_state, view_state); } auto rp_state = getRenderPass(dev_data, fb_state->createInfo.renderPass); if (rp_state) { diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 21f55104..ff2cdbf8 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -680,6 +680,7 @@ void invalidateCommandBuffers(std::unordered_set, VK_OBJECT); bool ValidateMemoryIsBoundToBuffer(const layer_data *, const BUFFER_NODE *, const char *); void AddCommandBufferBindingSampler(GLOBAL_CB_NODE *, SAMPLER_NODE *); void AddCommandBufferBindingImage(const layer_data *, GLOBAL_CB_NODE *, IMAGE_NODE *); +void AddCommandBufferBindingImageView(const layer_data *, GLOBAL_CB_NODE *, IMAGE_VIEW_STATE *); void AddCommandBufferBindingBuffer(const layer_data *, GLOBAL_CB_NODE *, BUFFER_NODE *); } diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index df5dac29..f02da6b1 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -880,9 +880,7 @@ void cvdescriptorset::ImageSamplerDescriptor::BindCommandBuffer(const core_valid // Add binding for image auto iv_state = getImageViewState(dev_data, image_view_); if (iv_state) { - auto image_node = getImageNode(dev_data, iv_state->create_info.image); - if (image_node) - core_validation::AddCommandBufferBindingImage(dev_data, cb_node, image_node); + core_validation::AddCommandBufferBindingImageView(dev_data, cb_node, iv_state); } } @@ -913,9 +911,7 @@ void cvdescriptorset::ImageDescriptor::BindCommandBuffer(const core_validation:: // Add binding for image auto iv_state = getImageViewState(dev_data, image_view_); if (iv_state) { - auto image_node = getImageNode(dev_data, iv_state->create_info.image); - if (image_node) - core_validation::AddCommandBufferBindingImage(dev_data, cb_node, image_node); + core_validation::AddCommandBufferBindingImageView(dev_data, cb_node, iv_state); } } -- cgit v1.2.3