From: Mark Lobodzinski Date: Thu, 9 Apr 2015 18:46:09 +0000 (-0500) Subject: layers: Added in fence state validation to MemTracker X-Git-Tag: upstream/1.1.92~5778 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=20a9be42825cc83e7371ea49f10294fb94831dc6;p=platform%2Fupstream%2FVulkan-Tools.git layers: Added in fence state validation to MemTracker Validation checks for SIGNALED/UNSIGNALED fences in appropriate locations. --- diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp index e7f1f7e..189b87a 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(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(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(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); } } }