layers: Fix Memtracker fence-related memory leak
MemTracker created internal fence objects to locally track command buffer
completion, but these objects were never destroyed.
diff --git a/layers/mem_tracker.c b/layers/mem_tracker.c
index 44e6e27..aaf30df 100644
--- a/layers/mem_tracker.c
+++ b/layers/mem_tracker.c
@@ -120,7 +120,7 @@
return pTrav;
}
// Set fence for given cb in global cb node
-static bool32_t setCBFence(const XGL_CMD_BUFFER cb, const XGL_FENCE fence)
+static bool32_t setCBFence(const XGL_CMD_BUFFER cb, const XGL_FENCE fence, bool32_t localFlag)
{
GLOBAL_CB_NODE* pTrav = getGlobalCBNode(cb);
if (!pTrav) {
@@ -130,6 +130,7 @@
return XGL_FALSE;
}
pTrav->fence = fence;
+ pTrav->localFlag = localFlag;
return XGL_TRUE;
}
@@ -284,6 +285,11 @@
layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
return XGL_FALSE;
}
+ if ((pCBTrav->fence != NULL) && (pCBTrav->localFlag == XGL_TRUE)) {
+ nextTable.DestroyObject(pCBTrav->fence);
+ pCBTrav->fence = NULL;
+ pCBTrav->localFlag = XGL_FALSE;
+ }
MINI_NODE* pMemTrav = pCBTrav->pMemObjList;
MINI_NODE* pDeleteMe = NULL;
// We traverse LL in order and free nodes as they're cleared
@@ -853,10 +859,12 @@
XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, uint32_t cmdBufferCount, const XGL_CMD_BUFFER* pCmdBuffers, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs, XGL_FENCE fence)
{
+ bool32_t localFlag = XGL_FALSE;
// TODO : Need to track fence and clear mem references when fence clears
XGL_FENCE localFence = fence;
if (XGL_NULL_HANDLE == fence) { // allocate our own fence to track cmd buffer
localFence = createLocalFence();
+ localFlag = XGL_TRUE;
}
char str[1024];
sprintf(str, "In xglQueueSubmit(), checking %u cmdBuffers with %u memRefs", cmdBufferCount, memRefCount);
@@ -864,7 +872,7 @@
printMemList();
printGlobalCB();
for (uint32_t i = 0; i < cmdBufferCount; i++) {
- setCBFence(pCmdBuffers[i], localFence);
+ setCBFence(pCmdBuffers[i], localFence, localFlag);
sprintf(str, "Verifying mem refs for CB %p", pCmdBuffers[i]);
layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_NONE, "MEM", str);
if (XGL_FALSE == validateCBMemRef(pCmdBuffers[i], memRefCount, pMemRefs)) {
diff --git a/layers/mem_tracker.h b/layers/mem_tracker.h
index 5e26147..930d972 100644
--- a/layers/mem_tracker.h
+++ b/layers/mem_tracker.h
@@ -149,5 +149,6 @@
uint32_t colorAttachmentCount;
XGL_DEPTH_STENCIL_BIND_INFO dsBindInfo;
XGL_CMD_BUFFER cmdBuffer;
- XGL_FENCE fence; // fence tracking this cmd buffer
+ XGL_FENCE fence; // fence tracking this cmd buffer
+ bool32_t localFlag; // fence is internal to layer
} GLOBAL_CB_NODE;