[Mesa-dev] [PATCH 02/21] anv: Split anv_extensions.py into two files

Jason Ekstrand jason at jlekstrand.net
Tue Jan 23 08:28:06 UTC 2018


On Mon, Jan 22, 2018 at 11:39 PM, Samuel Iglesias Gonsálvez <
siglesias at igalia.com> wrote:

> On 20/01/18 20:11, Jason Ekstrand wrote:
> > The new anv_extensions_gen.py is the code generator while the old
> > anv_extensions.py file is purely declarative.
> > ---
> >  src/intel/Makefile.vulkan.am           |   3 +-
> >  src/intel/vulkan/anv_extensions.py     | 154
> ---------------------------
> >  src/intel/vulkan/anv_extensions_gen.py | 184
> +++++++++++++++++++++++++++++++++
> >  src/intel/vulkan/meson.build           |   3 +-
> >  4 files changed, 188 insertions(+), 156 deletions(-)
> >  create mode 100644 src/intel/vulkan/anv_extensions_gen.py
> >
> > diff --git a/src/intel/Makefile.vulkan.am b/src/intel/Makefile.vulkan.am
> > index 811faab..cacd049 100644
> > --- a/src/intel/Makefile.vulkan.am
> > +++ b/src/intel/Makefile.vulkan.am
> > @@ -36,7 +36,8 @@ vulkan/anv_entrypoints.c:
> vulkan/anv_entrypoints_gen.py \
> >               --outdir $(builddir)/vulkan
> >  vulkan/anv_entrypoints.h: vulkan/anv_entrypoints.c
> >
> > -vulkan/anv_extensions.c: vulkan/anv_extensions.py \
> > +vulkan/anv_extensions.c: vulkan/anv_extensions_gen.py \
> > +                      vulkan/anv_extensions.py \
> >                        $(vulkan_api_xml) \
> >                        $(vk_android_native_buffer_xml)
> >       $(MKDIR_GEN)
>
> There is a bug in the autotools build,


Sorry about that. :-(  I should have tested before sending it to the list.
I've got it fixed locally.


> it is needed to update the
> command to generate the files:
>
> diff --git a/src/intel/Makefile.vulkan.am b/src/intel/Makefile.vulkan.am
> index 7157772062c..7823b608804 100644
> --- a/src/intel/Makefile.vulkan.am
> +++ b/src/intel/Makefile.vulkan.am
> @@ -41,7 +41,7 @@ vulkan/anv_extensions.c: vulkan/anv_extensions_gen.py \
>                          $(vulkan_api_xml) \
>                          $(vk_android_native_buffer_xml)
>         $(MKDIR_GEN)
> -       $(AM_V_GEN)$(PYTHON2) $(srcdir)/vulkan/anv_extensions.py \
> +       $(AM_V_GEN)$(PYTHON2) $(srcdir)/vulkan/anv_extensions_gen.py \
>                 --xml $(vulkan_api_xml) \
>                 --xml $(vk_android_native_buffer_xml) \
>                 --out-c $@
> @@ -51,7 +51,7 @@ vulkan/anv_extensions.h: vulkan/anv_extensions_gen.py \
>                          $(vulkan_api_xml) \
>                          $(vk_android_native_buffer_xml)
>         $(MKDIR_GEN)
> -       $(AM_V_GEN)$(PYTHON2) $(srcdir)/vulkan/anv_extensions.py \
> +       $(AM_V_GEN)$(PYTHON2) $(srcdir)/vulkan/anv_extensions_gen.py \
>                 --xml $(vulkan_api_xml) \
>                 --xml $(vk_android_native_buffer_xml) \
>                 --out-h $@
>
> Sam
>
> > diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_
> extensions.py
> > index adfebca..ae30ec9 100644
> > --- a/src/intel/vulkan/anv_extensions.py
> > +++ b/src/intel/vulkan/anv_extensions.py
> > @@ -130,157 +130,3 @@ class VkVersion:
> >          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.
> """
> > -
> > -    xml = et.parse(xml)
> > -
> > -    ext_name_map = {}
> > -    for ext in EXTENSIONS:
> > -        ext_name_map[ext.name] = ext
> > -
> > -    for ext_elem in xml.findall('.extensions/extension'):
> > -        ext_name = ext_elem.attrib['name']
> > -        if ext_name not in ext_name_map:
> > -            continue
> > -
> > -        # Workaround for VK_ANDROID_native_buffer. Its <extension>
> element in
> > -        # vk.xml lists it as supported="disabled" and provides only a
> stub
> > -        # definition.  Its <extension> element in Mesa's custom
> > -        # vk_android_native_buffer.xml, though, lists it as
> > -        # supported='android-vendor' and fully defines the extension.
> We want
> > -        # to skip the <extension> element in vk.xml.
> > -        if ext_elem.attrib['supported'] == 'disabled':
> > -            assert ext_name == 'VK_ANDROID_native_buffer'
> > -            continue
> > -
> > -        ext = ext_name_map[ext_name]
> > -        ext.type = ext_elem.attrib['type']
> > -
> > -_TEMPLATE = COPYRIGHT + """
> > -#include "anv_private.h"
> > -
> > -#include "vk_util.h"
> > -
> > -/* Convert the VK_USE_PLATFORM_* defines to booleans */
> > -%for platform in ['ANDROID', 'WAYLAND', 'XCB', 'XLIB']:
> > -#ifdef VK_USE_PLATFORM_${platform}_KHR
> > -#   undef VK_USE_PLATFORM_${platform}_KHR
> > -#   define VK_USE_PLATFORM_${platform}_KHR true
> > -#else
> > -#   define VK_USE_PLATFORM_${platform}_KHR false
> > -#endif
> > -%endfor
> > -
> > -/* And ANDROID too */
> > -#ifdef ANDROID
> > -#   undef ANDROID
> > -#   define ANDROID true
> > -#else
> > -#   define ANDROID false
> > -#endif
> > -
> > -#define ANV_HAS_SURFACE (VK_USE_PLATFORM_WAYLAND_KHR || \\
> > -                         VK_USE_PLATFORM_XCB_KHR || \\
> > -                         VK_USE_PLATFORM_XLIB_KHR)
> > -
> > -bool
> > -anv_instance_extension_supported(const char *name)
> > -{
> > -%for ext in instance_extensions:
> > -    if (strcmp(name, "${ext.name}") == 0)
> > -        return ${ext.enable};
> > -%endfor
> > -    return false;
> > -}
> > -
> > -VkResult anv_EnumerateInstanceExtensionProperties(
> > -    const char*                                 pLayerName,
> > -    uint32_t*                                   pPropertyCount,
> > -    VkExtensionProperties*                      pProperties)
> > -{
> > -    VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);
> > -
> > -%for ext in instance_extensions:
> > -    if (${ext.enable}) {
> > -        vk_outarray_append(&out, prop) {
> > -            *prop = (VkExtensionProperties) {
> > -                .extensionName = "${ext.name}",
> > -                .specVersion = ${ext.ext_version},
> > -            };
> > -        }
> > -    }
> > -%endfor
> > -
> > -    return vk_outarray_status(&out);
> > -}
> > -
> > -uint32_t
> > -anv_physical_device_api_version(struct anv_physical_device *dev)
> > -{
> > -    return ${MAX_API_VERSION.c_vk_version()};
> > -}
> > -
> > -bool
> > -anv_physical_device_extension_supported(struct anv_physical_device
> *device,
> > -                                        const char *name)
> > -{
> > -%for ext in device_extensions:
> > -    if (strcmp(name, "${ext.name}") == 0)
> > -        return ${ext.enable};
> > -%endfor
> > -    return false;
> > -}
> > -
> > -VkResult anv_EnumerateDeviceExtensionProperties(
> > -    VkPhysicalDevice                            physicalDevice,
> > -    const char*                                 pLayerName,
> > -    uint32_t*                                   pPropertyCount,
> > -    VkExtensionProperties*                      pProperties)
> > -{
> > -    ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice);
> > -    VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);
> > -    (void)device;
> > -
> > -%for ext in device_extensions:
> > -    if (${ext.enable}) {
> > -        vk_outarray_append(&out, prop) {
> > -            *prop = (VkExtensionProperties) {
> > -                .extensionName = "${ext.name}",
> > -                .specVersion = ${ext.ext_version},
> > -            };
> > -        }
> > -    }
> > -%endfor
> > -
> > -    return vk_outarray_status(&out);
> > -}
> > -"""
> > -
> > -if __name__ == '__main__':
> > -    parser = argparse.ArgumentParser()
> > -    parser.add_argument('--out', help='Output C file.', required=True)
> > -    parser.add_argument('--xml',
> > -                        help='Vulkan API XML file.',
> > -                        required=True,
> > -                        action='append',
> > -                        dest='xml_files')
> > -    args = parser.parse_args()
> > -
> > -    for filename in args.xml_files:
> > -        _init_exts_from_xml(filename)
> > -
> > -    for ext in EXTENSIONS:
> > -        assert ext.type == 'instance' or ext.type == 'device'
> > -
> > -    template_env = {
> > -        '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'],
> > -    }
> > -
> > -    from mako.template import Template
> > -
> > -    with open(args.out, 'w') as f:
> > -        f.write(Template(_TEMPLATE).render(**template_env))
> > diff --git a/src/intel/vulkan/anv_extensions_gen.py
> b/src/intel/vulkan/anv_extensions_gen.py
> > new file mode 100644
> > index 0000000..a1e8688
> > --- /dev/null
> > +++ b/src/intel/vulkan/anv_extensions_gen.py
> > @@ -0,0 +1,184 @@
> > +COPYRIGHT = """\
> > +/*
> > + * Copyright 2017 Intel Corporation
> > + *
> > + * Permission is hereby granted, free of charge, to any person
> obtaining a
> > + * copy of this software and associated documentation files (the
> > + * "Software"), to deal in the Software without restriction, including
> > + * without limitation the rights to use, copy, modify, merge, publish,
> > + * distribute, sub license, and/or sell copies of the Software, and to
> > + * permit persons to whom the Software is furnished to do so, subject to
> > + * the following conditions:
> > + *
> > + * The above copyright notice and this permission notice (including the
> > + * next paragraph) shall be included in all copies or substantial
> portions
> > + * of the Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS
> > + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NON-INFRINGEMENT.
> > + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
> > + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> CONTRACT,
> > + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> > + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> > + */
> > +"""
> > +
> > +import argparse
> > +import xml.etree.cElementTree as et
> > +
> > +from mako.template import Template
> > +
> > +from anv_extensions import *
> > +
> > +def _init_exts_from_xml(xml):
> > +    """ Walk the Vulkan XML and fill out extra extension information.
> """
> > +
> > +    xml = et.parse(xml)
> > +
> > +    ext_name_map = {}
> > +    for ext in EXTENSIONS:
> > +        ext_name_map[ext.name] = ext
> > +
> > +    for ext_elem in xml.findall('.extensions/extension'):
> > +        ext_name = ext_elem.attrib['name']
> > +        if ext_name not in ext_name_map:
> > +            continue
> > +
> > +        # Workaround for VK_ANDROID_native_buffer. Its <extension>
> element in
> > +        # vk.xml lists it as supported="disabled" and provides only a
> stub
> > +        # definition.  Its <extension> element in Mesa's custom
> > +        # vk_android_native_buffer.xml, though, lists it as
> > +        # supported='android-vendor' and fully defines the extension.
> We want
> > +        # to skip the <extension> element in vk.xml.
> > +        if ext_elem.attrib['supported'] == 'disabled':
> > +            assert ext_name == 'VK_ANDROID_native_buffer'
> > +            continue
> > +
> > +        ext = ext_name_map[ext_name]
> > +        ext.type = ext_elem.attrib['type']
> > +
> > +_TEMPLATE = Template(COPYRIGHT + """
> > +#include "anv_private.h"
> > +
> > +#include "vk_util.h"
> > +
> > +/* Convert the VK_USE_PLATFORM_* defines to booleans */
> > +%for platform in ['ANDROID', 'WAYLAND', 'XCB', 'XLIB']:
> > +#ifdef VK_USE_PLATFORM_${platform}_KHR
> > +#   undef VK_USE_PLATFORM_${platform}_KHR
> > +#   define VK_USE_PLATFORM_${platform}_KHR true
> > +#else
> > +#   define VK_USE_PLATFORM_${platform}_KHR false
> > +#endif
> > +%endfor
> > +
> > +/* And ANDROID too */
> > +#ifdef ANDROID
> > +#   undef ANDROID
> > +#   define ANDROID true
> > +#else
> > +#   define ANDROID false
> > +#endif
> > +
> > +#define ANV_HAS_SURFACE (VK_USE_PLATFORM_WAYLAND_KHR || \\
> > +                         VK_USE_PLATFORM_XCB_KHR || \\
> > +                         VK_USE_PLATFORM_XLIB_KHR)
> > +
> > +bool
> > +anv_instance_extension_supported(const char *name)
> > +{
> > +%for ext in instance_extensions:
> > +    if (strcmp(name, "${ext.name}") == 0)
> > +        return ${ext.enable};
> > +%endfor
> > +    return false;
> > +}
> > +
> > +VkResult anv_EnumerateInstanceExtensionProperties(
> > +    const char*                                 pLayerName,
> > +    uint32_t*                                   pPropertyCount,
> > +    VkExtensionProperties*                      pProperties)
> > +{
> > +    VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);
> > +
> > +%for ext in instance_extensions:
> > +    if (${ext.enable}) {
> > +        vk_outarray_append(&out, prop) {
> > +            *prop = (VkExtensionProperties) {
> > +                .extensionName = "${ext.name}",
> > +                .specVersion = ${ext.ext_version},
> > +            };
> > +        }
> > +    }
> > +%endfor
> > +
> > +    return vk_outarray_status(&out);
> > +}
> > +
> > +uint32_t
> > +anv_physical_device_api_version(struct anv_physical_device *dev)
> > +{
> > +    return ${MAX_API_VERSION.c_vk_version()};
> > +}
> > +
> > +bool
> > +anv_physical_device_extension_supported(struct anv_physical_device
> *device,
> > +                                        const char *name)
> > +{
> > +%for ext in device_extensions:
> > +    if (strcmp(name, "${ext.name}") == 0)
> > +        return ${ext.enable};
> > +%endfor
> > +    return false;
> > +}
> > +
> > +VkResult anv_EnumerateDeviceExtensionProperties(
> > +    VkPhysicalDevice                            physicalDevice,
> > +    const char*                                 pLayerName,
> > +    uint32_t*                                   pPropertyCount,
> > +    VkExtensionProperties*                      pProperties)
> > +{
> > +    ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice);
> > +    VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);
> > +    (void)device;
> > +
> > +%for ext in device_extensions:
> > +    if (${ext.enable}) {
> > +        vk_outarray_append(&out, prop) {
> > +            *prop = (VkExtensionProperties) {
> > +                .extensionName = "${ext.name}",
> > +                .specVersion = ${ext.ext_version},
> > +            };
> > +        }
> > +    }
> > +%endfor
> > +
> > +    return vk_outarray_status(&out);
> > +}
> > +""")
> > +
> > +if __name__ == '__main__':
> > +    parser = argparse.ArgumentParser()
> > +    parser.add_argument('--out', help='Output C file.', required=True)
> > +    parser.add_argument('--xml',
> > +                        help='Vulkan API XML file.',
> > +                        required=True,
> > +                        action='append',
> > +                        dest='xml_files')
> > +    args = parser.parse_args()
> > +
> > +    for filename in args.xml_files:
> > +        _init_exts_from_xml(filename)
> > +
> > +    for ext in EXTENSIONS:
> > +        assert ext.type == 'instance' or ext.type == 'device'
> > +
> > +    template_env = {
> > +        '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'],
> > +    }
> > +
> > +    with open(args.out, 'w') as f:
> > +        f.write(_TEMPLATE.render(**template_env))
> > diff --git a/src/intel/vulkan/meson.build b/src/intel/vulkan/meson.build
> > index 6bd29da..97cb686 100644
> > --- a/src/intel/vulkan/meson.build
> > +++ b/src/intel/vulkan/meson.build
> > @@ -32,7 +32,8 @@ anv_entrypoints = custom_target(
> >
> >  anv_extensions_c = custom_target(
> >    'anv_extensions.c',
> > -  input : ['anv_extensions.py', vk_api_xml,
> vk_android_native_buffer_xml],
> > +  input : ['anv_extensions_gen.py', vk_api_xml,
> vk_android_native_buffer_xml,
> > +           'anv_extensions.py'],
> >    output : 'anv_extensions.c',
> >    command : [
> >      prog_python2, '@INPUT0@', '--xml', '@INPUT1@', '--xml', '@INPUT2@',
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180123/94229344/attachment-0001.html>


More information about the mesa-dev mailing list