[Mesa-dev] [PATCH 4/6] vulkan: enum generator: generate extension number defines

Dylan Baker dylan at pnwbakers.com
Thu Sep 21 17:26:55 UTC 2017


Quoting Jason Ekstrand (2017-09-21 08:32:21)
> From: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
> 
> 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>
> ---
>  src/vulkan/util/gen_enum_to_str.py | 24 ++++++++++++++++++++----
>  1 file changed, 20 insertions(+), 4 deletions(-)
> 
> diff --git a/src/vulkan/util/gen_enum_to_str.py b/src/vulkan/util/gen_enum_to_str.py
> index 5281e89..8f32102 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):
> +        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,8 @@ 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'], int(elem.attrib['number']))

It would be better to nest the tags under the event
if event == 'start':
    if elem.tag == '...'

>              elif event == 'end' and elem.tag == 'extension':
>                  if elem.attrib['supported'] != 'vulkan':
>                      continue
> @@ -169,7 +183,6 @@ def parse_xml(enum_factory, filename):
>  
>              root.clear()
>  
> -
>  def main():
>      parser = argparse.ArgumentParser()
>      parser.add_argument('--xml', required=True,
> @@ -183,9 +196,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 +208,7 @@ def main():
>              f.write(template.render(
>                  file=os.path.basename(__file__),
>                  enums=enums,
> +                extensions=extensions,
>                  copyright=COPYRIGHT,
>                  FOREIGN_ENUM_VALUES=FOREIGN_ENUM_VALUES))
>  
> -- 
> 2.5.0.400.gff86faf
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: signature
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170921/8e6a856c/attachment-0001.sig>


More information about the mesa-dev mailing list