[Mesa-dev] [PATCH 02/21] anv: Split anv_extensions.py into two files
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Tue Jan 23 07:39:27 UTC 2018
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, 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 --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180123/480e415e/attachment.sig>
More information about the mesa-dev
mailing list