aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Lentine <mlentine@google.com>2016-05-20 10:14:00 -0500
committerTobin Ehlis <tobine@google.com>2016-05-23 11:10:23 -0600
commit77bfc0df13075008e4a6657a8e61a7727778ee4a (patch)
tree1a786f247c62b09bd3e2ed7848e6ebde748c25e8
parentd2970375fcce017d2284c00e4e88151e73196800 (diff)
downloadusermoji-77bfc0df13075008e4a6657a8e61a7727778ee4a.tar.xz
layers: Fix event tracking to differentiate reading and writing
-rw-r--r--layers/core_validation.cpp43
-rw-r--r--layers/core_validation.h1
-rw-r--r--layers/core_validation_types.h5
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;