From a0c3998fc18cb5d9362b19a3478c70699b284352 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 10 Mar 2016 09:18:20 -0700 Subject: layers: GH98 Only check fence in-use once per QueueSubmit In vkQueueSubmit, perform the fence in-use check first. Then validate each submit, which includes marking the current fence in-use. --- layers/draw_state.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'layers/draw_state.cpp') diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index db289795..338e1b37 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -4224,6 +4224,13 @@ vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, GLOBAL_CB_NODE *pCB = NULL; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map); loader_platform_thread_lock_mutex(&globalLock); + // First verify that fence is not in use + if ((fence != VK_NULL_HANDLE) && (submitCount != 0) && dev_data->fenceMap[fence].in_use.load()) { + skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, + (uint64_t)(fence), __LINE__, DRAWSTATE_INVALID_FENCE, "DS", + "Fence %#" PRIx64 " is already in use by another submission.", (uint64_t)(fence)); + } + // Now verify each individual submit for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) { const VkSubmitInfo *submit = &pSubmits[submit_idx]; vector semaphoreList; @@ -4249,11 +4256,7 @@ vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, pCB->submitCount++; // increment submit count skipCall |= validatePrimaryCommandBufferState(dev_data, pCB); } - if ((fence != VK_NULL_HANDLE) && dev_data->fenceMap[fence].in_use.load()) { - skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - (uint64_t)(fence), __LINE__, DRAWSTATE_INVALID_FENCE, "DS", - "Fence %#" PRIx64 " is already in use by another submission.", (uint64_t)(fence)); - } + // Update cmdBuffer-related data structs and mark fence in-use trackCommandBuffers(dev_data, queue, submit->commandBufferCount, submit->pCommandBuffers, fence); } loader_platform_thread_unlock_mutex(&globalLock); -- cgit v1.2.3