glave: cleanup codegen of trace functionality

* Splits declarations from implementations so that the implementations can be done in separate files - some codegen'd, some manually written.
* Many of the declarations are now marked as extern.
* I tried to remove as many of the big conditional blocks of code in the script that were specific to a single function. There are certainly still conditionals for small changes, but many of the calls should follow a consistent path through the script now.
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();
+}