bug 14362: VK_NULL_HANDLE does not work in C (WIP)

Drop type safety on 32-bit.

https://cvs.khronos.org/bugzilla/show_bug.cgi?id=14362
diff --git a/vktrace/vktrace_generate.py b/vktrace/vktrace_generate.py
index f214522..415cddb 100755
--- a/vktrace/vktrace_generate.py
+++ b/vktrace/vktrace_generate.py
@@ -1213,7 +1213,7 @@
         rc_body.append('    switch (objectType) {')
         rc_body.append('        case VK_OBJECT_TYPE_BUFFER:')
         rc_body.append('        {')
-        rc_body.append('            std::map<uint64_t, bufferObj>::iterator it = m_buffers.find(handle);')
+        rc_body.append('            std::map<VkBuffer, bufferObj>::iterator it = m_buffers.find((VkBuffer) handle);')
         rc_body.append('            if (it != m_buffers.end()) {')
         rc_body.append('                objMemory obj = it->second.bufferMem;')
         rc_body.append('                obj.setCount(num);')
@@ -1223,7 +1223,7 @@
         rc_body.append('        }')
         rc_body.append('        case VK_OBJECT_TYPE_IMAGE:')
         rc_body.append('        {')
-        rc_body.append('            std::map<uint64_t, imageObj>::iterator it = m_images.find(handle);')
+        rc_body.append('            std::map<VkImage, imageObj>::iterator it = m_images.find((VkImage) handle);')
         rc_body.append('            if (it != m_images.end()) {')
         rc_body.append('                objMemory obj = it->second.imageMem;')
         rc_body.append('                obj.setCount(num);')
@@ -1240,7 +1240,7 @@
         rc_body.append('    switch (objectType) {')
         rc_body.append('        case VK_OBJECT_TYPE_BUFFER:')
         rc_body.append('        {')
-        rc_body.append('            std::map<uint64_t, bufferObj>::iterator it = m_buffers.find(handle);')
+        rc_body.append('            std::map<VkBuffer, bufferObj>::iterator it = m_buffers.find((VkBuffer) handle);')
         rc_body.append('            if (it != m_buffers.end()) {')
         rc_body.append('                objMemory obj = it->second.bufferMem;')
         rc_body.append('                obj.setReqs(pMemReqs, num);')
@@ -1250,7 +1250,7 @@
         rc_body.append('        }')
         rc_body.append('        case VK_OBJECT_TYPE_IMAGE:')
         rc_body.append('        {')
-        rc_body.append('            std::map<uint64_t, imageObj>::iterator it = m_images.find(handle);')
+        rc_body.append('            std::map<VkImage, imageObj>::iterator it = m_images.find((VkImage) handle);')
         rc_body.append('            if (it != m_images.end()) {')
         rc_body.append('                objMemory obj = it->second.imageMem;')
         rc_body.append('                obj.setReqs(pMemReqs, num);')
@@ -1270,53 +1270,47 @@
         rc_body.append('    }\n')
         disp_obj_types = [obj for obj in vulkan.object_dispatch_list]
         for var in sorted(obj_map_dict):
-            # Disp objs are pts so the obj can be map key, for non-disp objs, use uint64_t handle as map key
-            if obj_map_dict[var] in disp_obj_types:
+            if obj_map_dict[var] == 'VkImage':
+                rc_body.append(self._map_decl('VkImage', 'imageObj', var))
+                rc_body.append(self._add_to_map_decl('VkImage', 'imageObj', var))
+                rc_body.append(self._rm_from_map_decl('VkImage', var))
+                rc_body.append('    VkImage remap_images(const VkImage& value)')
+                rc_body.append('    {')
+                rc_body.append('        if (value == 0) { return 0; }')
+                rc_body.append('')
+                rc_body.append('        std::map<VkImage, imageObj>::const_iterator q = m_images.find(value);')
+                rc_body.append('        if (q == m_images.end()) { vktrace_LogError("Failed to remap VkImage."); return value; }\n')
+                rc_body.append('        return q->second.replayImage;')
+                rc_body.append('    }\n')
+            elif obj_map_dict[var] == 'VkBuffer':
+                rc_body.append(self._map_decl('VkBuffer', 'bufferObj', var))
+                rc_body.append(self._add_to_map_decl('VkBuffer', 'bufferObj', var))
+                rc_body.append(self._rm_from_map_decl('VkBuffer', var))
+                rc_body.append('    VkBuffer remap_buffers(const VkBuffer& value)')
+                rc_body.append('    {')
+                rc_body.append('        if (value == 0) { return 0; }')
+                rc_body.append('')
+                rc_body.append('        std::map<VkBuffer, bufferObj>::const_iterator q = m_buffers.find(value);')
+                rc_body.append('        if (q == m_buffers.end()) { vktrace_LogError("Failed to remap VkBuffer."); return value; }\n')
+                rc_body.append('        return q->second.replayBuffer;')
+                rc_body.append('    }\n')
+            elif obj_map_dict[var] == 'VkDeviceMemory':
+                rc_body.append(self._map_decl('VkDeviceMemory', 'gpuMemObj', var))
+                rc_body.append(self._add_to_map_decl('VkDeviceMemory', 'gpuMemObj', var))
+                rc_body.append(self._rm_from_map_decl('VkDeviceMemory', var))
+                rc_body.append('    VkDeviceMemory remap_devicememorys(const VkDeviceMemory& value)')
+                rc_body.append('    {')
+                rc_body.append('        if (value == 0) { return 0; }')
+                rc_body.append('')
+                rc_body.append('        std::map<VkDeviceMemory, gpuMemObj>::const_iterator q = m_devicememorys.find(value);')
+                rc_body.append('        if (q == m_devicememorys.end()) { vktrace_LogError("Failed to remap VkDeviceMemory."); return value; }')
+                rc_body.append('        return q->second.replayGpuMem;')
+                rc_body.append('    }\n')
+            else:
                 rc_body.append(self._map_decl(obj_map_dict[var], obj_map_dict[var], var))
                 rc_body.append(self._add_to_map_decl(obj_map_dict[var], obj_map_dict[var], var))
                 rc_body.append(self._rm_from_map_decl(obj_map_dict[var], var))
                 rc_body.append(self._remap_decl(obj_map_dict[var], var))
-            elif obj_map_dict[var] == 'VkImage':
-                rc_body.append(self._map_decl('uint64_t', 'imageObj', var))
-                rc_body.append(self._add_to_map_decl('uint64_t', 'imageObj', var))
-                rc_body.append(self._rm_from_map_decl('uint64_t', var))
-                rc_body.append('    uint64_t remap_images(const uint64_t& value)')
-                rc_body.append('    {')
-                rc_body.append('        if (value == 0) { return 0; }')
-                rc_body.append('')
-                rc_body.append('        std::map<uint64_t, imageObj>::const_iterator q = m_images.find(value);')
-                rc_body.append('        if (q == m_images.end()) { vktrace_LogError("Failed to remap VkImage."); return value; }\n')
-                rc_body.append('        return q->second.replayImage.handle;')
-                rc_body.append('    }\n')
-            elif obj_map_dict[var] == 'VkBuffer':
-                rc_body.append(self._map_decl('uint64_t', 'bufferObj', var))
-                rc_body.append(self._add_to_map_decl('uint64_t', 'bufferObj', var))
-                rc_body.append(self._rm_from_map_decl('uint64_t', var))
-                rc_body.append('    uint64_t remap_buffers(const uint64_t& value)')
-                rc_body.append('    {')
-                rc_body.append('        if (value == 0) { return 0; }')
-                rc_body.append('')
-                rc_body.append('        std::map<uint64_t, bufferObj>::const_iterator q = m_buffers.find(value);')
-                rc_body.append('        if (q == m_buffers.end()) { vktrace_LogError("Failed to remap VkBuffer."); return value; }\n')
-                rc_body.append('        return q->second.replayBuffer.handle;')
-                rc_body.append('    }\n')
-            elif obj_map_dict[var] == 'VkDeviceMemory':
-                rc_body.append(self._map_decl('uint64_t', 'gpuMemObj', var))
-                rc_body.append(self._add_to_map_decl('uint64_t', 'gpuMemObj', var))
-                rc_body.append(self._rm_from_map_decl('uint64_t', var))
-                rc_body.append('    uint64_t remap_devicememorys(const uint64_t& value)')
-                rc_body.append('    {')
-                rc_body.append('        if (value == 0) { return 0; }')
-                rc_body.append('')
-                rc_body.append('        std::map<uint64_t, gpuMemObj>::const_iterator q = m_devicememorys.find(value);')
-                rc_body.append('        if (q == m_devicememorys.end()) { vktrace_LogError("Failed to remap VkDeviceMemory."); return value; }')
-                rc_body.append('        return q->second.replayGpuMem.handle;')
-                rc_body.append('    }\n')
-            else:
-                rc_body.append(self._map_decl('uint64_t', 'uint64_t', var))
-                rc_body.append(self._add_to_map_decl('uint64_t', 'uint64_t', var))
-                rc_body.append(self._rm_from_map_decl('uint64_t', var))
-                rc_body.append(self._remap_decl('uint64_t', var))
         # VkDynamicStateObject code
 # TODO138 : Each dynamic state object is now unique so need to make sure their re-mapping is being handled correctly
 #        state_obj_remap_types = vulkan.object_dynamic_state_list
@@ -1389,33 +1383,20 @@
                         result = '            %s *remapped%s = new %s%s;\n' % (cleanParamType, paramName, cleanParamType, 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 += '                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
 
-                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)
-                    result += '%s\n' % self.lineinfo.get()
-                    result += '            if (pPacket->%s.handle != 0 && remapped%s.handle == 0)\n' % (paramName, paramName)
-                    result += '            {\n'
-                    result += '                return vktrace_replay::VKTRACE_REPLAY_ERROR;\n'
-                    result += '            }\n'
-                else:
-                    result = '            %s remapped%s = m_objMapper.remap_%ss(pPacket->%s%s);\n' % (paramType, paramName, cleanParamType.lower()[2:], paramName, objectTypeRemapParam)
-                    result += '%s\n' % self.lineinfo.get()
-                    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'
+                result = '            %s remapped%s = m_objMapper.remap_%ss(pPacket->%s%s);\n' % (paramType, paramName, cleanParamType.lower()[2:], paramName, objectTypeRemapParam)
+                result += '%s\n' % self.lineinfo.get()
+                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
         return '            // No need to remap %s' % (paramName)
 
@@ -1446,7 +1427,7 @@
         ci_body.append('            replayResult = m_vkFuncs.real_vkCreateImage(remappedDevice, pPacket->pCreateInfo, &local_imageObj.replayImage);')
         ci_body.append('            if (replayResult == VK_SUCCESS)')
         ci_body.append('            {')
-        ci_body.append('                m_objMapper.add_to_images_map(pPacket->pImage->handle, local_imageObj);')
+        ci_body.append('                m_objMapper.add_to_images_map(*(pPacket->pImage), local_imageObj);')
         ci_body.append('            }')
         return "\n".join(ci_body)
 
@@ -1461,7 +1442,7 @@
         cb_body.append('            replayResult = m_vkFuncs.real_vkCreateBuffer(remappedDevice, pPacket->pCreateInfo, &local_bufferObj.replayBuffer);')
         cb_body.append('            if (replayResult == VK_SUCCESS)')
         cb_body.append('            {')
-        cb_body.append('                m_objMapper.add_to_buffers_map(pPacket->pBuffer->handle, local_bufferObj);')
+        cb_body.append('                m_objMapper.add_to_buffers_map(*(pPacket->pBuffer), local_bufferObj);')
         cb_body.append('            }')
         return "\n".join(cb_body)
 
@@ -1579,11 +1560,11 @@
                     rbody.append('            %s createInfo;' % (proto.params[1].ty.strip('*').replace('const ', '')))
                     rbody.append('            memcpy(&createInfo, pPacket->pCreateInfo, sizeof(%s));' % (proto.params[1].ty.strip('*').replace('const ', '')))
                     if 'CreateComputePipeline' == proto.name:
-                        rbody.append('            createInfo.cs.shader.handle = m_objMapper.remap_shaders(pPacket->pCreateInfo->cs.shader.handle);')
+                        rbody.append('            createInfo.cs.shader = m_objMapper.remap_shaders(pPacket->pCreateInfo->cs.shader);')
                     elif 'CreateBufferView' == proto.name:
-                        rbody.append('            createInfo.buffer.handle = m_objMapper.remap_buffers(pPacket->pCreateInfo->buffer.handle);')
+                        rbody.append('            createInfo.buffer = m_objMapper.remap_buffers(pPacket->pCreateInfo->buffer);')
                     else:
-                        rbody.append('            createInfo.image.handle = m_objMapper.remap_images(pPacket->pCreateInfo->image.handle);')
+                        rbody.append('            createInfo.image = m_objMapper.remap_images(pPacket->pCreateInfo->image);')
                     rbody.append('            %s local_%s;' % (proto.params[-1].ty.strip('*').replace('const ', ''), proto.params[-1].name))
                 elif create_func: # Declare local var to store created handle into
                     if 'AllocDescriptorSets' == proto.name:
@@ -1592,21 +1573,21 @@
                         rbody.append('            VkDescriptorSetLayout* local_pSetLayouts = (VkDescriptorSetLayout*)malloc(pPacket->pAllocInfo->count * sizeof(VkDescriptorSetLayout));')
                         rbody.append('            VkDescriptorSetAllocInfo local_AllocInfo, *local_pAllocInfo = &local_AllocInfo;')
                         rbody.append('            VkDescriptorPool local_descPool;')
-                        rbody.append('            local_descPool.handle = m_objMapper.remap_descriptorpools(pPacket->pAllocInfo->descriptorPool.handle);')
+                        rbody.append('            local_descPool = m_objMapper.remap_descriptorpools(pPacket->pAllocInfo->descriptorPool);')
                         rbody.append('            for (uint32_t i = 0; i < pPacket->pAllocInfo->count; i++)')
                         rbody.append('            {')
-                        rbody.append('                local_pSetLayouts[i].handle = m_objMapper.remap_descriptorsetlayouts(pPacket->%s->pSetLayouts[i].handle);' % (proto.params[-2].name))
+                        rbody.append('                local_pSetLayouts[i] = m_objMapper.remap_descriptorsetlayouts(pPacket->%s->pSetLayouts[i]);' % (proto.params[-2].name))
                         rbody.append('            }')
                         rbody.append('            memcpy(local_pAllocInfo, pPacket->pAllocInfo, sizeof(VkDescriptorSetAllocInfo));')
                         rbody.append('            local_pAllocInfo->pSetLayouts = local_pSetLayouts;')
-                        rbody.append('            local_pAllocInfo->descriptorPool.handle = local_descPool.handle;')
+                        rbody.append('            local_pAllocInfo->descriptorPool = local_descPool;')
                     else:
                         rbody.append('            %s local_%s;' % (proto.params[-1].ty.strip('*').replace('const ', ''), proto.params[-1].name))
                 elif proto.name == 'ResetFences':
                     rbody.append('            VkFence* fences = VKTRACE_NEW_ARRAY(VkFence, pPacket->fenceCount);')
                     rbody.append('            for (uint32_t i = 0; i < pPacket->fenceCount; i++)')
                     rbody.append('            {')
-                    rbody.append('                fences[i].handle = m_objMapper.remap_fences(pPacket->%s[i].handle);' % (proto.params[-1].name))
+                    rbody.append('                fences[i] = m_objMapper.remap_fences(pPacket->%s[i]);' % (proto.params[-1].name))
                     rbody.append('            }')
                 elif proto.name in do_while_dict:
                     rbody.append('            do {')
@@ -1696,7 +1677,7 @@
                 elif 'DestroySwapchainKHR' in proto.name:
                     rbody.append('            if (replayResult == VK_SUCCESS)')
                     rbody.append('            {')
-                    rbody.append('                m_objMapper.rm_from_swapchainkhrs_map(pPacket->swapchain.handle);')
+                    rbody.append('                m_objMapper.rm_from_swapchainkhrs_map(pPacket->swapchain);')
                     rbody.append('            }')
                 elif 'DestroyInstance' in proto.name:
                     rbody.append('            if (replayResult == VK_SUCCESS)')
@@ -1715,7 +1696,7 @@
                     rbody.append('            if (replayResult == VK_SUCCESS)')
                     rbody.append('            {')
                     rbody.append('                for (uint32_t i = 0; i < pPacket->pAllocInfo->count; i++) {')
-                    rbody.append('                    m_objMapper.add_to_descriptorsets_map(pPacket->%s[i].handle, local_%s[i].handle);' % (proto.params[-1].name, proto.params[-1].name))
+                    rbody.append('                    m_objMapper.add_to_descriptorsets_map(pPacket->%s[i], local_%s[i]);' % (proto.params[-1].name, proto.params[-1].name))
                     rbody.append('                }')
                     rbody.append('            }')
                     rbody.append('            free(local_pSetLayouts);')
@@ -1728,10 +1709,7 @@
                         rbody.append('            {')
                     clean_type = proto.params[-1].ty.strip('*').replace('const ', '')
                     VkNonDispObjType = [o for o in vulkan.object_non_dispatch_list]
-                    if clean_type in VkNonDispObjType:
-                        rbody.append('                m_objMapper.add_to_%ss_map(pPacket->%s->handle, local_%s.handle);' % (clean_type.lower()[2:], proto.params[-1].name, proto.params[-1].name))
-                    else:
-                        rbody.append('                m_objMapper.add_to_%ss_map(*(pPacket->%s), local_%s);' % (clean_type.lower()[2:], proto.params[-1].name, proto.params[-1].name))
+                    rbody.append('                m_objMapper.add_to_%ss_map(*(pPacket->%s), local_%s);' % (clean_type.lower()[2:], proto.params[-1].name, proto.params[-1].name))
                     if 'AllocMemory' == proto.name:
                         rbody.append('                m_objMapper.add_entry_to_mapData(local_%s, pPacket->pAllocInfo->allocationSize);' % (proto.params[-1].name))
                     if ret_value: