glave: Add codgen helper for struct size calculation and use for trace packet creation
diff --git a/glave-generate.py b/glave-generate.py
index 64e5310..876c4c2 100755
--- a/glave-generate.py
+++ b/glave-generate.py
@@ -416,14 +416,14 @@
         ps = []
         skip_list = [] # store params that are already accounted for so we don't count them twice
         # Dict of specific params with unique custom sizes
-        custom_size_dict = {'xgl_shader_create_info': '((pCreateInfo != NULL) ? pCreateInfo->codeSize : 0) + sizeof(XGL_SHADER_CREATE_INFO)',
-                            'xgl_graphics_pipeline_create_info': '(calculate_pipeline_state_size(pCreateInfo->pNext)) + sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO)',
-                            'pUpdateChain': 'sizeof(XGL_DESCRIPTOR_SET) + (calculate_update_descriptors_size(pUpdateChain))',
+        custom_size_dict = {'xgl_shader_create_info': 'get_struct_chain_size((void*)pCreateInfo)',
+                            'xgl_graphics_pipeline_create_info': 'get_struct_chain_size((void*)pCreateInfo)',
+                            'pUpdateChain': 'get_struct_chain_size(pUpdateChain)',
                             'pSetBindPoints': '(XGL_SHADER_STAGE_COMPUTE * sizeof(uint32_t))', # Accounting for largest possible array
-                            'xgl_descriptor_set_layout_create_info': '(calculate_create_ds_layout_size(pSetLayoutInfoList))',
-                            'xgl_cmd_buffer_begin_info': 'sizeof(XGL_CMD_BUFFER_BEGIN_INFO) + (calculate_begin_cmdbuf_size(pBeginInfo->pNext))',
-                            'xgl_memory_alloc_info': 'sizeof(XGL_MEMORY_ALLOC_INFO) + calculate_alloc_memory_size(pAllocInfo->pNext)',
-                            'xgl_compute_pipeline_create_info': 'sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO) + calculate_pipeline_state_size(pCreateInfo->pNext)'}
+                            'xgl_descriptor_set_layout_create_info': 'get_struct_chain_size((void*)pSetLayoutInfoList)',
+                            'xgl_cmd_buffer_begin_info': 'get_struct_chain_size((void*)pBeginInfo)',
+                            'xgl_memory_alloc_info': 'get_struct_chain_size((void*)pAllocInfo)',
+                            'xgl_compute_pipeline_create_info': 'get_struct_chain_size((void*)pCreateInfo)'}
         for p in params:
             #First handle custom cases
             if p.ty.strip('*').replace('const ', '').lower() in custom_size_dict:
@@ -950,27 +950,6 @@
         hf_body.append('    return;')
         hf_body.append('}')
         hf_body.append('')
-        hf_body.append('static size_t calculate_begin_cmdbuf_size(const XGL_CMD_BUFFER_BEGIN_INFO* pNext)')
-        hf_body.append('{')
-        hf_body.append('    size_t siz = 0;')
-        hf_body.append('    while (pNext != NULL)')
-        hf_body.append('    {')
-        hf_body.append('        switch (pNext->sType)')
-        hf_body.append('        {')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:')
-        hf_body.append('        {')
-        hf_body.append('            siz += sizeof(XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO);')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        default:')
-        hf_body.append('            glv_LogError("calculate_begin_cmdbuf_size() bad internal state sType\\n");')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        pNext = (XGL_CMD_BUFFER_BEGIN_INFO*)pNext->pNext;')
-        hf_body.append('    }')
-        hf_body.append('    return siz;')
-        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;')
@@ -1004,32 +983,6 @@
         hf_body.append('    return;')
         hf_body.append('}')
         hf_body.append('')
-        hf_body.append('static size_t calculate_alloc_memory_size(const XGL_MEMORY_ALLOC_INFO* pNext)')
-        hf_body.append('{')
-        hf_body.append('    size_t siz = 0;')
-        hf_body.append('    while (pNext != NULL)')
-        hf_body.append('    {')
-        hf_body.append('        switch (pNext->sType)')
-        hf_body.append('        {')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:')
-        hf_body.append('        {')
-        hf_body.append('            siz += sizeof(XGL_MEMORY_ALLOC_BUFFER_INFO);')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:')
-        hf_body.append('        {')
-        hf_body.append('            siz += sizeof(XGL_MEMORY_ALLOC_IMAGE_INFO);')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        default:')
-        hf_body.append('            glv_LogError("calculate_alloc_memory_size() bad internal state sType\\n");')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        pNext = (XGL_MEMORY_ALLOC_INFO*)pNext->pNext;')
-        hf_body.append('    }')
-        hf_body.append('    return siz;')
-        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;')
@@ -1052,22 +1005,6 @@
         hf_body.append('    }')
         hf_body.append('    return siz;')
         hf_body.append('}')
-        hf_body.append('static size_t calculate_pipeline_shader_size(const XGL_PIPELINE_SHADER* shader)')
-        hf_body.append('{')
-        hf_body.append('    size_t size = 0;')
-        hf_body.append('    size += sizeof(XGL_PIPELINE_SHADER);')
-        hf_body.append('    // constant buffers')
-        hf_body.append('    if (shader->linkConstBufferCount > 0 && shader->pLinkConstBufferInfo != NULL)')
-        hf_body.append('    {')
-        hf_body.append('        uint32_t i;')
-        hf_body.append('        for (i = 0; i < shader->linkConstBufferCount; i++)')
-        hf_body.append('        {')
-        hf_body.append('            size += sizeof(XGL_LINK_CONST_BUFFER);')
-        hf_body.append('            size += shader->pLinkConstBufferInfo[i].bufferSize;')
-        hf_body.append('        }')
-        hf_body.append('    }')
-        hf_body.append('    return size;')
-        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('{')
@@ -1097,18 +1034,6 @@
         hf_body.append('    }')
         hf_body.append('}')
         hf_body.append('')
-        hf_body.append('static size_t calculate_create_ds_layout_size(const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pCreateInfo)')
-        hf_body.append('{')
-        hf_body.append('    size_t update_size = 0;')
-        hf_body.append('    XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pTrav = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCreateInfo;')
-        hf_body.append('    while (pTrav)')
-        hf_body.append('    {')
-        hf_body.append('        update_size += sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);')
-        hf_body.append('        pTrav = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pTrav->pNext;')
-        hf_body.append('    }')
-        hf_body.append('    return update_size;')
-        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;')
@@ -1125,47 +1050,6 @@
         hf_body.append('    return;')
         hf_body.append('}')
         hf_body.append('')
-        hf_body.append('static size_t calculate_update_descriptors_size(const void* pUpdateChain)')
-        hf_body.append('{')
-        hf_body.append('    const XGL_UPDATE_SAMPLERS* pNext = pUpdateChain;')
-        hf_body.append('    size_t totalUpdateSize = 0;')
-        hf_body.append('    while (pNext)')
-        hf_body.append('    {')
-        hf_body.append('        switch (pNext->sType)')
-        hf_body.append('        {')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:')
-        hf_body.append('        {')
-        hf_body.append('            totalUpdateSize += sizeof(XGL_UPDATE_SAMPLERS) + ((XGL_UPDATE_SAMPLERS*)pNext)->count * sizeof(XGL_SAMPLER);')
-        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('            break;')
-        hf_body.append('        }')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:')
-        hf_body.append('        {')
-        hf_body.append('            totalUpdateSize += sizeof(XGL_UPDATE_IMAGES) + (((XGL_UPDATE_IMAGES*)pNext)->count * (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) + sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*)));')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:')
-        hf_body.append('        {')
-        hf_body.append('            totalUpdateSize += sizeof(XGL_UPDATE_BUFFERS) + (((XGL_UPDATE_BUFFERS*)pNext)->count * (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) + sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*)));')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('        case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:')
-        hf_body.append('        {')
-        hf_body.append('            totalUpdateSize += sizeof(XGL_UPDATE_AS_COPY);')
-        hf_body.append('            break;')
-        hf_body.append('        }')
-        hf_body.append('            default:')
-        hf_body.append('                assert(0);')
-        hf_body.append('        }')
-        hf_body.append('        pNext = (XGL_UPDATE_SAMPLERS*)pNext->pNext;')
-        hf_body.append('    }')
-        hf_body.append('    return totalUpdateSize;')
-        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;')
@@ -1248,14 +1132,6 @@
         hf_body.append('    return;')
         hf_body.append('}')
         hf_body.append('')
-        hf_body.append('static size_t calculate_pipeline_state_size(const void* pState)')
-        hf_body.append('{')
-        hf_body.append('    const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pNext = pState;')
-        hf_body.append('    size_t totalStateSize = 0;')
-        hf_body.append('    while (pNext)')
-        hf_body.append('    {')
-        hf_body.append('        switch (pNext->sType)')
-        hf_body.append('        {')
         pipe_state_list = ['IA_STATE_CREATE_INFO',
                            'TESS_STATE_CREATE_INFO',
                            'RS_STATE_CREATE_INFO',
@@ -1263,36 +1139,6 @@
                            'VP_STATE_CREATE_INFO',
                            'MS_STATE_CREATE_INFO'
                            ]
-        for pipe_state in pipe_state_list:
-            hf_body.append('            case XGL_STRUCTURE_TYPE_PIPELINE_%s:' % pipe_state)
-            hf_body.append('                totalStateSize += sizeof(XGL_PIPELINE_%s);' % pipe_state)
-            hf_body.append('                break;')
-        hf_body.append('            case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:')
-        hf_body.append('            {')
-        hf_body.append('                totalStateSize += (sizeof(XGL_PIPELINE_CB_STATE_CREATE_INFO) + ((XGL_PIPELINE_CB_STATE_CREATE_INFO *) pNext)->attachmentCount * sizeof(XGL_PIPELINE_CB_ATTACHMENT_STATE));')
-        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('                const XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pShaderStage = (const XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*)pNext;')
-        hf_body.append('                totalStateSize += (sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO) + calculate_pipeline_shader_size(&pShaderStage->shader));')
-        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('                const XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO* pVi = (const XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pNext;')
-        hf_body.append('                totalStateSize += sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO) + pVi->bindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION)')
-        hf_body.append('                                    + pVi->attributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION);')
-        hf_body.append('                break;')
-        hf_body.append('            }')
-        hf_body.append('            default:')
-        hf_body.append('                assert(0);')
-        hf_body.append('        }')
-        hf_body.append('        pNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)pNext->pNext;')
-        hf_body.append('    }')
-        hf_body.append('    return totalStateSize;')
-        hf_body.append('}')
-        hf_body.append('')
         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;')
@@ -3551,6 +3397,7 @@
         header_txt.append('#include "glvtrace_xgl_xglwsix11ext.h"')
         header_txt.append('#include "glv_interconnect.h"')
         header_txt.append('#include "glv_filelike.h"')
+        header_txt.append('#include "xgl_struct_size_helper.h"')
         header_txt.append('#ifdef WIN32')
         header_txt.append('#include "mhook/mhook-lib/mhook.h"')
         header_txt.append('#endif')