vktrace: Make codegen remap arrays of objects
diff --git a/vktrace/vktrace_generate.py b/vktrace/vktrace_generate.py
index 3dcbc4b..446015e 100755
--- a/vktrace/vktrace_generate.py
+++ b/vktrace/vktrace_generate.py
@@ -1327,7 +1327,7 @@
         rif_body.append('}')
         return "\n".join(rif_body)
 
-    def _remap_packet_param(self, funcName, paramType, paramName):
+    def _remap_packet_param(self, funcName, paramType, paramName, lastName):
         remap_list = vulkan.object_type_list
         param_exclude_list = ['pDescriptorSets', 'pFences']
         cleanParamType = paramType.strip('*').replace('const ', '')
@@ -1344,16 +1344,34 @@
                         objectTypeRemapParam = ', pPacket->objType'
                 elif 'srcObject' == paramName and 'Callback' in funcName:
                     objectTypeRemapParam = ', pPacket->objType'
+                pArray = ''
                 if '*' in paramType:
-                    if 'const ' not in paramType:
-                        result = '            %s remapped%s = m_objMapper.remap_%ss(*pPacket->%s%s);\n' % (cleanParamType, paramName, paramName.lower(), paramName, objectTypeRemapParam)
-                        result += '            if (pPacket->%s != VK_NULL_HANDLE && remapped%s == VK_NULL_HANDLE)\n' % (paramName, paramName)
-                        result += '            {\n'
-                        result += '                return vktrace_replay::VKTRACE_REPLAY_ERROR;\n'
+                    if 'const' not in paramType:
+                        result = '        %s remapped%s = m_objMapper.remap_%ss(*pPacket->%s%s);\n' % (cleanParamType, paramName, paramName.lower(), paramName, objectTypeRemapParam)
+                        result += '        if (pPacket->%s != VK_NULL_HANDLE && remapped%s == VK_NULL_HANDLE)\n' % (paramName, paramName)
+                        result += '        {\n'
+                        result += '            return vktrace_replay::VKTRACE_REPLAY_ERROR;\n'
+                        result += '        }\n'
+                        return result
+                    else:
+                        if lastName == '':
+                            return '            // pPacket->%s should have been remapped with special case code' % (paramName)
+                        pArray = '[pPacket->%s]' % lastName
+                        result = '            %s remapped%s%s;\n' % (cleanParamType, paramName, pArray)
+                        result += '%s\n' % self.lineinfo.get()
+                        result += '            for (uint32_t i = 0; i < pPacket->%s; i++) {\n' % lastName
+                        if cleanParamType in  VulkNonDispObjects:
+                            result += '                remapped%s[i].handle = m_objMapper.remap_%ss(pPacket->%s[i]%s.handle);\n' % (paramName, cleanParamType.lower()[2:], paramName, objectTypeRemapParam)
+                            result += '                if (pPacket->%s[i].handle != 0 && remapped%s[i].handle == 0)\n' % (paramName, paramName)
+                        else:
+                            result += '                remapped%s[i] = m_objMapper.remap_%ss(pPacket->%s[i]%s);\n' % (paramName, cleanParamType.lower()[2:], paramName, objectTypeRemapParam)
+                            result += '                if (pPacket->%s[i] != VK_NULL_HANDLE && remapped%s[i] == VK_NULL_HANDLE)\n' % (paramName, paramName)
+                        result += '                {\n'
+                        result += '                    return vktrace_replay::VKTRACE_REPLAY_ERROR;\n'
+                        result += '                }\n'
                         result += '            }\n'
                         return result
-                    else: # TODO : Don't remap array ptrs?
-                        return '            // pPacket->%s should have been remapped with special case code' % (paramName)
+
                 if paramType in VulkNonDispObjects:
                     result = '            %s remapped%s;\n' % (paramType, paramName)
                     result += '            remapped%s.handle = m_objMapper.remap_%ss(pPacket->%s%s.handle);\n' % (paramName, cleanParamType.lower()[2:], paramName, objectTypeRemapParam)
@@ -1385,11 +1403,6 @@
                         objectTypeRemapParam = ', VKTRACE_VK_OBJECT_TYPE_UNKNOWN'
                     else:
                         objectTypeRemapParam = ', pPacket->objType'
-                if '*' in paramType:
-                    if 'const ' not in paramType:
-                        return 'remapped%s' % (paramName)
-                    else: # TODO : Don't remap array ptrs?
-                        return 'pPacket->%s' % (paramName)
                 return 'remapped%s' % (paramName)
         return 'pPacket->%s' % (paramName)
 
@@ -1568,13 +1581,14 @@
                     rbody.append('            }')
                 elif proto.name in do_while_dict:
                     rbody.append('            do {')
-
+                last_name = ''
                 for p in proto.params:
                     if create_func or create_view:
                         if p.name != proto.params[-1].name:
-                            rbody.append(self._remap_packet_param(proto.name, p.ty, p.name))
+                            rbody.append(self._remap_packet_param(proto.name, p.ty, p.name, last_name))
                     else:
-                        rbody.append(self._remap_packet_param(proto.name, p.ty, p.name))
+                        rbody.append(self._remap_packet_param(proto.name, p.ty, p.name, last_name))
+                    last_name = p.name
 
                 if proto.name == 'DestroyInstance':
                     rbody.append('            if (m_vkFuncs.real_vkDbgDestroyMsgCallback != NULL)')