layers: Improve PresentableImage memory handling in mem/objecttracker

Add handling to eliminate meaningless error reporting for the
xglWsiX11CreatePresentableImage memory resources.
diff --git a/layers/mem_tracker.c b/layers/mem_tracker.c
index 758dc39..e3088b4 100644
--- a/layers/mem_tracker.c
+++ b/layers/mem_tracker.c
@@ -453,7 +453,7 @@
         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 0ab7d44..9c224c5 100644
--- a/layers/object_track.h
+++ b/layers/object_track.h
@@ -87,6 +87,7 @@
     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 b346314..01aafb6 100755
--- a/xgl-layer-generate.py
+++ b/xgl-layer-generate.py
@@ -652,6 +652,8 @@
                     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 @@
                             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 @@
         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 @@
         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 @@
         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('')