layers: Fix bug in CmdBuffer free for MemTracker layer
diff --git a/layers/mem_tracker.c b/layers/mem_tracker.c
index 0f31cb6..19766f5 100644
--- a/layers/mem_tracker.c
+++ b/layers/mem_tracker.c
@@ -254,6 +254,7 @@
layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
found = 1;
foundCount++;
+ break;
}
}
if (!found) {
@@ -419,11 +420,12 @@
XGL_BOOL result = XGL_TRUE;
GLOBAL_CB_NODE* pCBTrav = pGlobalCBHead;
while (pCBTrav) {
- XGL_BOOL tmpResult = deleteGlobalCBNode(pCBTrav->cmdBuffer);
+ XGL_CMD_BUFFER cbToDelete = pCBTrav->cmdBuffer;
+ pCBTrav = pCBTrav->pNextGlobalCBNode;
+ XGL_BOOL tmpResult = deleteGlobalCBNode(cbToDelete);
// If any result is FALSE, final result should be FALSE
if ((XGL_FALSE == tmpResult) || (XGL_FALSE == result))
result = XGL_FALSE;
- pCBTrav = pCBTrav->pNextGlobalCBNode;
}
return result;
}
@@ -774,7 +776,7 @@
sprintf(str, "Details of Global CB list w/ HEAD at %p:", (void*)pTrav);
layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
while (pTrav) {
- sprintf(str, " Global CB Node (%p) has CB %p, fence %p, and pMemObjList %p", (void*)pTrav, (void*)pTrav->cmdBuffer, (void*)pTrav->fence, (void*)pTrav->pMemObjList);
+ sprintf(str, " Global CB Node (%p) w/ pNextGlobalCBNode (%p) has CB %p, fence %p, and pMemObjList %p", (void*)pTrav, (void*)pTrav->pNextGlobalCBNode, (void*)pTrav->cmdBuffer, (void*)pTrav->fence, (void*)pTrav->pMemObjList);
layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
MINI_NODE* pMemObjTrav = pTrav->pMemObjList;
while (pMemObjTrav) {
@@ -1188,9 +1190,10 @@
XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
{
- // TODO : Pick up frees here
- // Make sure mem object is unbound from any other objects
- // Make sure mem object not referenced by any queued command buffers
+ /* From spec : A memory object is freed by calling xglFreeMemory() when it is no longer needed. Before
+ * freeing a memory object, an application must ensure the memory object is unbound from
+ * all API objects referencing it and that it is not referenced by any queued command buffers
+ */
if (XGL_FALSE == freeMemNode(mem)) {
char str[1024];
sprintf(str, "Issue while freeing mem obj %p", (void*)mem);