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