<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Aug 1, 2017 at 2:07 PM, Lionel Landwerlin <span dir="ltr"><<a href="mailto:lionel.g.landwerlin@intel.com" target="_blank">lionel.g.landwerlin@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 01/08/17 19:54, Jason Ekstrand wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The VkVersion class is probably overkill but it makes it really easy to<br>
compare versions in a way that's safe without the caller having to think<br>
about patch vs. no patch.<br>
---<br>
src/intel/vulkan/anv_entrypoin<wbr>ts_gen.py | 4 +--<br>
src/intel/vulkan/anv_extension<wbr>s.py | 43 ++++++++++++++++++++++++++++++<wbr>+++<br>
2 files changed, 44 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/anv_entrypo<wbr>ints_gen.py b/src/intel/vulkan/anv_entrypo<wbr>ints_gen.py<br>
index 9177a94..f5c527e 100644<br>
--- a/src/intel/vulkan/anv_entrypo<wbr>ints_gen.py<br>
+++ b/src/intel/vulkan/anv_entrypo<wbr>ints_gen.py<br>
@@ -32,8 +32,6 @@ from mako.template import Template<br>
from anv_extensions import *<br>
-MAX_API_VERSION = 1.0<br>
-<br>
# We generate a static hash table for entry point lookup<br>
# (vkGetProcAddress). We use a linear congruential generator for our hash<br>
# function and a power-of-two size table. The prime numbers are determined<br>
@@ -262,7 +260,7 @@ def get_entrypoints(doc, entrypoints_to_defines):<br>
enabled_commands = set()<br>
for feature in doc.findall('./feature'):<br>
assert feature.attrib['api'] == 'vulkan'<br>
- if float(feature.attrib['number']<wbr>) > MAX_API_VERSION:<br>
+ if VkVersion(feature.attrib['numb<wbr>er']) > MAX_API_VERSION:<br>
continue<br>
for command in feature.findall('./require/com<wbr>mand'):<br>
diff --git a/src/intel/vulkan/anv_extensi<wbr>ons.py b/src/intel/vulkan/anv_extensi<wbr>ons.py<br>
index 0d243c6..7307cac 100644<br>
--- a/src/intel/vulkan/anv_extensi<wbr>ons.py<br>
+++ b/src/intel/vulkan/anv_extensi<wbr>ons.py<br>
@@ -25,10 +25,14 @@ COPYRIGHT = """\<br>
"""<br>
import argparse<br>
+import copy<br>
+import re<br>
import xml.etree.cElementTree as et<br>
from mako.template import Template<br>
+MAX_API_VERSION = '1.0.54'<br>
+<br>
class Extension:<br>
def __init__(self, name, ext_version, enable):<br>
<a href="http://self.name" rel="noreferrer" target="_blank">self.name</a> = name<br>
@@ -64,6 +68,45 @@ EXTENSIONS = [<br>
Extension('VK_KHX_multiview', 1, True),<br>
]<br>
+class VkVersion:<br>
+ def __init__(self, string):<br>
+ split = string.split('.')<br>
+ self.major = int(split[0])<br>
+ self.minor = int(split[1])<br>
+ if len(split) > 2:<br>
+ assert len(split) == 3<br>
+ self.patch = int(split[2])<br>
+ else:<br>
+ self.patch = None<br>
+<br>
+ # Sanity check. The range bits are required by the definition of the<br>
+ # VK_MAKE_VERSION macro<br>
+ assert self.major < 1024 and self.minor < 1024<br>
+ assert self.patch is None or self.patch < 4096<br>
+ assert(str(self) == string)<br>
+<br>
+ def __str__(self):<br>
+ ver_list = [str(self.major), str(self.minor)]<br>
+ if self.patch is not None:<br>
+ ver_list.append(str(self.patch<wbr>))<br>
+ return '.'.join(ver_list)<br>
+<br>
+ def __int_ver(self):<br>
+ # This is just an expansion of VK_VERSION<br>
+ patch = self.patch if self.patch is not None else 0<br>
+ return (self.major << 22) | (self.minor << 12) | patch<br>
+<br>
+ def __cmp__(self, other):<br>
+ # If only one of them has a patch version, "ignore" it by making<br>
+ # other's patch version match self.<br>
+ if (self.patch is None) != (other.patch is None):<br>
+ other = copy.copy(other)<br>
+ other.patch = self.patch<br>
+<br>
+ return self.__int_ver().__cmp__(other<wbr>.__int_ver())<br>
+<br>
+MAX_API_VERSION = VkVersion(MAX_API_VERSION)<br>
</blockquote>
<br></div></div>
Why not just MAX_API_VERSION = VkVersion('1.0.54') ?<br>
</blockquote><div><br></div><div>Because I wanted the obvious declaration MAX_API_VERSION to go as high up in the file as possible for readability. VkVersion is an annoyingly complicated class and I didn't want it cluttering the top of the file. The end result is this little bit of uglyness. I'm not sure if it was worth it.<br><br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
def _init_exts_from_xml(xml):<br>
""" Walk the Vulkan XML and fill out extra extension information. """<br>
<br>
</blockquote>
<br>
<br>
</div></div></blockquote></div><br></div></div>