diff options
| author | Michael Lentine <mlentine@google.com> | 2016-05-20 10:14:00 -0500 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-05-23 11:10:23 -0600 |
| commit | 77bfc0df13075008e4a6657a8e61a7727778ee4a (patch) | |
| tree | 1a786f247c62b09bd3e2ed7848e6ebde748c25e8 | |
| parent | d2970375fcce017d2284c00e4e88151e73196800 (diff) | |
| download | usermoji-77bfc0df13075008e4a6657a8e61a7727778ee4a.tar.xz | |
layers: Fix event tracking to differentiate reading and writing
| -rw-r--r-- | layers/core_validation.cpp | 43 | ||||
| -rw-r--r-- | layers/core_validation.h | 1 | ||||
| -rw-r--r-- | layers/core_validation_types.h | 5 |
3 files changed, 37 insertions, 12 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index b7368f56..c7d9bc4d 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -65,7 +65,11 @@ #include <android/log.h> #define LOGCONSOLE(...) ((void)__android_log_print(ANDROID_LOG_INFO, "DS", __VA_ARGS__)) #else -#define LOGCONSOLE(...) printf(__VA_ARGS__) +#define LOGCONSOLE(...) \ + { \ + printf(__VA_ARGS__); \ + printf("\n"); \ + } #endif using namespace std; @@ -4102,6 +4106,10 @@ static bool validateAndIncrementResources(layer_data *my_data, GLOBAL_CB_NODE *p eventNode->second.in_use.fetch_add(1); } } + for (auto event : pCB->writeEventsBeforeWait) { + auto eventNode = my_data->eventMap.find(event); + eventNode->second.write_in_use++; + } return skip_call; } @@ -4162,6 +4170,12 @@ static void decrementResources(layer_data *my_data, VkCommandBuffer cmdBuffer) { eventNode->second.in_use.fetch_sub(1); } } + for (auto event : pCB->writeEventsBeforeWait) { + auto eventNode = my_data->eventMap.find(event); + if (eventNode != my_data->eventMap.end()) { + eventNode->second.write_in_use--; + } + } for (auto queryStatePair : pCB->queryToStateMap) { my_data->queryToStateMap[queryStatePair.first] = queryStatePair.second; } @@ -7405,6 +7419,9 @@ CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags s skipCall |= addCmd(dev_data, pCB, CMD_SETEVENT, "vkCmdSetEvent()"); skipCall |= insideRenderPass(dev_data, pCB, "vkCmdSetEvent"); pCB->events.push_back(event); + if (!pCB->waitedEvents.count(event)) { + pCB->writeEventsBeforeWait.push_back(event); + } std::function<bool(VkQueue)> eventUpdate = std::bind(setEventStageMask, std::placeholders::_1, commandBuffer, event, stageMask); pCB->eventUpdates.push_back(eventUpdate); @@ -7424,6 +7441,9 @@ CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags skipCall |= addCmd(dev_data, pCB, CMD_RESETEVENT, "vkCmdResetEvent()"); skipCall |= insideRenderPass(dev_data, pCB, "vkCmdResetEvent"); pCB->events.push_back(event); + if (!pCB->waitedEvents.count(event)) { + pCB->writeEventsBeforeWait.push_back(event); + } std::function<bool(VkQueue)> eventUpdate = std::bind(setEventStageMask, std::placeholders::_1, commandBuffer, event, VkPipelineStageFlags(0)); pCB->eventUpdates.push_back(eventUpdate); @@ -7789,13 +7809,16 @@ bool validateEventStageMask(VkQueue queue, GLOBAL_CB_NODE *pCB, uint32_t eventCo } } } - if (sourceStageMask != stageMask) { - skip_call |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_EVENT, "DS", - "Submitting cmdbuffer with call to VkCmdWaitEvents using srcStageMask 0x%x which must be the bitwise OR of the " - "stageMask parameters used in calls to vkCmdSetEvent and VK_PIPELINE_STAGE_HOST_BIT if used with vkSetEvent.", - sourceStageMask); + // TODO: Need to validate that host_bit is only set if set event is called + // but set event can be called at any time. + if (sourceStageMask != stageMask && sourceStageMask != (stageMask | VK_PIPELINE_STAGE_HOST_BIT)) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_EVENT, "DS", "Submitting cmdbuffer with call to VkCmdWaitEvents " + "using srcStageMask 0x%x which must be the bitwise " + "OR of the stageMask parameters used in calls to " + "vkCmdSetEvent and VK_PIPELINE_STAGE_HOST_BIT if " + "used with vkSetEvent but instead is 0x%x.", + sourceStageMask, stageMask); } return skip_call; } @@ -7812,7 +7835,7 @@ CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent if (pCB) { auto firstEventIndex = pCB->events.size(); for (uint32_t i = 0; i < eventCount; ++i) { - pCB->waitedEvents.push_back(pEvents[i]); + pCB->waitedEvents.insert(pEvents[i]); pCB->events.push_back(pEvents[i]); } std::function<bool(VkQueue)> eventUpdate = @@ -9479,7 +9502,7 @@ VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) { if (event_node != dev_data->eventMap.end()) { event_node->second.needsSignaled = false; event_node->second.stageMask = VK_PIPELINE_STAGE_HOST_BIT; - if (event_node->second.in_use.load()) { + if (event_node->second.write_in_use) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, reinterpret_cast<const uint64_t &>(event), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", "Cannot call vkSetEvent() on event 0x%" PRIxLEAST64 " that is already in use by a command buffer.", diff --git a/layers/core_validation.h b/layers/core_validation.h index b4927b7b..e44bbf89 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -234,6 +234,7 @@ class SEMAPHORE_NODE : public BASE_NODE { class EVENT_NODE : public BASE_NODE { public: using BASE_NODE::in_use; + int write_in_use; bool needsSignaled; VkPipelineStageFlags stageMask; }; diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 5d9f0715..683eefc5 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -415,10 +415,11 @@ struct GLOBAL_CB_NODE : public BASE_NODE { std::unordered_set<cvdescriptorset::DescriptorSet *> destroyedSets; std::unordered_set<cvdescriptorset::DescriptorSet *> updatedSets; std::unordered_set<VkFramebuffer> destroyedFramebuffers; - std::vector<VkEvent> waitedEvents; + std::unordered_set<VkEvent> waitedEvents; + std::vector<VkEvent> writeEventsBeforeWait; std::vector<VkSemaphore> semaphores; std::vector<VkEvent> events; - std::unordered_map<QueryObject, std::vector<VkEvent>> waitedEventsBeforeQueryReset; + std::unordered_map<QueryObject, std::unordered_set<VkEvent>> waitedEventsBeforeQueryReset; std::unordered_map<QueryObject, bool> queryToStateMap; // 0 is unavailable, 1 is available std::unordered_set<QueryObject> activeQueries; std::unordered_set<QueryObject> startedQueries; |
