# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
-"""Create enum to string functions for vulking using vk.xml."""
+"""Create enum to string functions for vulkan using vk.xml."""
from __future__ import print_function
+import argparse
import os
import textwrap
import xml.etree.cElementTree as et
from mako.template import Template
-VK_XML = os.path.join(os.path.dirname(__file__), '..', 'registry', 'vk.xml')
-
COPYRIGHT = textwrap.dedent(u"""\
* Copyright © 2017 Intel Corporation
*
*/
#include <vulkan/vulkan.h>
+ #include <vulkan/vk_android_native_buffer.h>
#include "util/macros.h"
#include "vk_enum_to_str.h"
{
switch(input) {
% for v in enum.values:
+ % if v in FOREIGN_ENUM_VALUES:
+
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wswitch"
+ % endif
case ${v}:
return "${v}";
+ % if v in FOREIGN_ENUM_VALUES:
+ #pragma GCC diagnostic pop
+
+ % endif
% endfor
default:
unreachable("Undefined enum value.");
#define MESA_VK_ENUM_TO_STR_H
#include <vulkan/vulkan.h>
+ #include <vulkan/vk_android_native_buffer.h>
% for enum in enums:
const char * vk_${enum.name[2:]}_to_str(${enum.name} input);
#endif"""),
output_encoding='utf-8')
+# These enums are defined outside their respective enum blocks, and thus cause
+# -Wswitch warnings.
+FOREIGN_ENUM_VALUES = [
+ "VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID",
+]
+
class EnumFactory(object):
"""Factory for creating enums."""
self.values = values or []
-def xml_parser(filename):
- """Parse the XML file and return parsed data.
+def parse_xml(efactory, filename):
+ """Parse the XML file. Accumulate results into the efactory.
This parser is a memory efficient iterative XML parser that returns a list
of VkEnum objects.
"""
- efactory = EnumFactory(VkEnum)
with open(filename, 'rb') as f:
context = iter(et.iterparse(f, events=('start', 'end')))
root.clear()
- return efactory.registry.values()
-
def main():
- enums = xml_parser(VK_XML)
- for template, file_ in [(C_TEMPLATE, 'vk_enum_to_str.c'),
- (H_TEMPLATE, 'vk_enum_to_str.h')]:
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--xml', required=True,
+ help='Vulkan API XML files',
+ action='append',
+ dest='xml_files')
+ parser.add_argument('--outdir',
+ help='Directory to put the generated files in',
+ required=True)
+
+ args = parser.parse_args()
+
+ efactory = EnumFactory(VkEnum)
+ for filename in args.xml_files:
+ parse_xml(efactory, filename)
+
+ 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'))]:
with open(file_, 'wb') as f:
f.write(template.render(
file=os.path.basename(__file__),
- enums=enums,
- copyright=COPYRIGHT))
+ enums=efactory.registry.values(),
+ copyright=COPYRIGHT,
+ FOREIGN_ENUM_VALUES=FOREIGN_ENUM_VALUES))
if __name__ == '__main__':