From cc98270fde030bbaa03cc020f8f0749eccd62afb Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 5 Mar 2015 12:39:33 -0600 Subject: layers: Improve PresentableImage memory handling in mem/objecttracker Add handling to eliminate meaningless error reporting for the xglWsiX11CreatePresentableImage memory resources. --- layers/mem_tracker.c | 2 +- layers/object_track.h | 1 + xgl-layer-generate.py | 42 ++++++++++++++++++++++++++++++------------ 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/layers/mem_tracker.c b/layers/mem_tracker.c index 758dc391..e3088b47 100644 --- a/layers/mem_tracker.c +++ b/layers/mem_tracker.c @@ -453,7 +453,7 @@ static bool32_t freeMemNode(XGL_GPU_MEMORY mem) if (pTrav->allocInfo.allocationSize == 0) { char str[1024]; sprintf(str, "Attempting to free memory associated with a Presentable Image, %p, this should not be explicitly freed\n", (void*)mem); - layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str); + layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str); result = XGL_FALSE; } else { // Clear any CB bindings for completed CBs diff --git a/layers/object_track.h b/layers/object_track.h index 0ab7d448..9c224c5e 100644 --- a/layers/object_track.h +++ b/layers/object_track.h @@ -87,6 +87,7 @@ typedef enum _XGL_OBJECT_TYPE XGL_OBJECT_TYPE_DYNAMIC_RS_STATE_OBJECT, XGL_OBJECT_TYPE_FENCE, XGL_OBJECT_TYPE_CMD_BUFFER, + XGL_OBJECT_TYPE_PRESENTABLE_IMAGE_MEMORY, XGL_OBJECT_TYPE_UNKNOWN, XGL_NUM_OBJECT_TYPE, diff --git a/xgl-layer-generate.py b/xgl-layer-generate.py index b3463146..01aafb6b 100755 --- a/xgl-layer-generate.py +++ b/xgl-layer-generate.py @@ -652,6 +652,8 @@ class Subcommand(object): elif 'CreatePresentableImage' in proto.name: create_line = ' loader_platform_thread_lock_mutex(&objLock);\n' create_line += ' ll_insert_obj((void*)*%s, %s);\n' % (proto.params[-2].name, obj_type_mapping[proto.params[-2].ty.strip('*').strip('const ')]) + create_line += ' ll_insert_obj((void*)*pMem, XGL_OBJECT_TYPE_PRESENTABLE_IMAGE_MEMORY);\n' + # create_line += ' ll_insert_obj((void*)*%s, XGL_OBJECT_TYPE_PRESENTABLE_IMAGE_MEMORY);\n' % (obj_type_mapping[proto.params[-1].ty.strip('*').strip('const ')]) create_line += ' loader_platform_thread_unlock_mutex(&objLock);\n' elif 'Create' in proto.name or 'Alloc' in proto.name: create_line = ' loader_platform_thread_lock_mutex(&objLock);\n' @@ -670,10 +672,17 @@ class Subcommand(object): using_line = '' if 'DestroyDevice' in proto.name: destroy_line += ' // Report any remaining objects in LL\n objNode *pTrav = pGlobalHead;\n while (pTrav) {\n' - destroy_line += ' char str[1024];\n' - destroy_line += ' sprintf(str, "OBJ ERROR : %s object %p has not been destroyed (was used %lu times).", string_XGL_OBJECT_TYPE(pTrav->obj.objType), pTrav->obj.pObj, pTrav->obj.numUses);\n' - destroy_line += ' layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, device, 0, OBJTRACK_OBJECT_LEAK, "OBJTRACK", str);\n' - destroy_line += ' pTrav = pTrav->pNextGlobal;\n }\n' + destroy_line += ' if (pTrav->obj.objType == XGL_OBJECT_TYPE_PRESENTABLE_IMAGE_MEMORY) {\n' + destroy_line += ' objNode *pDel = pTrav;\n' + destroy_line += ' pTrav = pTrav->pNextGlobal;\n' + destroy_line += ' ll_destroy_obj((void*)(pDel->obj.pObj));\n' + destroy_line += ' } else {\n' + destroy_line += ' char str[1024];\n' + destroy_line += ' sprintf(str, "OBJ ERROR : %s object %p has not been destroyed (was used %lu times).", string_XGL_OBJECT_TYPE(pTrav->obj.objType), pTrav->obj.pObj, pTrav->obj.numUses);\n' + destroy_line += ' layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, device, 0, OBJTRACK_OBJECT_LEAK, "OBJTRACK", str);\n' + destroy_line += ' pTrav = pTrav->pNextGlobal;\n' + destroy_line += ' }\n' + destroy_line += ' }\n' ret_val = '' stmt = '' if proto.ret != "void": @@ -1404,7 +1413,7 @@ class ObjectTrackerSubcommand(Subcommand): header_txt.append('}') header_txt.append('') header_txt.append('// Check object status for selected flag state') - header_txt.append('static void validate_status(void* pObj, XGL_OBJECT_TYPE objType, OBJECT_STATUS status_mask, OBJECT_STATUS status_flag, XGL_DBG_MSG_TYPE error_level, OBJECT_TRACK_ERROR error_code, char* fail_msg) {') + header_txt.append('static bool32_t validate_status(void* pObj, XGL_OBJECT_TYPE objType, OBJECT_STATUS status_mask, OBJECT_STATUS status_flag, XGL_DBG_MSG_TYPE error_level, OBJECT_TRACK_ERROR error_code, char* fail_msg) {') header_txt.append(' objNode *pTrav = pObjectHead[objType];') header_txt.append(' while (pTrav) {') header_txt.append(' if (pTrav->obj.pObj == pObj) {') @@ -1412,15 +1421,19 @@ class ObjectTrackerSubcommand(Subcommand): header_txt.append(' char str[1024];') header_txt.append(' sprintf(str, "OBJECT VALIDATION WARNING: %s object %p: %s", string_XGL_OBJECT_TYPE(objType), (void*)pObj, fail_msg);') header_txt.append(' layerCbMsg(error_level, XGL_VALIDATION_LEVEL_0, pObj, 0, error_code, "OBJTRACK", str);') + header_txt.append(' return XGL_FALSE;') header_txt.append(' }') - header_txt.append(' return;') + header_txt.append(' return XGL_TRUE;') header_txt.append(' }') header_txt.append(' pTrav = pTrav->pNextObj;') header_txt.append(' }') - header_txt.append(' // If we do not find it print an error') - header_txt.append(' char str[1024];') - header_txt.append(' sprintf(str, "Unable to obtain status for non-existent object %p of %s type", pObj, string_XGL_OBJECT_TYPE(objType));') - header_txt.append(' layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pObj, 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK", str);') + header_txt.append(' if (objType != XGL_OBJECT_TYPE_PRESENTABLE_IMAGE_MEMORY) {') + header_txt.append(' // If we do not find it print an error') + header_txt.append(' char str[1024];') + header_txt.append(' sprintf(str, "Unable to obtain status for non-existent object %p of %s type", pObj, string_XGL_OBJECT_TYPE(objType));') + header_txt.append(' layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pObj, 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK", str);') + header_txt.append(' }') + header_txt.append(' return XGL_FALSE;') header_txt.append('}') header_txt.append('') header_txt.append('static void validate_draw_state_flags(void* pObj) {') @@ -1433,8 +1446,13 @@ class ObjectTrackerSubcommand(Subcommand): header_txt.append('static void validate_memory_mapping_status(const XGL_MEMORY_REF* pMemRefs, uint32_t numRefs) {') header_txt.append(' uint32_t i;') header_txt.append(' for (i = 0; i < numRefs; i++) {') - header_txt.append(' if(pMemRefs[i].mem)') - header_txt.append(' validate_status((void *)pMemRefs[i].mem, XGL_OBJECT_TYPE_GPU_MEMORY, OBJSTATUS_GPU_MEM_MAPPED, OBJSTATUS_NONE, XGL_DBG_MSG_ERROR, OBJTRACK_GPU_MEM_MAPPED, "A Mapped Memory Object was referenced in a command buffer");') + header_txt.append(' if(pMemRefs[i].mem) {') + header_txt.append(' // If mem reference is in presentable image memory list, skip the check of the GPU_MEMORY list') + header_txt.append(' if (!validate_status((void *)pMemRefs[i].mem, XGL_OBJECT_TYPE_PRESENTABLE_IMAGE_MEMORY, OBJSTATUS_NONE, OBJSTATUS_NONE, XGL_DBG_MSG_UNKNOWN, OBJTRACK_NONE, NULL) == XGL_TRUE)') + header_txt.append(' {') + header_txt.append(' validate_status((void *)pMemRefs[i].mem, XGL_OBJECT_TYPE_GPU_MEMORY, OBJSTATUS_GPU_MEM_MAPPED, OBJSTATUS_NONE, XGL_DBG_MSG_ERROR, OBJTRACK_GPU_MEM_MAPPED, "A Mapped Memory Object was referenced in a command buffer");') + header_txt.append(' }') + header_txt.append(' }') header_txt.append(' }') header_txt.append('}') header_txt.append('') -- cgit v1.2.3