glave: Fixes for CreateDescriptorSetLayout changed structures
diff --git a/tools/glave/scripts/vk_generate.py b/tools/glave/scripts/vk_generate.py
index 6aad905..b2d7f32 100755
--- a/tools/glave/scripts/vk_generate.py
+++ b/tools/glave/scripts/vk_generate.py
@@ -352,8 +352,6 @@
                                         'finalize_txt': 'default'},
                            'pDescriptorSets': {'add_txt': 'glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pDescriptorSets), customSize, pDescriptorSets)',
                                                'finalize_txt': 'default'},
-                           'pUpdateChain': {'add_txt': 'add_update_descriptors_to_trace_packet(pHeader, (void**)&(pPacket->pUpdateChain), pUpdateChain)',
-                                            'finalize_txt': 'default'},
                            'XGL_SHADER_CREATE_INFO': {'add_txt': 'glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo), sizeof(XGL_SHADER_CREATE_INFO), pCreateInfo);\n    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo->pCode), ((pCreateInfo != NULL) ? pCreateInfo->codeSize : 0), pCreateInfo->pCode)',
                                                       'finalize_txt': 'glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pCreateInfo->pCode));\n    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pCreateInfo))'},
                            'XGL_FRAMEBUFFER_CREATE_INFO': {'add_txt': 'glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo), sizeof(XGL_FRAMEBUFFER_CREATE_INFO), pCreateInfo);\n    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo->pColorAttachments), colorCount * sizeof(XGL_COLOR_ATTACHMENT_BIND_INFO), pCreateInfo->pColorAttachments);\n    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo->pDepthStencilAttachment), dsSize, pCreateInfo->pDepthStencilAttachment)',
@@ -368,8 +366,8 @@
                                                      'finalize_txt': 'glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pAllocInfo))'},
                            'XGL_GRAPHICS_PIPELINE_CREATE_INFO': {'add_txt': 'glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo), sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO), pCreateInfo);\n    add_pipeline_state_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo->pNext), pCreateInfo->pNext)',
                                                                  'finalize_txt': 'glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pCreateInfo))'},
-                           'XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO': {'add_txt': 'glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pSetLayoutInfoList), sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO), pSetLayoutInfoList);\n    if (pSetLayoutInfoList)\n        add_create_ds_layout_to_trace_packet(pHeader, (void**)&(pPacket->pSetLayoutInfoList->pNext), pSetLayoutInfoList->pNext)',
-                                                                     'finalize_txt': 'glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pSetLayoutInfoList))'},
+                           'XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO': {'add_txt': 'if (pCreateInfo)\n        add_create_ds_layout_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo), pCreateInfo)',
+                                                                     'finalize_txt': '// pCreateInfo finalized in add_create_ds_layout_to_trace_packet'},
                            'XGL_DESCRIPTOR_POOL_CREATE_INFO': {'add_txt': 'glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo), sizeof(XGL_DESCRIPTOR_POOL_CREATE_INFO), pCreateInfo);\n    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo->pTypeCount), rgCount * sizeof(XGL_DESCRIPTOR_TYPE_COUNT), pCreateInfo->pTypeCount)',
                                                                  'finalize_txt': 'glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pCreateInfo->pTypeCount));\n    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pCreateInfo))'},
                            'XGL_COMPUTE_PIPELINE_CREATE_INFO': {'add_txt': 'glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo), sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO), pCreateInfo);\n    add_pipeline_state_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo->pNext), pCreateInfo->pNext);\n    add_pipeline_shader_to_trace_packet(pHeader, (XGL_PIPELINE_SHADER*)&pPacket->pCreateInfo->cs, &pCreateInfo->cs)',
@@ -401,17 +399,11 @@
     def _get_packet_size(self, params):
         ps = [] # List of elements to be added together to account for packet size for given params
         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 = {'pSetBindPoints': '(XGL_SHADER_STAGE_COMPUTE * sizeof(uint32_t))', # Accounting for largest possible array
-                            }
         for p in params:
             #First handle custom cases
-            if p.name in ['pCreateInfo', 'pUpdateChain', 'pSetLayoutInfoList', 'pBeginInfo', 'pAllocInfo']:
+            if p.name in ['pCreateInfo', 'pBeginInfo', 'pAllocInfo']:
                 ps.append('get_struct_chain_size((void*)%s)' % p.name)
                 skip_list.append(p.name)
-            elif p.name in custom_size_dict:
-                ps.append(custom_size_dict[p.name])
-                skip_list.append(p.name)
             # Skip any params already handled
             if p.name in skip_list:
                 continue
@@ -501,7 +493,7 @@
                 # 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 proto.name in ['CreateFramebuffer', 'CreateRenderPass', 'CreateDynamicViewportState',
-                                  'CreateDescriptorPool']:
+                                  'CreateDescriptorPool', 'UpdateDescriptors']:
                     # 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;')
@@ -525,6 +517,15 @@
                     elif 'CreateDescriptorPool' == proto.name:
                         func_body.append('    uint32_t rgCount = (pCreateInfo != NULL && pCreateInfo->pTypeCount != NULL) ? pCreateInfo->count : 0;')
                         func_body.append('    CREATE_TRACE_PACKET(xglCreateDescriptorPool,  get_struct_chain_size((void*)pCreateInfo) + sizeof(XGL_DESCRIPTOR_POOL));')
+                    elif 'UpdateDescriptors' == proto.name:
+                        func_body.append('    uint32_t i;')
+                        func_body.append('    size_t customSize=0;')
+                        func_body.append('    for (i = 0; i < updateCount; i++)')
+                        func_body.append('    {')
+                        func_body.append('        customSize += get_struct_chain_size(ppUpdateArray[i]);')
+                        func_body.append('        customSize += sizeof(intptr_t);')
+                        func_body.append('    }')
+                        func_body.append('    CREATE_TRACE_PACKET(xglUpdateDescriptors,  customSize);')
                     func_body.append('    %sreal_xgl%s;' % (return_txt, proto.c_call()))
                 else:
                     if (0 == len(packet_size)):
@@ -536,18 +537,26 @@
                     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))
-                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;')
-                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 'UpdateDescriptors' == proto.name:
+                    func_body.append('    // add buffer which is an array of pointers')
+                    func_body.append('    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->ppUpdateArray), updateCount * sizeof(intptr_t), ppUpdateArray);')
+                    func_body.append('    // add all the sub buffers with descriptor updates')
+                    func_body.append('    add_update_descriptors_to_trace_packet(pHeader, updateCount, (void ***) &pPacket->ppUpdateArray, ppUpdateArray);')
+                    func_body.append('    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->ppUpdateArray));')
+                    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']))
+                    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 ('ppUpdateArray' != 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')
@@ -851,17 +860,17 @@
                                                                           '    void** ppLocalMemBarriers = (void**)&pBarrier->ppMemBarriers[i];\n',
                                                                           '    *ppLocalMemBarriers = (void*) glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pBarrier->ppMemBarriers[i]);\n',
                                                                           '}']},
-                             'CreateDescriptorSetLayout' : {'param': 'pSetLayoutInfoList', 'txt': ['if (pPacket->pSetLayoutInfoList->sType == XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO) {\n',
-                                                                                         '    // need to make a non-const pointer to the pointer so that we can properly change the original pointer to the interpretted one\n',
-                                                                                         '    void** ppNextVoidPtr = (void**)&(pPacket->pSetLayoutInfoList->pNext);\n',
-                                                                                         '    *ppNextVoidPtr = (void*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pPacket->pSetLayoutInfoList->pNext);\n',
-                                                                                         '    XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pNext = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pPacket->pSetLayoutInfoList->pNext;\n',
-                                                                                         '    while (NULL != pNext)\n', '    {\n',
+                             'CreateDescriptorSetLayout' : {'param': 'pCreateInfo', 'txt': ['if (pPacket->pCreateInfo->sType == XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO) {\n',
+                                                                                         '    XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pNext = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pPacket->pCreateInfo;\n',
+                                                                                         '    do\n', '    {\n',
+                                                                                         '        // need to make a non-const pointer to the pointer so that we can properly change the original pointer to the interpretted one\n',
+                                                                                         '        void** ppNextVoidPtr = (void**)&(pNext->pNext);\n',
+                                                                                         '        *ppNextVoidPtr = (void*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pNext->pNext);\n',
                                                                                          '        switch(pNext->sType)\n', '        {\n',
                                                                                          '            case XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO:\n',
                                                                                          '            {\n' ,
-                                                                                         '                void** ppNextVoidPtr = (void**)&pNext->pNext;\n',
-                                                                                         '                *ppNextVoidPtr = (void*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pNext->pNext);\n',
+                                                                                         '                XGL_DESCRIPTOR_SET_LAYOUT_BINDING** ppBinding = (XGL_DESCRIPTOR_SET_LAYOUT_BINDING**)&pNext->pBinding;\n',
+                                                                                         '                *ppBinding = (XGL_DESCRIPTOR_SET_LAYOUT_BINDING*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pNext->pBinding);\n',
                                                                                          '                break;\n',
                                                                                          '            }\n',
                                                                                          '            default:\n',
@@ -872,7 +881,7 @@
                                                                                          '            }\n',
                                                                                          '        }\n',
                                                                                          '        pNext = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pNext->pNext;\n',
-                                                                                         '     }\n',
+                                                                                         '     }  while (NULL != pNext);\n',
                                                                                          '} else {\n',
                                                                                          '     // This is unexpected.\n',
                                                                                          '     glv_LogError("CreateDescriptorSetLayout must have LayoutInfoList stype of XGL_STRCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO\\n");\n',
diff --git a/tools/glave/src/glv_extensions/glvreplay_xgl/glvreplay_xgl_xglreplay.cpp b/tools/glave/src/glv_extensions/glvreplay_xgl/glvreplay_xgl_xglreplay.cpp
index 405fa26..2673b43 100644
--- a/tools/glave/src/glv_extensions/glvreplay_xgl/glvreplay_xgl_xglreplay.cpp
+++ b/tools/glave/src/glv_extensions/glvreplay_xgl/glvreplay_xgl_xglreplay.cpp
@@ -522,28 +522,33 @@
     // We have to remap handles internal to the structures so save the handles prior to remap and then restore
     // Rather than doing a deep memcpy of the entire struct and fixing any intermediate pointers, do save and restores via STL queue
     glv_replay::GLV_REPLAY_RESULT returnValue = glv_replay::GLV_REPLAY_SUCCESS;
-    XGL_UPDATE_SAMPLERS* pUpdateChain = (XGL_UPDATE_SAMPLERS*)pPacket->pUpdateChain;
     std::queue<XGL_SAMPLER> saveSamplers;
     std::queue<XGL_BUFFER_VIEW> saveBufferViews;
     std::queue<XGL_IMAGE_VIEW> saveImageViews;
     std::queue<XGL_DESCRIPTOR_SET> saveDescSets;
-    while (pUpdateChain) {
-        switch(pUpdateChain->sType)
+    uint32_t j;
+    for (j = 0; j < pPacket->updateCount; j++)
+    {
+        XGL_UPDATE_SAMPLERS* pUpdateArray = (XGL_UPDATE_SAMPLERS*)pPacket->ppUpdateArray[j];
+        switch(pUpdateArray->sType)
         {
             case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
-                for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLERS*)pUpdateChain)->count; i++) {
-                    XGL_SAMPLER* pLocalSampler = (XGL_SAMPLER*) &((XGL_UPDATE_SAMPLERS*)pUpdateChain)->pSamplers[i];
+            {
+                for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLERS*)pUpdateArray)->count; i++)
+                {
+                    XGL_SAMPLER* pLocalSampler = (XGL_SAMPLER*) &((XGL_UPDATE_SAMPLERS*)pUpdateArray)->pSamplers[i];
                     saveSamplers.push(*pLocalSampler);
-                    *pLocalSampler = m_objMapper.remap(((XGL_UPDATE_SAMPLERS*)pUpdateChain)->pSamplers[i]);
+                    *pLocalSampler = m_objMapper.remap(((XGL_UPDATE_SAMPLERS*)pUpdateArray)->pSamplers[i]);
                 }
                 break;
+            }
             case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
             {
-                XGL_UPDATE_SAMPLER_TEXTURES *pUST = (XGL_UPDATE_SAMPLER_TEXTURES *) pUpdateChain;
+                XGL_UPDATE_SAMPLER_TEXTURES *pUST = (XGL_UPDATE_SAMPLER_TEXTURES *) pUpdateArray;
                 for (uint32_t i = 0; i < pUST->count; i++) {
-                    XGL_SAMPLER *pLocalSampler = (XGL_SAMPLER *) &pUST->pSamplerImageViews[i].pSampler;
+                    XGL_SAMPLER *pLocalSampler = (XGL_SAMPLER *) &pUST->pSamplerImageViews[i].sampler;
                     saveSamplers.push(*pLocalSampler);
-                    *pLocalSampler = m_objMapper.remap(pUST->pSamplerImageViews[i].pSampler);
+                    *pLocalSampler = m_objMapper.remap(pUST->pSamplerImageViews[i].sampler);
                     XGL_IMAGE_VIEW *pLocalView = (XGL_IMAGE_VIEW *) &pUST->pSamplerImageViews[i].pImageView->view;
                     saveImageViews.push(*pLocalView);
                     *pLocalView = m_objMapper.remap(pUST->pSamplerImageViews[i].pImageView->view);
@@ -552,51 +557,56 @@
             }
             case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
             {
-                XGL_UPDATE_IMAGES *pUI = (XGL_UPDATE_IMAGES*) pUpdateChain;
+                XGL_UPDATE_IMAGES *pUI = (XGL_UPDATE_IMAGES*) pUpdateArray;
                 for (uint32_t i = 0; i < pUI->count; i++) {
-                    XGL_IMAGE_VIEW* pLocalView = (XGL_IMAGE_VIEW*) &pUI->pImageViews[i]->view;
+                    XGL_IMAGE_VIEW* pLocalView = (XGL_IMAGE_VIEW*) &pUI->pImageViews[i].view;
                     saveImageViews.push(*pLocalView);
-                    *pLocalView = m_objMapper.remap(pUI->pImageViews[i]->view);
+                    *pLocalView = m_objMapper.remap(pUI->pImageViews[i].view);
                 }
                 break;
             }
             case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
             {
-                XGL_UPDATE_BUFFERS *pUB = (XGL_UPDATE_BUFFERS *) pUpdateChain;
+                XGL_UPDATE_BUFFERS *pUB = (XGL_UPDATE_BUFFERS *) pUpdateArray;
                 for (uint32_t i = 0; i < pUB->count; i++) {
-                    XGL_BUFFER_VIEW* pLocalView = (XGL_BUFFER_VIEW*) &pUB->pBufferViews[i]->view;
+                    XGL_BUFFER_VIEW* pLocalView = (XGL_BUFFER_VIEW*) &pUB->pBufferViews[i].view;
                     saveBufferViews.push(*pLocalView);
-                    *pLocalView = m_objMapper.remap(pUB->pBufferViews[i]->view);
+                    *pLocalView = m_objMapper.remap(pUB->pBufferViews[i].view);
                 }
                 break;
             }
             case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
-                saveDescSets.push(((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet);
-                ((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet = m_objMapper.remap(((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet);
+            {
+                saveDescSets.push(((XGL_UPDATE_AS_COPY*)pUpdateArray)->descriptorSet);
+                ((XGL_UPDATE_AS_COPY*)pUpdateArray)->descriptorSet = m_objMapper.remap(((XGL_UPDATE_AS_COPY*)pUpdateArray)->descriptorSet);
                 break;
+            }
             default:
+            {
                 assert(0);
                 break;
+            }
         }
-        pUpdateChain = (XGL_UPDATE_SAMPLERS*) pUpdateChain->pNext;
+        pUpdateArray = (XGL_UPDATE_SAMPLERS*) pUpdateArray->pNext;
     }
-    m_xglFuncs.real_xglUpdateDescriptors(m_objMapper.remap(pPacket->descriptorSet), pPacket->pUpdateChain);
-    pUpdateChain = (XGL_UPDATE_SAMPLERS*) pPacket->pUpdateChain;
-    while (pUpdateChain) {
-        switch(pUpdateChain->sType)
+    m_xglFuncs.real_xglUpdateDescriptors(m_objMapper.remap(pPacket->descriptorSet), pPacket->updateCount, pPacket->ppUpdateArray);
+    for (j = 0; j < pPacket->updateCount; j++)
+    {
+        XGL_UPDATE_SAMPLERS* pUpdateArray = (XGL_UPDATE_SAMPLERS*)pPacket->ppUpdateArray[j];
+        switch(pUpdateArray->sType)
         {
             case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
-                for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLERS*)pUpdateChain)->count; i++) {
-                    XGL_SAMPLER* pLocalSampler = (XGL_SAMPLER*) &((XGL_UPDATE_SAMPLERS*)pUpdateChain)->pSamplers[i];
+                for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLERS*)pUpdateArray)->count; i++) {
+                    XGL_SAMPLER* pLocalSampler = (XGL_SAMPLER*) &((XGL_UPDATE_SAMPLERS*)pUpdateArray)->pSamplers[i];
                     *pLocalSampler = saveSamplers.front();
                     saveSamplers.pop();
                 }
                 break;
             case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
             {
-                XGL_UPDATE_SAMPLER_TEXTURES *pUST = (XGL_UPDATE_SAMPLER_TEXTURES *) pUpdateChain;
+                XGL_UPDATE_SAMPLER_TEXTURES *pUST = (XGL_UPDATE_SAMPLER_TEXTURES *) pUpdateArray;
                 for (uint32_t i = 0; i < pUST->count; i++) {
-                    XGL_SAMPLER *plocalSampler = (XGL_SAMPLER *) &pUST->pSamplerImageViews[i].pSampler;
+                    XGL_SAMPLER *plocalSampler = (XGL_SAMPLER *) &pUST->pSamplerImageViews[i].sampler;
                     *plocalSampler = saveSamplers.front();
                     saveSamplers.pop();
                     XGL_IMAGE_VIEW *pLocalView = (XGL_IMAGE_VIEW *) &pUST->pSamplerImageViews[i].pImageView->view;
@@ -607,9 +617,9 @@
             }
             case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
             {
-                XGL_UPDATE_IMAGES *pUI = (XGL_UPDATE_IMAGES*) pUpdateChain;
+                XGL_UPDATE_IMAGES *pUI = (XGL_UPDATE_IMAGES*) pUpdateArray;
                 for (uint32_t i = 0; i < pUI->count; i++) {
-                    XGL_IMAGE_VIEW* pLocalView = (XGL_IMAGE_VIEW*) &pUI->pImageViews[i]->view;
+                    XGL_IMAGE_VIEW* pLocalView = (XGL_IMAGE_VIEW*) &pUI->pImageViews[i].view;
                     *pLocalView = saveImageViews.front();
                     saveImageViews.pop();
                 }
@@ -617,26 +627,24 @@
             }
             case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
             {
-                XGL_UPDATE_BUFFERS *pUB = (XGL_UPDATE_BUFFERS *) pUpdateChain;
+                XGL_UPDATE_BUFFERS *pUB = (XGL_UPDATE_BUFFERS *) pUpdateArray;
                 for (uint32_t i = 0; i < pUB->count; i++) {
-                    XGL_BUFFER_VIEW* pLocalView = (XGL_BUFFER_VIEW*) &pUB->pBufferViews[i]->view;
+                    XGL_BUFFER_VIEW* pLocalView = (XGL_BUFFER_VIEW*) &pUB->pBufferViews[i].view;
                     *pLocalView = saveBufferViews.front();
                     saveBufferViews.pop();
                 }
                 break;
             }
             case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
-                ((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet = saveDescSets.front();
+                ((XGL_UPDATE_AS_COPY*)pUpdateArray)->descriptorSet = saveDescSets.front();
                 saveDescSets.pop();
-                //pFreeMe = (XGL_UPDATE_SAMPLERS*)pLocalUpdateChain;
                 //pLocalUpdateChain = (void*)((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pNext;
-                //free(pFreeMe);
                 break;
             default:
                 assert(0);
                 break;
         }
-        pUpdateChain = (XGL_UPDATE_SAMPLERS*) pUpdateChain->pNext;
+        pUpdateArray = (XGL_UPDATE_SAMPLERS*) pUpdateArray->pNext;
     }
     return returnValue;
 }
@@ -645,21 +653,48 @@
 {
     XGL_RESULT replayResult = XGL_ERROR_UNKNOWN;
     glv_replay::GLV_REPLAY_RESULT returnValue = glv_replay::GLV_REPLAY_SUCCESS;
-    XGL_SAMPLER saveSampler;
-    if (pPacket->pSetLayoutInfoList != NULL) {
-        XGL_SAMPLER *pSampler = (XGL_SAMPLER *) &pPacket->pSetLayoutInfoList->immutableSampler;
-        saveSampler = pPacket->pSetLayoutInfoList->immutableSampler;
-        *pSampler = m_objMapper.remap(saveSampler);
+    XGL_SAMPLER *pSaveSampler;
+    XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO *pInfo = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO *) pPacket->pCreateInfo;
+    if (pInfo != NULL)
+    {
+        size_t bytesAlloc = 0;
+        for (unsigned int i = 0; i < pInfo->count; i++)
+        {
+            XGL_DESCRIPTOR_SET_LAYOUT_BINDING *pLayoutBind = (XGL_DESCRIPTOR_SET_LAYOUT_BINDING *) &pInfo->pBinding[i];
+            bytesAlloc += pLayoutBind->count * sizeof(XGL_SAMPLER);
+        }
+        pSaveSampler = (XGL_SAMPLER *) glv_malloc(bytesAlloc);
+        XGL_SAMPLER *pArray = pSaveSampler;
+        for (unsigned int i = 0; i < pInfo->count; i++)
+        {
+            XGL_DESCRIPTOR_SET_LAYOUT_BINDING *pLayoutBind = (XGL_DESCRIPTOR_SET_LAYOUT_BINDING *) &pInfo->pBinding[i];
+            for (unsigned int j = 0; j < pLayoutBind->count; j++)
+            {
+                XGL_SAMPLER *pOrigSampler = (XGL_SAMPLER *) pLayoutBind->pImmutableSamplers + j;
+                *pArray++ = *((XGL_SAMPLER *) pLayoutBind->pImmutableSamplers + j);
+                *pOrigSampler = m_objMapper.remap(*pOrigSampler);
+            }
+        }
     }
     XGL_DESCRIPTOR_SET_LAYOUT setLayout;
-    replayResult = m_xglFuncs.real_xglCreateDescriptorSetLayout(m_objMapper.remap(pPacket->device), pPacket->stageFlags, pPacket->pSetBindPoints, m_objMapper.remap(pPacket->priorSetLayout), pPacket->pSetLayoutInfoList, &setLayout);
+    replayResult = m_xglFuncs.real_xglCreateDescriptorSetLayout(m_objMapper.remap(pPacket->device), pPacket->pCreateInfo, &setLayout);
     if (replayResult == XGL_SUCCESS)
     {
         m_objMapper.add_to_map(pPacket->pSetLayout, &setLayout);
     }
-    if (pPacket->pSetLayoutInfoList != NULL) {
-        XGL_SAMPLER *pSampler = (XGL_SAMPLER *) &pPacket->pSetLayoutInfoList->immutableSampler;
-        *pSampler = saveSampler;
+    if (pPacket->pCreateInfo != NULL)
+    {
+        XGL_SAMPLER *pArray = pSaveSampler;
+        for (unsigned int i = 0; i < pInfo->count; i++)
+        {
+            XGL_DESCRIPTOR_SET_LAYOUT_BINDING *pLayoutBind = (XGL_DESCRIPTOR_SET_LAYOUT_BINDING *) &pInfo->pBinding[i];
+            for (unsigned int j = 0; j < pLayoutBind->count; j++)
+            {
+                XGL_SAMPLER *pOrigSampler = (XGL_SAMPLER *) pLayoutBind->pImmutableSamplers + j;
+                *pOrigSampler = *pArray++;
+            }
+        }
+        glv_free(pSaveSampler);
     }
     CHECK_RETURN_VALUE(xglCreateDescriptorSetLayout);
     return returnValue;
@@ -673,7 +708,7 @@
     struct shaderPair saveShader[10];
     unsigned int idx = 0;
     memcpy(&createInfo, pPacket->pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
-    createInfo.lastSetLayout = m_objMapper.remap(createInfo.lastSetLayout);
+    createInfo.pSetLayoutChain = m_objMapper.remap(createInfo.pSetLayoutChain);
     // Cast to shader type, as those are of primariy interest and all structs in LL have same header w/ sType & pNext
     XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pPacketNext = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*)pPacket->pCreateInfo->pNext;
     XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pNext = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*)createInfo.pNext;
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
index 96a5161..b8bdcf6 100644
--- a/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_helpers.h
+++ b/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_helpers.h
@@ -331,10 +331,20 @@
     while (pInNow != NULL)
     {
         XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO** ppOutNow = ppOutNext;
+        size_t i;
         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));
+        for (i = 0; i < pInNow->count; i++)
+        {
+            XGL_DESCRIPTOR_SET_LAYOUT_BINDING *pLayoutBinding =  (XGL_DESCRIPTOR_SET_LAYOUT_BINDING *) pInNow->pBinding + i;
+            XGL_DESCRIPTOR_SET_LAYOUT_BINDING *pOutLayoutBinding =  (XGL_DESCRIPTOR_SET_LAYOUT_BINDING *) (*ppOutNow)->pBinding + i;
+            glv_add_buffer_to_trace_packet(pHeader, (void**) &pOutLayoutBinding, sizeof(XGL_SAMPLER) * pLayoutBinding->count, pLayoutBinding->pImmutableSamplers);
+            glv_finalize_buffer_address(pHeader, (void**) &pOutLayoutBinding);
+        }
+        glv_add_buffer_to_trace_packet(pHeader, (void**)&((*ppOutNow)->pBinding), sizeof(XGL_DESCRIPTOR_SET_LAYOUT_BINDING) * pInNow->count, pInNow->pBinding);
+        glv_finalize_buffer_address(pHeader, (void**)&((*ppOutNow)->pBinding));
         pInNow = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pInNow->pNext;
     }
     return;