From 9b01eceb4dc5f21c68d83dbe797e6561c0c5125e Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Wed, 25 Feb 2015 18:11:05 -0600 Subject: [PATCH] layers: Fix Memtracker fence-related memory leak MemTracker created internal fence objects to locally track command buffer completion, but these objects were never destroyed. --- layers/mem_tracker.c | 12 ++++++++++-- layers/mem_tracker.h | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) 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 @@ static GLOBAL_CB_NODE* getGlobalCBNode(const XGL_CMD_BUFFER cb) 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 @@ static bool32_t setCBFence(const XGL_CMD_BUFFER cb, const XGL_FENCE fence) return XGL_FALSE; } pTrav->fence = fence; + pTrav->localFlag = localFlag; return XGL_TRUE; } @@ -284,6 +285,11 @@ static bool32_t freeCBBindings(const XGL_CMD_BUFFER cb) 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 xglGetDeviceQueue(XGL_DEVICE device, XGL_QUEU 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 @@ XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, uint32_t cmdB 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 @@ typedef struct _GLOBAL_CB_NODE { 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; -- 2.7.4