layers: Added in fence state validation to MemTracker
authorMark Lobodzinski <mark@lunarg.com>
Thu, 9 Apr 2015 18:46:09 +0000 (13:46 -0500)
committerChia-I Wu <olv@lunarg.com>
Thu, 16 Apr 2015 09:48:20 +0000 (17:48 +0800)
Validation checks for SIGNALED/UNSIGNALED fences in appropriate locations.

layers/mem_tracker.cpp

index e7f1f7e..189b87a 100644 (file)
@@ -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);
             }
         }
     }