scripts: Optimize expensive xml lookups

4x speedup in codegen by fetching type information ahead of time instead
of doing repeated ad-hoc queries on the whole tree

Change-Id: Iba5625b830aa09baaf21f1eb16957d2f67d5d24a
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index 9a8b60f..4e2aa47 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -106,6 +106,8 @@
     # Called once at the beginning of each run
     def beginFile(self, genOpts):
         OutputGenerator.beginFile(self, genOpts)
+        # Initialize members that require the tree
+        self.handle_types = GetHandleTypes(self.registry.tree)
         # User-supplied prefix text, if any (list of strings)
         self.helper_file_type = genOpts.helper_file_type
         self.library_name = genOpts.library_name
@@ -305,16 +307,14 @@
             type_key = 'VK_DEFINE_HANDLE'
         else:
             type_key = 'VK_DEFINE_NON_DISPATCHABLE_HANDLE'
-        handle = self.registry.tree.find("types/type/[name='" + handle_type + "'][@category='handle']")
-        if handle is not None and handle.find('type').text == type_key:
+        if self.handle_types.get(handle_type) == type_key:
             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:
-                    handle = self.registry.tree.find("types/type/[name='" + item.type + "'][@category='handle']")
-                    if handle is not None and handle.find('type').text == type_key:
+                    if self.handle_types.get(item.type) == type_key:
                         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 IsHandleTypeNonDispatchable(self.registry.tree, item) :
+            if self.handle_types.get(item) == 'VK_DEFINE_NON_DISPATCHABLE_HANDLE':
                 non_dispatchable[item] = enum_entry
             else:
                 dispatchable[item] = enum_entry