anv: Add MAX_API_VERSION to anv_extensions.py
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 1 Aug 2017 18:09:50 +0000 (11:09 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 2 Aug 2017 16:13:13 +0000 (09:13 -0700)
The VkVersion class is probably overkill but it makes it really easy to
compare versions in a way that's safe without the caller having to think
about patch vs. no patch.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/vulkan/anv_entrypoints_gen.py
src/intel/vulkan/anv_extensions.py

index 9177a94cb98f1b00d6a0ab537cecae7346175e14..f5c527ed92cd38a7f995801c978a4f9fc3be3700 100644 (file)
@@ -32,8 +32,6 @@ from mako.template import Template
 
 from anv_extensions import *
 
-MAX_API_VERSION = 1.0
-
 # We generate a static hash table for entry point lookup
 # (vkGetProcAddress). We use a linear congruential generator for our hash
 # function and a power-of-two size table. The prime numbers are determined
@@ -262,7 +260,7 @@ def get_entrypoints(doc, entrypoints_to_defines):
     enabled_commands = set()
     for feature in doc.findall('./feature'):
         assert feature.attrib['api'] == 'vulkan'
-        if float(feature.attrib['number']) > MAX_API_VERSION:
+        if VkVersion(feature.attrib['number']) > MAX_API_VERSION:
             continue
 
         for command in feature.findall('./require/command'):
index 0d243c6f138167de3c2342337853b378d19326e3..7307cacbcac354156a2993d5e790d8f0651812b8 100644 (file)
@@ -25,10 +25,14 @@ COPYRIGHT = """\
 """
 
 import argparse
+import copy
+import re
 import xml.etree.cElementTree as et
 
 from mako.template import Template
 
+MAX_API_VERSION = '1.0.54'
+
 class Extension:
     def __init__(self, name, ext_version, enable):
         self.name = name
@@ -64,6 +68,45 @@ EXTENSIONS = [
     Extension('VK_KHX_multiview',                         1, True),
 ]
 
+class VkVersion:
+    def __init__(self, string):
+        split = string.split('.')
+        self.major = int(split[0])
+        self.minor = int(split[1])
+        if len(split) > 2:
+            assert len(split) == 3
+            self.patch = int(split[2])
+        else:
+            self.patch = None
+
+        # Sanity check.  The range bits are required by the definition of the
+        # VK_MAKE_VERSION macro
+        assert self.major < 1024 and self.minor < 1024
+        assert self.patch is None or self.patch < 4096
+        assert(str(self) == string)
+
+    def __str__(self):
+        ver_list = [str(self.major), str(self.minor)]
+        if self.patch is not None:
+            ver_list.append(str(self.patch))
+        return '.'.join(ver_list)
+
+    def __int_ver(self):
+        # This is just an expansion of VK_VERSION
+        patch = self.patch if self.patch is not None else 0
+        return (self.major << 22) | (self.minor << 12) | patch
+
+    def __cmp__(self, other):
+        # If only one of them has a patch version, "ignore" it by making
+        # other's patch version match self.
+        if (self.patch is None) != (other.patch is None):
+            other = copy.copy(other)
+            other.patch = self.patch
+
+        return self.__int_ver().__cmp__(other.__int_ver())
+
+MAX_API_VERSION = VkVersion(MAX_API_VERSION)
+
 def _init_exts_from_xml(xml):
     """ Walk the Vulkan XML and fill out extra extension information. """