aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorChris Forbes <chrisforbes@google.com>2017-06-12 12:46:20 -0700
committerChris Forbes <chrisf@ijw.co.nz>2017-06-12 14:38:54 -0700
commit87773c677ad185795fdb5165f6feccd09b4b8e26 (patch)
treeda32e434a43d8afead3c9421a94ba8d097d1a898 /layers/core_validation.cpp
parentd9fd531293806b6a9c4b2437cfad4ff0cd0fc72e (diff)
downloadusermoji-87773c677ad185795fdb5165f6feccd09b4b8e26.tar.xz
layers: Split validate & update of CmdEndQuery
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp18
1 files changed, 12 insertions, 6 deletions
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<std::mutex> 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,