glave: Replay for UpdateDescriptor handle multiple replays

The local chain copy had embedded pointers into the original chain. So
multiple replays/remaps weren't working.  Simplify code to just save a queue
of the actaul objects that need to be remapped  and restore them  after making
the call to xglUpdateDescriptors().
diff --git a/glave-generate.py b/glave-generate.py
index 88db3f8..a136cec 100755
--- a/glave-generate.py
+++ b/glave-generate.py
@@ -2691,96 +2691,123 @@
 
     def _gen_replay_update_descriptors(self):
         ud_body = []
-        # TODO : Add code here to read chain of update structs
-        #  We have to remap handles internal to the structures so make complete local copy of update chain
-        #   and remap all of the handles inside of the update structs
+        # 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
         ud_body.append('            XGL_UPDATE_SAMPLERS* pUpdateChain = (XGL_UPDATE_SAMPLERS*)pPacket->pUpdateChain;')
-        ud_body.append('            void* pLocalUpdateChain = NULL;')
-        ud_body.append('            XGL_UPDATE_SAMPLERS* pPrev = NULL;')
-        ud_body.append('            void* pLocalUpdateChainHEAD = NULL;')
-        ud_body.append('            size_t blockSize = 0;')
+        ud_body.append('            std::queue<XGL_SAMPLER> saveSamplers;')
+        ud_body.append('            std::queue<XGL_BUFFER_VIEW> saveBufferViews;')
+        ud_body.append('            std::queue<XGL_IMAGE_VIEW> saveImageViews;')
+        ud_body.append('            std::queue<XGL_DESCRIPTOR_SET> saveDescSets;')
         ud_body.append('            while (pUpdateChain) {')
         ud_body.append('                switch(pUpdateChain->sType)')
         ud_body.append('                {')
         ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:')
-        ud_body.append('                        blockSize = sizeof(XGL_UPDATE_SAMPLERS) + ((XGL_UPDATE_SAMPLERS*)pUpdateChain)->count * sizeof(XGL_SAMPLER);')
-        ud_body.append('                        pLocalUpdateChain = (void*)malloc(blockSize);')
-        ud_body.append('                        memcpy(pLocalUpdateChain, pUpdateChain, blockSize);')
-        ud_body.append('                        for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->count; i++) {')
-        ud_body.append('                            XGL_SAMPLER* pLocalSampler = (XGL_SAMPLER*) &((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pSamplers[i];')
+        ud_body.append('                        for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLERS*)pUpdateChain)->count; i++) {')
+        ud_body.append('                            XGL_SAMPLER* pLocalSampler = (XGL_SAMPLER*) &((XGL_UPDATE_SAMPLERS*)pUpdateChain)->pSamplers[i];')
+        ud_body.append('                            saveSamplers.push(*pLocalSampler);')
         ud_body.append('                            *pLocalSampler = remap(((XGL_UPDATE_SAMPLERS*)pUpdateChain)->pSamplers[i]);')
         ud_body.append('                        }')
         ud_body.append('                        break;')
         ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:')
-        ud_body.append('                        blockSize = sizeof(XGL_UPDATE_SAMPLER_TEXTURES) + ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateChain)->count * (sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) + sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));')
-        ud_body.append('                        XGL_UPDATE_SAMPLER_TEXTURES *pLocalUST;')
-        ud_body.append('                        pLocalUST = (XGL_UPDATE_SAMPLER_TEXTURES *)malloc(blockSize);')
-        ud_body.append('                        memcpy(pLocalUST, pUpdateChain, blockSize);')
-        ud_body.append('                        for (uint32_t i = 0; i < pLocalUST->count; i++) {')
-        ud_body.append('                            XGL_SAMPLER *plocalSampler = (XGL_SAMPLER *) &pLocalUST->pSamplerImageViews[i].pSampler; ')
-        ud_body.append('                            *plocalSampler = remap(((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateChain)->pSamplerImageViews[i].pSampler);')
-        ud_body.append('                            XGL_IMAGE_VIEW *pLocalView = (XGL_IMAGE_VIEW *)&pLocalUST->pSamplerImageViews[i].pImageView->view; ')
-        ud_body.append('                            *pLocalView = remap(((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateChain)->pSamplerImageViews[i].pImageView->view);')
+        ud_body.append('                    {')
+        ud_body.append('                        XGL_UPDATE_SAMPLER_TEXTURES *pUST = (XGL_UPDATE_SAMPLER_TEXTURES *) pUpdateChain;')
+        ud_body.append('                        for (uint32_t i = 0; i < pUST->count; i++) {')
+        ud_body.append('                            XGL_SAMPLER *pLocalSampler = (XGL_SAMPLER *) &pUST->pSamplerImageViews[i].pSampler;')
+        ud_body.append('                            saveSamplers.push(*pLocalSampler);')
+        ud_body.append('                            *pLocalSampler = remap(pUST->pSamplerImageViews[i].pSampler);')
+        ud_body.append('                            XGL_IMAGE_VIEW *pLocalView = (XGL_IMAGE_VIEW *) &pUST->pSamplerImageViews[i].pImageView->view;')
+        ud_body.append('                            saveImageViews.push(*pLocalView);')
+        ud_body.append('                            *pLocalView = remap(pUST->pSamplerImageViews[i].pImageView->view);')
         ud_body.append('                        }')
-        ud_body.append('                        pLocalUpdateChain = (void *) pLocalUST;')
         ud_body.append('                        break;')
+        ud_body.append('                    }')
         ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:')
-        ud_body.append('                        blockSize = sizeof(XGL_UPDATE_IMAGES) + (((XGL_UPDATE_IMAGES*)pUpdateChain)->count * (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*) + sizeof(XGL_IMAGE_VIEW_ATTACH_INFO)));')
-        ud_body.append('                        pLocalUpdateChain = malloc(blockSize);')
-        ud_body.append('                        memcpy(pLocalUpdateChain, pUpdateChain, blockSize);')
-        ud_body.append('                        for (uint32_t i = 0; i < ((XGL_UPDATE_IMAGES*)pLocalUpdateChain)->count; i++) {')
-        ud_body.append('                            XGL_IMAGE_VIEW* pLocalView = (XGL_IMAGE_VIEW*) &((XGL_UPDATE_IMAGES*)pUpdateChain)->pImageViews[i]->view;')
-        ud_body.append('                            *pLocalView = remap(((XGL_UPDATE_IMAGES*)pUpdateChain)->pImageViews[i]->view);')
+        ud_body.append('                    {')
+        ud_body.append('                        XGL_UPDATE_IMAGES *pUI = (XGL_UPDATE_IMAGES*) pUpdateChain;')
+        ud_body.append('                        for (uint32_t i = 0; i < pUI->count; i++) {')
+        ud_body.append('                            XGL_IMAGE_VIEW* pLocalView = (XGL_IMAGE_VIEW*) &pUI->pImageViews[i]->view;')
+        ud_body.append('                            saveImageViews.push(*pLocalView);')
+        ud_body.append('                            *pLocalView = remap(pUI->pImageViews[i]->view);')
         ud_body.append('                        }')
         ud_body.append('                        break;')
+        ud_body.append('                    }')
         ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:')
-        ud_body.append('                        blockSize = sizeof(XGL_UPDATE_BUFFERS) + (((XGL_UPDATE_BUFFERS*)pUpdateChain)->count * (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*) + sizeof(XGL_BUFFER_VIEW_ATTACH_INFO)));')
-        ud_body.append('                        pLocalUpdateChain = malloc(blockSize);')
-        ud_body.append('                        memcpy(pLocalUpdateChain, pUpdateChain, blockSize);')
-        ud_body.append('                        for (uint32_t i = 0; i < ((XGL_UPDATE_BUFFERS*)pLocalUpdateChain)->count; i++) {')
-        ud_body.append('                            XGL_BUFFER_VIEW* pLocalView = (XGL_BUFFER_VIEW*) &((XGL_UPDATE_BUFFERS*)pUpdateChain)->pBufferViews[i]->view;')
-        ud_body.append('                            *pLocalView = remap(((XGL_UPDATE_BUFFERS*)pUpdateChain)->pBufferViews[i]->view);')
+        ud_body.append('                    {')
+        ud_body.append('                        XGL_UPDATE_BUFFERS *pUB = (XGL_UPDATE_BUFFERS *) pUpdateChain;')
+        ud_body.append('                        for (uint32_t i = 0; i < pUB->count; i++) {')
+        ud_body.append('                            XGL_BUFFER_VIEW* pLocalView = (XGL_BUFFER_VIEW*) &pUB->pBufferViews[i]->view;')
+        ud_body.append('                            saveBufferViews.push(*pLocalView);')
+        ud_body.append('                            *pLocalView = remap(pUB->pBufferViews[i]->view);')
         ud_body.append('                        }')
         ud_body.append('                        break;')
+        ud_body.append('                    }')
         ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:')
-        ud_body.append('                        blockSize += sizeof(XGL_UPDATE_AS_COPY);')
-        ud_body.append('                        pLocalUpdateChain = malloc(blockSize);')
-        ud_body.append('                        memcpy(pLocalUpdateChain, pUpdateChain, blockSize);')
-        ud_body.append('                        ((XGL_UPDATE_AS_COPY*)pLocalUpdateChain)->descriptorSet = remap(((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet);')
+        ud_body.append('                        saveDescSets.push(((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet);')
+        ud_body.append('                        ((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet = remap(((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet);')
         ud_body.append('                        break;')
         ud_body.append('                    default:')
-        ud_body.append('                        // TODO : Flag error here')
+        ud_body.append('                        assert(0);')
         ud_body.append('                        break;')
         ud_body.append('                }')
-        ud_body.append('                if (NULL == pLocalUpdateChainHEAD) {')
-        ud_body.append('                    pLocalUpdateChainHEAD = pLocalUpdateChain;')
-        ud_body.append('                }')
-        ud_body.append('                if (pPrev) {')
-        ud_body.append('                    pPrev->pNext = pLocalUpdateChain;')
-        ud_body.append('                }')
-        ud_body.append('                pPrev = (XGL_UPDATE_SAMPLERS*)pLocalUpdateChain;')
-        ud_body.append('                pUpdateChain = (XGL_UPDATE_SAMPLERS*)pUpdateChain->pNext;')
+        ud_body.append('                pUpdateChain = (XGL_UPDATE_SAMPLERS*) pUpdateChain->pNext;')
         ud_body.append('            }')
-        ud_body.append('            m_xglFuncs.real_xglUpdateDescriptors(remap(pPacket->descriptorSet), pLocalUpdateChainHEAD);')
-        ud_body.append('            pLocalUpdateChain = (XGL_UPDATE_SAMPLERS*)pLocalUpdateChainHEAD;')
-        ud_body.append('            XGL_UPDATE_SAMPLERS* pFreeMe = NULL;')
-        ud_body.append('            while (pLocalUpdateChain) {')
-        ud_body.append('                switch(((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->sType)')
+        ud_body.append('            m_xglFuncs.real_xglUpdateDescriptors(remap(pPacket->descriptorSet), pPacket->pUpdateChain);')
+        ud_body.append('            pUpdateChain = (XGL_UPDATE_SAMPLERS*) pPacket->pUpdateChain;')
+        ud_body.append('            while (pUpdateChain) {')
+        ud_body.append('                switch(pUpdateChain->sType)')
         ud_body.append('                {')
         ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:')
-        ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:')
-        ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:')
-        ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:')
+        ud_body.append('                        for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLERS*)pUpdateChain)->count; i++) {')
+        ud_body.append('                            XGL_SAMPLER* pLocalSampler = (XGL_SAMPLER*) &((XGL_UPDATE_SAMPLERS*)pUpdateChain)->pSamplers[i];')
+        ud_body.append('                            *pLocalSampler = saveSamplers.front();')
+        ud_body.append('                            saveSamplers.pop();')
+        ud_body.append('                        }')
+        ud_body.append('                        break;')
         ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:')
-        ud_body.append('                        pFreeMe = (XGL_UPDATE_SAMPLERS*)pLocalUpdateChain;')
-        ud_body.append('                        pLocalUpdateChain = (void*)((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pNext;')
-        ud_body.append('                        free(pFreeMe);')
+        ud_body.append('                    {')
+        ud_body.append('                        XGL_UPDATE_SAMPLER_TEXTURES *pUST = (XGL_UPDATE_SAMPLER_TEXTURES *) pUpdateChain;')
+        ud_body.append('                        for (uint32_t i = 0; i < pUST->count; i++) {')
+        ud_body.append('                            XGL_SAMPLER *plocalSampler = (XGL_SAMPLER *) &pUST->pSamplerImageViews[i].pSampler;')
+        ud_body.append('                            *plocalSampler = saveSamplers.front();')
+        ud_body.append('                            saveSamplers.pop();')
+        ud_body.append('                            XGL_IMAGE_VIEW *pLocalView = (XGL_IMAGE_VIEW *) &pUST->pSamplerImageViews[i].pImageView->view;')
+        ud_body.append('                            *pLocalView = saveImageViews.front();')
+        ud_body.append('                            saveImageViews.pop();')
+        ud_body.append('                        }')
+        ud_body.append('                        break;')
+        ud_body.append('                    }')
+        ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:')
+        ud_body.append('                    {')
+        ud_body.append('                        XGL_UPDATE_IMAGES *pUI = (XGL_UPDATE_IMAGES*) pUpdateChain;')
+        ud_body.append('                        for (uint32_t i = 0; i < pUI->count; i++) {')
+        ud_body.append('                            XGL_IMAGE_VIEW* pLocalView = (XGL_IMAGE_VIEW*) &pUI->pImageViews[i]->view;')
+        ud_body.append('                            *pLocalView = saveImageViews.front();')
+        ud_body.append('                            saveImageViews.pop();')
+        ud_body.append('                        }')
+        ud_body.append('                        break;')
+        ud_body.append('                    }')
+        ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:')
+        ud_body.append('                    {')
+        ud_body.append('                        XGL_UPDATE_BUFFERS *pUB = (XGL_UPDATE_BUFFERS *) pUpdateChain;')
+        ud_body.append('                        for (uint32_t i = 0; i < pUB->count; i++) {')
+        ud_body.append('                            XGL_BUFFER_VIEW* pLocalView = (XGL_BUFFER_VIEW*) &pUB->pBufferViews[i]->view;')
+        ud_body.append('                            *pLocalView = saveBufferViews.front();')
+        ud_body.append('                            saveBufferViews.pop();')
+        ud_body.append('                        }')
+        ud_body.append('                        break;')
+        ud_body.append('                    }')
+        ud_body.append('                    case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:')
+        ud_body.append('                        ((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet = saveDescSets.front();')
+        ud_body.append('                        saveDescSets.pop();')
+        ud_body.append('                        //pFreeMe = (XGL_UPDATE_SAMPLERS*)pLocalUpdateChain;')
+        ud_body.append('                        //pLocalUpdateChain = (void*)((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pNext;')
+        ud_body.append('                        //free(pFreeMe);')
         ud_body.append('                        break;')
         ud_body.append('                    default:')
-        ud_body.append('                        // TODO : Flag error here')
-        ud_body.append('                        pLocalUpdateChain = (void*)((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pNext;')
+        ud_body.append('                        assert(0);')
         ud_body.append('                        break;')
         ud_body.append('                }')
+        ud_body.append('                pUpdateChain = (XGL_UPDATE_SAMPLERS*) pUpdateChain->pNext;')
         ud_body.append('            }')
         return "\n".join(ud_body)
 
@@ -3565,6 +3592,7 @@
         header_txt.append('#include "glvreplay_xgl_write_ppm.h"\n')
         header_txt.append('#include "glvreplay_main.h"\n')
         header_txt.append('#include <algorithm>')
+        header_txt.append('#include <queue>')
         header_txt.append('extern glvreplay_settings *g_pReplaySettings;')
         header_txt.append('extern "C" {')
         header_txt.append('#include "glvtrace_xgl_xgl_structs.h"')