scripts: Add external/internal object type xlation

Change-Id: Ib621d93069912bac6bbdc643c02fe6b711803c6f
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index bb323da..a4afbe9 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -84,6 +84,8 @@
         self.structTypes = dict()                         # Map of Vulkan struct typename to required VkStructureType
         self.structMembers = []                           # List of StructMemberData records for all Vulkan structs
         self.object_types = []                            # List of all handle types
+        self.debug_report_object_types = []               # Handy copy of debug_report_object_type enum data
+
         # Named tuples to store struct and command data
         self.StructType = namedtuple('StructType', ['name', 'value'])
         self.CommandParam = namedtuple('CommandParam', ['type', 'name', 'ispointer', 'isstaticarray', 'isconst', 'iscount', 'len', 'extstructs', 'cdecl'])
@@ -152,6 +154,11 @@
                     value_list.append(item_name)
             if value_list is not None:
                 self.enum_output += self.GenerateEnumStringConversion(groupName, value_list)
+        elif self.helper_file_type == 'object_types_header' and groupName == 'VkDebugReportObjectTypeEXT':
+            for elem in groupElem.findall('enum'):
+                if elem.get('supported') != 'disabled':
+                    item_name = elem.get('name')
+                    self.debug_report_object_types.append(item_name)
     #
     # Called for each type -- if the type is a struct/union, grab the metadata
     def genType(self, typeinfo, name):
@@ -519,24 +526,54 @@
         object_types_helper_header = '\n'
         object_types_helper_header += '#pragma once\n'
         object_types_helper_header += '\n'
+        object_types_helper_header += '#include <vulkan/vulkan.h>\n\n'
         object_types_helper_header += self.GenerateObjectTypesHeader()
         return object_types_helper_header
     #
     # Object types header: create object enum type header file
     def GenerateObjectTypesHeader(self):
-        object_types_header = ''
+        object_types_header = '// Object Type enum for validation layer internal object handling\n'
         object_types_header += 'typedef enum VulkanObjectType {\n'
         object_types_header += '    kVulkanObjectTypeUnknown = 0,\n'
         enum_num = 1
+        type_list = [];
 
+        # Output enum definition as each handle is processed, saving the names to use for the conversion routine
         for item in self.object_types:
             fixup_name = item[2:]
-            object_types_header += '    kVulkanObjectType%s' % fixup_name
+            enum_entry = 'kVulkanObjectType%s' % fixup_name
+            object_types_header += '    ' + enum_entry
             object_types_header += ' = %d,\n' % enum_num
             enum_num += 1
+            type_list.append(enum_entry)
         object_types_header += '    kVulkanObjectTypeMax = %d,\n' % enum_num
         object_types_header += '} VulkanObjectType;\n'
 
+        # Output a conversion routine from the layer object definitions to the debug report definitions
+        object_types_header += '\n\n'
+        object_types_header += '// Helper function to get Official Vulkan object type enum from the internal layers version\n'
+        object_types_header += 'VkDebugReportObjectTypeEXT GetDebugReportEnum(VulkanObjectType object_type) {\n\n'
+        object_types_header += '    switch (object_type) {\n'
+        object_types_header += '        case kVulkanObjectTypeUnknown:\n'
+        object_types_header += '            return VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;\n\n'
+        for object_type in type_list:
+            done = False
+            object_types_header += '        case %s:\n' % object_type
+            search_type = object_type.replace("kVulkanObjectType", "").lower()
+            for vk_object_type in self.debug_report_object_types:
+                target_type = vk_object_type.replace("VK_DEBUG_REPORT_OBJECT_TYPE_", "").lower()
+                target_type = target_type[:-4]
+                target_type = target_type.replace("_", "")
+                if search_type == target_type:
+                    object_types_header += '            return %s;\n\n' % vk_object_type
+                    done = True
+                    break
+            if done == False:
+                    object_types_header += '            return VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;\n\n'
+        object_types_header += '        default:\n'
+        object_types_header += '            return VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;\n\n'
+        object_types_header += '    }\n'
+        object_types_header += '}\n'
         return object_types_header
     #
     # Determine if a structure needs a safe_struct helper function