aboutsummaryrefslogtreecommitdiffstats
path: root/src/amd
diff options
context:
space:
mode:
authorSamuel Pitoiset <[email protected]>2020-05-11 11:58:26 +0200
committerSamuel Pitoiset <[email protected]>2020-05-12 10:29:46 +0200
commit021270cb3170ef38244d21cf3fe8780a3ef5fb3e (patch)
tree0e44957a22e39a2482f42455e39a8ed590159004 /src/amd
parent69430921fc123b9016d5bf1779c0ab0ed4d95931 (diff)
radv: handle different Vulkan API versions correctly
Loosely based on ANV. Signed-off-by: Samuel Pitoiset <[email protected]> Acked-by: Bas Nieuwenhuizen <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4985>
Diffstat (limited to 'src/amd')
-rw-r--r--src/amd/vulkan/radv_extensions.py55
1 files changed, 43 insertions, 12 deletions
diff --git a/src/amd/vulkan/radv_extensions.py b/src/amd/vulkan/radv_extensions.py
index 4ea75a10d57..684f30f12de 100644
--- a/src/amd/vulkan/radv_extensions.py
+++ b/src/amd/vulkan/radv_extensions.py
@@ -31,7 +31,12 @@ import xml.etree.cElementTree as et
from mako.template import Template
-MAX_API_VERSION = '1.2.128'
+def _bool_to_c_expr(b):
+ if b is True:
+ return 'true'
+ if b is False:
+ return 'false'
+ return b
class Extension:
def __init__(self, name, ext_version, enable):
@@ -44,6 +49,24 @@ class Extension:
else:
self.enable = enable;
+class ApiVersion:
+ def __init__(self, version, enable):
+ self.version = version
+ self.enable = _bool_to_c_expr(enable)
+
+# Supported API versions. Each one is the maximum patch version for the given
+# version. Version come in increasing order and each version is available if
+# it's provided "enable" condition is true and all previous versions are
+# available.
+# TODO: The patch version should be unified!
+API_VERSIONS = [
+ ApiVersion('1.0.68', True),
+ ApiVersion('1.1.107', True),
+ ApiVersion('1.2.131', '!ANDROID'),
+]
+
+MAX_API_VERSION = None # Computed later
+
# On Android, we disable all surface and swapchain extensions. Android's Vulkan
# loader implements VK_KHR_surface and VK_KHR_swapchain, and applications
# cannot access the driver's implementation. Moreoever, if the driver exposes
@@ -218,7 +241,11 @@ class VkVersion:
return self.__int_ver() > other.__int_ver()
-MAX_API_VERSION = VkVersion(MAX_API_VERSION)
+MAX_API_VERSION = VkVersion('0.0.0')
+for version in API_VERSIONS:
+ version.version = VkVersion(version.version)
+ assert version.version > MAX_API_VERSION
+ MAX_API_VERSION = version.version
def _init_exts_from_xml(xml):
""" Walk the Vulkan XML and fill out extra extension information. """
@@ -412,6 +439,7 @@ _TEMPLATE_C = Template(COPYRIGHT + """
VK_USE_PLATFORM_XLIB_KHR || \\
VK_USE_PLATFORM_DISPLAY_KHR)
+static const uint32_t MAX_API_VERSION = ${MAX_API_VERSION.c_vk_version()};
const VkExtensionProperties radv_instance_extensions[RADV_INSTANCE_EXTENSION_COUNT] = {
%for ext in instance_extensions:
@@ -443,24 +471,26 @@ void radv_fill_device_extension_table(const struct radv_physical_device *device,
VkResult radv_EnumerateInstanceVersion(
uint32_t* pApiVersion)
{
- *pApiVersion = ${MAX_API_VERSION.c_vk_version()};
+ *pApiVersion = MAX_API_VERSION;
return VK_SUCCESS;
}
uint32_t
radv_physical_device_api_version(struct radv_physical_device *dev)
{
+ uint32_t version = 0;
+
uint32_t override = vk_get_version_override();
- uint32_t version = VK_MAKE_VERSION(1, 0, 68);
- if (dev->rad_info.has_syncobj_wait_for_submit) {
- if (ANDROID) {
- version = VK_MAKE_VERSION(1, 1, 107);
- } else {
- version = ${MAX_API_VERSION.c_vk_version()};
- }
- }
+ if (override)
+ return MIN2(override, MAX_API_VERSION);
+
+%for version in API_VERSIONS:
+ if (!(${version.enable}))
+ return version;
+ version = ${version.version.c_vk_version()};
- return override ? MIN2(override, version) : version;
+%endfor
+ return version;
}
""")
@@ -482,6 +512,7 @@ if __name__ == '__main__':
assert ext.type == 'instance' or ext.type == 'device'
template_env = {
+ 'API_VERSIONS': API_VERSIONS,
'MAX_API_VERSION': MAX_API_VERSION,
'instance_extensions': [e for e in EXTENSIONS if e.type == 'instance'],
'device_extensions': [e for e in EXTENSIONS if e.type == 'device'],