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)