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'):
diff --git a/scripts/vuid_mapping.py b/scripts/vuid_mapping.py
index c1bb8d3..c21422c 100644
--- a/scripts/vuid_mapping.py
+++ b/scripts/vuid_mapping.py
@@ -627,6 +627,11 @@
'VkVertexInputBindingDivisorDescriptionEXT' : 571,
'VkBaseOutStructure' : 572,
'VkBaseInStructure' : 573,
+'VkRect2D' : 574,
+'VkClearRect' : 575,
+'VkOffset2D' : 576,
+'VkExtent2D' : 577,
+'VkDisplayModeParameters' : 578,
### ADD New func/struct mappings above this line
}
# Mapping of params to unique IDs
@@ -1168,6 +1173,40 @@
'pDescriptorCounts' : 534,
'srcOffsets' : 535,
'dstOffsets' : 536,
+'offset' : 537,
+'extent' : 538,
+'pMapEntries' : 539,
+'color' : 540,
+'depthStencil' : 541,
+'pTessellationState' : 542,
+'pViewportState' : 543,
+'pMultisampleState' : 544,
+'pDepthStencilState' : 545,
+'pColorBlendState' : 546,
+'pImageInfo' : 547,
+'pBufferInfo' : 548,
+'pInheritanceInfo' : 549,
+'srcOffset' : 550,
+'dstOffset' : 551,
+'imageOffset' : 552,
+'imageExtent' : 553,
+'clearValue' : 554,
+'rect' : 555,
+'renderArea' : 556,
+'pClearValues' : 557,
+'parameters' : 558,
+'displayPrimaryRed' : 559,
+'displayPrimaryGreen' : 560,
+'displayPrimaryBlue' : 561,
+'whitePoint' : 562,
+'pQueueLabels' : 563,
+'pCmdBufLabels' : 564,
+'pObjects' : 565,
+'features' : 566,
+'visibleRegion' : 567,
+'srcRect' : 568,
+'dstRect' : 569,
+'sampleLocationGridSize' : 570,
### ADD New implicit param mappings above this line
}