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)