aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobin Ehlis <tobin@lunarg.com>2014-11-25 14:47:20 -0700
committerCourtney Goeltzenleuchter <courtney@LunarG.com>2014-11-26 10:03:12 -0700
commit3f02aeb3d93ee8a10188ea07bb2ab35f00d80be9 (patch)
tree6c5e690002ed6dcd285d80badc3331ee05e97cc7
parentb79a1339b2f266ae57c5e9dcc1a6590d9d664f90 (diff)
downloadusermoji-3f02aeb3d93ee8a10188ea07bb2ab35f00d80be9.tar.xz
layers: Fix bug in CmdBuffer free for MemTracker layer
-rw-r--r--layers/mem_tracker.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/layers/mem_tracker.c b/layers/mem_tracker.c
index 0f31cb69..19766f53 100644
--- a/layers/mem_tracker.c
+++ b/layers/mem_tracker.c
@@ -254,6 +254,7 @@ static XGL_BOOL validateCBMemRef(const XGL_CMD_BUFFER cb, XGL_UINT memRefCount,
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 @@ static XGL_BOOL deleteGlobalCBList()
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 @@ static void printGlobalCB()
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 xglAllocMemory(XGL_DEVICE device, const XGL_M
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);