layers: Fix msvc++ iterator issues
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 771feb8..ab5b456 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -75,6 +75,8 @@
void)
{
// Process queue list, cleaning up each entry before deleting
+ if (queueMap.size() <= 0)
+ return;
for (map<VkQueue, MT_QUEUE_INFO*>::iterator ii=queueMap.begin(); ii!=queueMap.end(); ++ii) {
(*ii).second->pQueueCmdBuffers.clear();
}
@@ -209,6 +211,8 @@
VkQueue queue = NULL;
bool found = false;
+ if (fenceMap.size() <= 0)
+ return;
for (map<uint64_t, MT_FENCE_INFO*>::iterator ii=fenceMap.begin(); !found && ii!=fenceMap.end(); ++ii) {
if ((*ii).second != NULL) {
if (fence == ((*ii).second)->fence) {
@@ -277,7 +281,7 @@
// Set Queue's lastRetired to lastSubmitted, free items in queue's fence list
map<uint64_t, MT_FENCE_INFO*>::iterator it = fenceMap.begin();
map<uint64_t, MT_FENCE_INFO*>::iterator temp;
- while (it != fenceMap.end()) {
+ while (fenceMap.size() > 0 && it != fenceMap.end()) {
if ((((*it).second) != NULL) && ((*it).second)->queue == queue) {
temp = it;
++temp;
@@ -295,6 +299,8 @@
{
// Process each queue for device
// TODO: Add multiple device support
+ if (queueMap.size() <= 0)
+ return;
for (map<VkQueue, MT_QUEUE_INFO*>::iterator ii=queueMap.begin(); ii!=queueMap.end(); ++ii) {
retireQueueFences((*ii).first);
}
@@ -309,6 +315,8 @@
bool32_t result = VK_FALSE;
list<VkDeviceMemory>::iterator it;
MT_QUEUE_INFO *pQueueInfo = queueMap[queue];
+ if (pQueueInfo->pMemRefList.size() <= 0)
+ return result;
for (it = pQueueInfo->pMemRefList.begin(); it != pQueueInfo->pMemRefList.end(); ++it) {
if ((*it) == mem) {
result = VK_TRUE;
@@ -345,19 +353,21 @@
result = VK_FALSE;
} else {
// Validate that all actual references are accounted for in pMemRefs
- for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
- // Search for each memref in queues memreflist.
- if (checkMemRef(queue, *it)) {
- char str[1024];
- sprintf(str, "Found Mem Obj %p binding to CB %p for queue %p", (*it), pCmdBuffers[i], queue);
- layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_NONE, "MEM", str);
- }
- else {
- char str[1024];
- sprintf(str, "Queue %p Memory reference list for Command Buffer %p is missing ref to mem obj %p",
- queue, pCmdBuffers[i], (*it));
- layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_INVALID_MEM_REF, "MEM", str);
- result = VK_FALSE;
+ if (pCBInfo->pMemObjList.size() > 0) {
+ for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
+ // Search for each memref in queues memreflist.
+ if (checkMemRef(queue, *it)) {
+ char str[1024];
+ sprintf(str, "Found Mem Obj %p binding to CB %p for queue %p", (*it), pCmdBuffers[i], queue);
+ layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_NONE, "MEM", str);
+ }
+ else {
+ char str[1024];
+ sprintf(str, "Queue %p Memory reference list for Command Buffer %p is missing ref to mem obj %p",
+ queue, pCmdBuffers[i], (*it));
+ layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_INVALID_MEM_REF, "MEM", str);
+ result = VK_FALSE;
+ }
}
}
}
@@ -422,10 +432,12 @@
} else {
// Search for cmd buffer object in memory object's binding list
bool32_t found = VK_FALSE;
- for (list<VkCmdBuffer>::iterator it = pMemInfo->pCmdBufferBindings.begin(); it != pMemInfo->pCmdBufferBindings.end(); ++it) {
- if ((*it) == cb) {
- found = VK_TRUE;
- break;
+ if (pMemInfo->pCmdBufferBindings.size() > 0) {
+ for (list<VkCmdBuffer>::iterator it = pMemInfo->pCmdBufferBindings.begin(); it != pMemInfo->pCmdBufferBindings.end(); ++it) {
+ if ((*it) == cb) {
+ found = VK_TRUE;
+ break;
+ }
}
}
// If not present, add to list
@@ -444,10 +456,12 @@
} else {
// Search for memory object in cmd buffer's binding list
bool32_t found = VK_FALSE;
- for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
- if ((*it) == mem) {
- found = VK_TRUE;
- break;
+ if (pCBInfo->pMemObjList.size() > 0) {
+ for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
+ if ((*it) == mem) {
+ found = VK_TRUE;
+ break;
+ }
}
}
// If not present, add to list
@@ -491,8 +505,10 @@
deleteFenceInfo(pCBInfo->fenceId);
}
- for (list<VkDeviceMemory>::iterator it=pCBInfo->pMemObjList.begin(); it!=pCBInfo->pMemObjList.end(); ++it) {
- clearCBBinding(cb, (*it));
+ if (pCBInfo->pMemObjList.size() <= 0) {
+ for (list<VkDeviceMemory>::iterator it=pCBInfo->pMemObjList.begin(); it!=pCBInfo->pMemObjList.end(); ++it) {
+ clearCBBinding(cb, (*it));
+ }
}
pCBInfo->pMemObjList.clear();
}
@@ -523,6 +539,8 @@
void)
{
bool32_t result = VK_TRUE;
+ if (cbMap.size() <= 0)
+ return result;
for (map<VkCmdBuffer, MT_CB_INFO*>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
freeCBBindings((*ii).first);
delete (*ii).second;
@@ -544,7 +562,7 @@
layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, pMemObjInfo->mem, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
}
- if (cmdBufRefCount > 0) {
+ if (cmdBufRefCount > 0 && pMemObjInfo->pCmdBufferBindings.size() > 0) {
for (list<VkCmdBuffer>::const_iterator it = pMemObjInfo->pCmdBufferBindings.begin(); it != pMemObjInfo->pCmdBufferBindings.end(); ++it) {
char str[1024];
sprintf(str, "Command Buffer %p still has a reference to mem obj %p", (*it), pMemObjInfo->mem);
@@ -554,7 +572,7 @@
pMemObjInfo->pCmdBufferBindings.clear();
}
- if (objRefCount > 0) {
+ if (objRefCount > 0 && pMemObjInfo->pObjBindings.size() > 0) {
for (list<VkObject>::const_iterator it = pMemObjInfo->pObjBindings.begin(); it != pMemObjInfo->pObjBindings.end(); ++it) {
char str[1024];
sprintf(str, "VK Object %p still has a reference to mem obj %p", (*it), pMemObjInfo->mem);
@@ -629,7 +647,7 @@
list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin();
list<VkCmdBuffer>::iterator temp;
- while (it != pInfo->pCmdBufferBindings.end()) {
+ while (pInfo->pCmdBufferBindings.size() > 0 && it != pInfo->pCmdBufferBindings.end()) {
if (VK_TRUE == checkCBCompleted(*it)) {
temp = it;
++temp;
@@ -672,7 +690,7 @@
"unneccessary to call bind/unbindObjectMemory on them.", object);
layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", str);
} else {
- if (!pObjInfo->pMemObjInfo) {
+ if (!pObjInfo->pMemObjInfo || pObjInfo->pMemObjInfo->pObjBindings.size() <= 0) {
char str[1024];
sprintf(str, "Attempting to clear mem binding on obj %p but it has no binding.", (void*)object);
layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEM_OBJ_CLEAR_EMPTY_BINDINGS, "MEM", str);
@@ -724,7 +742,7 @@
}
// non-null case so should have real mem obj
MT_MEM_OBJ_INFO* pInfo = getMemObjInfo(mem);
- if (!pInfo) {
+ if (!pInfo || pInfo->pObjBindings.size() <=0) {
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);
} else {
@@ -769,6 +787,8 @@
char str[1024];
sprintf(str, "Details of Object list of size %lu elements", objectMap.size());
layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
+ if (objectMap.size() <= 0)
+ return;
for (map<VkObject, MT_OBJ_INFO*>::iterator ii=objectMap.begin(); ii!=objectMap.end(); ++ii) {
pInfo = (*ii).second;
sprintf(str, " ObjInfo %p has object %p, pMemObjInfo %p", pInfo, pInfo->object, pInfo->pMemObjInfo);
@@ -812,6 +832,9 @@
sprintf(str, "MEM INFO : Details of Memory Object list of size %lu elements", memObjMap.size());
layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
+ if (memObjMap.size() <= 0)
+ return;
+
for (map<VkDeviceMemory, MT_MEM_OBJ_INFO*>::iterator ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
pInfo = (*ii).second;
@@ -832,16 +855,21 @@
sprintf(str, " VK OBJECT Binding list of size %lu elements:", pInfo->pObjBindings.size());
layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
- for (list<VkObject>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
- sprintf(str, " VK OBJECT %p", (*it));
- layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
+ if (pInfo->pObjBindings.size() > 0) {
+ for (list<VkObject>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
+ sprintf(str, " VK OBJECT %p", (*it));
+ layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
+ }
}
sprintf(str, " VK Command Buffer (CB) binding list of size %lu elements", pInfo->pCmdBufferBindings.size());
layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
- for (list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin(); it != pInfo->pCmdBufferBindings.end(); ++it) {
- sprintf(str, " VK CB %p", (*it));
- layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
+ if (pInfo->pCmdBufferBindings.size() > 0)
+ {
+ for (list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin(); it != pInfo->pCmdBufferBindings.end(); ++it) {
+ sprintf(str, " VK CB %p", (*it));
+ layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
+ }
}
}
}
@@ -854,6 +882,9 @@
sprintf(str, "Details of CB list of size %lu elements", cbMap.size());
layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
+ if (cbMap.size() <= 0)
+ return;
+
for (map<VkCmdBuffer, MT_CB_INFO*>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
pCBInfo = (*ii).second;
@@ -862,6 +893,8 @@
(void*)getFenceFromId(pCBInfo->fenceId));
layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
+ if (pCBInfo->pMemObjList.size() <= 0)
+ continue;
for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
sprintf(str, " Mem obj %p", (*it));
layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
@@ -937,13 +970,15 @@
}
// Report any memory leaks
MT_MEM_OBJ_INFO* pInfo = NULL;
- for (map<VkDeviceMemory, MT_MEM_OBJ_INFO*>::iterator ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
- pInfo = (*ii).second;
+ if (memObjMap.size() > 0) {
+ for (map<VkDeviceMemory, MT_MEM_OBJ_INFO*>::iterator ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
+ pInfo = (*ii).second;
- if (pInfo->allocInfo.allocationSize != 0) {
- sprintf(str, "Mem Object %p has not been freed. You should clean up this memory by calling "
+ if (pInfo->allocInfo.allocationSize != 0) {
+ sprintf(str, "Mem Object %p has not been freed. You should clean up this memory by calling "
"vkFreeMemory(%p) prior to vkDestroyDevice().", pInfo->mem, pInfo->mem);
- layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, pInfo->mem, 0, MEMTRACK_MEMORY_LEAK, "MEM", str);
+ layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, pInfo->mem, 0, MEMTRACK_MEMORY_LEAK, "MEM", str);
+ }
}
}
@@ -1100,12 +1135,14 @@
sprintf(str, "Unknown Queue %p", queue);
layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_INVALID_QUEUE, "MEM", str);
} else {
- for (uint32_t i = 0; i < count; i++) {
- for (list<VkDeviceMemory>::iterator it = pQueueInfo->pMemRefList.begin(); it != pQueueInfo->pMemRefList.end();) {
- if ((*it) == pMems[i]) {
- it = pQueueInfo->pMemRefList.erase(it);
- } else {
- ++it;
+ for (int i = 0; i < count; i++) {
+ if (pQueueInfo->pMemRefList.size() > 0) {
+ for (list<VkDeviceMemory>::iterator it = pQueueInfo->pMemRefList.begin(); it != pQueueInfo->pMemRefList.end();) {
+ if ((*it) == pMems[i]) {
+ it = pQueueInfo->pMemRefList.erase(it);
+ } else {
+ ++it;
+ }
}
}
}
@@ -2269,14 +2306,16 @@
if (swapChainMap.find(swapChain) != swapChainMap.end()) {
MT_SWAP_CHAIN_INFO* pInfo = swapChainMap[swapChain];
- for (std::vector<VkSwapChainImageInfoWSI>::const_iterator it = pInfo->images.begin();
- it != pInfo->images.end(); it++) {
- clearObjectBinding(it->image);
- freeMemObjInfo(it->memory, true);
+ if (pInfo->images.size() > 0) {
+ for (std::vector<VkSwapChainImageInfoWSI>::const_iterator it = pInfo->images.begin();
+ it != pInfo->images.end(); it++) {
+ clearObjectBinding(it->image);
+ freeMemObjInfo(it->memory, true);
- MT_OBJ_INFO* pDelInfo = objectMap[it->image];
- delete pDelInfo;
- objectMap.erase(it->image);
+ MT_OBJ_INFO* pDelInfo = objectMap[it->image];
+ delete pDelInfo;
+ objectMap.erase(it->image);
+ }
}
delete pInfo;
@@ -2304,15 +2343,17 @@
pInfo->images.resize(count);
memcpy(&pInfo->images[0], pData, sizeof(pInfo->images[0]) * count);
- for (std::vector<VkSwapChainImageInfoWSI>::const_iterator it = pInfo->images.begin();
- it != pInfo->images.end(); it++) {
- // Add image object, then insert the new Mem Object and then bind it to created image
- addObjectInfo(it->image, VK_STRUCTURE_TYPE_MAX_ENUM, &pInfo->createInfo, sizeof(pInfo->createInfo), "persistent_image");
- addMemObjInfo(it->memory, NULL);
- if (VK_FALSE == updateObjectBinding(it->image, it->memory)) {
- char str[1024];
- sprintf(str, "In vkGetSwapChainInfoWSI(), unable to set image %p binding to mem obj %p", (void*)it->image, (void*)it->memory);
- layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, it->image, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
+ if (pInfo->images.size() > 0) {
+ for (std::vector<VkSwapChainImageInfoWSI>::const_iterator it = pInfo->images.begin();
+ it != pInfo->images.end(); it++) {
+ // Add image object, then insert the new Mem Object and then bind it to created image
+ addObjectInfo(it->image, VK_STRUCTURE_TYPE_MAX_ENUM, &pInfo->createInfo, sizeof(pInfo->createInfo), "persistent_image");
+ addMemObjInfo(it->memory, NULL);
+ if (VK_FALSE == updateObjectBinding(it->image, it->memory)) {
+ char str[1024];
+ sprintf(str, "In vkGetSwapChainInfoWSI(), unable to set image %p binding to mem obj %p", (void*)it->image, (void*)it->memory);
+ layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, it->image, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
+ }
}
}
} else {