aboutsummaryrefslogtreecommitdiff
path: root/layers/mem_tracker.cpp
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2015-04-09 13:46:09 -0500
committerChia-I Wu <olv@lunarg.com>2015-04-16 17:48:20 +0800
commit20a9be42825cc83e7371ea49f10294fb94831dc6 (patch)
tree630abc05f5b3351b2f8fdd4206580ec9177bc427 /layers/mem_tracker.cpp
parentb4ea4d83a983183056c41e9ed68e6b483329981a (diff)
downloadusermoji-20a9be42825cc83e7371ea49f10294fb94831dc6.tar.xz
layers: Added in fence state validation to MemTracker
Validation checks for SIGNALED/UNSIGNALED fences in appropriate locations.
Diffstat (limited to 'layers/mem_tracker.cpp')
-rw-r--r--layers/mem_tracker.cpp33
1 files changed, 26 insertions, 7 deletions
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index e7f1f7eb..189b87aa 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -141,7 +141,16 @@ static uint64_t addFenceInfo(VkFence fence, VkQueue queue)
addObjectInfo(pFenceInfo->fence, fci.sType, &fci, sizeof(VkFenceCreateInfo), "internalFence");
pFenceInfo->localFence = VK_TRUE;
} else {
- pFenceInfo->localFence = VK_FALSE;
+ // Validate that fence is in UNSIGNALED state
+ MT_OBJ_INFO* pObjectInfo = getObjectInfo(fence);
+ if (pObjectInfo != NULL) {
+ if (pObjectInfo->create_info.fence_create_info.flags & XGL_FENCE_CREATE_SIGNALED_BIT) {
+ char str[1024];
+ sprintf(str, "Fence %p submitted in SIGNALED state. Fences must be reset before being submitted", fence);
+ layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, fence, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", str);
+ }
+ }
+ pFenceInfo->localFence = XGL_FALSE;
pFenceInfo->fence = fence;
}
pFenceInfo->queue = queue;
@@ -189,7 +198,8 @@ static void updateFenceTracking(VkFence fence)
// Update fence state in fenceCreateInfo structure
MT_OBJ_INFO* pObjectInfo = getObjectInfo(fence);
if (pObjectInfo != NULL) {
- pObjectInfo->create_info.fence_create_info.flags = VK_FENCE_CREATE_SIGNALED_BIT;
+ pObjectInfo->create_info.fence_create_info.flags =
+ static_cast<XGL_FENCE_CREATE_FLAGS>(pObjectInfo->create_info.fence_create_info.flags | XGL_FENCE_CREATE_SIGNALED_BIT);
}
}
}
@@ -1219,8 +1229,17 @@ VK_LAYER_EXPORT VkResult VKAPI vkResetFences(VkDevice device, uint32_t fenceCoun
for (uint32_t i = 0; i < fenceCount; i++) {
MT_OBJ_INFO* pObjectInfo = getObjectInfo(pFences[i]);
if (pObjectInfo != NULL) {
- pObjectInfo->create_info.fence_create_info.flags =
- static_cast<VkFenceCreateFlags>(pObjectInfo->create_info.fence_create_info.flags & ~VK_FENCE_CREATE_SIGNALED_BIT);
+ // Validate fences in SIGNALED state
+ if (!(pObjectInfo->create_info.fence_create_info.flags & XGL_FENCE_CREATE_SIGNALED_BIT)) {
+ char str[1024];
+ sprintf(str, "Fence %p submitted to xglResetFences in UNSIGNALED STATE", pFences[i]);
+ layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pFences[i], 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", str);
+ result = XGL_ERROR_INVALID_VALUE;
+ }
+ else {
+ pObjectInfo->create_info.fence_create_info.flags =
+ static_cast<XGL_FENCE_CREATE_FLAGS>(pObjectInfo->create_info.fence_create_info.flags & ~XGL_FENCE_CREATE_SIGNALED_BIT);
+ }
}
}
loader_platform_thread_unlock_mutex(&globalLock);
@@ -1245,10 +1264,10 @@ VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences(VkDevice device, uint32_t fenceCo
for(uint32_t i = 0; i < fenceCount; i++) {
MT_OBJ_INFO* pObjectInfo = getObjectInfo(pFences[i]);
if (pObjectInfo != NULL) {
- if (pObjectInfo->create_info.fence_create_info.flags == VK_FENCE_CREATE_SIGNALED_BIT) {
+ if (pObjectInfo->create_info.fence_create_info.flags & XGL_FENCE_CREATE_SIGNALED_BIT) {
char str[1024];
- sprintf(str, "vkWaitForFences specified signaled-state Fence %p. Fences must be reset before being submitted", pFences[i]);
- layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, pFences[i], 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", str);
+ sprintf(str, "xglWaitForFences specified fence %p already in SIGNALED state.", pFences[i]);
+ layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, pFences[i], 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", str);
}
}
}