aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2015-02-25 18:11:05 -0600
committerMark Lobodzinski <mark@lunarg.com>2015-02-25 20:22:06 -0600
commit9b01eceb4dc5f21c68d83dbe797e6561c0c5125e (patch)
tree1f67ebcae269e00f93327c9b7699f4f3ca3777b4
parentc88216fef874eb08a085265184826c6809da40ff (diff)
downloadusermoji-9b01eceb4dc5f21c68d83dbe797e6561c0c5125e.tar.xz
layers: Fix Memtracker fence-related memory leak
MemTracker created internal fence objects to locally track command buffer completion, but these objects were never destroyed.
-rw-r--r--layers/mem_tracker.c12
-rw-r--r--layers/mem_tracker.h3
2 files changed, 12 insertions, 3 deletions
diff --git a/layers/mem_tracker.c b/layers/mem_tracker.c
index 44e6e27d..aaf30df7 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 5e261477..930d9721 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;