<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Jan 22, 2018 at 11:39 PM, Samuel Iglesias Gonsálvez <span dir="ltr"><<a href="mailto:siglesias@igalia.com" target="_blank">siglesias@igalia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 20/01/18 20:11, Jason Ekstrand wrote:<br>
> The new anv_extensions_gen.py is the code generator while the old<br>
> anv_extensions.py file is purely declarative.<br>
> ---<br>
>  src/intel/<a href="http://Makefile.vulkan.am" rel="noreferrer" target="_blank">Makefile.vulkan.am</a>           |   3 +-<br>
>  src/intel/vulkan/anv_<wbr>extensions.py     | 154 ---------------------------<br>
>  src/intel/vulkan/anv_<wbr>extensions_gen.py | 184 ++++++++++++++++++++++++++++++<wbr>+++<br>
>  src/intel/vulkan/meson.build           |   3 +-<br>
>  4 files changed, 188 insertions(+), 156 deletions(-)<br>
>  create mode 100644 src/intel/vulkan/anv_<wbr>extensions_gen.py<br>
><br>
> diff --git a/src/intel/<a href="http://Makefile.vulkan.am" rel="noreferrer" target="_blank">Makefile.vulkan.am</a> b/src/intel/<a href="http://Makefile.vulkan.am" rel="noreferrer" target="_blank">Makefile.vulkan.am</a><br>
> index 811faab..cacd049 100644<br>
> --- a/src/intel/<a href="http://Makefile.vulkan.am" rel="noreferrer" target="_blank">Makefile.vulkan.am</a><br>
> +++ b/src/intel/<a href="http://Makefile.vulkan.am" rel="noreferrer" target="_blank">Makefile.vulkan.am</a><br>
> @@ -36,7 +36,8 @@ vulkan/anv_entrypoints.c: vulkan/anv_entrypoints_gen.py \<br>
>               --outdir $(builddir)/vulkan<br>
>  vulkan/anv_entrypoints.h: vulkan/anv_entrypoints.c<br>
><br>
> -vulkan/anv_extensions.c: vulkan/anv_extensions.py \<br>
> +vulkan/anv_extensions.c: vulkan/anv_extensions_gen.py \<br>
> +                      vulkan/anv_extensions.py \<br>
>                        $(vulkan_api_xml) \<br>
>                        $(vk_android_native_buffer_<wbr>xml)<br>
>       $(MKDIR_GEN)<br>
<br>
</span>There is a bug in the autotools build,</blockquote><div><br></div><div>Sorry about that. :-(  I should have tested before sending it to the list.  I've got it fixed locally.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> it is needed to update the<br>
command to generate the files:<br>
<br>
diff --git a/src/intel/<a href="http://Makefile.vulkan.am" rel="noreferrer" target="_blank">Makefile.vulkan.am</a> b/src/intel/<a href="http://Makefile.vulkan.am" rel="noreferrer" target="_blank">Makefile.vulkan.am</a><br>
index 7157772062c..7823b608804 100644<br>
--- a/src/intel/<a href="http://Makefile.vulkan.am" rel="noreferrer" target="_blank">Makefile.vulkan.am</a><br>
+++ b/src/intel/<a href="http://Makefile.vulkan.am" rel="noreferrer" target="_blank">Makefile.vulkan.am</a><br>
@@ -41,7 +41,7 @@ vulkan/anv_extensions.c: vulkan/anv_extensions_gen.py \<br>
                         $(vulkan_api_xml) \<br>
                         $(vk_android_native_buffer_<wbr>xml)<br>
        $(MKDIR_GEN)<br>
-       $(AM_V_GEN)$(PYTHON2) $(srcdir)/vulkan/anv_<wbr>extensions.py \<br>
+       $(AM_V_GEN)$(PYTHON2) $(srcdir)/vulkan/anv_<wbr>extensions_gen.py \<br>
                --xml $(vulkan_api_xml) \<br>
                --xml $(vk_android_native_buffer_<wbr>xml) \<br>
                --out-c $@<br>
@@ -51,7 +51,7 @@ vulkan/anv_extensions.h: vulkan/anv_extensions_gen.py \<br>
                         $(vulkan_api_xml) \<br>
                         $(vk_android_native_buffer_<wbr>xml)<br>
        $(MKDIR_GEN)<br>
-       $(AM_V_GEN)$(PYTHON2) $(srcdir)/vulkan/anv_<wbr>extensions.py \<br>
+       $(AM_V_GEN)$(PYTHON2) $(srcdir)/vulkan/anv_<wbr>extensions_gen.py \<br>
                --xml $(vulkan_api_xml) \<br>
                --xml $(vk_android_native_buffer_<wbr>xml) \<br>
                --out-h $@<br>
<br>
Sam<br>
<div class="HOEnZb"><div class="h5"><br>
> diff --git a/src/intel/vulkan/anv_<wbr>extensions.py b/src/intel/vulkan/anv_<wbr>extensions.py<br>
> index adfebca..ae30ec9 100644<br>
> --- a/src/intel/vulkan/anv_<wbr>extensions.py<br>
> +++ b/src/intel/vulkan/anv_<wbr>extensions.py<br>
> @@ -130,157 +130,3 @@ class VkVersion:<br>
>          return self.__int_ver().__cmp__(<wbr>other.__int_ver())<br>
><br>
>  MAX_API_VERSION = VkVersion(MAX_API_VERSION)<br>
> -<br>
> -def _init_exts_from_xml(xml):<br>
> -    """ Walk the Vulkan XML and fill out extra extension information. """<br>
> -<br>
> -    xml = et.parse(xml)<br>
> -<br>
> -    ext_name_map = {}<br>
> -    for ext in EXTENSIONS:<br>
> -        ext_name_map[<a href="http://ext.name" rel="noreferrer" target="_blank">ext.name</a>] = ext<br>
> -<br>
> -    for ext_elem in xml.findall('.extensions/<wbr>extension'):<br>
> -        ext_name = ext_elem.attrib['name']<br>
> -        if ext_name not in ext_name_map:<br>
> -            continue<br>
> -<br>
> -        # Workaround for VK_ANDROID_native_buffer. Its <extension> element in<br>
> -        # vk.xml lists it as supported="disabled" and provides only a stub<br>
> -        # definition.  Its <extension> element in Mesa's custom<br>
> -        # vk_android_native_buffer.xml, though, lists it as<br>
> -        # supported='android-vendor' and fully defines the extension. We want<br>
> -        # to skip the <extension> element in vk.xml.<br>
> -        if ext_elem.attrib['supported'] == 'disabled':<br>
> -            assert ext_name == 'VK_ANDROID_native_buffer'<br>
> -            continue<br>
> -<br>
> -        ext = ext_name_map[ext_name]<br>
> -        ext.type = ext_elem.attrib['type']<br>
> -<br>
> -_TEMPLATE = COPYRIGHT + """<br>
> -#include "anv_private.h"<br>
> -<br>
> -#include "vk_util.h"<br>
> -<br>
> -/* Convert the VK_USE_PLATFORM_* defines to booleans */<br>
> -%for platform in ['ANDROID', 'WAYLAND', 'XCB', 'XLIB']:<br>
> -#ifdef VK_USE_PLATFORM_${platform}_<wbr>KHR<br>
> -#   undef VK_USE_PLATFORM_${platform}_<wbr>KHR<br>
> -#   define VK_USE_PLATFORM_${platform}_<wbr>KHR true<br>
> -#else<br>
> -#   define VK_USE_PLATFORM_${platform}_<wbr>KHR false<br>
> -#endif<br>
> -%endfor<br>
> -<br>
> -/* And ANDROID too */<br>
> -#ifdef ANDROID<br>
> -#   undef ANDROID<br>
> -#   define ANDROID true<br>
> -#else<br>
> -#   define ANDROID false<br>
> -#endif<br>
> -<br>
> -#define ANV_HAS_SURFACE (VK_USE_PLATFORM_WAYLAND_KHR || \\<br>
> -                         VK_USE_PLATFORM_XCB_KHR || \\<br>
> -                         VK_USE_PLATFORM_XLIB_KHR)<br>
> -<br>
> -bool<br>
> -anv_instance_extension_<wbr>supported(const char *name)<br>
> -{<br>
> -%for ext in instance_extensions:<br>
> -    if (strcmp(name, "${<a href="http://ext.name" rel="noreferrer" target="_blank">ext.name</a>}") == 0)<br>
> -        return ${ext.enable};<br>
> -%endfor<br>
> -    return false;<br>
> -}<br>
> -<br>
> -VkResult anv_<wbr>EnumerateInstanceExtensionProp<wbr>erties(<br>
> -    const char*                                 pLayerName,<br>
> -    uint32_t*                                   pPropertyCount,<br>
> -    VkExtensionProperties*                      pProperties)<br>
> -{<br>
> -    VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);<br>
> -<br>
> -%for ext in instance_extensions:<br>
> -    if (${ext.enable}) {<br>
> -        vk_outarray_append(&out, prop) {<br>
> -            *prop = (VkExtensionProperties) {<br>
> -                .extensionName = "${<a href="http://ext.name" rel="noreferrer" target="_blank">ext.name</a>}",<br>
> -                .specVersion = ${ext.ext_version},<br>
> -            };<br>
> -        }<br>
> -    }<br>
> -%endfor<br>
> -<br>
> -    return vk_outarray_status(&out);<br>
> -}<br>
> -<br>
> -uint32_t<br>
> -anv_physical_device_api_<wbr>version(struct anv_physical_device *dev)<br>
> -{<br>
> -    return ${MAX_API_VERSION.c_vk_<wbr>version()};<br>
> -}<br>
> -<br>
> -bool<br>
> -anv_physical_device_<wbr>extension_supported(struct anv_physical_device *device,<br>
> -                                        const char *name)<br>
> -{<br>
> -%for ext in device_extensions:<br>
> -    if (strcmp(name, "${<a href="http://ext.name" rel="noreferrer" target="_blank">ext.name</a>}") == 0)<br>
> -        return ${ext.enable};<br>
> -%endfor<br>
> -    return false;<br>
> -}<br>
> -<br>
> -VkResult anv_<wbr>EnumerateDeviceExtensionProper<wbr>ties(<br>
> -    VkPhysicalDevice                            physicalDevice,<br>
> -    const char*                                 pLayerName,<br>
> -    uint32_t*                                   pPropertyCount,<br>
> -    VkExtensionProperties*                      pProperties)<br>
> -{<br>
> -    ANV_FROM_HANDLE(anv_physical_<wbr>device, device, physicalDevice);<br>
> -    VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);<br>
> -    (void)device;<br>
> -<br>
> -%for ext in device_extensions:<br>
> -    if (${ext.enable}) {<br>
> -        vk_outarray_append(&out, prop) {<br>
> -            *prop = (VkExtensionProperties) {<br>
> -                .extensionName = "${<a href="http://ext.name" rel="noreferrer" target="_blank">ext.name</a>}",<br>
> -                .specVersion = ${ext.ext_version},<br>
> -            };<br>
> -        }<br>
> -    }<br>
> -%endfor<br>
> -<br>
> -    return vk_outarray_status(&out);<br>
> -}<br>
> -"""<br>
> -<br>
> -if __name__ == '__main__':<br>
> -    parser = argparse.ArgumentParser()<br>
> -    parser.add_argument('--out', help='Output C file.', required=True)<br>
> -    parser.add_argument('--xml',<br>
> -                        help='Vulkan API XML file.',<br>
> -                        required=True,<br>
> -                        action='append',<br>
> -                        dest='xml_files')<br>
> -    args = parser.parse_args()<br>
> -<br>
> -    for filename in args.xml_files:<br>
> -        _init_exts_from_xml(filename)<br>
> -<br>
> -    for ext in EXTENSIONS:<br>
> -        assert ext.type == 'instance' or ext.type == 'device'<br>
> -<br>
> -    template_env = {<br>
> -        'MAX_API_VERSION': MAX_API_VERSION,<br>
> -        'instance_extensions': [e for e in EXTENSIONS if e.type == 'instance'],<br>
> -        'device_extensions': [e for e in EXTENSIONS if e.type == 'device'],<br>
> -    }<br>
> -<br>
> -    from mako.template import Template<br>
> -<br>
> -    with open(args.out, 'w') as f:<br>
> -        f.write(Template(_TEMPLATE).<wbr>render(**template_env))<br>
> diff --git a/src/intel/vulkan/anv_<wbr>extensions_gen.py b/src/intel/vulkan/anv_<wbr>extensions_gen.py<br>
> new file mode 100644<br>
> index 0000000..a1e8688<br>
> --- /dev/null<br>
> +++ b/src/intel/vulkan/anv_<wbr>extensions_gen.py<br>
> @@ -0,0 +1,184 @@<br>
> +COPYRIGHT = """\<br>
> +/*<br>
> + * Copyright 2017 Intel Corporation<br>
> + *<br>
> + * Permission is hereby granted, free of charge, to any person obtaining a<br>
> + * copy of this software and associated documentation files (the<br>
> + * "Software"), to deal in the Software without restriction, including<br>
> + * without limitation the rights to use, copy, modify, merge, publish,<br>
> + * distribute, sub license, and/or sell copies of the Software, and to<br>
> + * permit persons to whom the Software is furnished to do so, subject to<br>
> + * the following conditions:<br>
> + *<br>
> + * The above copyright notice and this permission notice (including the<br>
> + * next paragraph) shall be included in all copies or substantial portions<br>
> + * of the Software.<br>
> + *<br>
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS<br>
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<br>
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.<br>
> + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR<br>
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,<br>
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE<br>
> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<br>
> + */<br>
> +"""<br>
> +<br>
> +import argparse<br>
> +import xml.etree.cElementTree as et<br>
> +<br>
> +from mako.template import Template<br>
> +<br>
> +from anv_extensions import *<br>
> +<br>
> +def _init_exts_from_xml(xml):<br>
> +    """ Walk the Vulkan XML and fill out extra extension information. """<br>
> +<br>
> +    xml = et.parse(xml)<br>
> +<br>
> +    ext_name_map = {}<br>
> +    for ext in EXTENSIONS:<br>
> +        ext_name_map[<a href="http://ext.name" rel="noreferrer" target="_blank">ext.name</a>] = ext<br>
> +<br>
> +    for ext_elem in xml.findall('.extensions/<wbr>extension'):<br>
> +        ext_name = ext_elem.attrib['name']<br>
> +        if ext_name not in ext_name_map:<br>
> +            continue<br>
> +<br>
> +        # Workaround for VK_ANDROID_native_buffer. Its <extension> element in<br>
> +        # vk.xml lists it as supported="disabled" and provides only a stub<br>
> +        # definition.  Its <extension> element in Mesa's custom<br>
> +        # vk_android_native_buffer.xml, though, lists it as<br>
> +        # supported='android-vendor' and fully defines the extension. We want<br>
> +        # to skip the <extension> element in vk.xml.<br>
> +        if ext_elem.attrib['supported'] == 'disabled':<br>
> +            assert ext_name == 'VK_ANDROID_native_buffer'<br>
> +            continue<br>
> +<br>
> +        ext = ext_name_map[ext_name]<br>
> +        ext.type = ext_elem.attrib['type']<br>
> +<br>
> +_TEMPLATE = Template(COPYRIGHT + """<br>
> +#include "anv_private.h"<br>
> +<br>
> +#include "vk_util.h"<br>
> +<br>
> +/* Convert the VK_USE_PLATFORM_* defines to booleans */<br>
> +%for platform in ['ANDROID', 'WAYLAND', 'XCB', 'XLIB']:<br>
> +#ifdef VK_USE_PLATFORM_${platform}_<wbr>KHR<br>
> +#   undef VK_USE_PLATFORM_${platform}_<wbr>KHR<br>
> +#   define VK_USE_PLATFORM_${platform}_<wbr>KHR true<br>
> +#else<br>
> +#   define VK_USE_PLATFORM_${platform}_<wbr>KHR false<br>
> +#endif<br>
> +%endfor<br>
> +<br>
> +/* And ANDROID too */<br>
> +#ifdef ANDROID<br>
> +#   undef ANDROID<br>
> +#   define ANDROID true<br>
> +#else<br>
> +#   define ANDROID false<br>
> +#endif<br>
> +<br>
> +#define ANV_HAS_SURFACE (VK_USE_PLATFORM_WAYLAND_KHR || \\<br>
> +                         VK_USE_PLATFORM_XCB_KHR || \\<br>
> +                         VK_USE_PLATFORM_XLIB_KHR)<br>
> +<br>
> +bool<br>
> +anv_instance_extension_<wbr>supported(const char *name)<br>
> +{<br>
> +%for ext in instance_extensions:<br>
> +    if (strcmp(name, "${<a href="http://ext.name" rel="noreferrer" target="_blank">ext.name</a>}") == 0)<br>
> +        return ${ext.enable};<br>
> +%endfor<br>
> +    return false;<br>
> +}<br>
> +<br>
> +VkResult anv_<wbr>EnumerateInstanceExtensionProp<wbr>erties(<br>
> +    const char*                                 pLayerName,<br>
> +    uint32_t*                                   pPropertyCount,<br>
> +    VkExtensionProperties*                      pProperties)<br>
> +{<br>
> +    VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);<br>
> +<br>
> +%for ext in instance_extensions:<br>
> +    if (${ext.enable}) {<br>
> +        vk_outarray_append(&out, prop) {<br>
> +            *prop = (VkExtensionProperties) {<br>
> +                .extensionName = "${<a href="http://ext.name" rel="noreferrer" target="_blank">ext.name</a>}",<br>
> +                .specVersion = ${ext.ext_version},<br>
> +            };<br>
> +        }<br>
> +    }<br>
> +%endfor<br>
> +<br>
> +    return vk_outarray_status(&out);<br>
> +}<br>
> +<br>
> +uint32_t<br>
> +anv_physical_device_api_<wbr>version(struct anv_physical_device *dev)<br>
> +{<br>
> +    return ${MAX_API_VERSION.c_vk_<wbr>version()};<br>
> +}<br>
> +<br>
> +bool<br>
> +anv_physical_device_<wbr>extension_supported(struct anv_physical_device *device,<br>
> +                                        const char *name)<br>
> +{<br>
> +%for ext in device_extensions:<br>
> +    if (strcmp(name, "${<a href="http://ext.name" rel="noreferrer" target="_blank">ext.name</a>}") == 0)<br>
> +        return ${ext.enable};<br>
> +%endfor<br>
> +    return false;<br>
> +}<br>
> +<br>
> +VkResult anv_<wbr>EnumerateDeviceExtensionProper<wbr>ties(<br>
> +    VkPhysicalDevice                            physicalDevice,<br>
> +    const char*                                 pLayerName,<br>
> +    uint32_t*                                   pPropertyCount,<br>
> +    VkExtensionProperties*                      pProperties)<br>
> +{<br>
> +    ANV_FROM_HANDLE(anv_physical_<wbr>device, device, physicalDevice);<br>
> +    VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);<br>
> +    (void)device;<br>
> +<br>
> +%for ext in device_extensions:<br>
> +    if (${ext.enable}) {<br>
> +        vk_outarray_append(&out, prop) {<br>
> +            *prop = (VkExtensionProperties) {<br>
> +                .extensionName = "${<a href="http://ext.name" rel="noreferrer" target="_blank">ext.name</a>}",<br>
> +                .specVersion = ${ext.ext_version},<br>
> +            };<br>
> +        }<br>
> +    }<br>
> +%endfor<br>
> +<br>
> +    return vk_outarray_status(&out);<br>
> +}<br>
> +""")<br>
> +<br>
> +if __name__ == '__main__':<br>
> +    parser = argparse.ArgumentParser()<br>
> +    parser.add_argument('--out', help='Output C file.', required=True)<br>
> +    parser.add_argument('--xml',<br>
> +                        help='Vulkan API XML file.',<br>
> +                        required=True,<br>
> +                        action='append',<br>
> +                        dest='xml_files')<br>
> +    args = parser.parse_args()<br>
> +<br>
> +    for filename in args.xml_files:<br>
> +        _init_exts_from_xml(filename)<br>
> +<br>
> +    for ext in EXTENSIONS:<br>
> +        assert ext.type == 'instance' or ext.type == 'device'<br>
> +<br>
> +    template_env = {<br>
> +        'MAX_API_VERSION': MAX_API_VERSION,<br>
> +        'instance_extensions': [e for e in EXTENSIONS if e.type == 'instance'],<br>
> +        'device_extensions': [e for e in EXTENSIONS if e.type == 'device'],<br>
> +    }<br>
> +<br>
> +    with open(args.out, 'w') as f:<br>
> +        f.write(_TEMPLATE.render(**<wbr>template_env))<br>
> diff --git a/src/intel/vulkan/meson.build b/src/intel/vulkan/meson.build<br>
> index 6bd29da..97cb686 100644<br>
> --- a/src/intel/vulkan/meson.build<br>
> +++ b/src/intel/vulkan/meson.build<br>
> @@ -32,7 +32,8 @@ anv_entrypoints = custom_target(<br>
><br>
>  anv_extensions_c = custom_target(<br>
>    'anv_extensions.c',<br>
> -  input : ['anv_extensions.py', vk_api_xml, vk_android_native_buffer_xml],<br>
> +  input : ['anv_extensions_gen.py', vk_api_xml, vk_android_native_buffer_xml,<br>
> +           'anv_extensions.py'],<br>
>    output : 'anv_extensions.c',<br>
>    command : [<br>
>      prog_python2, '@INPUT0@', '--xml', '@INPUT1@', '--xml', '@INPUT2@',<br>
<br>
<br>
</div></div></blockquote></div><br></div></div>