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