diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-10-12 16:58:54 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-10-13 19:13:34 -0600 |
| commit | 92388e51bc3baf1015743fa4f499c8f38fc9bfea (patch) | |
| tree | 5077dcd6530209df2d3ec76c72cee0d48f7f6e95 /layers/core_validation.cpp | |
| parent | 425563279f457143ae49ab32d48ad5432aab6080 (diff) | |
| download | usermoji-92388e51bc3baf1015743fa4f499c8f38fc9bfea.tar.xz | |
layers:Refactor DestroyRenderPass
Add validation flag for DestroyRenderPass and update it to follow the
Pre/Post pattern.
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 33 |
1 files changed, 24 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<uint64_t &>(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<std::mutex> lock(global_lock); - auto rp_state = getRenderPassState(dev_data, renderPass); - if (rp_state) { - VK_OBJECT obj_struct = {reinterpret_cast<uint64_t &>(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); } } |
