layers: Automate CMD_TYPE and must be recording gen

Add the update of the CMD_TYPE enum and "must be recording" VUID to the
vk_validation_error_messages.h update script.  Update code to reflect
autogenerated type and list.

Perf note: removes one hash lookup per vkCmd* call.

Change-Id: I7bcda9cb108b114f9ac5069c6bb333ec0e056b7a
diff --git a/scripts/vk_validation_stats.py b/scripts/vk_validation_stats.py
index 5a5c329..48b2c99 100755
--- a/scripts/vk_validation_stats.py
+++ b/scripts/vk_validation_stats.py
@@ -61,7 +61,6 @@
 layer_source_files = [
 '../layers/buffer_validation.cpp',
 '../layers/core_validation.cpp',
-'../layers/core_validation_drawdispatch.cpp',
 '../layers/descriptor_sets.cpp',
 '../layers/parameter_validation_utils.cpp',
 '../layers/object_tracker_utils.cpp',
@@ -599,15 +598,48 @@
             hfile.write(self.header_preamble)
             vuid_list = list(self.vj.all_vuids)
             vuid_list.sort()
+            cmd_dict = {}
             for vuid in vuid_list:
                 db_entry = self.vj.vuid_db[vuid][0]
-                hfile.write('    {"%s", "%s (%s#%s)"},\n' % (vuid, db_entry['text'].strip(' '), self.spec_url, vuid))
+                db_text = db_entry['text'].strip(' ')
+                hfile.write('    {"%s", "%s (%s#%s)"},\n' % (vuid, db_text, self.spec_url, vuid))
                 # For multiply-defined VUIDs, include versions with extension appended
                 if len(self.vj.vuid_db[vuid]) > 1:
                     for db_entry in self.vj.vuid_db[vuid]:
-                        hfile.write('    {"%s[%s]", "%s (%s#%s)"},\n' % (vuid, db_entry['ext'].strip(' '), db_entry['text'].strip(' '), self.spec_url, vuid))
+                        hfile.write('    {"%s[%s]", "%s (%s#%s)"},\n' % (vuid, db_entry['ext'].strip(' '), db_text, self.spec_url, vuid))
+                if 'commandBuffer must be in the recording state' in db_text:
+                    cmd_dict[vuid] = db_text 
             hfile.write(self.header_postamble)
 
+            # Generate the information for validating recording state VUID's 
+            cmd_prefix = 'prefix##'
+            cmd_regex = re.compile(r'VUID-vk(Cmd|End)(\w+)')
+            cmd_vuid_vector = ['    "VUID_Undefined"']
+            cmd_name_vector = [ '    "Command_Undefined"' ]
+            cmd_enum = ['    ' + cmd_prefix + 'NONE = 0']
+
+            cmd_ordinal = 1
+            for vuid, db_text in cmd_dict.items():
+                cmd_match = cmd_regex.match(vuid)
+                if cmd_match.group(1) == "End":
+                    end = "END"
+                else:
+                    end = ""
+                cmd_name_vector.append('    "vk'+ cmd_match.group(1) + cmd_match.group(2) + '"')
+                cmd_name = cmd_prefix + end + cmd_match.group(2).upper()
+                cmd_enum.append('    {} = {}'.format(cmd_name, cmd_ordinal))
+                cmd_ordinal += 1
+                cmd_vuid_vector.append('    "{}"'.format(vuid))
+
+            hfile.write('\n// Defines to allow creating "must be recording" meta data\n')
+            cmd_enum.append('    {}RANGE_SIZE = {}'.format(cmd_prefix, cmd_ordinal))
+            cmd_enum_string = '#define VUID_CMD_ENUM_LIST(prefix)\\\n' + ',\\\n'.join(cmd_enum) + '\n\n'
+            hfile.write(cmd_enum_string)
+            cmd_name_list_string = '#define VUID_CMD_NAME_LIST\\\n' + ',\\\n'.join(cmd_name_vector) + '\n\n'
+            hfile.write(cmd_name_list_string)
+            vuid_vector_string = '#define VUID_MUST_BE_RECORDING_LIST\\\n' + ',\\\n'.join(cmd_vuid_vector) + '\n'
+            hfile.write(vuid_vector_string)
+
 def main(argv):
     global verbose_mode
     global txt_filename