scripts: Move handle comparisons into common

Consolidate the VK_DEFINE_HANDLE and VK_DEFINE_NON_DISPATCHABLE_HANDLE
string comparisons into common_codegen.py

Change-Id: Ie3df0ba5dc5345bbbc755d59a0783378c48f1149
diff --git a/scripts/common_codegen.py b/scripts/common_codegen.py
index a3d95e7..7aa7cee 100644
--- a/scripts/common_codegen.py
+++ b/scripts/common_codegen.py
@@ -73,7 +73,14 @@
 
 # Return a dict containing the dispatchable/non-dispatchable type of every handle
 def GetHandleTypes(tree):
-    handles = OrderedDict()
+    # Extend OrderedDict with common handle operations
+    class HandleDict(OrderedDict):
+        def IsDispatchable(self, handle_type):
+            return self.get(handle_type) == 'VK_DEFINE_HANDLE'
+        def IsNonDispatchable(self, handle_type):
+            return self.get(handle_type) == 'VK_DEFINE_NON_DISPATCHABLE_HANDLE'
+
+    handles = HandleDict()
     for elem in tree.findall("types/type/[@category='handle']"):
         if not elem.get('alias'):
             name = elem.get('name')
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index 2a8c2fd..93af5d8 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -304,17 +304,17 @@
     # non-dispatchable (dispatchable = False) handle
     def TypeContainsObjectHandle(self, handle_type, dispatchable):
         if dispatchable:
-            type_key = 'VK_DEFINE_HANDLE'
+            type_check = self.handle_types.IsDispatchable
         else:
-            type_key = 'VK_DEFINE_NON_DISPATCHABLE_HANDLE'
-        if self.handle_types.get(handle_type) == type_key:
+            type_check = self.handle_types.IsNonDispatchable
+        if type_check(handle_type):
             return True
         # if handle_type is a struct, search its members
         if handle_type in self.structNames:
             member_index = next((i for i, v in enumerate(self.structMembers) if v[0] == handle_type), None)
             if member_index is not None:
                 for item in self.structMembers[member_index].members:
-                    if self.handle_types.get(item.type) == type_key:
+                    if type_check(item.type):
                         return True
         return False
     #
@@ -687,7 +687,7 @@
             type_list.append(enum_entry)
             object_type_info[enum_entry] = { 'VkType': item }
             # We'll want lists of the dispatchable and non dispatchable handles below with access to the same info
-            if self.handle_types.get(item) == 'VK_DEFINE_NON_DISPATCHABLE_HANDLE':
+            if self.handle_types.IsNonDispatchable(item):
                 non_dispatchable[item] = enum_entry
             else:
                 dispatchable[item] = enum_entry
diff --git a/scripts/layer_chassis_dispatch_generator.py b/scripts/layer_chassis_dispatch_generator.py
index 59875d5..897c005 100644
--- a/scripts/layer_chassis_dispatch_generator.py
+++ b/scripts/layer_chassis_dispatch_generator.py
@@ -1183,10 +1183,6 @@
                 ispointer = True
         return ispointer
     #
-    # Check if a parent object is dispatchable or not
-    def isHandleTypeNonDispatchable(self, handletype):
-        return self.handle_types.get(handletype) == 'VK_DEFINE_NON_DISPATCHABLE_HANDLE'
-    #
     # Retrieve the type and name for a parameter
     def getTypeNameTuple(self, param):
         type = ''
@@ -1284,7 +1280,7 @@
         struct_members = struct_member_dict[struct_item]
 
         for member in struct_members:
-            if self.isHandleTypeNonDispatchable(member.type):
+            if self.handle_types.IsNonDispatchable(member.type):
                 return True
             elif member.type in struct_member_dict:
                 if self.struct_contains_ndo(member.type) == True:
@@ -1311,7 +1307,7 @@
         else:
             member_list = item_list
         for item in member_list:
-            if self.isHandleTypeNonDispatchable(paramtype.text):
+            if self.handle_types.IsNonDispatchable(paramtype.text):
                 ndo_list.add(item)
         return ndo_list
     #
@@ -1414,7 +1410,7 @@
     def generate_create_ndo_code(self, indent, proto, params, cmd_info):
         create_ndo_code = ''
         handle_type = params[-1].find('type')
-        if self.isHandleTypeNonDispatchable(handle_type.text):
+        if self.handle_types.IsNonDispatchable(handle_type.text):
             # Check for special case where multiple handles are returned
             ndo_array = False
             if cmd_info[-1].len is not None:
@@ -1447,7 +1443,7 @@
                 param = -1
             else:
                 param = -2
-            if self.isHandleTypeNonDispatchable(cmd_info[param].type) == True:
+            if self.handle_types.IsNonDispatchable(cmd_info[param].type):
                 if ndo_array == True:
                     # This API is freeing an array of handles.  Remove them from the unique_id map.
                     destroy_ndo_code += '%sif ((VK_SUCCESS == result) && (%s)) {\n' % (indent, cmd_info[param].name)
@@ -1544,7 +1540,7 @@
         for member in members:
             process_pnext = self.StructWithExtensions(member.type)
             # Handle NDOs
-            if self.isHandleTypeNonDispatchable(member.type) == True:
+            if self.handle_types.IsNonDispatchable(member.type):
                 count_name = member.len
                 if (count_name is not None):
                     if first_level_param == False:
@@ -1697,7 +1693,7 @@
             ispointer = self.paramIsPointer(member)
             # Mark param as local if it is an array of NDOs
             islocal = False;
-            if self.isHandleTypeNonDispatchable(type) == True:
+            if self.handle_types.IsNonDispatchable(type):
                 if (len is not None) and (isconst == True):
                     islocal = True
             # Or if it's a struct that contains an NDO
diff --git a/scripts/layer_chassis_generator.py b/scripts/layer_chassis_generator.py
index ca9c31b..d53ad4d 100644
--- a/scripts/layer_chassis_generator.py
+++ b/scripts/layer_chassis_generator.py
@@ -1500,19 +1500,10 @@
                 ispointer = True
         return ispointer
 
-    # Check if an object is a non-dispatchable handle
-    def isHandleTypeNonDispatchable(self, handletype):
-        return self.handle_types.get(handletype) == 'VK_DEFINE_NON_DISPATCHABLE_HANDLE'
-
-    # Check if an object is a dispatchable handle
-    def isHandleTypeDispatchable(self, handletype):
-        return self.handle_types.get(handletype) == 'VK_DEFINE_HANDLE'
     #
     #
     def beginFile(self, genOpts):
         OutputGenerator.beginFile(self, genOpts)
-        # Initialize members that require the tree
-        self.handle_types = GetHandleTypes(self.registry.tree)
         # Output Copyright
         write(self.inline_copyright_message, file=self.outFile)
         # Multiple inclusion protection
diff --git a/scripts/object_tracker_generator.py b/scripts/object_tracker_generator.py
index e0a2afa..a435d0e 100644
--- a/scripts/object_tracker_generator.py
+++ b/scripts/object_tracker_generator.py
@@ -301,7 +301,7 @@
         output_func += '    bool skip = false;\n'
         output_func += '    skip |= DeviceReportUndestroyedObjects(device, kVulkanObjectTypeCommandBuffer, error_code);\n'
         for handle in self.object_types:
-            if self.isHandleTypeNonDispatchable(handle):
+            if self.handle_types.IsNonDispatchable(handle):
                 output_func += '    skip |= DeviceReportUndestroyedObjects(device, %s, error_code);\n' % (self.GetVulkanObjType(handle))
         output_func += '    return skip;\n'
         output_func += '}\n'
@@ -314,7 +314,7 @@
         output_func += 'void ObjectLifetimes::DestroyUndestroyedObjects(VkDevice device) {\n'
         output_func += '    DeviceDestroyUndestroyedObjects(device, kVulkanObjectTypeCommandBuffer);\n'
         for handle in self.object_types:
-            if self.isHandleTypeNonDispatchable(handle):
+            if self.handle_types.IsNonDispatchable(handle):
                 output_func += '    DeviceDestroyUndestroyedObjects(device, %s);\n' % (self.GetVulkanObjType(handle))
         output_func += '}\n'
         return output_func
@@ -502,14 +502,6 @@
                 ispointer = True
         return ispointer
     #
-    # Check if a parent object is dispatchable or not
-    def isHandleTypeObject(self, handletype):
-        return handletype in self.handle_types
-    #
-    # Check if a parent object is dispatchable or not
-    def isHandleTypeNonDispatchable(self, handletype):
-        return self.handle_types.get(handletype) == 'VK_DEFINE_NON_DISPATCHABLE_HANDLE'
-    #
     # Retrieve the type and name for a parameter
     def getTypeNameTuple(self, param):
         type = ''
@@ -604,7 +596,7 @@
         struct_members = struct_member_dict[struct_item]
 
         for member in struct_members:
-            if self.isHandleTypeObject(member.type):
+            if member.type in self.handle_types:
                 return True
             # recurse for member structs, guard against infinite recursion
             elif member.type in struct_member_dict and member.type != struct_item:
@@ -631,7 +623,7 @@
         else:
             member_list = item_list
         for item in member_list:
-            if self.isHandleTypeObject(paramtype.text):
+            if paramtype.text in self.handle_types:
                 object_list.add(item)
         return object_list
     #
@@ -673,7 +665,7 @@
         handle_type = params[-1].find('type')
         is_create_pipelines = False
 
-        if self.isHandleTypeObject(handle_type.text):
+        if handle_type.text in self.handle_types:
             # Check for special case where multiple handles are returned
             object_array = False
             if cmd_info[-1].len is not None:
@@ -722,7 +714,7 @@
             nullalloc_vuid_string = '%s-nullalloc' % cmd_info[param].name
             compatalloc_vuid = self.manual_vuids.get(compatalloc_vuid_string, "kVUIDUndefined")
             nullalloc_vuid = self.manual_vuids.get(nullalloc_vuid_string, "kVUIDUndefined")
-            if self.isHandleTypeObject(cmd_info[param].type) == True:
+            if cmd_info[param].type in self.handle_types:
                 if object_array == True:
                     # This API is freeing an array of handles -- add loop control
                     validate_code += 'HEY, NEED TO DESTROY AN ARRAY\n'
@@ -769,7 +761,7 @@
             # Handle objects
             if member.iscreate and first_level_param and member == members[-1]:
                 continue
-            if self.isHandleTypeObject(member.type) == True:
+            if member.type in self.handle_types:
                 count_name = member.len
                 if (count_name is not None):
                     count_name = '%s%s' % (prefix, member.len)
@@ -879,7 +871,7 @@
             isconst = True if 'const' in cdecl else False
             # Mark param as local if it is an array of objects
             islocal = False;
-            if self.isHandleTypeObject(type) == True:
+            if type in self.handle_types:
                 if (length is not None) and (isconst == True):
                     islocal = True
             # Or if it's a struct that contains an object
diff --git a/scripts/thread_safety_generator.py b/scripts/thread_safety_generator.py
index 8e19ee6..e4ec375 100644
--- a/scripts/thread_safety_generator.py
+++ b/scripts/thread_safety_generator.py
@@ -681,14 +681,6 @@
                 ispointer = True
         return ispointer
 
-    # Check if an object is a non-dispatchable handle
-    def isHandleTypeNonDispatchable(self, handletype):
-        return self.handle_types.get(handletype) == 'VK_DEFINE_NON_DISPATCHABLE_HANDLE'
-
-    # Check if an object is a dispatchable handle
-    def isHandleTypeDispatchable(self, handletype):
-        return self.handle_types.get(handletype) == 'VK_DEFINE_HANDLE'
-
     def makeThreadUseBlock(self, cmd, functionprefix):
         """Generate C function pointer typedef for <command> Element"""
         paramdecl = ''
@@ -751,7 +743,7 @@
                         paramtype = paramtype.text
                     else:
                         paramtype = 'None'
-                    if (self.isHandleTypeDispatchable(paramtype) or self.isHandleTypeNonDispatchable(paramtype)) and paramtype != 'VkPhysicalDevice':
+                    if paramtype in self.handle_types and paramtype != 'VkPhysicalDevice':
                         if self.paramIsArray(param) and ('pPipelines' != paramname.text):
                             # Add pointer dereference for array counts that are pointer values
                             dereference = ''
@@ -877,11 +869,8 @@
     # Type generation
     def genType(self, typeinfo, name, alias):
         OutputGenerator.genType(self, typeinfo, name, alias)
-        type_elem = typeinfo.elem
-        category = type_elem.get('category')
-        if category == 'handle':
-            if self.isHandleTypeNonDispatchable(name):
-                self.non_dispatchable_types.add(name)
+        if self.handle_types.IsNonDispatchable(name):
+            self.non_dispatchable_types.add(name)
     #
     # Struct (e.g. C "struct" type) generation.
     # This is a special case of the <type> tag where the contents are