layers: Pick up struct validation ids
Add check for valid substructs embedded in substructs -- another
twenty checks or so.
Change-Id: I4bf4bf9b118080d48503984fe1bae8e804a27862
diff --git a/scripts/parameter_validation_generator.py b/scripts/parameter_validation_generator.py
index dcd0ce0..01fa38d 100644
--- a/scripts/parameter_validation_generator.py
+++ b/scripts/parameter_validation_generator.py
@@ -326,7 +326,7 @@
pnext_case += ' // Validation code for %s structure members\n' % item
pnext_case += ' case %s: {\n' % self.getStructType(item)
pnext_case += ' %s *structure = (%s *) header;\n' % (item, item)
- expr = self.expandStructCode(self.validatedStructs[item], item, 'structure->', '', ' ', [], postProcSpec)
+ expr = self.expandStructCode(item, item, 'structure->', '', ' ', [], postProcSpec)
struct_validation_source = self.ScrubStructCode(expr)
pnext_case += '%s' % struct_validation_source
pnext_case += ' } break;\n'
@@ -543,8 +543,6 @@
# Returnedonly structs should have most of their members ignored -- on entry, we only care about validating the sType and
# pNext members. Everything else will be overwritten by the callee.
if typeinfo.elem.attrib.get('returnedonly') is not None:
- if typeName == 'VkPhysicalDeviceGroupProperties':
- stop = 'here'
self.returnedonly_structs.append(typeName)
membersInfo = [m for m in membersInfo if m.name in ('sType', 'pNext')]
self.structMembers.append(self.StructMemberData(name=typeName, members=membersInfo))
@@ -1041,11 +1039,12 @@
sub_struct_code = []
check_type = "%s-parameter" % struct_info.name
vuid = self.GetVuid(funcname, check_type)
- sub_struct_code.append('skip |= ValidateSubstructure(local_data->report_data, "%s", "%s", %s);' % (funcname, struct_info.name, vuid))
+ sub_struct_code.append('skip |= ValidateSubstructure(local_data->report_data, "%s", "%s", %s);\n' % (funcname, struct_info.name, vuid))
return sub_struct_code
#
# Process struct validation code for inclusion in function or parent struct validation code
- def expandStructCode(self, lines, funcName, memberNamePrefix, memberDisplayNamePrefix, indent, output, postProcSpec):
+ def expandStructCode(self, item_type, funcName, memberNamePrefix, memberDisplayNamePrefix, indent, output, postProcSpec):
+ lines = self.validatedStructs[item_type]
for line in lines:
if output:
output[-1] += '\n'
@@ -1084,7 +1083,7 @@
memberNamePrefix = '{}{}->'.format(prefix, value.name)
memberDisplayNamePrefix = '{}->'.format(valueDisplayName)
# Expand the struct validation lines
- expr = self.expandStructCode(self.validatedStructs[value.type], funcName, memberNamePrefix, memberDisplayNamePrefix, indent, expr, postProcSpec)
+ expr = self.expandStructCode(value.type, funcName, memberNamePrefix, memberDisplayNamePrefix, indent, expr, postProcSpec)
if lenValue:
# Close if and for scopes
indent = self.decIndent(indent)
@@ -1096,10 +1095,6 @@
def genFuncBody(self, funcName, values, valuePrefix, displayNamePrefix, structTypeName):
lines = [] # Generated lines of code
unused = [] # Unused variable names
-
- if funcName == 'vkCmdCopyImage':
- stop = 'here'
-
for value in values:
usedLines = []
lenParam = None
@@ -1227,7 +1222,11 @@
if value.type in self.validatedStructs:
memberNamePrefix = '{}{}.'.format(valuePrefix, value.name)
memberDisplayNamePrefix = '{}.'.format(valueDisplayName)
- usedLines.append(self.expandStructCode(self.validatedStructs[value.type], funcName, memberNamePrefix, memberDisplayNamePrefix, '', [], postProcSpec))
+
+ sub_struct_check = self.MakeSubStructCheck(structTypeName, value)
+ if 'UNDEFINED' not in sub_struct_check[0]:
+ usedLines.append(sub_struct_check)
+ usedLines.append(self.expandStructCode(value.type, funcName, memberNamePrefix, memberDisplayNamePrefix, '', [], postProcSpec))
# Append the parameter check to the function body for the current command
if usedLines:
# Apply special conditional checks
@@ -1261,11 +1260,6 @@
just_validate = True
# Skip first parameter if it is a dispatch handle (everything except vkCreateInstance)
startIndex = 0 if command.name == 'vkCreateInstance' else 1
-
- if command.name == 'vkEnumeratePhysicalDeviceGroups':
- stop = 'here'
-
-
lines, unused = self.genFuncBody(command.name, command.params[startIndex:], '', '', None)
# Cannot validate extension dependencies for device extension APIs having a physical device as their dispatchable object
if (command.name in self.required_extensions) and (self.extension_type != 'device' or command.params[0].type != 'VkPhysicalDevice'):