From 8c30df14b10c55bb1d4f6a5518c8bc786de3bea0 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 26 Feb 2015 18:33:10 -0600 Subject: layers: Fix MemTracker memory leak Call to string helper function was not freeing returned memory. --- layers/mem_tracker.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/layers/mem_tracker.c b/layers/mem_tracker.c index df2cdd73..a0903cd9 100644 --- a/layers/mem_tracker.c +++ b/layers/mem_tracker.c @@ -655,11 +655,15 @@ static void printMemList() layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str); sprintf(str, " pNext Mem Obj Node: %p", (void*)pTrav->pNextGlobalNode); layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str); - if (0 != pTrav->allocInfo.allocationSize) - sprintf(str, " Mem Alloc info:\n%s", xgl_print_xgl_memory_alloc_info(&pTrav->allocInfo, "{MEM}INFO : ")); - else + if (0 != pTrav->allocInfo.allocationSize) { + char* pAllocInfoMsg = xgl_print_xgl_memory_alloc_info(&pTrav->allocInfo, "{MEM}INFO : "); + sprintf(str, " Mem Alloc info:\n%s", pAllocInfoMsg); + layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str); + free(pAllocInfoMsg); + } else { sprintf(str, " Mem Alloc info is NULL (alloc done by xglWsiX11CreatePresentableImage())"); - layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str); + layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str); + } MINI_NODE* pObjTrav = pTrav->pObjBindings; if (!pObjTrav) { sprintf(str, " No XGL Object bindings"); -- cgit v1.2.3 From f060f5de540f79c39252bc9acb315b09be1f4cd5 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 26 Feb 2015 18:42:09 -0600 Subject: layers: Remove spurious assert. This was unnecessarily crashing the valve tests. --- layers/mem_tracker.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/mem_tracker.c b/layers/mem_tracker.c index a0903cd9..58b4748a 100644 --- a/layers/mem_tracker.c +++ b/layers/mem_tracker.c @@ -558,10 +558,10 @@ static bool32_t updateObjectBinding(XGL_OBJECT object, XGL_GPU_MEMORY mem) } char str[1024]; GLOBAL_OBJECT_NODE* pGlobalObjTrav = getGlobalObjectNode(object); - assert(pGlobalObjTrav); if (!pGlobalObjTrav) { sprintf(str, "Attempting to update Binding of Obj(%p) that's not in global list()", (void*)object); layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str); + return XGL_FALSE; } // non-null case so should have real mem obj GLOBAL_MEM_OBJ_NODE* pTrav = getGlobalMemNode(mem); -- cgit v1.2.3 From c3d37d82b3840da8450f3d1ffea259e1f92e5f49 Mon Sep 17 00:00:00 2001 From: Jeremy Hayes Date: Thu, 26 Feb 2015 15:59:19 -0700 Subject: glave: Add command buffer diagram. --- glave-generate.py | 11 +++++++---- layers/draw_state.h | 2 ++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/glave-generate.py b/glave-generate.py index bb99ea08..e16175df 100755 --- a/glave-generate.py +++ b/glave-generate.py @@ -1945,6 +1945,7 @@ class Subcommand(object): rc_body.append('private:') rc_body.append(' struct xglFuncs m_xglFuncs;') rc_body.append(' DRAW_STATE_DUMP_DOT_FILE m_pDSDump;') + rc_body.append(' DRAW_STATE_DUMP_COMMAND_BUFFER_DOT_FILE m_pCBDump;') rc_body.append(' xglDisplay *m_display;') rc_body.append(' struct shaderPair {') rc_body.append(' XGL_SHADER *addr;') @@ -2419,12 +2420,13 @@ class Subcommand(object): rvf_body.append('}') rvf_body.append('int xglReplay::dump_validation_data()') rvf_body.append('{') - rvf_body.append(' if (m_pDSDump)') + rvf_body.append(' if (!m_pDSDump || !m_pCBDump)') rvf_body.append(' {') - rvf_body.append(' m_pDSDump((char *) "pipeline_dump.dot");') - rvf_body.append(' return 0;') + rvf_body.append(' return -1;') rvf_body.append(' }') - rvf_body.append(' return -1;') + rvf_body.append(' m_pDSDump((char *) "pipeline_dump.dot");') + rvf_body.append(' m_pCBDump((char *) "cb_dump.dot");') + rvf_body.append(' return 0;') rvf_body.append('}') return "\n".join(rvf_body) @@ -2607,6 +2609,7 @@ class Subcommand(object): cd_body.append(' if (xglDbgRegisterMsgCallback(g_fpDbgMsgCallback, NULL) != XGL_SUCCESS)') cd_body.append(' glv_LogError("Failed to register xgl callback for replayer error handling\\n");') cd_body.append(' m_pDSDump = (DRAW_STATE_DUMP_DOT_FILE) m_xglFuncs.real_xglGetProcAddr(remap(pPacket->gpu), "drawStateDumpDotFile");') + cd_body.append(' m_pCBDump = (DRAW_STATE_DUMP_COMMAND_BUFFER_DOT_FILE) m_xglFuncs.real_xglGetProcAddr(remap(pPacket->gpu), "drawStateDumpCommandBufferDotFile");') cd_body.append(' }') cd_body.append(' else ') cd_body.append(' replayResult = m_xglFuncs.real_xglCreateDevice(remap(pPacket->gpu), pPacket->pCreateInfo, &device);') diff --git a/layers/draw_state.h b/layers/draw_state.h index 7466e389..3fcf820e 100644 --- a/layers/draw_state.h +++ b/layers/draw_state.h @@ -220,6 +220,8 @@ typedef struct _GLOBAL_CB_NODE { //prototypes for extension functions void drawStateDumpDotFile(char* outFileName); void drawStateDumpPngFile(char* outFileName); +void drawStateDumpCommandBufferDotFile(char* outFileName); // Func ptr typedefs typedef void (*DRAW_STATE_DUMP_DOT_FILE)(char*); typedef void (*DRAW_STATE_DUMP_PNG_FILE)(char*); +typedef void (*DRAW_STATE_DUMP_COMMAND_BUFFER_DOT_FILE)(char*); -- cgit v1.2.3 From 8f19c7f45b3b4690482487fa151652ce82b287a4 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 26 Feb 2015 15:18:57 -0600 Subject: layers: Fix null pointer reference in MemTracker Copy-paste error caused segfault in Cube demo, among others. --- layers/mem_tracker.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/mem_tracker.c b/layers/mem_tracker.c index 58b4748a..0c36934a 100644 --- a/layers/mem_tracker.c +++ b/layers/mem_tracker.c @@ -365,7 +365,7 @@ static void reportMemReferences(const GLOBAL_MEM_OBJ_NODE* pMemObjTrav) if (refCount != pMemObjTrav->refCount) { char str[1024]; sprintf(str, "Refcount of %u for Mem Obj %p does't match reported refs of %u", pMemObjTrav->refCount, pMemObjTrav->mem, refCount); - layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pObjTrav->object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str); + layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pMemObjTrav->mem, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str); } } -- cgit v1.2.3