aboutsummaryrefslogtreecommitdiff
path: root/layers/draw_state.cpp
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2016-03-10 09:18:20 -0700
committerTobin Ehlis <tobine@google.com>2016-03-10 09:41:49 -0700
commita0c3998fc18cb5d9362b19a3478c70699b284352 (patch)
tree42f4e84e350c8c0723050344f68d609254a92952 /layers/draw_state.cpp
parent80fa52c13be9df09277afe41c4ab4dd84ef348ae (diff)
downloadusermoji-a0c3998fc18cb5d9362b19a3478c70699b284352.tar.xz
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.
Diffstat (limited to 'layers/draw_state.cpp')
-rw-r--r--layers/draw_state.cpp13
1 files changed, 8 insertions, 5 deletions
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<VkSemaphore> 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);