Vulkan: correctly expose Vulkan entry points

This change fixes the advertisement of core Vulkan entry points as below:
1. GIPA returns a valid checked_proc for 1.1 core device APIs.
2. GDPA returns NULL for 1.1 core device APIs on a 1.0 physical device.

Bug: 134185757
Bug: 142266108
Test: dEQP-VK.memory.binding on 1.1 loader and 1.0 device ICD
Test: dEQP-VK.api.info.instance on 1.1 loader and 1.0 instance ICD
Change-Id: I0a3e06dc04bade4f36a7e68ee2f53979c656ee4e
diff --git a/vulkan/scripts/driver_generator.py b/vulkan/scripts/driver_generator.py
index 0f3d760..a64a702 100644
--- a/vulkan/scripts/driver_generator.py
+++ b/vulkan/scripts/driver_generator.py
@@ -177,8 +177,12 @@
     for ext in _KNOWN_EXTENSIONS:
       f.write(gencom.indent(2) + gencom.base_ext_name(ext) + ',\n')
 
-    f.write("""
-        EXTENSION_CORE,  // valid bit
+    f.write('\n')
+    for version in gencom.version_code_list:
+      f.write(gencom.indent(2) + 'EXTENSION_CORE_' + version + ',\n')
+
+    # EXTENSION_COUNT must be the next enum after the highest API version.
+    f.write("""\
         EXTENSION_COUNT,
         EXTENSION_UNKNOWN,
     };
@@ -249,6 +253,18 @@
   return False
 
 
+def _get_proc_hook_enum(cmd):
+  """Returns the ProcHook enumeration for the corresponding core function.
+
+  Args:
+    cmd: Vulkan function name.
+  """
+  assert cmd in gencom.version_dict
+  for version in gencom.version_code_list:
+    if gencom.version_dict[cmd] == 'VK_VERSION_' + version:
+      return 'ProcHook::EXTENSION_CORE_' + version
+
+
 def _need_proc_hook_stub(cmd):
   """Returns true if a function needs a ProcHook stub.
 
@@ -259,6 +275,8 @@
     if cmd in gencom.extension_dict:
       if not gencom.is_extension_internal(gencom.extension_dict[cmd]):
         return True
+    elif gencom.version_dict[cmd] != 'VK_VERSION_1_0':
+      return True
   return False
 
 
@@ -271,8 +289,16 @@
   """
   if _need_proc_hook_stub(cmd):
     return_type = gencom.return_type_dict[cmd]
-    ext_name = gencom.extension_dict[cmd]
-    ext_hook = 'ProcHook::' + gencom.base_ext_name(ext_name)
+
+    ext_name = ''
+    ext_hook = ''
+    if cmd in gencom.extension_dict:
+      ext_name = gencom.extension_dict[cmd]
+      ext_hook = 'ProcHook::' + gencom.base_ext_name(ext_name)
+    else:
+      ext_name = gencom.version_dict[cmd]
+      ext_hook = _get_proc_hook_enum(cmd)
+
     handle = gencom.param_dict[cmd][0][1]
     param_types = ', '.join([''.join(i) for i in gencom.param_dict[cmd]])
     param_names = ', '.join([''.join(i[1]) for i in gencom.param_dict[cmd]])
@@ -306,12 +332,12 @@
 
   f.write(gencom.indent(1) + '{\n')
   f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
-  f.write("""\
-        ProcHook::GLOBAL,
-        ProcHook::EXTENSION_CORE,
-        reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
-        nullptr,
-    },\n""")
+  f.write(gencom.indent(2) + 'ProcHook::GLOBAL,\n')
+  f.write(gencom.indent(2) + _get_proc_hook_enum(cmd) + ',\n')
+  f.write(gencom.indent(2) + 'reinterpret_cast<PFN_vkVoidFunction>(' +
+          gencom.base_name(cmd) + '),\n')
+  f.write(gencom.indent(2) + 'nullptr,\n')
+  f.write(gencom.indent(1) + '},\n')
 
 
 def _define_instance_proc_hook(cmd, f):
@@ -339,8 +365,8 @@
         reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
         nullptr,\n""")
   else:
+    f.write(gencom.indent(2) + _get_proc_hook_enum(cmd) + ',\n')
     f.write("""\
-        ProcHook::EXTENSION_CORE,
         reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
         nullptr,\n""")
 
@@ -358,10 +384,17 @@
   f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
   f.write(gencom.indent(2) + 'ProcHook::DEVICE,\n')
 
-  if cmd in gencom.extension_dict:
-    ext_name = gencom.extension_dict[cmd]
-    f.write(gencom.indent(2) + 'ProcHook::' +
-            gencom.base_ext_name(ext_name) + ',\n')
+  if (cmd in gencom.extension_dict or
+      gencom.version_dict[cmd] != 'VK_VERSION_1_0'):
+    ext_name = ''
+    ext_hook = ''
+    if cmd in gencom.extension_dict:
+      ext_name = gencom.extension_dict[cmd]
+      ext_hook = 'ProcHook::' + gencom.base_ext_name(ext_name)
+    else:
+      ext_name = gencom.version_dict[cmd]
+      ext_hook = _get_proc_hook_enum(cmd)
+    f.write(gencom.indent(2) + ext_hook + ',\n')
 
     if gencom.is_extension_internal(ext_name):
       f.write("""\
@@ -374,8 +407,8 @@
               gencom.base_name(cmd) + '),\n')
 
   else:
+    f.write(gencom.indent(2) + _get_proc_hook_enum(cmd) + ',\n')
     f.write("""\
-        ProcHook::EXTENSION_CORE,
         reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
         nullptr,\n""")
 
diff --git a/vulkan/scripts/generator_common.py b/vulkan/scripts/generator_common.py
index 670ba66..cf370fa 100644
--- a/vulkan/scripts/generator_common.py
+++ b/vulkan/scripts/generator_common.py
@@ -91,6 +91,9 @@
 # Dict for mapping a function to its return type.
 return_type_dict = {}
 
+# List of the sorted Vulkan version codes. e.g. '1_0', '1_1'.
+version_code_list = []
+
 # Dict for mapping a function to the core Vulkan API version.
 version_dict = {}
 
@@ -171,6 +174,15 @@
   return ext[3:]
 
 
+def version_code(version):
+  """Returns the version code from a version string.
+
+  Args:
+    version: Vulkan version string.
+  """
+  return version[11:]
+
+
 def is_function_supported(cmd):
   """Returns true if a function is core or from a supportable extension.
 
@@ -313,6 +325,7 @@
   extension_dict
   param_dict
   return_type_dict
+  version_code_list
   version_dict
   """
   registry = os.path.join(os.path.dirname(__file__), '..', '..', '..', '..',
@@ -385,3 +398,9 @@
           cmd_name = command.get('name')
           if cmd_name in command_list:
             version_dict[cmd_name] = apiversion
+
+  version_code_set = set()
+  for version in version_dict.values():
+    version_code_set.add(version_code(version))
+  for code in sorted(version_code_set):
+    version_code_list.append(code)