anv/extensions: Add support for multiple API versions
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 22 Sep 2017 14:36:39 +0000 (07:36 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 7 Mar 2018 20:13:47 +0000 (12:13 -0800)
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
src/intel/vulkan/anv_extensions.py
src/intel/vulkan/anv_extensions_gen.py

index 5a36708a0a1462eacd48b7af390e6651629e7696..b402b0c9cb3060fc19d4aa4b918ae7f6e030a314 100644 (file)
@@ -29,18 +29,34 @@ import copy
 import re
 import xml.etree.cElementTree as et
 
-MAX_API_VERSION = '1.0.57'
+def _bool_to_c_expr(b):
+    if b is True:
+        return 'true';
+    elif b is False:
+        return 'false';
+    else:
+        return b;
 
 class Extension:
     def __init__(self, name, ext_version, enable):
         self.name = name
         self.ext_version = int(ext_version)
-        if enable is True:
-            self.enable = 'true';
-        elif enable is False:
-            self.enable = 'false';
-        else:
-            self.enable = enable;
+        self.enable = _bool_to_c_expr(enable)
+
+class ApiVersion:
+    def __init__(self, max_patch_version, enable):
+        self.max_patch_version = max_patch_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.
+API_VERSIONS = [
+    ApiVersion('1.0.57',    True),
+]
+
+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
@@ -132,4 +148,9 @@ class VkVersion:
 
         return self.__int_ver().__cmp__(other.__int_ver())
 
-MAX_API_VERSION = VkVersion(MAX_API_VERSION)
+
+MAX_API_VERSION = VkVersion('0.0.0')
+for version in API_VERSIONS:
+    version.max_patch_version = VkVersion(version.max_patch_version)
+    assert version.max_patch_version > MAX_API_VERSION
+    MAX_API_VERSION = version.max_patch_version
index 33827ecd01565ea5ded16419b69d2f17b827a659..1796437dc7ceb5d8f2e329eef5a036d8c2f1e1b8 100644 (file)
@@ -147,9 +147,17 @@ const struct anv_instance_extension_table anv_instance_extensions_supported = {
 };
 
 uint32_t
-anv_physical_device_api_version(struct anv_physical_device *dev)
+anv_physical_device_api_version(struct anv_physical_device *device)
 {
-    return ${MAX_API_VERSION.c_vk_version()};
+    uint32_t version = 0;
+
+%for version in API_VERSIONS:
+    if (!(${version.enable}))
+        return version;
+    version = ${version.max_patch_version.c_vk_version()};
+
+%endfor
+    return version;
 }
 
 const VkExtensionProperties anv_device_extensions[ANV_DEVICE_EXTENSION_COUNT] = {
@@ -188,6 +196,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'],