Mesa (master): vulkan: enum generator: generate extension number defines

Jason Ekstrand jekstrand at kemper.freedesktop.org
Fri Sep 22 14:47:46 UTC 2017


Module: Mesa
Branch: master
Commit: 0ee868c1f63dd27fcef4e7c5994327cbf06934b1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0ee868c1f63dd27fcef4e7c5994327cbf06934b1

Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date:   Fri Sep 15 15:10:57 2017 +0100

vulkan: enum generator: generate extension number defines

New extensions can introduce additional enums. Most of the new enums
will have disjoint numbers from the initial enums. For example new
formats introduced by VK_IMG_format_pvrtc :

VK_FORMAT_ASTC_10x8_UNORM_BLOCK = 177,
VK_FORMAT_ASTC_10x8_SRGB_BLOCK = 178,
VK_FORMAT_ASTC_10x10_UNORM_BLOCK = 179,
VK_FORMAT_ASTC_10x10_SRGB_BLOCK = 180,
VK_FORMAT_ASTC_12x10_UNORM_BLOCK = 181,
VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182,
VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183,
VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184,
VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000,
VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001,
VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002,
VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = 1000054003,
VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = 1000054004,
VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005,
VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006,
VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007,

It's obvious we can't have a single table for handling those anymore.

Fortunately the enum values actually contain the number of the
extension that introduced the new enums. So we can build an
indirection table off the extension number and then index by
subtracting the first enum of the the format enum value.

This change makes the extension number available in the generated enum
code.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Reviewed-by: Dylan Baker <dylan at pnwbakers.com>

---

 src/vulkan/util/gen_enum_to_str.py | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/vulkan/util/gen_enum_to_str.py b/src/vulkan/util/gen_enum_to_str.py
index 3c9f260595..e89acb94bb 100644
--- a/src/vulkan/util/gen_enum_to_str.py
+++ b/src/vulkan/util/gen_enum_to_str.py
@@ -101,6 +101,10 @@ H_TEMPLATE = Template(textwrap.dedent(u"""\
     #include <vulkan/vulkan.h>
     #include <vulkan/vk_android_native_buffer.h>
 
+    % for ext in extensions:
+    #define _${ext.name}_number (${ext.number})
+    % endfor
+
     % for enum in enums:
     const char * vk_${enum.name[2:]}_to_str(${enum.name} input);
     % endfor
@@ -130,6 +134,14 @@ class NamedFactory(object):
         return n
 
 
+class VkExtension(object):
+    """Simple struct-like class representing extensions"""
+
+    def __init__(self, name, number=None):
+        self.name = name
+        self.number = number
+
+
 class VkEnum(object):
     """Simple struct-like class representing a single Vulkan Enum."""
 
@@ -138,8 +150,8 @@ class VkEnum(object):
         self.values = values or []
 
 
-def parse_xml(enum_factory, filename):
-    """Parse the XML file. Accumulate results into the efactory.
+def parse_xml(enum_factory, ext_factory, filename):
+    """Parse the XML file. Accumulate results into the factories.
 
     This parser is a memory efficient iterative XML parser that returns a list
     of VkEnum objects.
@@ -160,6 +172,9 @@ def parse_xml(enum_factory, filename):
                     enum = enum_factory(elem.attrib['name'])
                     enum.values.extend([e.attrib['name'] for e in elem
                                         if e.tag == 'enum'])
+            elif event == 'start' and elem.tag == 'extension':
+                ext_factory(elem.attrib['name'],
+                            number=int(elem.attrib['number']))
             elif event == 'end' and elem.tag == 'extension':
                 if elem.attrib['supported'] != 'vulkan':
                     continue
@@ -169,7 +184,6 @@ def parse_xml(enum_factory, filename):
 
             root.clear()
 
-
 def main():
     parser = argparse.ArgumentParser()
     parser.add_argument('--xml', required=True,
@@ -183,9 +197,11 @@ def main():
     args = parser.parse_args()
 
     enum_factory = NamedFactory(VkEnum)
+    ext_factory = NamedFactory(VkExtension)
     for filename in args.xml_files:
-        parse_xml(enum_factory, filename)
+        parse_xml(enum_factory, ext_factory, filename)
     enums = sorted(enum_factory.registry.values(), key=lambda e: e.name)
+    extensions = sorted(ext_factory.registry.values(), key=lambda e: e.name)
 
     for template, file_ in [(C_TEMPLATE, os.path.join(args.outdir, 'vk_enum_to_str.c')),
                             (H_TEMPLATE, os.path.join(args.outdir, 'vk_enum_to_str.h'))]:
@@ -193,6 +209,7 @@ def main():
             f.write(template.render(
                 file=os.path.basename(__file__),
                 enums=enums,
+                extensions=extensions,
                 copyright=COPYRIGHT,
                 FOREIGN_ENUM_VALUES=FOREIGN_ENUM_VALUES))
 




More information about the mesa-commit mailing list