From 92388e51bc3baf1015743fa4f499c8f38fc9bfea Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Wed, 12 Oct 2016 16:58:54 -0600 Subject: layers:Refactor DestroyRenderPass Add validation flag for DestroyRenderPass and update it to follow the Pre/Post pattern. --- layers/core_validation.cpp | 33 ++++++++++++++++++++++++--------- layers/core_validation.h | 1 + 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 85c1dfe1..c3a28987 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -6365,22 +6365,37 @@ DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocatio } } +static bool PreCallValidateDestroyRenderPass(layer_data *dev_data, VkRenderPass render_pass, RENDER_PASS_STATE **rp_state, + VK_OBJECT *obj_struct) { + if (dev_data->instance_state->disabled.destroy_renderpass) + return false; + bool skip = false; + *rp_state = getRenderPassState(dev_data, render_pass); + if (*rp_state) { + *obj_struct = {reinterpret_cast(render_pass), VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT}; + skip |= ValidateObjectNotInUse(dev_data, *rp_state, *obj_struct, VALIDATION_ERROR_00393); + } + return skip; +} + +static void PostCallRecordDestroyRenderPass(layer_data *dev_data, VkRenderPass render_pass, RENDER_PASS_STATE *rp_state, + VK_OBJECT obj_struct) { + invalidateCommandBuffers(rp_state->cb_bindings, obj_struct); + dev_data->renderPassMap.erase(render_pass); +} + VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) { layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - bool skip = false; + RENDER_PASS_STATE *rp_state = nullptr; + VK_OBJECT obj_struct; std::unique_lock lock(global_lock); - auto rp_state = getRenderPassState(dev_data, renderPass); - if (rp_state) { - VK_OBJECT obj_struct = {reinterpret_cast(renderPass), VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT}; - skip |= ValidateObjectNotInUse(dev_data, rp_state, obj_struct, VALIDATION_ERROR_00393); - // Any bound cmd buffers are now invalid - invalidateCommandBuffers(rp_state->cb_bindings, obj_struct); - } + bool skip = PreCallValidateDestroyRenderPass(dev_data, renderPass, &rp_state, &obj_struct); if (!skip) { - dev_data->renderPassMap.erase(renderPass); lock.unlock(); dev_data->dispatch_table.DestroyRenderPass(device, renderPass, pAllocator); + lock.lock(); + PostCallRecordDestroyRenderPass(dev_data, renderPass, rp_state, obj_struct); } } diff --git a/layers/core_validation.h b/layers/core_validation.h index 9f2218a1..7a050797 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -76,6 +76,7 @@ struct CHECK_DISABLED { bool destroy_pipeline; // Skip validation at DestroyPipeline time bool destroy_descriptor_pool; // Skip validation at DestroyDescriptorPool time bool destroy_framebuffer; // Skip validation at DestroyFramebuffer time + bool destroy_renderpass; // Skip validation at DestroyRenderpass time bool object_in_use; // Skip all object in_use checking bool idle_descriptor_set; // Skip check to verify that descriptor set is no in-use bool push_constant_range; // Skip push constant range checks -- cgit v1.2.3