• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/python
2# Copyright 2018 The ANGLE Project Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5#
6# gen_vk_mandatory_format_support_table.py:
7#  Code generation for mandatory formats supported by Vulkan.
8#  NOTE: don't run this script directly. Run scripts/run_code_generation.py.
9
10from datetime import date
11import sys
12
13sys.path.append('..')
14import angle_format
15import xml.etree.ElementTree as etree
16import sys, os
17
18template_table_autogen_cpp = """// GENERATED FILE - DO NOT EDIT.
19// Generated by {script_name} using data from {input_file_name} and
20// the vk.xml file situated at
21// /third_party/vulkan-validation-layers/src/scripts/vk.xml
22//
23// Copyright {copyright_year} The ANGLE Project Authors. All rights reserved.
24// Use of this source code is governed by a BSD-style license that can be
25// found in the LICENSE file.
26//
27// {out_file_name}:
28//   Queries for full Vulkan mandatory format support information based on VK format.
29
30#include "libANGLE/renderer/vulkan/vk_format_utils.h"
31
32using namespace angle;
33
34namespace rx
35{{
36
37namespace vk
38{{
39
40namespace
41{{
42static_assert({num_formats} == kNumVkFormats, "Update kNumVkFormats");
43constexpr std::array<VkFormatProperties, kNumVkFormats> kFormatProperties = {{{{
44    {format_case_data}
45}}}};
46}}  // anonymous namespace
47
48const VkFormatProperties& GetMandatoryFormatSupport(VkFormat vkFormat)
49{{
50    ASSERT(static_cast<uint64_t>(vkFormat) < sizeof(kFormatProperties));
51    return kFormatProperties[vkFormat];
52}}
53
54}}  // namespace vk
55
56}}  // namespace rx
57
58"""
59
60template_format_property = """
61/* {vk_format} */
62{{0, {optimal_features}, {buffer_features}}}"""
63
64
65def script_relative(path):
66    return os.path.join(os.path.dirname(sys.argv[0]), path)
67
68
69def gen_format_case(index, vk_to_index_to_format_map, vk_map):
70    vk_format = vk_to_index_to_format_map[index]
71
72    if vk_format in vk_map and len(vk_map[vk_format]) > 0:
73        # Check which feature is a buffer feature or not.
74        buffer_features = [x for x in vk_map[vk_format] if x.find("_BUFFER_") != -1]
75        optimal_features = [x for x in vk_map[vk_format] if x.find("_BUFFER_") == -1]
76        optimal_features_str = "|".join(optimal_features) if len(optimal_features) else "0"
77        buffer_features_str = "|".join(buffer_features) if len(buffer_features) else "0"
78    else:
79        optimal_features_str = "0"
80        buffer_features_str = "0"
81
82    return template_format_property.format(
83        vk_format=vk_format,
84        optimal_features=optimal_features_str,
85        buffer_features=buffer_features_str)
86
87
88def main():
89
90    input_file_name = 'vk_mandatory_format_support_data.json'
91    out_file_name = 'vk_mandatory_format_support_table_autogen.cpp'
92    vk_xml_file = '../../../../third_party/vulkan-headers/src/registry/vk.xml'
93
94    # auto_script parameters.
95    if len(sys.argv) > 1:
96        inputs = [
97            '../angle_format.py',
98            input_file_name,
99            vk_xml_file,
100        ]
101        outputs = [out_file_name]
102
103        if sys.argv[1] == 'inputs':
104            print ','.join(inputs)
105        elif sys.argv[1] == 'outputs':
106            print ','.join(outputs)
107        else:
108            print('Invalid script parameters')
109            return 1
110        return 0
111
112    tree = etree.parse(script_relative(vk_xml_file))
113    root = tree.getroot()
114    vk_format_enums = root.findall(".//enums[@name='VkFormat']/enum")
115    vk_format_name_to_index_map = {}
116    num_formats = len(vk_format_enums)
117    for format_enum in vk_format_enums:
118        index = int(format_enum.attrib['value'])
119        vk_format = format_enum.attrib['name']
120        vk_format_name_to_index_map[index] = vk_format
121
122    vk_map = angle_format.load_json(input_file_name)
123    vk_cases = [
124        gen_format_case(index, vk_format_name_to_index_map, vk_map)
125        for index in vk_format_name_to_index_map
126    ]
127
128    output_cpp = template_table_autogen_cpp.format(
129        copyright_year=date.today().year,
130        num_formats=num_formats,
131        format_case_data="\n,".join(vk_cases),
132        script_name=__file__,
133        out_file_name=out_file_name,
134        input_file_name=input_file_name)
135
136    with open(out_file_name, 'wt') as out_file:
137        out_file.write(output_cpp)
138        out_file.close()
139    return 0
140
141
142if __name__ == '__main__':
143    sys.exit(main())
144