aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2016-09-19 14:02:58 -0600
committerTobin Ehlis <tobine@google.com>2016-09-22 07:21:24 -0600
commit758a96f329c1f7dcc1ec6bd289022545c3a7981c (patch)
treec4f7e81dbd20d352fb18eaefa53a1d7b47342622
parent8f969432a0f658eb28b70717bc84c4bb87d59469 (diff)
downloadusermoji-758a96f329c1f7dcc1ec6bd289022545c3a7981c.tar.xz
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().
-rw-r--r--layers/core_validation.cpp23
-rw-r--r--layers/core_validation_types.h1
-rw-r--r--layers/descriptor_sets.cpp8
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<uint64_t &>(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<uint64_t &>(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<uint64_t &>(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<GLOBAL_CB_NODE *>, 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);
}
}