• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1COPYRIGHT = """\
2/*
3 * Copyright 2017 Intel Corporation
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sub license, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial portions
15 * of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25"""
26
27import argparse
28import xml.etree.cElementTree as et
29
30from mako.template import Template
31
32from anv_extensions import *
33
34def _init_exts_from_xml(xml):
35    """ Walk the Vulkan XML and fill out extra extension information. """
36
37    xml = et.parse(xml)
38
39    ext_name_map = {}
40    for ext in EXTENSIONS:
41        ext_name_map[ext.name] = ext
42
43    for ext_elem in xml.findall('.extensions/extension'):
44        ext_name = ext_elem.attrib['name']
45        if ext_name not in ext_name_map:
46            continue
47
48        # Workaround for VK_ANDROID_native_buffer. Its <extension> element in
49        # vk.xml lists it as supported="disabled" and provides only a stub
50        # definition.  Its <extension> element in Mesa's custom
51        # vk_android_native_buffer.xml, though, lists it as
52        # supported='android-vendor' and fully defines the extension. We want
53        # to skip the <extension> element in vk.xml.
54        if ext_elem.attrib['supported'] == 'disabled':
55            assert ext_name == 'VK_ANDROID_native_buffer'
56            continue
57
58        ext = ext_name_map[ext_name]
59        ext.type = ext_elem.attrib['type']
60
61_TEMPLATE_H = Template(COPYRIGHT + """
62
63#ifndef ANV_EXTENSIONS_H
64#define ANV_EXTENSIONS_H
65
66#include "stdbool.h"
67
68#define ANV_INSTANCE_EXTENSION_COUNT ${len(instance_extensions)}
69
70extern const VkExtensionProperties anv_instance_extensions[];
71
72struct anv_instance_extension_table {
73   union {
74      bool extensions[ANV_INSTANCE_EXTENSION_COUNT];
75      struct {
76%for ext in instance_extensions:
77         bool ${ext.name[3:]};
78%endfor
79      };
80   };
81};
82
83extern const struct anv_instance_extension_table anv_instance_extensions_supported;
84
85
86#define ANV_DEVICE_EXTENSION_COUNT ${len(device_extensions)}
87
88extern const VkExtensionProperties anv_device_extensions[];
89
90struct anv_device_extension_table {
91   union {
92      bool extensions[ANV_DEVICE_EXTENSION_COUNT];
93      struct {
94%for ext in device_extensions:
95        bool ${ext.name[3:]};
96%endfor
97      };
98   };
99};
100
101struct anv_physical_device;
102
103void
104anv_physical_device_get_supported_extensions(const struct anv_physical_device *device,
105                                             struct anv_device_extension_table *extensions);
106
107#endif /* ANV_EXTENSIONS_H */
108""")
109
110_TEMPLATE_C = Template(COPYRIGHT + """
111#include "anv_private.h"
112
113#include "vk_util.h"
114
115/* Convert the VK_USE_PLATFORM_* defines to booleans */
116%for platform in ['ANDROID', 'WAYLAND', 'XCB', 'XLIB']:
117#ifdef VK_USE_PLATFORM_${platform}_KHR
118#   undef VK_USE_PLATFORM_${platform}_KHR
119#   define VK_USE_PLATFORM_${platform}_KHR true
120#else
121#   define VK_USE_PLATFORM_${platform}_KHR false
122#endif
123%endfor
124
125/* And ANDROID too */
126#ifdef ANDROID
127#   undef ANDROID
128#   define ANDROID true
129#else
130#   define ANDROID false
131#endif
132
133#define ANV_HAS_SURFACE (VK_USE_PLATFORM_WAYLAND_KHR || \\
134                         VK_USE_PLATFORM_XCB_KHR || \\
135                         VK_USE_PLATFORM_XLIB_KHR)
136
137const VkExtensionProperties anv_instance_extensions[ANV_INSTANCE_EXTENSION_COUNT] = {
138%for ext in instance_extensions:
139   {"${ext.name}", ${ext.ext_version}},
140%endfor
141};
142
143const struct anv_instance_extension_table anv_instance_extensions_supported = {
144%for ext in instance_extensions:
145   .${ext.name[3:]} = ${ext.enable},
146%endfor
147};
148
149uint32_t
150anv_physical_device_api_version(struct anv_physical_device *dev)
151{
152    return ${MAX_API_VERSION.c_vk_version()};
153}
154
155const VkExtensionProperties anv_device_extensions[ANV_DEVICE_EXTENSION_COUNT] = {
156%for ext in device_extensions:
157   {"${ext.name}", ${ext.ext_version}},
158%endfor
159};
160
161void
162anv_physical_device_get_supported_extensions(const struct anv_physical_device *device,
163                                             struct anv_device_extension_table *extensions)
164{
165   *extensions = (struct anv_device_extension_table) {
166%for ext in device_extensions:
167      .${ext.name[3:]} = ${ext.enable},
168%endfor
169   };
170}
171""")
172
173if __name__ == '__main__':
174    parser = argparse.ArgumentParser()
175    parser.add_argument('--out-c', help='Output C file.')
176    parser.add_argument('--out-h', help='Output H file.')
177    parser.add_argument('--xml',
178                        help='Vulkan API XML file.',
179                        required=True,
180                        action='append',
181                        dest='xml_files')
182    args = parser.parse_args()
183
184    for filename in args.xml_files:
185        _init_exts_from_xml(filename)
186
187    for ext in EXTENSIONS:
188        assert ext.type == 'instance' or ext.type == 'device'
189
190    template_env = {
191        'MAX_API_VERSION': MAX_API_VERSION,
192        'instance_extensions': [e for e in EXTENSIONS if e.type == 'instance'],
193        'device_extensions': [e for e in EXTENSIONS if e.type == 'device'],
194    }
195
196    if args.out_h:
197        with open(args.out_h, 'w') as f:
198            f.write(_TEMPLATE_H.render(**template_env))
199
200    if args.out_c:
201        with open(args.out_c, 'w') as f:
202            f.write(_TEMPLATE_C.render(**template_env))
203