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 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'layers/core_validation.cpp') 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); } } -- cgit v1.2.3