aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2016-10-12 11:48:21 -0600
committerTobin Ehlis <tobine@google.com>2016-10-13 19:13:33 -0600
commit68bffb05ebae84543f3632f9a6d8193f480415da (patch)
treea219118c8dada504820eb203898ab8f274c87bd3 /layers/core_validation.cpp
parent15f2d405fc05e0f0a90623d91e56ec109b418391 (diff)
downloadusermoji-68bffb05ebae84543f3632f9a6d8193f480415da.tar.xz
layers:Refactor DestroyFramebuffer
Add validation flag for DestroyFramebuffer and update it to follow the Pre/Post pattern. This function didn't previously perform an in-use check so added that check. Updated database file.
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp34
1 files changed, 27 insertions, 7 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index a398c130..824c0bf6 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -6331,18 +6331,38 @@ void invalidateCommandBuffers(std::unordered_set<GLOBAL_CB_NODE *> cb_nodes, VK_
}
}
+static bool PreCallValidateDestroyFramebuffer(layer_data *dev_data, VkFramebuffer framebuffer, FRAMEBUFFER_NODE **framebuffer_state,
+ VK_OBJECT *obj_struct) {
+ if (dev_data->instance_state->disabled.destroy_framebuffer)
+ return false;
+ bool skip = false;
+ *framebuffer_state = getFramebuffer(dev_data, framebuffer);
+ if (*framebuffer_state) {
+ *obj_struct = {reinterpret_cast<uint64_t &>(framebuffer), VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT};
+ skip |= ValidateObjectNotInUse(dev_data, *framebuffer_state, *obj_struct, VALIDATION_ERROR_00422);
+ }
+ return skip;
+}
+
+static void PostCallRecordDestroyFramebuffer(layer_data *dev_data, VkFramebuffer framebuffer, FRAMEBUFFER_NODE *framebuffer_state,
+ VK_OBJECT obj_struct) {
+ invalidateCommandBuffers(framebuffer_state->cb_bindings, obj_struct);
+ dev_data->frameBufferMap.erase(framebuffer);
+}
+
VKAPI_ATTR void VKAPI_CALL
DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
+ FRAMEBUFFER_NODE *framebuffer_state = nullptr;
+ VK_OBJECT obj_struct;
std::unique_lock<std::mutex> lock(global_lock);
- auto fb_node = getFramebuffer(dev_data, framebuffer);
- if (fb_node) {
- invalidateCommandBuffers(fb_node->cb_bindings,
- {reinterpret_cast<uint64_t &>(fb_node->framebuffer), VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT});
- dev_data->frameBufferMap.erase(fb_node->framebuffer);
+ bool skip = PreCallValidateDestroyFramebuffer(dev_data, framebuffer, &framebuffer_state, &obj_struct);
+ if (!skip) {
+ lock.unlock();
+ dev_data->dispatch_table.DestroyFramebuffer(device, framebuffer, pAllocator);
+ lock.lock();
+ PostCallRecordDestroyFramebuffer(dev_data, framebuffer, framebuffer_state, obj_struct);
}
- lock.unlock();
- dev_data->dispatch_table.DestroyFramebuffer(device, framebuffer, pAllocator);
}
VKAPI_ATTR void VKAPI_CALL