From 87773c677ad185795fdb5165f6feccd09b4b8e26 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Mon, 12 Jun 2017 12:46:20 -0700 Subject: layers: Split validate & update of CmdEndQuery --- layers/core_validation.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 41c03ed8..df227ddc 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -6552,27 +6552,33 @@ VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPoo bool skip = false; layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); std::unique_lock lock(global_lock); + QueryObject query = {queryPool, slot}; GLOBAL_CB_NODE *cb_state = GetCBNode(dev_data, commandBuffer); if (cb_state) { - QueryObject query = {queryPool, slot}; if (!cb_state->activeQueries.count(query)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1ae00652, "DS", "Ending a query before it was started: queryPool 0x%" PRIx64 ", index %d. %s", HandleToUint64(queryPool), slot, validation_error_map[VALIDATION_ERROR_1ae00652]); - } else { - cb_state->activeQueries.erase(query); } - cb_state->queryUpdates.emplace_back([=](VkQueue q){return setQueryState(q, commandBuffer, query, true);}); skip |= ValidateCmdQueueFlags(dev_data, cb_state, "VkCmdEndQuery()", VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, VALIDATION_ERROR_1ae02415); skip |= ValidateCmd(dev_data, cb_state, CMD_ENDQUERY, "VkCmdEndQuery()"); + } + lock.unlock(); + + if (skip) return; + + dev_data->dispatch_table.CmdEndQuery(commandBuffer, queryPool, slot); + + lock.lock(); + if (cb_state) { + cb_state->activeQueries.erase(query); + cb_state->queryUpdates.emplace_back([=](VkQueue q){return setQueryState(q, commandBuffer, query, true);}); UpdateCmdBufferLastCmd(cb_state, CMD_ENDQUERY); addCommandBufferBinding(&GetQueryPoolNode(dev_data, queryPool)->cb_bindings, {HandleToUint64(queryPool), kVulkanObjectTypeQueryPool}, cb_state); } - lock.unlock(); - if (!skip) dev_data->dispatch_table.CmdEndQuery(commandBuffer, queryPool, slot); } VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, -- cgit v1.2.3