diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2015-05-14 15:08:13 -0500 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2015-05-14 15:08:13 -0500 |
| commit | 9fde28dffb7e642dfa282e5bb8df44d9f4c2444a (patch) | |
| tree | 5668c1a4106437d9a20d7a5d2b317c0accf324e2 /layers/mem_tracker.cpp | |
| parent | 93e9d9bcc6624b6939421206a64180d35cd28ca8 (diff) | |
| download | usermoji-9fde28dffb7e642dfa282e5bb8df44d9f4c2444a.tar.xz | |
tests: Expand layer validation test coverage
Added layer validation tests for several ObjectTracker and
MemTracker validation cases. Also improved error handling
in object tracker layer to handle validation failures that
could cause unrecoverable driver errors.
Diffstat (limited to 'layers/mem_tracker.cpp')
| -rw-r--r-- | layers/mem_tracker.cpp | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp index 3d3a9965..98fdb64c 100644 --- a/layers/mem_tracker.cpp +++ b/layers/mem_tracker.cpp @@ -482,7 +482,7 @@ static void reportMemReferencesAndCleanUp( char str[1024]; sprintf(str, "Attempting to free memory object %p which still contains %lu references", pMemObjInfo->mem, (cmdBufRefCount + objRefCount)); - layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, pMemObjInfo->mem, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str); + layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, pMemObjInfo->mem, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str); } if (cmdBufRefCount > 0 && pMemObjInfo->pCmdBufferBindings.size() > 0) { @@ -504,6 +504,7 @@ static void reportMemReferencesAndCleanUp( // Clear the list of hanging references pMemObjInfo->pObjBindings.clear(); } + } static void deleteMemObjInfo( @@ -583,10 +584,6 @@ static bool32_t freeMemObjInfo( // Now verify that no references to this mem obj remain if (0 != pInfo->refCount) { - // If references remain, report the error and can search CB list to find references - char str[1024]; - sprintf(str, "Freeing mem obj %p while it still has references", (void*)mem); - layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREED_MEM_REF, "MEM", str); reportMemReferencesAndCleanUp(pInfo); result = VK_FALSE; } @@ -668,6 +665,7 @@ static bool32_t updateObjectBinding( if (!pInfo) { sprintf(str, "While trying to bind mem for obj %p, couldn't find info for mem obj %p", (void*)object, (void*)mem); layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str); + return VK_FALSE; } else { // Search for object in memory object's binding list bool32_t found = VK_FALSE; @@ -930,7 +928,7 @@ VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo( size_t *pDataSize, void *pData) { - /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */ + // This entrypoint is NOT going to init its own dispatch table since loader calls here early VkExtensionProperties *ext_props; uint32_t *count; @@ -1055,14 +1053,16 @@ VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory( * all API objects referencing it and that it is not referenced by any queued command buffers */ loader_platform_thread_lock_mutex(&globalLock); - if (VK_FALSE == freeMemObjInfo(mem, false)) { - char str[1024]; - sprintf(str, "Issue while freeing mem obj %p", (void*)mem); - layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREE_MEM_ERROR, "MEM", str); - } + bool32_t noerror = freeMemObjInfo(mem, false); printMemList(); printObjList(); printCBList(); + // Output an warning message for proper error/warning handling + if (noerror == VK_FALSE) { + char str[1024]; + sprintf(str, "Freeing memory object while it still has references: mem obj %p", (void*)mem); + layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREED_MEM_REF, "MEM", str); + } loader_platform_thread_unlock_mutex(&globalLock); VkResult result = nextTable.FreeMemory(device, mem); return result; @@ -1092,7 +1092,7 @@ VK_LAYER_EXPORT VkResult VKAPI vkMapMemory( MT_MEM_OBJ_INFO *pMemObj = getMemObjInfo(mem); if ((pMemObj->allocInfo.memProps & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0) { char str[1024]; - sprintf(str, "Mapping Memory (%p) without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set", (void*)mem); + sprintf(str, "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set: mem obj %p", (void*)mem); layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_STATE, "MEM", str); } loader_platform_thread_unlock_mutex(&globalLock); |
