diff --git a/tools/glave/scripts/vk_generate.py b/tools/glave/scripts/vk_generate.py
index e9c9076..78a1cb8 100755
--- a/tools/glave/scripts/vk_generate.py
+++ b/tools/glave/scripts/vk_generate.py
@@ -179,20 +179,34 @@
         return "\n".join(func_protos)
 
 
+    def _generate_trace_real_func_ptr_protos(self):
+        func_ptr_assign = []
+        func_ptr_assign.append('')
+        for proto in self.protos:
+            if 'Dbg' not in proto.name and 'Wsi' not in proto.name:
+                func_ptr_assign.append('extern %s( XGLAPI * real_xgl%s)(' % (proto.ret, proto.name))
+                for p in proto.params:
+                    if 'color' == p.name:
+                        func_ptr_assign.append('    %s %s[4],' % (p.ty.replace('[4]', ''), p.name))
+                    else:
+                        func_ptr_assign.append('    %s %s,' % (p.ty, p.name))
+                func_ptr_assign[-1] = func_ptr_assign[-1].replace(',', ');\n')
+        return "\n".join(func_ptr_assign)
+
     def _generate_func_ptr_assignments(self):
         func_ptr_assign = []
         for proto in self.protos:
             if 'Dbg' not in proto.name and 'Wsi' not in proto.name:
-                func_ptr_assign.append('static %s( XGLAPI * real_xgl%s)(' % (proto.ret, proto.name))
+                func_ptr_assign.append('%s( XGLAPI * real_xgl%s)(' % (proto.ret, proto.name))
                 for p in proto.params:
                     if 'color' == p.name:
                         func_ptr_assign.append('    %s %s[4],' % (p.ty.replace('[4]', ''), p.name))
                     else:
                         func_ptr_assign.append('    %s %s,' % (p.ty, p.name))
                 func_ptr_assign[-1] = func_ptr_assign[-1].replace(',', ') = xgl%s;\n' % (proto.name))
-        func_ptr_assign.append('static BOOL isHooked = FALSE;\n')
         return "\n".join(func_ptr_assign)
 
+
     def _generate_func_ptr_assignments_ext(self, func_class='Wsi'):
         func_ptr_assign = []
         for proto in self.protos:
@@ -205,6 +219,8 @@
 
     def _generate_attach_hooks(self):
         hooks_txt = []
+        hooks_txt.append('// declared as extern in glvtrace_xgl_helpers.h')
+        hooks_txt.append('BOOL isHooked = FALSE;\n')
         hooks_txt.append('void AttachHooks()\n{\n   BOOL hookSuccess = TRUE;\n#if defined(WIN32)')
         hooks_txt.append('    Mhook_BeginMultiOperation(FALSE);')
         # TODO : Verify if CreateInstance is appropriate to key off of here
@@ -301,7 +317,7 @@
         init_tracer.append('    pPacket->version = XGL_API_VERSION;')
         init_tracer.append('    FINISH_TRACE_PACKET();\n}\n')
 
-        init_tracer.append('static GLV_CRITICAL_SECTION g_memInfoLock;')
+        init_tracer.append('extern GLV_CRITICAL_SECTION g_memInfoLock;')
         init_tracer.append('void InitTracer(void)\n{')
         init_tracer.append('    char *ipAddr = glv_get_global_var("GLVLIB_TRACE_IPADDR");')
         init_tracer.append('    if (ipAddr == NULL)')
@@ -314,41 +330,6 @@
         init_tracer.append('    send_xgl_api_version_packet();\n}\n')
         return "\n".join(init_tracer)
 
-    def _gen_unmap_memory(self):
-        um_body = []
-        um_body.append('GLVTRACER_EXPORT XGL_RESULT XGLAPI __HOOKED_xglUnmapMemory(')
-        um_body.append('    XGL_GPU_MEMORY mem)')
-        um_body.append('{')
-        um_body.append('    glv_trace_packet_header* pHeader;')
-        um_body.append('    XGL_RESULT result;')
-        um_body.append('    struct_xglUnmapMemory* pPacket;')
-        um_body.append('    XGLAllocInfo *entry;')
-        um_body.append('    SEND_ENTRYPOINT_PARAMS("xglUnmapMemory(mem %p)\\n", mem);')
-        um_body.append('    // insert into packet the data that was written by CPU between the xglMapMemory call and here')
-        um_body.append('    // Note must do this prior to the real xglUnMap() or else may get a FAULT')
-        um_body.append('    glv_enter_critical_section(&g_memInfoLock);')
-        um_body.append('    entry = find_mem_info_entry(mem);')
-        um_body.append('    CREATE_TRACE_PACKET(xglUnmapMemory, (entry) ? entry->size : 0);')
-        um_body.append('    pPacket = interpret_body_as_xglUnmapMemory(pHeader);')
-        um_body.append('    if (entry)')
-        um_body.append('    {')
-        um_body.append('        assert(entry->handle == mem);')
-        um_body.append('        glv_add_buffer_to_trace_packet(pHeader, (void**) &(pPacket->pData), entry->size, entry->pData);')
-        um_body.append('        glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pData));')
-        um_body.append('        entry->pData = NULL;')
-        um_body.append('    } else')
-        um_body.append('    {')
-        um_body.append('         glv_LogError("Failed to copy app memory into trace packet (idx = %u) on xglUnmapMemory\\n", pHeader->global_packet_index);')
-        um_body.append('    }')
-        um_body.append('    glv_leave_critical_section(&g_memInfoLock);')
-        um_body.append('    result = real_xglUnmapMemory(mem);')
-        um_body.append('    pPacket->mem = mem;')
-        um_body.append('    pPacket->result = result;')
-        um_body.append('    FINISH_TRACE_PACKET();')
-        um_body.append('    return result;')
-        um_body.append('}\n')
-        return "\n".join(um_body)
-
     # Take a list of params and return a list of dicts w/ ptr param details
     def _get_packet_ptr_param_list(self, params):
         ptr_param_list = []
@@ -478,9 +459,12 @@
     # return result?
     def _generate_trace_funcs(self):
         func_body = []
+        manually_written_hooked_funcs = ['CreateInstance', 'EnumerateLayers', 'EnumerateGpus',
+                                         'AllocDescriptorSets', 'MapMemory', 'UnmapMemory',
+                                         'CmdPipelineBarrier', 'CmdWaitEvents']
         for proto in self.protos:
-            if 'UnmapMemory' == proto.name:
-                func_body.append(self._gen_unmap_memory())
+            if proto.name in manually_written_hooked_funcs:
+                func_body.append( '// __HOOKED_xgl%s is manually written. Look in glvtrace_xgl_trace.c\n' % proto.name)
             elif 'Dbg' not in proto.name and 'Wsi' not in proto.name:
                 raw_packet_update_list = [] # non-ptr elements placed directly into packet
                 ptr_packet_update_list = [] # ptr elements to be updated into packet
@@ -516,51 +500,8 @@
                 func_body.append('    struct_xgl%s* pPacket = NULL;' % proto.name)
                 # functions that have non-standard sequence of  packet creation and calling real function
                 # NOTE: Anytime we call the function before CREATE_TRACE_PACKET, need to add custom code for correctly tracking API call time
-                if 'CreateInstance' == proto.name:
-                    func_body.append('    uint64_t startTime;')
-                    func_body.append('    glv_platform_thread_once(&gInitOnce, InitTracer);')
-                    func_body.append('    SEND_ENTRYPOINT_ID(xgl%s);' % proto.name)
-                    func_body.append('    if (real_xglCreateInstance == xglCreateInstance)')
-                    func_body.append('    {')
-                    func_body.append('        glv_platform_get_next_lib_sym((void **) &real_xglCreateInstance,"xglCreateInstance");')
-                    func_body.append('    }')
-                    func_body.append('    startTime = glv_get_time();')
-                    func_body.append('    %sreal_xgl%s;' % (return_txt, proto.c_call()))
-                    func_body.append('    CREATE_TRACE_PACKET(xgl%s, sizeof(XGL_INSTANCE) + get_struct_chain_size((void*)pAppInfo) + ((pAllocCb == NULL) ? 0 :sizeof(XGL_ALLOC_CALLBACKS)));' % (proto.name))
-                    func_body.append('    pHeader->entrypoint_begin_time = startTime;')
-                    func_body.append('    if (isHooked == FALSE) {')
-                    func_body.append('        AttachHooks();')
-                    func_body.append('        AttachHooks_xgldbg();')
-                    func_body.append('        AttachHooks_xglwsix11ext();')
-                    func_body.append('    }')
-                elif 'EnumerateGpus' == proto.name:
-                    func_body.append('    uint64_t startTime;')
-                    func_body.append('    SEND_ENTRYPOINT_ID(xgl%s);' % proto.name)
-                    func_body.append('    startTime = glv_get_time();')
-                    func_body.append('    %sreal_xgl%s;' % (return_txt, proto.c_call()))
-                    func_body.append('    CREATE_TRACE_PACKET(xglEnumerateGpus, sizeof(uint32_t) + ((pGpus && pGpuCount) ? *pGpuCount * sizeof(XGL_PHYSICAL_GPU) : 0));')
-                    func_body.append('    pHeader->entrypoint_begin_time = startTime;')
-                elif 'EnumerateLayers' == proto.name:
-                    func_body.append('    uint64_t startTime;')
-                    func_body.append('    SEND_ENTRYPOINT_ID(xgl%s);' % proto.name)
-                    func_body.append('    startTime = glv_get_time();')
-                    func_body.append('    %sreal_xgl%s;' % (return_txt, proto.c_call()))
-                    func_body.append('    size_t totStringSize = 0;')
-                    func_body.append('    uint32_t i = 0;')
-                    func_body.append('    for (i = 0; i < *pOutLayerCount; i++)')
-                    func_body.append('        totStringSize += (pOutLayers[i] != NULL) ? strlen(pOutLayers[i]) + 1: 0;')
-                    func_body.append('    CREATE_TRACE_PACKET(xgl%s, totStringSize + sizeof(size_t));' % (proto.name))
-                    func_body.append('    pHeader->entrypoint_begin_time = startTime;')
-                elif 'AllocDescriptorSets' == proto.name:
-                    func_body.append('    uint64_t startTime;')
-                    func_body.append('    SEND_ENTRYPOINT_ID(xgl%s);' % proto.name)
-                    func_body.append('    startTime = glv_get_time();')
-                    func_body.append('    %sreal_xgl%s;' % (return_txt, proto.c_call()))
-                    func_body.append('    size_t customSize = (*pCount <= 0) ? (sizeof(XGL_DESCRIPTOR_SET)) : (*pCount * sizeof(XGL_DESCRIPTOR_SET));')
-                    func_body.append('    CREATE_TRACE_PACKET(xglAllocDescriptorSets, sizeof(XGL_DESCRIPTOR_SET_LAYOUT) + customSize + sizeof(uint32_t));')
-                    func_body.append('    pHeader->entrypoint_begin_time = startTime;')
-                elif proto.name in ['CreateFramebuffer', 'CreateRenderPass', 'CreateDynamicViewportState', 
-                                    'CreateDescriptorRegion', 'CmdWaitEvents', 'CmdPipelineBarrier']:
+                if proto.name in ['CreateFramebuffer', 'CreateRenderPass', 'CreateDynamicViewportState',
+                                  'CreateDescriptorRegion']:
                     # these are regular case as far as sequence of tracing but have some custom size element
                     if 'CreateFramebuffer' == proto.name:
                         func_body.append('    int dsSize = (pCreateInfo != NULL && pCreateInfo->pDepthStencilAttachment != NULL) ? sizeof(XGL_DEPTH_STENCIL_BIND_INFO) : 0;')
@@ -575,15 +516,6 @@
                     elif 'CreateDescriptorRegion' == proto.name:
                         func_body.append('    uint32_t rgCount = (pCreateInfo != NULL && pCreateInfo->pTypeCount != NULL) ? pCreateInfo->count : 0;')
                         func_body.append('    CREATE_TRACE_PACKET(xglCreateDescriptorRegion,  get_struct_chain_size((void*)pCreateInfo) + sizeof(XGL_DESCRIPTOR_REGION));')
-                    else: # ['CmdWaitEvents', 'CmdPipelineBarrier']:
-                        func_body.append('    size_t customSize;')
-                        event_array_type = 'XGL_EVENT'
-                        if 'CmdPipelineBarrier' == proto.name:
-                            event_array_type = 'XGL_SET_EVENT'
-                        func_body.append('    uint32_t eventCount = (%s != NULL && %s->pEvents != NULL) ? %s->eventCount : 0;' % (proto.params[-1].name, proto.params[-1].name, proto.params[-1].name))
-                        func_body.append('    uint32_t mbCount = (%s != NULL && %s->ppMemBarriers != NULL) ? %s->memBarrierCount : 0;' % (proto.params[-1].name, proto.params[-1].name, proto.params[-1].name))
-                        func_body.append('    customSize = (eventCount * sizeof(%s)) + mbCount * sizeof(void*) + calculate_memory_barrier_size(mbCount, %s->ppMemBarriers);' % (event_array_type, proto.params[-1].name))
-                        func_body.append('    CREATE_TRACE_PACKET(xgl%s, sizeof(%s) + customSize);' % (proto.name, proto.params[-1].ty.strip('*').replace('const ', '')))
                     func_body.append('    %sreal_xgl%s;' % (return_txt, proto.c_call()))
                 else:
                     if (0 == len(packet_size)):
@@ -595,72 +527,18 @@
                     func_body.append('    _dataSize = (pDataSize == NULL || pData == NULL) ? 0 : *pDataSize;')
                 func_body.append('    pPacket = interpret_body_as_xgl%s(pHeader);' % proto.name)
                 func_body.append('\n'.join(raw_packet_update_list))
-                if 'MapMemory' == proto.name: # Custom code for MapMem case
-                    func_body.append('    if (ppData != NULL)')
-                    func_body.append('    {')
-                    func_body.append('        glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->ppData), sizeof(void*), *ppData);')
-                    func_body.append('        glv_finalize_buffer_address(pHeader, (void**)&(pPacket->ppData));')
-                    func_body.append('        add_data_to_mem_info(mem, *ppData);')
-                    func_body.append('    }')
+                for pp_dict in ptr_packet_update_list: #buff_ptr_indices:
+                    func_body.append('    %s;' % (pp_dict['add_txt']))
+                if 'void' not in proto.ret or '*' in proto.ret:
                     func_body.append('    pPacket->result = result;')
-                    func_body.append('    FINISH_TRACE_PACKET();')
-                elif 'EnumerateLayers' == proto.name: #custom code for EnumerateLayers case
-                    func_body.append('    pPacket->gpu = gpu;')
-                    func_body.append('    pPacket->maxLayerCount = maxLayerCount;')
-                    func_body.append('    pPacket->maxStringSize = maxStringSize;')
-                    func_body.append('    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pOutLayerCount), sizeof(size_t), pOutLayerCount);')
-                    func_body.append('    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pOutLayerCount));')
-                    func_body.append('    for (i = 0; i < *pOutLayerCount; i++) {')
-                    func_body.append('        glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pOutLayers[i]), ((pOutLayers[i] != NULL) ? strlen(pOutLayers[i]) + 1 : 0), pOutLayers[i]);')
-                    func_body.append('        glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pOutLayers[i]));')
-                    func_body.append('    }')
-
-                    func_body.append('    pPacket->pReserved = pReserved;')
-                    func_body.append('    pPacket->result = result;')
-                    func_body.append('    FINISH_TRACE_PACKET();')
-                else:
-                    for pp_dict in ptr_packet_update_list: #buff_ptr_indices:
-                        func_body.append('    %s;' % (pp_dict['add_txt']))
-                    # Some custom add_* and finalize_* function calls for Create* API calls
-                    if proto.name in ['CmdWaitEvents', 'CmdPipelineBarrier']:
-                        event_array_type = 'XGL_EVENT'
-                        if 'CmdPipelineBarrier' == proto.name:
-                            event_array_type = 'XGL_SET_EVENT'
-                        func_body.append('    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->%s->pEvents), eventCount * sizeof(%s), %s->pEvents);' % (proto.params[-1].name, event_array_type, proto.params[-1].name))
-                        func_body.append('    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->%s->pEvents));' % (proto.params[-1].name))
-                        func_body.append('    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->%s->ppMemBarriers), mbCount * sizeof(void*), %s->ppMemBarriers);' % (proto.params[-1].name, proto.params[-1].name))
-                        func_body.append('    uint32_t i, siz;')
-                        func_body.append('    for (i = 0; i < mbCount; i++) {')
-                        func_body.append('        XGL_MEMORY_BARRIER *pNext = (XGL_MEMORY_BARRIER *) %s->ppMemBarriers[i];' % proto.params[-1].name)
-                        func_body.append('        switch (pNext->sType) {')
-                        func_body.append('            case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:')
-                        func_body.append('                siz = sizeof(XGL_MEMORY_BARRIER);')
-                        func_body.append('                break;')
-                        func_body.append('            case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:')
-                        func_body.append('                siz = sizeof(XGL_BUFFER_MEMORY_BARRIER);')
-                        func_body.append('                break;')
-                        func_body.append('            case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:')
-                        func_body.append('                siz = sizeof(XGL_IMAGE_MEMORY_BARRIER);')
-                        func_body.append('                break;')
-                        func_body.append('            default:')
-                        func_body.append('                assert(0);')
-                        func_body.append('                siz = 0;')
-                        func_body.append('                break;')
-                        func_body.append('        }')
-                        func_body.append('        glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->%s->ppMemBarriers[i]), siz, %s->ppMemBarriers[i]);' % (proto.params[-1].name, proto.params[-1].name))
-                        func_body.append('        glv_finalize_buffer_address(pHeader, (void**)&(pPacket->%s->ppMemBarriers[i]));' % (proto.params[-1].name))
-                        func_body.append('    }')
-                        func_body.append('    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->%s->ppMemBarriers));' % (proto.params[-1].name))
-                    if 'void' not in proto.ret or '*' in proto.ret:
-                        func_body.append('    pPacket->result = result;')
-                    for pp_dict in ptr_packet_update_list:
-                        if ('DEVICE_CREATE_INFO' not in proto.params[pp_dict['index']].ty) and ('APPLICATION_INFO' not in proto.params[pp_dict['index']].ty) and ('pUpdateChain' != proto.params[pp_dict['index']].name):
-                            func_body.append('    %s;' % (pp_dict['finalize_txt']))
-                    func_body.append('    FINISH_TRACE_PACKET();')
-                    if 'AllocMemory' in proto.name:
-                        func_body.append('    add_new_handle_to_mem_info(*pMem, pAllocInfo->allocationSize, NULL);')
-                    elif 'FreeMemory' in proto.name:
-                        func_body.append('    rm_handle_from_mem_info(mem);')
+                for pp_dict in ptr_packet_update_list:
+                    if ('DEVICE_CREATE_INFO' not in proto.params[pp_dict['index']].ty) and ('APPLICATION_INFO' not in proto.params[pp_dict['index']].ty) and ('pUpdateChain' != proto.params[pp_dict['index']].name):
+                        func_body.append('    %s;' % (pp_dict['finalize_txt']))
+                func_body.append('    FINISH_TRACE_PACKET();')
+                if 'AllocMemory' in proto.name:
+                    func_body.append('    add_new_handle_to_mem_info(*pMem, pAllocInfo->allocationSize, NULL);')
+                elif 'FreeMemory' in proto.name:
+                    func_body.append('    rm_handle_from_mem_info(mem);')
                 if 'void' not in proto.ret or '*' in proto.ret:
                     func_body.append('    return result;')
                 func_body.append('}\n')
@@ -734,471 +612,6 @@
                 func_body.append('}\n')
         return "\n".join(func_body)
 
-    def _generate_helper_funcs(self):
-        hf_body = []
-        hf_body.append('// Support for shadowing CPU mapped memory')
-        hf_body.append('typedef struct _XGLAllocInfo {')
-        hf_body.append('    XGL_GPU_SIZE   size;')
-        hf_body.append('    XGL_GPU_MEMORY handle;')
-        hf_body.append('    void           *pData;')
-        hf_body.append('    BOOL           valid;')
-        hf_body.append('} XGLAllocInfo;')
-        hf_body.append('typedef struct _XGLMemInfo {')
-        hf_body.append('    unsigned int numEntrys;')
-        hf_body.append('    XGLAllocInfo *pEntrys;')
-        hf_body.append('    XGLAllocInfo *pLastMapped;')
-        hf_body.append('    unsigned int capacity;')
-        hf_body.append('} XGLMemInfo;')
-        hf_body.append('')
-        hf_body.append('static XGLMemInfo g_memInfo = {0, NULL, NULL, 0};')
-        hf_body.append('')
-        hf_body.append('static void init_mem_info_entrys(XGLAllocInfo *ptr, const unsigned int num)')
-        hf_body.append('{')
-        hf_body.append('    unsigned int i;')
-        hf_body.append('    for (i = 0; i < num; i++)')
-        hf_body.append('    {')
-        hf_body.append('        XGLAllocInfo *entry = ptr + i;')
-        hf_body.append('        entry->pData = NULL;')
-        hf_body.append('        entry->size  = 0;')
-        hf_body.append('        entry->handle = NULL;')
-        hf_body.append('        entry->valid = FALSE;')
-        hf_body.append('    }')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('// caller must hold the g_memInfoLock')
-        hf_body.append('static void init_mem_info()')
-        hf_body.append('{')
-        hf_body.append('    g_memInfo.numEntrys = 0;')
-        hf_body.append('    g_memInfo.capacity = 4096;')
-        hf_body.append('    g_memInfo.pLastMapped = NULL;')
-        hf_body.append('')
-        hf_body.append('    g_memInfo.pEntrys = GLV_NEW_ARRAY(XGLAllocInfo, g_memInfo.capacity);')
-        hf_body.append('')
-        hf_body.append('    if (g_memInfo.pEntrys == NULL)')
-        hf_body.append('        glv_LogError("init_mem_info()  malloc failed\\n");')
-        hf_body.append('    else')
-        hf_body.append('        init_mem_info_entrys(g_memInfo.pEntrys, g_memInfo.capacity);')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('// caller must hold the g_memInfoLock')
-        hf_body.append('static void delete_mem_info()')
-        hf_body.append('{')
-        hf_body.append('    GLV_DELETE(g_memInfo.pEntrys);')
-        hf_body.append('    g_memInfo.pEntrys = NULL;')
-        hf_body.append('    g_memInfo.numEntrys = 0;')
-        hf_body.append('    g_memInfo.capacity = 0;')
-        hf_body.append('    g_memInfo.pLastMapped = NULL;')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('// caller must hold the g_memInfoLock')
-        hf_body.append('static XGLAllocInfo * get_mem_info_entry()')
-        hf_body.append('{')
-        hf_body.append('    unsigned int i;')
-        hf_body.append('    XGLAllocInfo *entry;')
-        hf_body.append('    if (g_memInfo.numEntrys > g_memInfo.capacity)')
-        hf_body.append('    {')
-        hf_body.append('        glv_LogError("get_mem_info_entry() bad internal state numEntrys %u\\n", g_memInfo.numEntrys);')
-        hf_body.append('        return NULL;')
-        hf_body.append('    }')
-        hf_body.append('')
-        hf_body.append('    entry = g_memInfo.pEntrys;')
-        hf_body.append('    for (i = 0; i < g_memInfo.numEntrys; i++)')
-        hf_body.append('    {')
-        hf_body.append('        if ((entry + i)->valid == FALSE)')
-        hf_body.append('            return entry + i;')
-        hf_body.append('    }')
-        hf_body.append('    if (g_memInfo.numEntrys == g_memInfo.capacity)')
-        hf_body.append('    {  // grow the array 2x')
-        hf_body.append('        g_memInfo.capacity *= 2;')
-        hf_body.append('        g_memInfo.pEntrys = (XGLAllocInfo *) GLV_REALLOC(g_memInfo.pEntrys, g_memInfo.capacity * sizeof(XGLAllocInfo));')
-        hf_body.append('        if (g_memInfo.pEntrys == NULL)')
-        hf_body.append('            glv_LogError("get_mem_info_entry() realloc failed\\n");')
-        hf_body.append('        //glv_LogInfo("realloc memInfo from %u to %u\\n", g_memInfo.capacity /2, g_memInfo.capacity);')
-        hf_body.append('        //init the newly added entrys')
-        hf_body.append('        init_mem_info_entrys(g_memInfo.pEntrys + g_memInfo.capacity / 2, g_memInfo.capacity / 2);')
-        hf_body.append('    }')
-        hf_body.append('')
-        hf_body.append('    assert(g_memInfo.numEntrys < g_memInfo.capacity);')
-        hf_body.append('    entry = g_memInfo.pEntrys + g_memInfo.numEntrys;')
-        hf_body.append('    g_memInfo.numEntrys++;')
-        hf_body.append('    assert(entry->valid == FALSE);')
-        hf_body.append('    return entry;')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('// caller must hold the g_memInfoLock')
-        hf_body.append('static XGLAllocInfo * find_mem_info_entry(const XGL_GPU_MEMORY handle)')
-        hf_body.append('{')
-        hf_body.append('    XGLAllocInfo *entry;')
-        hf_body.append('    unsigned int i;')
-        hf_body.append('    entry = g_memInfo.pEntrys;')
-        hf_body.append('    if (g_memInfo.pLastMapped && g_memInfo.pLastMapped->handle == handle && g_memInfo.pLastMapped->valid)')
-        hf_body.append('    {')
-        hf_body.append('        return g_memInfo.pLastMapped;')
-        hf_body.append('    }')
-        hf_body.append('    for (i = 0; i < g_memInfo.numEntrys; i++)')
-        hf_body.append('    {')
-        hf_body.append('        if ((entry + i)->valid && (handle == (entry + i)->handle))')
-        hf_body.append('        {')
-        hf_body.append('            return entry + i;')
-        hf_body.append('        }')
-        hf_body.append('    }')
-        hf_body.append('')
-        hf_body.append('    return NULL;')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('static XGLAllocInfo * find_mem_info_entry_lock(const XGL_GPU_MEMORY handle)')
-        hf_body.append('{')
-        hf_body.append('    XGLAllocInfo *res;')
-        hf_body.append('    glv_enter_critical_section(&g_memInfoLock);')
-        hf_body.append('    res = find_mem_info_entry(handle);')
-        hf_body.append('    glv_leave_critical_section(&g_memInfoLock);')
-        hf_body.append('    return res;')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('static void add_new_handle_to_mem_info(const XGL_GPU_MEMORY handle, XGL_GPU_SIZE size, void *pData)')
-        hf_body.append('{')
-        hf_body.append('    XGLAllocInfo *entry;')
-        hf_body.append('')
-        hf_body.append('    glv_enter_critical_section(&g_memInfoLock);')
-        hf_body.append('    if (g_memInfo.capacity == 0)')
-        hf_body.append('        init_mem_info();')
-        hf_body.append('')
-        hf_body.append('    entry = get_mem_info_entry();')
-        hf_body.append('    if (entry)')
-        hf_body.append('    {')
-        hf_body.append('        entry->valid = TRUE;')
-        hf_body.append('        entry->handle = handle;')
-        hf_body.append('        entry->size = size;')
-        hf_body.append('        entry->pData = pData;   // NOTE: xglFreeMemory will free this mem, so no malloc()')
-        hf_body.append('    }')
-        hf_body.append('    glv_leave_critical_section(&g_memInfoLock);')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('static void add_data_to_mem_info(const XGL_GPU_MEMORY handle, void *pData)')
-        hf_body.append('{')
-        hf_body.append('    XGLAllocInfo *entry;')
-        hf_body.append('')
-        hf_body.append('    glv_enter_critical_section(&g_memInfoLock);')
-        hf_body.append('    entry = find_mem_info_entry(handle);')
-        hf_body.append('    if (entry)')
-        hf_body.append('    {')
-        hf_body.append('        entry->pData = pData;')
-        hf_body.append('    }')
-        hf_body.append('    g_memInfo.pLastMapped = entry;')
-        hf_body.append('    glv_leave_critical_section(&g_memInfoLock);')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('static void rm_handle_from_mem_info(const XGL_GPU_MEMORY handle)')
-        hf_body.append('{')
-        hf_body.append('    XGLAllocInfo *entry;')
-        hf_body.append('')
-        hf_body.append('    glv_enter_critical_section(&g_memInfoLock);')
-        hf_body.append('    entry = find_mem_info_entry(handle);')
-        hf_body.append('    if (entry)')
-        hf_body.append('    {')
-        hf_body.append('        entry->valid = FALSE;')
-        hf_body.append('        entry->pData = NULL;')
-        hf_body.append('        entry->size = 0;')
-        hf_body.append('        entry->handle = NULL;')
-        hf_body.append('')
-        hf_body.append('        if (entry == g_memInfo.pLastMapped)')
-        hf_body.append('            g_memInfo.pLastMapped = NULL;')
-        hf_body.append('        // adjust numEntrys to be last valid entry in list')
-        hf_body.append('        do {')
-        hf_body.append('            entry =  g_memInfo.pEntrys + g_memInfo.numEntrys - 1;')
-        hf_body.append('            if (entry->valid == FALSE)')
-        hf_body.append('                g_memInfo.numEntrys--;')
-        hf_body.append('        } while ((entry->valid == FALSE) && (g_memInfo.numEntrys > 0));')
-        hf_body.append('        if (g_memInfo.numEntrys == 0)')
-        hf_body.append('            delete_mem_info();')
-        hf_body.append('    }')
-        hf_body.append('    glv_leave_critical_section(&g_memInfoLock);')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('static void add_begin_cmdbuf_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
-        hf_body.append('{')
-        hf_body.append('    const XGL_CMD_BUFFER_BEGIN_INFO* pInNow = pIn;')
-        hf_body.append('    XGL_CMD_BUFFER_BEGIN_INFO** ppOutNext = (XGL_CMD_BUFFER_BEGIN_INFO**)ppOut;')
-        hf_body.append('    while (pInNow != NULL)')
-        hf_body.append('    {')
-        hf_body.append('        XGL_CMD_BUFFER_BEGIN_INFO** ppOutNow = ppOutNext;')
-        hf_body.append('        ppOutNext = NULL;')
-        hf_body.append('')
-        hf_body.append('        switch (pInNow->sType)')
-        hf_body.append('        {')
-        hf_body.append('            case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:')
-        hf_body.append('            {')
-        hf_body.append('                glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO), pInNow);')
-        hf_body.append('                ppOutNext = (XGL_CMD_BUFFER_BEGIN_INFO**)&(*ppOutNow)->pNext;')
-        hf_body.append('                glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('                break;')
-        hf_body.append('            }')
-        hf_body.append('            default:')
-        hf_body.append('                assert(!"Encountered an unexpected type in cmdbuffer_begin_info list");')
-        hf_body.append('        }')
-        hf_body.append('        pInNow = (XGL_CMD_BUFFER_BEGIN_INFO*)pInNow->pNext;')
-        hf_body.append('    }')
-        hf_body.append('    return;')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('static void add_alloc_memory_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
-        hf_body.append('{')
-        hf_body.append('    const XGL_MEMORY_ALLOC_INFO* pInNow = pIn;')
-        hf_body.append('    XGL_MEMORY_ALLOC_INFO** ppOutNext = (XGL_MEMORY_ALLOC_INFO**)ppOut;')
-        hf_body.append('    while (pInNow != NULL)')
-        hf_body.append('    {')
-        hf_body.append('        XGL_MEMORY_ALLOC_INFO** ppOutNow = ppOutNext;')
-        hf_body.append('        ppOutNext = NULL;')
-        hf_body.append('')
-        hf_body.append('        switch (pInNow->sType)')
-        hf_body.append('        {')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:')
-        hf_body.append('        {')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_MEMORY_ALLOC_BUFFER_INFO), pInNow);')
-        hf_body.append('            ppOutNext = (XGL_MEMORY_ALLOC_INFO**)&(*ppOutNow)->pNext;')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:')
-        hf_body.append('        {')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_MEMORY_ALLOC_IMAGE_INFO), pInNow);')
-        hf_body.append('            ppOutNext = (XGL_MEMORY_ALLOC_INFO**)&(*ppOutNow)->pNext;')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        default:')
-        hf_body.append('            assert(!"Encountered an unexpected type in memory_alloc_info list");')
-        hf_body.append('        }')
-        hf_body.append('        pInNow = (XGL_MEMORY_ALLOC_INFO*)pInNow->pNext;')
-        hf_body.append('    }')
-        hf_body.append('    return;')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('static size_t calculate_memory_barrier_size(uint32_t mbCount, const void** ppMemBarriers)')
-        hf_body.append('{')
-        hf_body.append('    uint32_t i, siz=0;')
-        hf_body.append('    for (i = 0; i < mbCount; i++) {')
-        hf_body.append('        XGL_MEMORY_BARRIER *pNext = (XGL_MEMORY_BARRIER *) ppMemBarriers[i];')
-        hf_body.append('        switch (pNext->sType) {')
-        hf_body.append('            case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:')
-        hf_body.append('                siz += sizeof(XGL_MEMORY_BARRIER);')
-        hf_body.append('                break;')
-        hf_body.append('            case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:')
-        hf_body.append('                siz += sizeof(XGL_BUFFER_MEMORY_BARRIER);')
-        hf_body.append('                break;')
-        hf_body.append('            case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:')
-        hf_body.append('                siz += sizeof(XGL_IMAGE_MEMORY_BARRIER);')
-        hf_body.append('                break;')
-        hf_body.append('            default:')
-        hf_body.append('                assert(0);')
-        hf_body.append('                break;')
-        hf_body.append('        }')
-        hf_body.append('    }')
-        hf_body.append('    return siz;')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('static void add_pipeline_shader_to_trace_packet(glv_trace_packet_header* pHeader, XGL_PIPELINE_SHADER* packetShader, const XGL_PIPELINE_SHADER* paramShader)')
-        hf_body.append('{')
-        hf_body.append('    uint32_t i;')
-        hf_body.append('    // constant buffers')
-        hf_body.append('    if (paramShader->linkConstBufferCount > 0 && paramShader->pLinkConstBufferInfo != NULL)')
-        hf_body.append('    {')
-        hf_body.append('        glv_add_buffer_to_trace_packet(pHeader, (void**)&(packetShader->pLinkConstBufferInfo), sizeof(XGL_LINK_CONST_BUFFER) * paramShader->linkConstBufferCount, paramShader->pLinkConstBufferInfo);')
-        hf_body.append('        for (i = 0; i < paramShader->linkConstBufferCount; i++)')
-        hf_body.append('        {')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void**)&(packetShader->pLinkConstBufferInfo[i].pBufferData), packetShader->pLinkConstBufferInfo[i].bufferSize, paramShader->pLinkConstBufferInfo[i].pBufferData);')
-        hf_body.append('        }')
-        hf_body.append('    }')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('static void finalize_pipeline_shader_address(glv_trace_packet_header* pHeader, const XGL_PIPELINE_SHADER* packetShader)')
-        hf_body.append('{')
-        hf_body.append('    uint32_t i;')
-        hf_body.append('    // constant buffers')
-        hf_body.append('    if (packetShader->linkConstBufferCount > 0 && packetShader->pLinkConstBufferInfo != NULL)')
-        hf_body.append('    {')
-        hf_body.append('        for (i = 0; i < packetShader->linkConstBufferCount; i++)')
-        hf_body.append('        {')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)&(packetShader->pLinkConstBufferInfo[i].pBufferData));')
-        hf_body.append('        }')
-        hf_body.append('        glv_finalize_buffer_address(pHeader, (void**)&(packetShader->pLinkConstBufferInfo));')
-        hf_body.append('    }')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('static void add_create_ds_layout_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
-        hf_body.append('{')
-        hf_body.append('    const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pInNow = pIn;')
-        hf_body.append('    XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO** ppOutNext = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO**)ppOut;')
-        hf_body.append('    while (pInNow != NULL)')
-        hf_body.append('    {')
-        hf_body.append('        XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO** ppOutNow = ppOutNext;')
-        hf_body.append('        ppOutNext = NULL;')
-        hf_body.append('        glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO), pInNow);')
-        hf_body.append('        ppOutNext = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO**)&(*ppOutNow)->pNext;')
-        hf_body.append('        glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('        pInNow = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pInNow->pNext;')
-        hf_body.append('    }')
-        hf_body.append('    return;')
-        hf_body.append('}')
-        hf_body.append('')
-        hf_body.append('static void add_update_descriptors_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
-        hf_body.append('{')
-        hf_body.append('    const XGL_UPDATE_SAMPLERS* pInNow = pIn;')
-        hf_body.append('    XGL_UPDATE_SAMPLERS** ppOutNext = (XGL_UPDATE_SAMPLERS**)ppOut;')
-        hf_body.append('    while (pInNow != NULL)')
-        hf_body.append('    {')
-        hf_body.append('        XGL_UPDATE_SAMPLERS** ppOutNow = ppOutNext;')
-        hf_body.append('        ppOutNext = NULL;')
-        hf_body.append('        switch (pInNow->sType)')
-        hf_body.append('        {')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:')
-        hf_body.append('        {')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_SAMPLERS), pInNow);')
-        hf_body.append('            XGL_UPDATE_SAMPLERS* pPacket = (XGL_UPDATE_SAMPLERS*)*ppOutNow;')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pSamplers, ((XGL_UPDATE_SAMPLERS*)pInNow)->count * sizeof(XGL_SAMPLER), ((XGL_UPDATE_SAMPLERS*)pInNow)->pSamplers);')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pSamplers));')
-        hf_body.append('            ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*ppOutNow)->pNext;')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:')
-        hf_body.append('        {')
-        #hf_body.append('            totalUpdateSize += sizeof(XGL_UPDATE_SAMPLER_TEXTURES) + ((XGL_UPDATE_SAMPLER_TEXTURES*)pNext)->count * (sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) + sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_SAMPLER_TEXTURES), pInNow);')
-        hf_body.append('            XGL_UPDATE_SAMPLER_TEXTURES* pPacket = (XGL_UPDATE_SAMPLER_TEXTURES*)*ppOutNow;')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pSamplerImageViews, ((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->count * sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO), ((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->pSamplerImageViews);')
-        # TODO : This is still broken. How to update the original XGL_SAMPLER_IMAGE_VIEW_INFO struct ptrs to have correct address for newly added XGL_IMAGE_VIEW_ATTACH_INFO blocks below?
-        hf_body.append('            uint32_t i;')
-        hf_body.append('            for (i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->count; i++) {')
-        hf_body.append('                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pSamplerImageViews[i].pImageView, sizeof(XGL_IMAGE_VIEW_ATTACH_INFO), ((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->pSamplerImageViews[i].pImageView);')
-        hf_body.append('                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pSamplerImageViews[i].pImageView));')
-        hf_body.append('            }')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pSamplerImageViews));')
-        hf_body.append('            ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*ppOutNow)->pNext;')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:')
-        hf_body.append('        {')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_IMAGES), pInNow);')
-        hf_body.append('            XGL_UPDATE_IMAGES* pPacket = (XGL_UPDATE_IMAGES*)*ppOutNow;')
-        hf_body.append('            uint32_t i;')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pImageViews, ((XGL_UPDATE_IMAGES*)pInNow)->count * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO *), ((XGL_UPDATE_IMAGES*)pInNow)->pImageViews);')
-        hf_body.append('            for (i = 0; i < ((XGL_UPDATE_IMAGES*)pInNow)->count; i++) {')
-        hf_body.append('                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pImageViews[i], sizeof(XGL_IMAGE_VIEW_ATTACH_INFO), ((XGL_UPDATE_IMAGES*)pInNow)->pImageViews[i]);')
-        hf_body.append('                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pImageViews[i]));')
-        hf_body.append('            }')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pImageViews));')
-        hf_body.append('            ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*ppOutNow)->pNext;')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:')
-        hf_body.append('        {')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_BUFFERS), pInNow);')
-        hf_body.append('            XGL_UPDATE_BUFFERS* pPacket = (XGL_UPDATE_BUFFERS*)*ppOutNow;')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pBufferViews, ((XGL_UPDATE_BUFFERS*)pInNow)->count * sizeof(XGL_BUFFER_VIEW_ATTACH_INFO *), ((XGL_UPDATE_BUFFERS*)pInNow)->pBufferViews);')
-        hf_body.append('            uint32_t i;')
-        hf_body.append('            for (i = 0; i < ((XGL_UPDATE_BUFFERS*)pInNow)->count; i++) {')
-        hf_body.append('                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pBufferViews[i], sizeof(XGL_BUFFER_VIEW_ATTACH_INFO), ((XGL_UPDATE_BUFFERS*)pInNow)->pBufferViews[i]);')
-        hf_body.append('                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pBufferViews[i]));')
-        hf_body.append('            }')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pBufferViews));')
-        hf_body.append('            ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*ppOutNow)->pNext;')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:')
-        hf_body.append('        {')
-        hf_body.append('            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_AS_COPY), pInNow);')
-        hf_body.append('            ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*ppOutNow)->pNext;')
-        hf_body.append('            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('            default:')
-        hf_body.append('                assert(0);')
-        hf_body.append('        }')
-        hf_body.append('        pInNow = (XGL_UPDATE_SAMPLERS*)pInNow->pNext;')
-        hf_body.append('    }')
-        hf_body.append('    return;')
-        hf_body.append('}')
-        hf_body.append('')
-        pipe_state_list = ['IA_STATE_CREATE_INFO',
-                           'TESS_STATE_CREATE_INFO',
-                           'RS_STATE_CREATE_INFO',
-                           'DS_STATE_CREATE_INFO',
-                           'VP_STATE_CREATE_INFO',
-                           'MS_STATE_CREATE_INFO'
-                           ]
-        hf_body.append('static void add_pipeline_state_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
-        hf_body.append('{')
-        hf_body.append('    const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pInNow = pIn;')
-        hf_body.append('    XGL_GRAPHICS_PIPELINE_CREATE_INFO** ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)ppOut;')
-        hf_body.append('    while (pInNow != NULL)')
-        hf_body.append('    {')
-        hf_body.append('        XGL_GRAPHICS_PIPELINE_CREATE_INFO** ppOutNow = ppOutNext;')
-        hf_body.append('        ppOutNext = NULL;')
-        hf_body.append('')
-        hf_body.append('        switch (pInNow->sType)')
-        hf_body.append('        {')
-        for pipe_state in pipe_state_list:
-            hf_body.append('            case XGL_STRUCTURE_TYPE_PIPELINE_%s:' % pipe_state)
-            hf_body.append('            {')
-            hf_body.append('                glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_%s), pInNow);' % pipe_state)
-            hf_body.append('                ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;')
-            hf_body.append('                glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-            hf_body.append('                break;')
-            hf_body.append('            }')
-        hf_body.append('            case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:')
-        hf_body.append('            {')
-        hf_body.append('                XGL_PIPELINE_CB_STATE_CREATE_INFO *pPacket = NULL;')
-        hf_body.append('                XGL_PIPELINE_CB_STATE_CREATE_INFO *pIn = NULL;')
-        hf_body.append('                glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_CB_STATE_CREATE_INFO), pInNow);')
-        hf_body.append('                pPacket = (XGL_PIPELINE_CB_STATE_CREATE_INFO*) *ppOutNow;')
-        hf_body.append('                pIn = (XGL_PIPELINE_CB_STATE_CREATE_INFO*) pInNow;')
-        hf_body.append('                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pAttachments, pIn->attachmentCount * sizeof(XGL_PIPELINE_CB_ATTACHMENT_STATE), pIn->pAttachments);')
-        hf_body.append('                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pAttachments));')
-        hf_body.append('                ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;')
-        hf_body.append('                glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('                break;')
-        hf_body.append('            }')
-        hf_body.append('            case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:')
-        hf_body.append('            {')
-        hf_body.append('                XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pPacket = NULL;')
-        hf_body.append('                XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pInPacket = NULL;')
-        hf_body.append('                glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO), pInNow);')
-        hf_body.append('                pPacket = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) *ppOutNow;')
-        hf_body.append('                pInPacket = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) pInNow;')
-        hf_body.append('                add_pipeline_shader_to_trace_packet(pHeader, &pPacket->shader, &pInPacket->shader);')
-        hf_body.append('                finalize_pipeline_shader_address(pHeader, &pPacket->shader);')
-        hf_body.append('                ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;')
-        hf_body.append('                glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('                break;')
-        hf_body.append('            }')
-        hf_body.append('            case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:')
-        hf_body.append('            {')
-        hf_body.append('                XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pPacket = NULL;')
-        hf_body.append('                XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pIn = NULL;')
-        hf_body.append('                glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO), pInNow);')
-        hf_body.append('                pPacket = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*) *ppOutNow;')
-        hf_body.append('                pIn = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*) pInNow;')
-        hf_body.append('                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pVertexBindingDescriptions, pIn->bindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION), pIn->pVertexBindingDescriptions);')
-        hf_body.append('                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pVertexBindingDescriptions));')
-        hf_body.append('                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pVertexAttributeDescriptions, pIn->attributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION), pIn->pVertexAttributeDescriptions);')
-        hf_body.append('                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pVertexAttributeDescriptions));')
-        hf_body.append('                ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;')
-        hf_body.append('                glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
-        hf_body.append('                break;')
-        hf_body.append('            }')
-        hf_body.append('            default:')
-        hf_body.append('                assert(!"Encountered an unexpected type in pipeline state list");')
-        hf_body.append('        }')
-        hf_body.append('        pInNow = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)pInNow->pNext;')
-        hf_body.append('    }')
-        hf_body.append('    return;')
-        hf_body.append('}')
-        return "\n".join(hf_body)
-
     def _generate_packet_id_enum(self):
         pid_enum = []
         pid_enum.append('enum GLV_TRACE_PACKET_ID_XGL')
@@ -2257,7 +1670,8 @@
 
     def generate_body(self):
         body = [self._generate_trace_func_ptrs(),
-                self._generate_trace_func_protos()]
+                self._generate_trace_func_protos(),
+                self._generate_trace_real_func_ptr_protos()]
 
         return "\n".join(body)
 
@@ -2266,6 +1680,7 @@
         header_txt = []
         header_txt.append('#include "glv_platform.h"')
         header_txt.append('#include "glv_common.h"')
+        header_txt.append('#include "glvtrace_xgl_helpers.h"')
         header_txt.append('#include "glvtrace_xgl_xgl.h"')
         header_txt.append('#include "glvtrace_xgl_xgldbg.h"')
         header_txt.append('#include "glvtrace_xgl_xglwsix11ext.h"')
@@ -2284,7 +1699,6 @@
                 self._generate_attach_hooks(),
                 self._generate_detach_hooks(),
                 self._generate_init_funcs(),
-                self._generate_helper_funcs(),
                 self._generate_trace_funcs()]
 
         return "\n".join(body)
diff --git a/tools/glave/src/glv_extensions/glvtrace_xgl/CMakeLists.txt b/tools/glave/src/glv_extensions/glvtrace_xgl/CMakeLists.txt
index 7cc11d7..b37b492 100644
--- a/tools/glave/src/glv_extensions/glvtrace_xgl/CMakeLists.txt
+++ b/tools/glave/src/glv_extensions/glvtrace_xgl/CMakeLists.txt
@@ -20,6 +20,7 @@
                           ${CMAKE_CURRENT_SOURCE_DIR}/codegen/glvtrace_xgl_xgldbg.c
                           ${CMAKE_CURRENT_SOURCE_DIR}/codegen/glv_vk_vkdbg_structs.h
                           ${CMAKE_CURRENT_SOURCE_DIR}/codegen/xgl_struct_size_helper.h
+                          ${CMAKE_CURRENT_SOURCE_DIR}/codegen/xgl_struct_size_helper.c
                           ${CMAKE_CURRENT_SOURCE_DIR}/codegen/xgl_enum_string_helper.h
         COMMAND ${PYTHON_CMD} ${SRC_DIR}/../scripts/vk_generate.py glave-trace-h > glvtrace_xgl_xgl.h
         COMMAND ${PYTHON_CMD} ${SRC_DIR}/../scripts/vk_generate.py glave-trace-c > glvtrace_xgl_xgl.c
@@ -40,6 +41,8 @@
 set(SRC_LIST
     ${SRC_LIST}
     glvtrace_xgl.c
+    glvtrace_xgl_trace.c
+    codegen/xgl_struct_size_helper.c
     codegen/glvtrace_xgl_xgl.c
     codegen/glvtrace_xgl_xgldbg.c
     codegen/glvtrace_xgl_xglwsix11ext.c
diff --git a/tools/glave/src/glv_extensions/glvtrace_xgl/codegen/xgl_struct_size_helper.c b/tools/glave/src/glv_extensions/glvtrace_xgl/codegen/xgl_struct_size_helper.c
new file mode 100644
index 0000000..f1df2cb
--- /dev/null
+++ b/tools/glave/src/glv_extensions/glvtrace_xgl/codegen/xgl_struct_size_helper.c
@@ -0,0 +1,1469 @@
+/* THIS FILE IS GENERATED.  DO NOT EDIT. */
+
+/*
+ * XGL
+ *
+ * Copyright (C) 2014 LunarG, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+#include "xgl_struct_size_helper.h"
+#include <string.h>
+#include <assert.h>
+
+// Function definitions
+size_t xgl_size_xgl_alloc_callbacks(const XGL_ALLOC_CALLBACKS* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_ALLOC_CALLBACKS);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_application_info(const XGL_APPLICATION_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_APPLICATION_INFO);
+        structSize += sizeof(char)*(1+strlen(pStruct->pAppName));
+        structSize += sizeof(char)*(1+strlen(pStruct->pEngineName));
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_buffer_copy(const XGL_BUFFER_COPY* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_BUFFER_COPY);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_buffer_create_info(const XGL_BUFFER_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_BUFFER_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_buffer_image_copy(const XGL_BUFFER_IMAGE_COPY* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_BUFFER_IMAGE_COPY);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_buffer_memory_barrier(const XGL_BUFFER_MEMORY_BARRIER* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_BUFFER_MEMORY_BARRIER);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_buffer_memory_requirements(const XGL_BUFFER_MEMORY_REQUIREMENTS* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_BUFFER_MEMORY_REQUIREMENTS);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_buffer_view_attach_info(const XGL_BUFFER_VIEW_ATTACH_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_BUFFER_VIEW_ATTACH_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_buffer_view_create_info(const XGL_BUFFER_VIEW_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_BUFFER_VIEW_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_channel_mapping(const XGL_CHANNEL_MAPPING* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_CHANNEL_MAPPING);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_clear_color(const XGL_CLEAR_COLOR* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_CLEAR_COLOR);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_clear_color_value(const XGL_CLEAR_COLOR_VALUE* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_CLEAR_COLOR_VALUE);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_cmd_buffer_begin_info(const XGL_CMD_BUFFER_BEGIN_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_CMD_BUFFER_BEGIN_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_cmd_buffer_create_info(const XGL_CMD_BUFFER_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_CMD_BUFFER_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_cmd_buffer_graphics_begin_info(const XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_color_attachment_bind_info(const XGL_COLOR_ATTACHMENT_BIND_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_COLOR_ATTACHMENT_BIND_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_color_attachment_view_create_info(const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_compute_pipeline_create_info(const XGL_COMPUTE_PIPELINE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_depth_stencil_bind_info(const XGL_DEPTH_STENCIL_BIND_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DEPTH_STENCIL_BIND_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_depth_stencil_view_create_info(const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DEPTH_STENCIL_VIEW_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_descriptor_region_create_info(const XGL_DESCRIPTOR_REGION_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->count; i++) {
+            structSize += xgl_size_xgl_descriptor_type_count(&pStruct->pTypeCount[i]);
+        }
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_descriptor_set_layout_create_info(const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_descriptor_type_count(const XGL_DESCRIPTOR_TYPE_COUNT* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DESCRIPTOR_TYPE_COUNT);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_device_create_info(const XGL_DEVICE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DEVICE_CREATE_INFO);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->queueRecordCount; i++) {
+            structSize += xgl_size_xgl_device_queue_create_info(&pStruct->pRequestedQueues[i]);
+        }
+        for (i = 0; i < pStruct->extensionCount; i++) {
+            structSize += (sizeof(char*) + (sizeof(char) * (1 + strlen(pStruct->ppEnabledExtensionNames[i]))));
+        }
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_device_queue_create_info(const XGL_DEVICE_QUEUE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DEVICE_QUEUE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_dispatch_indirect_cmd(const XGL_DISPATCH_INDIRECT_CMD* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DISPATCH_INDIRECT_CMD);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_draw_indexed_indirect_cmd(const XGL_DRAW_INDEXED_INDIRECT_CMD* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DRAW_INDEXED_INDIRECT_CMD);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_draw_indirect_cmd(const XGL_DRAW_INDIRECT_CMD* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DRAW_INDIRECT_CMD);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_dynamic_cb_state_create_info(const XGL_DYNAMIC_CB_STATE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_dynamic_ds_state_create_info(const XGL_DYNAMIC_DS_STATE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_dynamic_rs_state_create_info(const XGL_DYNAMIC_RS_STATE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_dynamic_vp_state_create_info(const XGL_DYNAMIC_VP_STATE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->viewportAndScissorCount; i++) {
+            structSize += xgl_size_xgl_viewport(&pStruct->pViewports[i]);
+        }
+        for (i = 0; i < pStruct->viewportAndScissorCount; i++) {
+            structSize += xgl_size_xgl_rect(&pStruct->pScissors[i]);
+        }
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_event_create_info(const XGL_EVENT_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_EVENT_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_event_wait_info(const XGL_EVENT_WAIT_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_EVENT_WAIT_INFO);
+        structSize += pStruct->eventCount*sizeof(XGL_EVENT);
+        structSize += pStruct->memBarrierCount*(sizeof(void*) + sizeof(XGL_IMAGE_MEMORY_BARRIER));
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_extent2d(const XGL_EXTENT2D* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_EXTENT2D);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_extent3d(const XGL_EXTENT3D* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_EXTENT3D);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_fence_create_info(const XGL_FENCE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_FENCE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_format_properties(const XGL_FORMAT_PROPERTIES* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_FORMAT_PROPERTIES);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_framebuffer_create_info(const XGL_FRAMEBUFFER_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_FRAMEBUFFER_CREATE_INFO);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->colorAttachmentCount; i++) {
+            structSize += xgl_size_xgl_color_attachment_bind_info(&pStruct->pColorAttachments[i]);
+        }
+        structSize += xgl_size_xgl_depth_stencil_bind_info(pStruct->pDepthStencilAttachment);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_gpu_compatibility_info(const XGL_GPU_COMPATIBILITY_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_GPU_COMPATIBILITY_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_graphics_pipeline_create_info(const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_image_copy(const XGL_IMAGE_COPY* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_IMAGE_COPY);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_image_create_info(const XGL_IMAGE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_IMAGE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_image_memory_barrier(const XGL_IMAGE_MEMORY_BARRIER* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_IMAGE_MEMORY_BARRIER);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_image_memory_bind_info(const XGL_IMAGE_MEMORY_BIND_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_IMAGE_MEMORY_BIND_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_image_memory_requirements(const XGL_IMAGE_MEMORY_REQUIREMENTS* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_IMAGE_MEMORY_REQUIREMENTS);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_image_resolve(const XGL_IMAGE_RESOLVE* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_IMAGE_RESOLVE);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_image_subresource(const XGL_IMAGE_SUBRESOURCE* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_IMAGE_SUBRESOURCE);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_image_subresource_range(const XGL_IMAGE_SUBRESOURCE_RANGE* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_IMAGE_SUBRESOURCE_RANGE);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_image_view_attach_info(const XGL_IMAGE_VIEW_ATTACH_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_IMAGE_VIEW_ATTACH_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_image_view_create_info(const XGL_IMAGE_VIEW_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_IMAGE_VIEW_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_layer_create_info(const XGL_LAYER_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_LAYER_CREATE_INFO);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->layerCount; i++) {
+            structSize += (sizeof(char*) + (sizeof(char) * (1 + strlen(pStruct->ppActiveLayerNames[i]))));
+        }
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_link_const_buffer(const XGL_LINK_CONST_BUFFER* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_LINK_CONST_BUFFER);
+        structSize += pStruct->bufferSize;
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_memory_alloc_buffer_info(const XGL_MEMORY_ALLOC_BUFFER_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_MEMORY_ALLOC_BUFFER_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_memory_alloc_image_info(const XGL_MEMORY_ALLOC_IMAGE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_MEMORY_ALLOC_IMAGE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_memory_alloc_info(const XGL_MEMORY_ALLOC_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_MEMORY_ALLOC_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_memory_barrier(const XGL_MEMORY_BARRIER* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_MEMORY_BARRIER);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_memory_open_info(const XGL_MEMORY_OPEN_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_MEMORY_OPEN_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_memory_ref(const XGL_MEMORY_REF* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_MEMORY_REF);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_memory_requirements(const XGL_MEMORY_REQUIREMENTS* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_MEMORY_REQUIREMENTS);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_offset2d(const XGL_OFFSET2D* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_OFFSET2D);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_offset3d(const XGL_OFFSET3D* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_OFFSET3D);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_peer_image_open_info(const XGL_PEER_IMAGE_OPEN_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PEER_IMAGE_OPEN_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_peer_memory_open_info(const XGL_PEER_MEMORY_OPEN_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PEER_MEMORY_OPEN_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_physical_gpu_memory_properties(const XGL_PHYSICAL_GPU_MEMORY_PROPERTIES* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PHYSICAL_GPU_MEMORY_PROPERTIES);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_physical_gpu_performance(const XGL_PHYSICAL_GPU_PERFORMANCE* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PHYSICAL_GPU_PERFORMANCE);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_physical_gpu_properties(const XGL_PHYSICAL_GPU_PROPERTIES* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PHYSICAL_GPU_PROPERTIES);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_physical_gpu_queue_properties(const XGL_PHYSICAL_GPU_QUEUE_PROPERTIES* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PHYSICAL_GPU_QUEUE_PROPERTIES);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_barrier(const XGL_PIPELINE_BARRIER* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_BARRIER);
+        structSize += pStruct->eventCount*sizeof(XGL_SET_EVENT);
+        structSize += pStruct->memBarrierCount*(sizeof(void*) + sizeof(XGL_IMAGE_MEMORY_BARRIER));
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_cb_attachment_state(const XGL_PIPELINE_CB_ATTACHMENT_STATE* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_CB_ATTACHMENT_STATE);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_cb_state_create_info(const XGL_PIPELINE_CB_STATE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_CB_STATE_CREATE_INFO);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->attachmentCount; i++) {
+            structSize += xgl_size_xgl_pipeline_cb_attachment_state(&pStruct->pAttachments[i]);
+        }
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_ds_state_create_info(const XGL_PIPELINE_DS_STATE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_DS_STATE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_ia_state_create_info(const XGL_PIPELINE_IA_STATE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_IA_STATE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_ms_state_create_info(const XGL_PIPELINE_MS_STATE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_MS_STATE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_rs_state_create_info(const XGL_PIPELINE_RS_STATE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_RS_STATE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_shader(const XGL_PIPELINE_SHADER* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_SHADER);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->linkConstBufferCount; i++) {
+            structSize += xgl_size_xgl_link_const_buffer(&pStruct->pLinkConstBufferInfo[i]);
+        }
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_shader_stage_create_info(const XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_statistics_data(const XGL_PIPELINE_STATISTICS_DATA* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_STATISTICS_DATA);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_tess_state_create_info(const XGL_PIPELINE_TESS_STATE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_TESS_STATE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_vertex_input_create_info(const XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->bindingCount; i++) {
+            structSize += xgl_size_xgl_vertex_input_binding_description(&pStruct->pVertexBindingDescriptions[i]);
+        }
+        for (i = 0; i < pStruct->attributeCount; i++) {
+            structSize += xgl_size_xgl_vertex_input_attribute_description(&pStruct->pVertexAttributeDescriptions[i]);
+        }
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_pipeline_vp_state_create_info(const XGL_PIPELINE_VP_STATE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_PIPELINE_VP_STATE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_query_pool_create_info(const XGL_QUERY_POOL_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_QUERY_POOL_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_queue_semaphore_create_info(const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_QUEUE_SEMAPHORE_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_queue_semaphore_open_info(const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_QUEUE_SEMAPHORE_OPEN_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_rect(const XGL_RECT* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_RECT);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_render_pass_create_info(const XGL_RENDER_PASS_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_RENDER_PASS_CREATE_INFO);
+        structSize += pStruct->colorAttachmentCount*sizeof(XGL_ATTACHMENT_LOAD_OP);
+        structSize += pStruct->colorAttachmentCount*sizeof(XGL_ATTACHMENT_STORE_OP);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->colorAttachmentCount; i++) {
+            structSize += xgl_size_xgl_clear_color(&pStruct->pColorLoadClearValues[i]);
+        }
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_sampler_create_info(const XGL_SAMPLER_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_SAMPLER_CREATE_INFO);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_sampler_image_view_info(const XGL_SAMPLER_IMAGE_VIEW_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO);
+        structSize += xgl_size_xgl_image_view_attach_info(pStruct->pImageView);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_shader_create_info(const XGL_SHADER_CREATE_INFO* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_SHADER_CREATE_INFO);
+        structSize += pStruct->codeSize;
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_stencil_op_state(const XGL_STENCIL_OP_STATE* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_STENCIL_OP_STATE);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_subresource_layout(const XGL_SUBRESOURCE_LAYOUT* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_SUBRESOURCE_LAYOUT);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_update_as_copy(const XGL_UPDATE_AS_COPY* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_UPDATE_AS_COPY);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_update_buffers(const XGL_UPDATE_BUFFERS* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_UPDATE_BUFFERS);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->count; i++) {
+            structSize += (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*) + xgl_size_xgl_buffer_view_attach_info(pStruct->pBufferViews[i]));
+        }
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_update_images(const XGL_UPDATE_IMAGES* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_UPDATE_IMAGES);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->count; i++) {
+            structSize += (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*) + xgl_size_xgl_image_view_attach_info(pStruct->pImageViews[i]));
+        }
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_update_samplers(const XGL_UPDATE_SAMPLERS* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_UPDATE_SAMPLERS);
+        structSize += pStruct->count*sizeof(XGL_SAMPLER);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_update_sampler_textures(const XGL_UPDATE_SAMPLER_TEXTURES* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_UPDATE_SAMPLER_TEXTURES);
+        uint32_t i = 0;
+        for (i = 0; i < pStruct->count; i++) {
+            structSize += xgl_size_xgl_sampler_image_view_info(&pStruct->pSamplerImageViews[i]);
+        }
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_vertex_input_attribute_description(const XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_vertex_input_binding_description(const XGL_VERTEX_INPUT_BINDING_DESCRIPTION* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION);
+    }
+    return structSize;
+}
+size_t xgl_size_xgl_viewport(const XGL_VIEWPORT* pStruct)
+{
+    size_t structSize = 0;
+    if (pStruct) {
+        structSize = sizeof(XGL_VIEWPORT);
+    }
+    return structSize;
+}
+size_t get_struct_chain_size(const void* pStruct)
+{
+    // Just use XGL_APPLICATION_INFO as struct until actual type is resolved
+    XGL_APPLICATION_INFO* pNext = (XGL_APPLICATION_INFO*)pStruct;
+    size_t structSize = 0;
+    while (pNext) {
+        switch (pNext->sType) {
+            case XGL_STRUCTURE_TYPE_APPLICATION_INFO:
+            {
+                structSize += xgl_size_xgl_application_info((XGL_APPLICATION_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_BUFFER_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_buffer_create_info((XGL_BUFFER_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:
+            {
+                structSize += xgl_size_xgl_buffer_memory_barrier((XGL_BUFFER_MEMORY_BARRIER*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_BUFFER_VIEW_ATTACH_INFO:
+            {
+                structSize += xgl_size_xgl_buffer_view_attach_info((XGL_BUFFER_VIEW_ATTACH_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_buffer_view_create_info((XGL_BUFFER_VIEW_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO:
+            {
+                structSize += xgl_size_xgl_cmd_buffer_begin_info((XGL_CMD_BUFFER_BEGIN_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_cmd_buffer_create_info((XGL_CMD_BUFFER_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:
+            {
+                structSize += xgl_size_xgl_cmd_buffer_graphics_begin_info((XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_color_attachment_view_create_info((XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_compute_pipeline_create_info((XGL_COMPUTE_PIPELINE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_depth_stencil_view_create_info((XGL_DEPTH_STENCIL_VIEW_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_descriptor_region_create_info((XGL_DESCRIPTOR_REGION_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_descriptor_set_layout_create_info((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_device_create_info((XGL_DEVICE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_dynamic_cb_state_create_info((XGL_DYNAMIC_CB_STATE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_dynamic_ds_state_create_info((XGL_DYNAMIC_DS_STATE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_dynamic_rs_state_create_info((XGL_DYNAMIC_RS_STATE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_dynamic_vp_state_create_info((XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_EVENT_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_event_create_info((XGL_EVENT_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_EVENT_WAIT_INFO:
+            {
+                structSize += xgl_size_xgl_event_wait_info((XGL_EVENT_WAIT_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_fence_create_info((XGL_FENCE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_framebuffer_create_info((XGL_FRAMEBUFFER_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_graphics_pipeline_create_info((XGL_GRAPHICS_PIPELINE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_image_create_info((XGL_IMAGE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:
+            {
+                structSize += xgl_size_xgl_image_memory_barrier((XGL_IMAGE_MEMORY_BARRIER*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO:
+            {
+                structSize += xgl_size_xgl_image_view_attach_info((XGL_IMAGE_VIEW_ATTACH_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_image_view_create_info((XGL_IMAGE_VIEW_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_layer_create_info((XGL_LAYER_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:
+            {
+                structSize += xgl_size_xgl_memory_alloc_buffer_info((XGL_MEMORY_ALLOC_BUFFER_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:
+            {
+                structSize += xgl_size_xgl_memory_alloc_image_info((XGL_MEMORY_ALLOC_IMAGE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO:
+            {
+                structSize += xgl_size_xgl_memory_alloc_info((XGL_MEMORY_ALLOC_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:
+            {
+                structSize += xgl_size_xgl_memory_barrier((XGL_MEMORY_BARRIER*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_MEMORY_OPEN_INFO:
+            {
+                structSize += xgl_size_xgl_memory_open_info((XGL_MEMORY_OPEN_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PEER_MEMORY_OPEN_INFO:
+            {
+                structSize += xgl_size_xgl_peer_memory_open_info((XGL_PEER_MEMORY_OPEN_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_BARRIER:
+            {
+                structSize += xgl_size_xgl_pipeline_barrier((XGL_PIPELINE_BARRIER*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_pipeline_cb_state_create_info((XGL_PIPELINE_CB_STATE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_pipeline_ds_state_create_info((XGL_PIPELINE_DS_STATE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_pipeline_ia_state_create_info((XGL_PIPELINE_IA_STATE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_pipeline_ms_state_create_info((XGL_PIPELINE_MS_STATE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_pipeline_rs_state_create_info((XGL_PIPELINE_RS_STATE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_pipeline_shader_stage_create_info((XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_TESS_STATE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_pipeline_tess_state_create_info((XGL_PIPELINE_TESS_STATE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_pipeline_vertex_input_create_info((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_VP_STATE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_pipeline_vp_state_create_info((XGL_PIPELINE_VP_STATE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_query_pool_create_info((XGL_QUERY_POOL_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_queue_semaphore_create_info((XGL_QUEUE_SEMAPHORE_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_OPEN_INFO:
+            {
+                structSize += xgl_size_xgl_queue_semaphore_open_info((XGL_QUEUE_SEMAPHORE_OPEN_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_render_pass_create_info((XGL_RENDER_PASS_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_sampler_create_info((XGL_SAMPLER_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO:
+            {
+                structSize += xgl_size_xgl_shader_create_info((XGL_SHADER_CREATE_INFO*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
+            {
+                structSize += xgl_size_xgl_update_as_copy((XGL_UPDATE_AS_COPY*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
+            {
+                structSize += xgl_size_xgl_update_buffers((XGL_UPDATE_BUFFERS*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
+            {
+                structSize += xgl_size_xgl_update_images((XGL_UPDATE_IMAGES*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
+            {
+                structSize += xgl_size_xgl_update_samplers((XGL_UPDATE_SAMPLERS*)pNext);
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
+            {
+                structSize += xgl_size_xgl_update_sampler_textures((XGL_UPDATE_SAMPLER_TEXTURES*)pNext);
+                break;
+            }
+            default:
+                assert(0);
+                structSize += 0;
+        }
+        pNext = (XGL_APPLICATION_INFO*)pNext->pNext;
+    }
+    return structSize;
+}
+size_t get_dynamic_struct_size(const void* pStruct)
+{
+    // Just use XGL_APPLICATION_INFO as struct until actual type is resolved
+    XGL_APPLICATION_INFO* pNext = (XGL_APPLICATION_INFO*)pStruct;
+    size_t structSize = 0;
+    switch (pNext->sType) {
+        case XGL_STRUCTURE_TYPE_APPLICATION_INFO:
+        {
+            structSize += xgl_size_xgl_application_info((XGL_APPLICATION_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_BUFFER_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_buffer_create_info((XGL_BUFFER_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:
+        {
+            structSize += xgl_size_xgl_buffer_memory_barrier((XGL_BUFFER_MEMORY_BARRIER*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_BUFFER_VIEW_ATTACH_INFO:
+        {
+            structSize += xgl_size_xgl_buffer_view_attach_info((XGL_BUFFER_VIEW_ATTACH_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_buffer_view_create_info((XGL_BUFFER_VIEW_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO:
+        {
+            structSize += xgl_size_xgl_cmd_buffer_begin_info((XGL_CMD_BUFFER_BEGIN_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_cmd_buffer_create_info((XGL_CMD_BUFFER_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:
+        {
+            structSize += xgl_size_xgl_cmd_buffer_graphics_begin_info((XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_color_attachment_view_create_info((XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_compute_pipeline_create_info((XGL_COMPUTE_PIPELINE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_depth_stencil_view_create_info((XGL_DEPTH_STENCIL_VIEW_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_descriptor_region_create_info((XGL_DESCRIPTOR_REGION_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_descriptor_set_layout_create_info((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_device_create_info((XGL_DEVICE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_dynamic_cb_state_create_info((XGL_DYNAMIC_CB_STATE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_dynamic_ds_state_create_info((XGL_DYNAMIC_DS_STATE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_dynamic_rs_state_create_info((XGL_DYNAMIC_RS_STATE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_dynamic_vp_state_create_info((XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_EVENT_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_event_create_info((XGL_EVENT_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_EVENT_WAIT_INFO:
+        {
+            structSize += xgl_size_xgl_event_wait_info((XGL_EVENT_WAIT_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_fence_create_info((XGL_FENCE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_framebuffer_create_info((XGL_FRAMEBUFFER_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_graphics_pipeline_create_info((XGL_GRAPHICS_PIPELINE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_image_create_info((XGL_IMAGE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:
+        {
+            structSize += xgl_size_xgl_image_memory_barrier((XGL_IMAGE_MEMORY_BARRIER*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO:
+        {
+            structSize += xgl_size_xgl_image_view_attach_info((XGL_IMAGE_VIEW_ATTACH_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_image_view_create_info((XGL_IMAGE_VIEW_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_layer_create_info((XGL_LAYER_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:
+        {
+            structSize += xgl_size_xgl_memory_alloc_buffer_info((XGL_MEMORY_ALLOC_BUFFER_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:
+        {
+            structSize += xgl_size_xgl_memory_alloc_image_info((XGL_MEMORY_ALLOC_IMAGE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO:
+        {
+            structSize += xgl_size_xgl_memory_alloc_info((XGL_MEMORY_ALLOC_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:
+        {
+            structSize += xgl_size_xgl_memory_barrier((XGL_MEMORY_BARRIER*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_MEMORY_OPEN_INFO:
+        {
+            structSize += xgl_size_xgl_memory_open_info((XGL_MEMORY_OPEN_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_PEER_MEMORY_OPEN_INFO:
+        {
+            structSize += xgl_size_xgl_peer_memory_open_info((XGL_PEER_MEMORY_OPEN_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_PIPELINE_BARRIER:
+        {
+            structSize += xgl_size_xgl_pipeline_barrier((XGL_PIPELINE_BARRIER*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_pipeline_cb_state_create_info((XGL_PIPELINE_CB_STATE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_pipeline_ds_state_create_info((XGL_PIPELINE_DS_STATE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_pipeline_ia_state_create_info((XGL_PIPELINE_IA_STATE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_pipeline_ms_state_create_info((XGL_PIPELINE_MS_STATE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_pipeline_rs_state_create_info((XGL_PIPELINE_RS_STATE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_pipeline_shader_stage_create_info((XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_PIPELINE_TESS_STATE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_pipeline_tess_state_create_info((XGL_PIPELINE_TESS_STATE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_pipeline_vertex_input_create_info((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_PIPELINE_VP_STATE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_pipeline_vp_state_create_info((XGL_PIPELINE_VP_STATE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_query_pool_create_info((XGL_QUERY_POOL_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_queue_semaphore_create_info((XGL_QUEUE_SEMAPHORE_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_OPEN_INFO:
+        {
+            structSize += xgl_size_xgl_queue_semaphore_open_info((XGL_QUEUE_SEMAPHORE_OPEN_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_render_pass_create_info((XGL_RENDER_PASS_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_sampler_create_info((XGL_SAMPLER_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO:
+        {
+            structSize += xgl_size_xgl_shader_create_info((XGL_SHADER_CREATE_INFO*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
+        {
+            structSize += xgl_size_xgl_update_as_copy((XGL_UPDATE_AS_COPY*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
+        {
+            structSize += xgl_size_xgl_update_buffers((XGL_UPDATE_BUFFERS*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
+        {
+            structSize += xgl_size_xgl_update_images((XGL_UPDATE_IMAGES*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
+        {
+            structSize += xgl_size_xgl_update_samplers((XGL_UPDATE_SAMPLERS*)pNext);
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
+        {
+            structSize += xgl_size_xgl_update_sampler_textures((XGL_UPDATE_SAMPLER_TEXTURES*)pNext);
+            break;
+        }
+        default:
+            assert(0);
+            structSize += 0;
+    }
+    return structSize;
+}
\ No newline at end of file
diff --git a/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_helpers.h b/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_helpers.h
new file mode 100644
index 0000000..96a5161
--- /dev/null
+++ b/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_helpers.h
@@ -0,0 +1,498 @@
+/*
+ * Vulkan
+ *
+ * Copyright (C) 2014 LunarG, Inc.
+ * Copyright (C) 2015 Valve Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+#pragma once
+
+#include "glv_platform.h"
+#include "glvtrace_xgl_xgl.h"
+#include "xgl_struct_size_helper.h"
+
+// defined in generated file: glvtrace_xgl_xgl.c
+extern BOOL isHooked;
+
+// Support for shadowing CPU mapped memory
+typedef struct _XGLAllocInfo {
+    XGL_GPU_SIZE   size;
+    XGL_GPU_MEMORY handle;
+    void           *pData;
+    BOOL           valid;
+} XGLAllocInfo;
+
+typedef struct _XGLMemInfo {
+    unsigned int numEntrys;
+    XGLAllocInfo *pEntrys;
+    XGLAllocInfo *pLastMapped;
+    unsigned int capacity;
+} XGLMemInfo;
+
+// defined in manually written file: glvtrace_xgl_trace.c
+extern XGLMemInfo g_memInfo;
+extern GLV_CRITICAL_SECTION g_memInfoLock;
+
+static void init_mem_info_entrys(XGLAllocInfo *ptr, const unsigned int num)
+{
+    unsigned int i;
+    for (i = 0; i < num; i++)
+    {
+        XGLAllocInfo *entry = ptr + i;
+        entry->pData = NULL;
+        entry->size  = 0;
+        entry->handle = NULL;
+        entry->valid = FALSE;
+    }
+}
+
+// caller must hold the g_memInfoLock
+static void init_mem_info()
+{
+    g_memInfo.numEntrys = 0;
+    g_memInfo.capacity = 4096;
+    g_memInfo.pLastMapped = NULL;
+
+    g_memInfo.pEntrys = GLV_NEW_ARRAY(XGLAllocInfo, g_memInfo.capacity);
+
+    if (g_memInfo.pEntrys == NULL)
+        glv_LogError("init_mem_info()  malloc failed\n");
+    else
+        init_mem_info_entrys(g_memInfo.pEntrys, g_memInfo.capacity);
+}
+
+// caller must hold the g_memInfoLock
+static void delete_mem_info()
+{
+    GLV_DELETE(g_memInfo.pEntrys);
+    g_memInfo.pEntrys = NULL;
+    g_memInfo.numEntrys = 0;
+    g_memInfo.capacity = 0;
+    g_memInfo.pLastMapped = NULL;
+}
+
+// caller must hold the g_memInfoLock
+static XGLAllocInfo * get_mem_info_entry()
+{
+    unsigned int i;
+    XGLAllocInfo *entry;
+    if (g_memInfo.numEntrys > g_memInfo.capacity)
+    {
+        glv_LogError("get_mem_info_entry() bad internal state numEntrys %u\n", g_memInfo.numEntrys);
+        return NULL;
+    }
+
+    entry = g_memInfo.pEntrys;
+    for (i = 0; i < g_memInfo.numEntrys; i++)
+    {
+        if ((entry + i)->valid == FALSE)
+            return entry + i;
+    }
+    if (g_memInfo.numEntrys == g_memInfo.capacity)
+    {  // grow the array 2x
+        g_memInfo.capacity *= 2;
+        g_memInfo.pEntrys = (XGLAllocInfo *) GLV_REALLOC(g_memInfo.pEntrys, g_memInfo.capacity * sizeof(XGLAllocInfo));
+        if (g_memInfo.pEntrys == NULL)
+            glv_LogError("get_mem_info_entry() realloc failed\n");
+        //glv_LogInfo("realloc memInfo from %u to %u\n", g_memInfo.capacity /2, g_memInfo.capacity);
+        //init the newly added entrys
+        init_mem_info_entrys(g_memInfo.pEntrys + g_memInfo.capacity / 2, g_memInfo.capacity / 2);
+    }
+
+    assert(g_memInfo.numEntrys < g_memInfo.capacity);
+    entry = g_memInfo.pEntrys + g_memInfo.numEntrys;
+    g_memInfo.numEntrys++;
+    assert(entry->valid == FALSE);
+    return entry;
+}
+
+// caller must hold the g_memInfoLock
+static XGLAllocInfo * find_mem_info_entry(const XGL_GPU_MEMORY handle)
+{
+    XGLAllocInfo *entry;
+    unsigned int i;
+    entry = g_memInfo.pEntrys;
+    if (g_memInfo.pLastMapped && g_memInfo.pLastMapped->handle == handle && g_memInfo.pLastMapped->valid)
+    {
+        return g_memInfo.pLastMapped;
+    }
+    for (i = 0; i < g_memInfo.numEntrys; i++)
+    {
+        if ((entry + i)->valid && (handle == (entry + i)->handle))
+        {
+            return entry + i;
+        }
+    }
+
+    return NULL;
+}
+
+static XGLAllocInfo * find_mem_info_entry_lock(const XGL_GPU_MEMORY handle)
+{
+    XGLAllocInfo *res;
+    glv_enter_critical_section(&g_memInfoLock);
+    res = find_mem_info_entry(handle);
+    glv_leave_critical_section(&g_memInfoLock);
+    return res;
+}
+
+static void add_new_handle_to_mem_info(const XGL_GPU_MEMORY handle, XGL_GPU_SIZE size, void *pData)
+{
+    XGLAllocInfo *entry;
+
+    glv_enter_critical_section(&g_memInfoLock);
+    if (g_memInfo.capacity == 0)
+        init_mem_info();
+
+    entry = get_mem_info_entry();
+    if (entry)
+    {
+        entry->valid = TRUE;
+        entry->handle = handle;
+        entry->size = size;
+        entry->pData = pData;   // NOTE: xglFreeMemory will free this mem, so no malloc()
+    }
+    glv_leave_critical_section(&g_memInfoLock);
+}
+
+static void add_data_to_mem_info(const XGL_GPU_MEMORY handle, void *pData)
+{
+    XGLAllocInfo *entry;
+
+    glv_enter_critical_section(&g_memInfoLock);
+    entry = find_mem_info_entry(handle);
+    if (entry)
+    {
+        entry->pData = pData;
+    }
+    g_memInfo.pLastMapped = entry;
+    glv_leave_critical_section(&g_memInfoLock);
+}
+
+static void rm_handle_from_mem_info(const XGL_GPU_MEMORY handle)
+{
+    XGLAllocInfo *entry;
+
+    glv_enter_critical_section(&g_memInfoLock);
+    entry = find_mem_info_entry(handle);
+    if (entry)
+    {
+        entry->valid = FALSE;
+        entry->pData = NULL;
+        entry->size = 0;
+        entry->handle = NULL;
+
+        if (entry == g_memInfo.pLastMapped)
+            g_memInfo.pLastMapped = NULL;
+        // adjust numEntrys to be last valid entry in list
+        do {
+            entry =  g_memInfo.pEntrys + g_memInfo.numEntrys - 1;
+            if (entry->valid == FALSE)
+                g_memInfo.numEntrys--;
+        } while ((entry->valid == FALSE) && (g_memInfo.numEntrys > 0));
+        if (g_memInfo.numEntrys == 0)
+            delete_mem_info();
+    }
+    glv_leave_critical_section(&g_memInfoLock);
+}
+
+
+static void add_begin_cmdbuf_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)
+{
+    const XGL_CMD_BUFFER_BEGIN_INFO* pInNow = pIn;
+    XGL_CMD_BUFFER_BEGIN_INFO** ppOutNext = (XGL_CMD_BUFFER_BEGIN_INFO**)ppOut;
+    while (pInNow != NULL)
+    {
+        XGL_CMD_BUFFER_BEGIN_INFO** ppOutNow = ppOutNext;
+        ppOutNext = NULL;
+
+        switch (pInNow->sType)
+        {
+            case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:
+            {
+                glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO), pInNow);
+                ppOutNext = (XGL_CMD_BUFFER_BEGIN_INFO**)&(*ppOutNow)->pNext;
+                glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+                break;
+            }
+            default:
+                assert(!"Encountered an unexpected type in cmdbuffer_begin_info list");
+        }
+        pInNow = (XGL_CMD_BUFFER_BEGIN_INFO*)pInNow->pNext;
+    }
+    return;
+}
+
+static void add_alloc_memory_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)
+{
+    const XGL_MEMORY_ALLOC_INFO* pInNow = pIn;
+    XGL_MEMORY_ALLOC_INFO** ppOutNext = (XGL_MEMORY_ALLOC_INFO**)ppOut;
+    while (pInNow != NULL)
+    {
+        XGL_MEMORY_ALLOC_INFO** ppOutNow = ppOutNext;
+        ppOutNext = NULL;
+
+        switch (pInNow->sType)
+        {
+        case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:
+        {
+            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_MEMORY_ALLOC_BUFFER_INFO), pInNow);
+            ppOutNext = (XGL_MEMORY_ALLOC_INFO**)&(*ppOutNow)->pNext;
+            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:
+        {
+            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_MEMORY_ALLOC_IMAGE_INFO), pInNow);
+            ppOutNext = (XGL_MEMORY_ALLOC_INFO**)&(*ppOutNow)->pNext;
+            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+            break;
+        }
+        default:
+            assert(!"Encountered an unexpected type in memory_alloc_info list");
+        }
+        pInNow = (XGL_MEMORY_ALLOC_INFO*)pInNow->pNext;
+    }
+    return;
+}
+
+static size_t calculate_memory_barrier_size(uint32_t mbCount, const void** ppMemBarriers)
+{
+    uint32_t i, siz=0;
+    for (i = 0; i < mbCount; i++) {
+        XGL_MEMORY_BARRIER *pNext = (XGL_MEMORY_BARRIER *) ppMemBarriers[i];
+        switch (pNext->sType) {
+            case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:
+                siz += sizeof(XGL_MEMORY_BARRIER);
+                break;
+            case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:
+                siz += sizeof(XGL_BUFFER_MEMORY_BARRIER);
+                break;
+            case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:
+                siz += sizeof(XGL_IMAGE_MEMORY_BARRIER);
+                break;
+            default:
+                assert(0);
+                break;
+        }
+    }
+    return siz;
+}
+
+static void add_pipeline_shader_to_trace_packet(glv_trace_packet_header* pHeader, XGL_PIPELINE_SHADER* packetShader, const XGL_PIPELINE_SHADER* paramShader)
+{
+    uint32_t i;
+    // constant buffers
+    if (paramShader->linkConstBufferCount > 0 && paramShader->pLinkConstBufferInfo != NULL)
+    {
+        glv_add_buffer_to_trace_packet(pHeader, (void**)&(packetShader->pLinkConstBufferInfo), sizeof(XGL_LINK_CONST_BUFFER) * paramShader->linkConstBufferCount, paramShader->pLinkConstBufferInfo);
+        for (i = 0; i < paramShader->linkConstBufferCount; i++)
+        {
+            glv_add_buffer_to_trace_packet(pHeader, (void**)&(packetShader->pLinkConstBufferInfo[i].pBufferData), packetShader->pLinkConstBufferInfo[i].bufferSize, paramShader->pLinkConstBufferInfo[i].pBufferData);
+        }
+    }
+}
+
+static void finalize_pipeline_shader_address(glv_trace_packet_header* pHeader, const XGL_PIPELINE_SHADER* packetShader)
+{
+    uint32_t i;
+    // constant buffers
+    if (packetShader->linkConstBufferCount > 0 && packetShader->pLinkConstBufferInfo != NULL)
+    {
+        for (i = 0; i < packetShader->linkConstBufferCount; i++)
+        {
+            glv_finalize_buffer_address(pHeader, (void**)&(packetShader->pLinkConstBufferInfo[i].pBufferData));
+        }
+        glv_finalize_buffer_address(pHeader, (void**)&(packetShader->pLinkConstBufferInfo));
+    }
+}
+
+static void add_create_ds_layout_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)
+{
+    const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pInNow = pIn;
+    XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO** ppOutNext = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO**)ppOut;
+    while (pInNow != NULL)
+    {
+        XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO** ppOutNow = ppOutNext;
+        ppOutNext = NULL;
+        glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO), pInNow);
+        ppOutNext = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO**)&(*ppOutNow)->pNext;
+        glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+        pInNow = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pInNow->pNext;
+    }
+    return;
+}
+
+static void add_update_descriptors_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)
+{
+    const XGL_UPDATE_SAMPLERS* pInNow = pIn;
+    XGL_UPDATE_SAMPLERS** ppOutNext = (XGL_UPDATE_SAMPLERS**)ppOut;
+    while (pInNow != NULL)
+    {
+        XGL_UPDATE_SAMPLERS** ppOutNow = ppOutNext;
+        ppOutNext = NULL;
+        switch (pInNow->sType)
+        {
+        case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
+        {
+            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_SAMPLERS), pInNow);
+            XGL_UPDATE_SAMPLERS* pPacket = (XGL_UPDATE_SAMPLERS*)*ppOutNow;
+            glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pSamplers, ((XGL_UPDATE_SAMPLERS*)pInNow)->count * sizeof(XGL_SAMPLER), ((XGL_UPDATE_SAMPLERS*)pInNow)->pSamplers);
+            glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pSamplers));
+            ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*ppOutNow)->pNext;
+            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
+        {
+//            totalUpdateSize += sizeof(XGL_UPDATE_SAMPLER_TEXTURES) + ((XGL_UPDATE_SAMPLER_TEXTURES*)pNext)->count * (sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) + sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
+            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_SAMPLER_TEXTURES), pInNow);
+            XGL_UPDATE_SAMPLER_TEXTURES* pPacket = (XGL_UPDATE_SAMPLER_TEXTURES*)*ppOutNow;
+            glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pSamplerImageViews, ((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->count * sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO), ((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->pSamplerImageViews);
+// TODO : This is still broken. How to update the original XGL_SAMPLER_IMAGE_VIEW_INFO struct ptrs to have correct address for newly added XGL_IMAGE_VIEW_ATTACH_INFO blocks below?
+            uint32_t i;
+            for (i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->count; i++) {
+                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pSamplerImageViews[i].pImageView, sizeof(XGL_IMAGE_VIEW_ATTACH_INFO), ((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->pSamplerImageViews[i].pImageView);
+                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pSamplerImageViews[i].pImageView));
+            }
+            glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pSamplerImageViews));
+            ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*ppOutNow)->pNext;
+            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
+        {
+            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_IMAGES), pInNow);
+            XGL_UPDATE_IMAGES* pPacket = (XGL_UPDATE_IMAGES*)*ppOutNow;
+            uint32_t i;
+            glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pImageViews, ((XGL_UPDATE_IMAGES*)pInNow)->count * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO *), ((XGL_UPDATE_IMAGES*)pInNow)->pImageViews);
+            for (i = 0; i < ((XGL_UPDATE_IMAGES*)pInNow)->count; i++) {
+                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pImageViews[i], sizeof(XGL_IMAGE_VIEW_ATTACH_INFO), ((XGL_UPDATE_IMAGES*)pInNow)->pImageViews[i]);
+                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pImageViews[i]));
+            }
+            glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pImageViews));
+            ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*ppOutNow)->pNext;
+            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
+        {
+            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_BUFFERS), pInNow);
+            XGL_UPDATE_BUFFERS* pPacket = (XGL_UPDATE_BUFFERS*)*ppOutNow;
+            glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pBufferViews, ((XGL_UPDATE_BUFFERS*)pInNow)->count * sizeof(XGL_BUFFER_VIEW_ATTACH_INFO *), ((XGL_UPDATE_BUFFERS*)pInNow)->pBufferViews);
+            uint32_t i;
+            for (i = 0; i < ((XGL_UPDATE_BUFFERS*)pInNow)->count; i++) {
+                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pBufferViews[i], sizeof(XGL_BUFFER_VIEW_ATTACH_INFO), ((XGL_UPDATE_BUFFERS*)pInNow)->pBufferViews[i]);
+                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pBufferViews[i]));
+            }
+            glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pBufferViews));
+            ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*ppOutNow)->pNext;
+            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+            break;
+        }
+        case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
+        {
+            glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_AS_COPY), pInNow);
+            ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*ppOutNow)->pNext;
+            glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+            break;
+        }
+            default:
+                assert(0);
+        }
+        pInNow = (XGL_UPDATE_SAMPLERS*)pInNow->pNext;
+    }
+    return;
+}
+
+#define CASE_XGL_STRUCTURE_TYPE_PIPELINE(type) \
+    case XGL_STRUCTURE_TYPE_PIPELINE_##type: {\
+        glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_##type), pInNow);\
+        ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;\
+        glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));\
+        break;\
+    }
+
+
+static void add_pipeline_state_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)
+{
+    const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pInNow = pIn;
+    XGL_GRAPHICS_PIPELINE_CREATE_INFO** ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)ppOut;
+    while (pInNow != NULL)
+    {
+        XGL_GRAPHICS_PIPELINE_CREATE_INFO** ppOutNow = ppOutNext;
+        ppOutNext = NULL;
+
+        switch (pInNow->sType)
+        {
+            CASE_XGL_STRUCTURE_TYPE_PIPELINE(IA_STATE_CREATE_INFO)
+            CASE_XGL_STRUCTURE_TYPE_PIPELINE(TESS_STATE_CREATE_INFO)
+            CASE_XGL_STRUCTURE_TYPE_PIPELINE(RS_STATE_CREATE_INFO)
+            CASE_XGL_STRUCTURE_TYPE_PIPELINE(DS_STATE_CREATE_INFO)
+            CASE_XGL_STRUCTURE_TYPE_PIPELINE(VP_STATE_CREATE_INFO)
+            CASE_XGL_STRUCTURE_TYPE_PIPELINE(MS_STATE_CREATE_INFO)
+            case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:
+            {
+                XGL_PIPELINE_CB_STATE_CREATE_INFO *pPacket = NULL;
+                XGL_PIPELINE_CB_STATE_CREATE_INFO *pIn = NULL;
+                glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_CB_STATE_CREATE_INFO), pInNow);
+                pPacket = (XGL_PIPELINE_CB_STATE_CREATE_INFO*) *ppOutNow;
+                pIn = (XGL_PIPELINE_CB_STATE_CREATE_INFO*) pInNow;
+                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pAttachments, pIn->attachmentCount * sizeof(XGL_PIPELINE_CB_ATTACHMENT_STATE), pIn->pAttachments);
+                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pAttachments));
+                ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;
+                glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:
+            {
+                XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pPacket = NULL;
+                XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pInPacket = NULL;
+                glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO), pInNow);
+                pPacket = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) *ppOutNow;
+                pInPacket = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) pInNow;
+                add_pipeline_shader_to_trace_packet(pHeader, &pPacket->shader, &pInPacket->shader);
+                finalize_pipeline_shader_address(pHeader, &pPacket->shader);
+                ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;
+                glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+                break;
+            }
+            case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:
+            {
+                XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pPacket = NULL;
+                XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pIn = NULL;
+                glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO), pInNow);
+                pPacket = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*) *ppOutNow;
+                pIn = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*) pInNow;
+                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pVertexBindingDescriptions, pIn->bindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION), pIn->pVertexBindingDescriptions);
+                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pVertexBindingDescriptions));
+                glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pVertexAttributeDescriptions, pIn->attributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION), pIn->pVertexAttributeDescriptions);
+                glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pVertexAttributeDescriptions));
+                ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;
+                glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));
+                break;
+            }
+            default:
+                assert(!"Encountered an unexpected type in pipeline state list");
+        }
+        pInNow = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)pInNow->pNext;
+    }
+    return;
+}
diff --git a/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_trace.c b/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_trace.c
new file mode 100644
index 0000000..2488f9d
--- /dev/null
+++ b/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_trace.c
@@ -0,0 +1,321 @@
+/*
+ * Vulkan
+ *
+ * Copyright (C) 2014 LunarG, Inc.
+ * Copyright (C) 2015 Valve Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "xgl.h"
+#include "glv_platform.h"
+#include "glv_common.h"
+#include "glvtrace_xgl_helpers.h"
+#include "glvtrace_xgl_xgl.h"
+#include "glvtrace_xgl_xgldbg.h"
+#include "glvtrace_xgl_xglwsix11ext.h"
+#include "glv_interconnect.h"
+#include "glv_filelike.h"
+#ifdef WIN32
+#include "mhook/mhook-lib/mhook.h"
+#endif
+#include "glv_trace_packet_utils.h"
+#include <stdio.h>
+
+// declared as extern in glvtrace_xgl_helpers.h
+GLV_CRITICAL_SECTION g_memInfoLock;
+XGLMemInfo g_memInfo = {0, NULL, NULL, 0};
+
+GLVTRACER_EXPORT XGL_RESULT XGLAPI __HOOKED_xglCreateInstance(
+    const XGL_APPLICATION_INFO* pAppInfo,
+    const XGL_ALLOC_CALLBACKS* pAllocCb,
+    XGL_INSTANCE* pInstance)
+{
+    glv_trace_packet_header* pHeader;
+    XGL_RESULT result;
+    struct_xglCreateInstance* pPacket = NULL;
+    uint64_t startTime;
+    glv_platform_thread_once(&gInitOnce, InitTracer);
+    SEND_ENTRYPOINT_ID(xglCreateInstance);
+    if (real_xglCreateInstance == xglCreateInstance)
+    {
+        glv_platform_get_next_lib_sym((void **) &real_xglCreateInstance,"xglCreateInstance");
+    }
+    startTime = glv_get_time();
+    result = real_xglCreateInstance(pAppInfo, pAllocCb, pInstance);
+    CREATE_TRACE_PACKET(xglCreateInstance, sizeof(XGL_INSTANCE) + get_struct_chain_size((void*)pAppInfo) + ((pAllocCb == NULL) ? 0 :sizeof(XGL_ALLOC_CALLBACKS)));
+    pHeader->entrypoint_begin_time = startTime;
+    if (isHooked == FALSE) {
+        AttachHooks();
+        AttachHooks_xgldbg();
+        AttachHooks_xglwsix11ext();
+    }
+    pPacket = interpret_body_as_xglCreateInstance(pHeader);
+
+    add_XGL_APPLICATION_INFO_to_packet(pHeader, (XGL_APPLICATION_INFO**)&(pPacket->pAppInfo), pAppInfo);
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pAllocCb), sizeof(XGL_ALLOC_CALLBACKS), pAllocCb);
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pInstance), sizeof(XGL_INSTANCE), pInstance);
+    pPacket->result = result;
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pAllocCb));
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pInstance));
+    FINISH_TRACE_PACKET();
+    return result;
+}
+
+GLVTRACER_EXPORT XGL_RESULT XGLAPI __HOOKED_xglEnumerateLayers(
+    XGL_PHYSICAL_GPU gpu,
+    size_t maxLayerCount,
+    size_t maxStringSize,
+    size_t* pOutLayerCount,
+    char* const* pOutLayers,
+    void* pReserved)
+{
+    glv_trace_packet_header* pHeader;
+    XGL_RESULT result;
+    struct_xglEnumerateLayers* pPacket = NULL;
+    uint64_t startTime;
+    SEND_ENTRYPOINT_ID(xglEnumerateLayers);
+    startTime = glv_get_time();
+    result = real_xglEnumerateLayers(gpu, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
+    size_t totStringSize = 0;
+    uint32_t i = 0;
+    for (i = 0; i < *pOutLayerCount; i++) {
+        totStringSize += (pOutLayers[i] != NULL) ? strlen(pOutLayers[i]) + 1: 0;
+    }
+    CREATE_TRACE_PACKET(xglEnumerateLayers, totStringSize + sizeof(size_t));
+    pHeader->entrypoint_begin_time = startTime;
+    pPacket = interpret_body_as_xglEnumerateLayers(pHeader);
+    pPacket->gpu = gpu;
+    pPacket->maxLayerCount = maxLayerCount;
+    pPacket->maxStringSize = maxStringSize;
+    pPacket->pReserved = pReserved;
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pOutLayerCount), sizeof(size_t), pOutLayerCount);
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pOutLayerCount));
+    for (i = 0; i < *pOutLayerCount; i++) {
+        glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pOutLayers[i]), ((pOutLayers[i] != NULL) ? strlen(pOutLayers[i]) + 1 : 0), pOutLayers[i]);
+        glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pOutLayers[i]));
+    }
+    pPacket->result = result;
+    FINISH_TRACE_PACKET();
+    return result;
+}
+
+GLVTRACER_EXPORT XGL_RESULT XGLAPI __HOOKED_xglEnumerateGpus(
+    XGL_INSTANCE instance,
+    uint32_t maxGpus,
+    uint32_t* pGpuCount,
+    XGL_PHYSICAL_GPU* pGpus)
+{
+    glv_trace_packet_header* pHeader;
+    XGL_RESULT result;
+    struct_xglEnumerateGpus* pPacket = NULL;
+    uint64_t startTime;
+    SEND_ENTRYPOINT_ID(xglEnumerateGpus);
+    startTime = glv_get_time();
+    result = real_xglEnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
+    CREATE_TRACE_PACKET(xglEnumerateGpus, sizeof(uint32_t) + ((pGpus && pGpuCount) ? *pGpuCount * sizeof(XGL_PHYSICAL_GPU) : 0));
+    pHeader->entrypoint_begin_time = startTime;
+    pPacket = interpret_body_as_xglEnumerateGpus(pHeader);
+    pPacket->instance = instance;
+    pPacket->maxGpus = maxGpus;
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pGpuCount), sizeof(uint32_t), pGpuCount);
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pGpus), *pGpuCount*sizeof(XGL_PHYSICAL_GPU), pGpus);
+    pPacket->result = result;
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pGpuCount));
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pGpus));
+    FINISH_TRACE_PACKET();
+    return result;
+}
+
+GLVTRACER_EXPORT XGL_RESULT XGLAPI __HOOKED_xglAllocDescriptorSets(
+    XGL_DESCRIPTOR_REGION descriptorRegion,
+    XGL_DESCRIPTOR_SET_USAGE setUsage,
+    uint32_t count,
+    const XGL_DESCRIPTOR_SET_LAYOUT* pSetLayouts,
+    XGL_DESCRIPTOR_SET* pDescriptorSets,
+    uint32_t* pCount)
+{
+    glv_trace_packet_header* pHeader;
+    XGL_RESULT result;
+    struct_xglAllocDescriptorSets* pPacket = NULL;
+    uint64_t startTime;
+    SEND_ENTRYPOINT_ID(xglAllocDescriptorSets);
+    startTime = glv_get_time();
+    result = real_xglAllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
+    size_t customSize = (*pCount <= 0) ? (sizeof(XGL_DESCRIPTOR_SET)) : (*pCount * sizeof(XGL_DESCRIPTOR_SET));
+    CREATE_TRACE_PACKET(xglAllocDescriptorSets, sizeof(XGL_DESCRIPTOR_SET_LAYOUT) + customSize + sizeof(uint32_t));
+    pHeader->entrypoint_begin_time = startTime;
+    pPacket = interpret_body_as_xglAllocDescriptorSets(pHeader);
+    pPacket->descriptorRegion = descriptorRegion;
+    pPacket->setUsage = setUsage;
+    pPacket->count = count;
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pSetLayouts), count*sizeof(XGL_DESCRIPTOR_SET_LAYOUT), pSetLayouts);
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pDescriptorSets), customSize, pDescriptorSets);
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pCount), sizeof(uint32_t), pCount);
+    pPacket->result = result;
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pSetLayouts));
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pDescriptorSets));
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pCount));
+    FINISH_TRACE_PACKET();
+    return result;
+}
+
+GLVTRACER_EXPORT XGL_RESULT XGLAPI __HOOKED_xglMapMemory(
+    XGL_GPU_MEMORY mem,
+    XGL_FLAGS flags,
+    void** ppData)
+{
+    glv_trace_packet_header* pHeader;
+    XGL_RESULT result;
+    struct_xglMapMemory* pPacket = NULL;
+    CREATE_TRACE_PACKET(xglMapMemory, sizeof(void*));
+    result = real_xglMapMemory(mem, flags, ppData);
+    pPacket = interpret_body_as_xglMapMemory(pHeader);
+    pPacket->mem = mem;
+    pPacket->flags = flags;
+    if (ppData != NULL)
+    {
+        glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->ppData), sizeof(void*), *ppData);
+        glv_finalize_buffer_address(pHeader, (void**)&(pPacket->ppData));
+        add_data_to_mem_info(mem, *ppData);
+    }
+    pPacket->result = result;
+    FINISH_TRACE_PACKET();
+    return result;
+}
+
+GLVTRACER_EXPORT XGL_RESULT XGLAPI __HOOKED_xglUnmapMemory(XGL_GPU_MEMORY mem)
+{
+    glv_trace_packet_header* pHeader;
+    XGL_RESULT result;
+    struct_xglUnmapMemory* pPacket;
+    XGLAllocInfo *entry;
+    SEND_ENTRYPOINT_PARAMS("xglUnmapMemory(mem %p)\n", mem);
+    // insert into packet the data that was written by CPU between the xglMapMemory call and here
+    // Note must do this prior to the real xglUnMap() or else may get a FAULT
+    glv_enter_critical_section(&g_memInfoLock);
+    entry = find_mem_info_entry(mem);
+    CREATE_TRACE_PACKET(xglUnmapMemory, (entry) ? entry->size : 0);
+    pPacket = interpret_body_as_xglUnmapMemory(pHeader);
+    if (entry)
+    {
+        assert(entry->handle == mem);
+        glv_add_buffer_to_trace_packet(pHeader, (void**) &(pPacket->pData), entry->size, entry->pData);
+        glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pData));
+        entry->pData = NULL;
+    } else
+    {
+         glv_LogError("Failed to copy app memory into trace packet (idx = %u) on xglUnmapMemory\n", pHeader->global_packet_index);
+    }
+    glv_leave_critical_section(&g_memInfoLock);
+//    glv_LogError("manual address of xglUnmapMemory: %p\n", real_xglUnmapMemory);
+    result = real_xglUnmapMemory(mem);
+    pPacket->mem = mem;
+    pPacket->result = result;
+    FINISH_TRACE_PACKET();
+    return result;
+}
+
+GLVTRACER_EXPORT void XGLAPI __HOOKED_xglCmdWaitEvents(
+    XGL_CMD_BUFFER cmdBuffer,
+    const XGL_EVENT_WAIT_INFO* pWaitInfo)
+{
+    glv_trace_packet_header* pHeader;
+    struct_xglCmdWaitEvents* pPacket = NULL;
+    size_t customSize;
+    uint32_t eventCount = (pWaitInfo != NULL && pWaitInfo->pEvents != NULL) ? pWaitInfo->eventCount : 0;
+    uint32_t mbCount = (pWaitInfo != NULL && pWaitInfo->ppMemBarriers != NULL) ? pWaitInfo->memBarrierCount : 0;
+    customSize = (eventCount * sizeof(XGL_EVENT)) + mbCount * sizeof(void*) + calculate_memory_barrier_size(mbCount, pWaitInfo->ppMemBarriers);
+    CREATE_TRACE_PACKET(xglCmdWaitEvents, sizeof(XGL_EVENT_WAIT_INFO) + customSize);
+    real_xglCmdWaitEvents(cmdBuffer, pWaitInfo);
+    pPacket = interpret_body_as_xglCmdWaitEvents(pHeader);
+    pPacket->cmdBuffer = cmdBuffer;
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pWaitInfo), sizeof(XGL_EVENT_WAIT_INFO), pWaitInfo);
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pWaitInfo->pEvents), eventCount * sizeof(XGL_EVENT), pWaitInfo->pEvents);
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pWaitInfo->pEvents));
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pWaitInfo->ppMemBarriers), mbCount * sizeof(void*), pWaitInfo->ppMemBarriers);
+    uint32_t i, siz;
+    for (i = 0; i < mbCount; i++) {
+        XGL_MEMORY_BARRIER *pNext = (XGL_MEMORY_BARRIER *) pWaitInfo->ppMemBarriers[i];
+        switch (pNext->sType) {
+            case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:
+                siz = sizeof(XGL_MEMORY_BARRIER);
+                break;
+            case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:
+                siz = sizeof(XGL_BUFFER_MEMORY_BARRIER);
+                break;
+            case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:
+                siz = sizeof(XGL_IMAGE_MEMORY_BARRIER);
+                break;
+            default:
+                assert(0);
+                siz = 0;
+                break;
+        }
+        glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pWaitInfo->ppMemBarriers[i]), siz, pWaitInfo->ppMemBarriers[i]);
+        glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pWaitInfo->ppMemBarriers[i]));
+    }
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pWaitInfo->ppMemBarriers));
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pWaitInfo));
+    FINISH_TRACE_PACKET();
+}
+
+GLVTRACER_EXPORT void XGLAPI __HOOKED_xglCmdPipelineBarrier(
+    XGL_CMD_BUFFER cmdBuffer,
+    const XGL_PIPELINE_BARRIER* pBarrier)
+{
+    glv_trace_packet_header* pHeader;
+    struct_xglCmdPipelineBarrier* pPacket = NULL;
+    size_t customSize;
+    uint32_t eventCount = (pBarrier != NULL && pBarrier->pEvents != NULL) ? pBarrier->eventCount : 0;
+    uint32_t mbCount = (pBarrier != NULL && pBarrier->ppMemBarriers != NULL) ? pBarrier->memBarrierCount : 0;
+    customSize = (eventCount * sizeof(XGL_SET_EVENT)) + mbCount * sizeof(void*) + calculate_memory_barrier_size(mbCount, pBarrier->ppMemBarriers);
+    CREATE_TRACE_PACKET(xglCmdPipelineBarrier, sizeof(XGL_PIPELINE_BARRIER) + customSize);
+    real_xglCmdPipelineBarrier(cmdBuffer, pBarrier);
+    pPacket = interpret_body_as_xglCmdPipelineBarrier(pHeader);
+    pPacket->cmdBuffer = cmdBuffer;
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pBarrier), sizeof(XGL_PIPELINE_BARRIER), pBarrier);
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pBarrier->pEvents), eventCount * sizeof(XGL_SET_EVENT), pBarrier->pEvents);
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pBarrier->pEvents));
+    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pBarrier->ppMemBarriers), mbCount * sizeof(void*), pBarrier->ppMemBarriers);
+    uint32_t i, siz;
+    for (i = 0; i < mbCount; i++) {
+        XGL_MEMORY_BARRIER *pNext = (XGL_MEMORY_BARRIER *) pBarrier->ppMemBarriers[i];
+        switch (pNext->sType) {
+            case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:
+                siz = sizeof(XGL_MEMORY_BARRIER);
+                break;
+            case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:
+                siz = sizeof(XGL_BUFFER_MEMORY_BARRIER);
+                break;
+            case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:
+                siz = sizeof(XGL_IMAGE_MEMORY_BARRIER);
+                break;
+            default:
+                assert(0);
+                siz = 0;
+                break;
+        }
+        glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pBarrier->ppMemBarriers[i]), siz, pBarrier->ppMemBarriers[i]);
+        glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pBarrier->ppMemBarriers[i]));
+    }
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pBarrier->ppMemBarriers));
+    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pBarrier));
+    FINISH_TRACE_PACKET();
+}
