layers: Rewrite flag validation

- use proper VUID
- eliminate dependency on std::bitset
- do not use raw bool parameters
- make single bit, and unknown bit checks independent
- merge single bit and Flags generation script
diff --git a/scripts/parameter_validation_generator.py b/scripts/parameter_validation_generator.py
index e283c1c..1a12599 100644
--- a/scripts/parameter_validation_generator.py
+++ b/scripts/parameter_validation_generator.py
@@ -1197,25 +1197,26 @@
                     elif value.type in self.handleTypes:
                         if not self.isHandleOptional(value, None):
                             usedLines.append('skip |= validate_required_handle("{}", {ppp}"{}"{pps}, {}{});\n'.format(funcName, valueDisplayName, valuePrefix, value.name, **postProcSpec))
-                    elif value.type in self.flags:
-                        flagBitsName = value.type.replace('Flags', 'FlagBits')
-                        if not flagBitsName in self.flagBits:
-                            vuid = self.GetVuid(vuid_name_tag, "%s-zerobitmask" % (value.name))
-                            usedLines.append('skip |= validate_reserved_flags("{}", {ppp}"{}"{pps}, {pf}{}, {});\n'.format(funcName, valueDisplayName, value.name, vuid, pf=valuePrefix, **postProcSpec))
-                        else:
-                            if value.isoptional:
-                                flagsRequired = 'false'
-                                vuid = self.GetVuid(vuid_name_tag, "%s-parameter" % (value.name))
-                            else:
-                                flagsRequired = 'true'
-                                vuid = self.GetVuid(vuid_name_tag, "%s-requiredbitmask" % (value.name))
-                            allFlagsName = 'All' + flagBitsName
-                            usedLines.append('skip |= validate_flags("{}", {ppp}"{}"{pps}, "{}", {}, {pf}{}, {}, false, {});\n'.format(funcName, valueDisplayName, flagBitsName, allFlagsName, value.name, flagsRequired, vuid, pf=valuePrefix, **postProcSpec))
-                    elif value.type in self.flagBits:
-                        flagsRequired = 'false' if value.isoptional else 'true'
-                        allFlagsName = 'All' + value.type
-                        vuid = self.GetVuid(vuid_name_tag, "%s-parameter" % (value.name))
-                        usedLines.append('skip |= validate_flags("{}", {ppp}"{}"{pps}, "{}", {}, {pf}{}, {}, true, {});\n'.format(funcName, valueDisplayName, value.type, allFlagsName, value.name, flagsRequired, vuid, pf=valuePrefix, **postProcSpec))
+                    elif value.type in self.flags and value.type.replace('Flags', 'FlagBits') not in self.flagBits:
+                        vuid = self.GetVuid(vuid_name_tag, "%s-zerobitmask" % (value.name))
+                        usedLines.append('skip |= validate_reserved_flags("{}", {ppp}"{}"{pps}, {pf}{}, {});\n'.format(funcName, valueDisplayName, value.name, vuid, pf=valuePrefix, **postProcSpec))
+                    elif value.type in self.flags or value.type in self.flagBits:
+                        if value.type in self.flags:
+                            flagBitsName = value.type.replace('Flags', 'FlagBits')
+                            flagsType = 'kOptionalFlags' if value.isoptional else 'kRequiredFlags'
+                            invalidVuid = self.GetVuid(vuid_name_tag, "%s-parameter" % (value.name))
+                            zeroVuid = self.GetVuid(vuid_name_tag, "%s-requiredbitmask" % (value.name))
+                        elif value.type in self.flagBits:
+                            flagBitsName = value.type
+                            flagsType = 'kOptionalSingleBit' if value.isoptional else 'kRequiredSingleBit'
+                            invalidVuid = self.GetVuid(vuid_name_tag, "%s-parameter" % (value.name))
+                            zeroVuid = invalidVuid
+                        allFlagsName = 'All' + flagBitsName
+
+                        invalid_vuid = self.GetVuid(vuid_name_tag, "%s-parameter" % (value.name))
+                        allFlagsName = 'All' + flagBitsName
+                        zeroVuidArg = '' if value.isoptional else ', ' + zeroVuid
+                        usedLines.append('skip |= validate_flags("{}", {ppp}"{}"{pps}, "{}", {}, {pf}{}, {}, {}{});\n'.format(funcName, valueDisplayName, flagBitsName, allFlagsName, value.name, flagsType, invalidVuid, zeroVuidArg, pf=valuePrefix, **postProcSpec))
                     elif value.isbool:
                         usedLines.append('skip |= validate_bool32("{}", {ppp}"{}"{pps}, {}{});\n'.format(funcName, valueDisplayName, valuePrefix, value.name, **postProcSpec))
                     elif value.israngedenum: