blob: f8233b038e5f78c04d1f0881e99e6db2d142f81a [file] [log] [blame]
#!/usr/bin/python3
# Copyright 2018 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# gen_vk_mandatory_format_support_table.py:
# Code generation for mandatory formats supported by Vulkan.
# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
import sys
sys.path.append('..')
import angle_format
import xml.etree.ElementTree as etree
import sys, os
TEMPLATE_TABLE_AUTOGEN_CPP = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {input_file_name} and
// the vk.xml file situated at
// /third_party/vulkan-validation-layers/src/scripts/vk.xml
//
// Copyright 2020 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// {out_file_name}:
// Queries for full Vulkan mandatory format support information based on VK format.
#include "libANGLE/renderer/vulkan/vk_format_utils.h"
using namespace angle;
namespace rx
{{
namespace vk
{{
namespace
{{
constexpr VkFormatFeatureFlagBits BLIT_DST = VK_FORMAT_FEATURE_BLIT_DST_BIT;
constexpr VkFormatFeatureFlagBits BLIT_SRC = VK_FORMAT_FEATURE_BLIT_SRC_BIT;
constexpr VkFormatFeatureFlagBits COLOR_ATTACHMENT = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
constexpr VkFormatFeatureFlagBits COLOR_ATTACHMENT_BLEND = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
constexpr VkFormatFeatureFlagBits DEPTH_STENCIL_ATTACHMENT = VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
constexpr VkFormatFeatureFlagBits SAMPLED_IMAGE = VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
constexpr VkFormatFeatureFlagBits SAMPLED_IMAGE_FILTER_LINEAR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
constexpr VkFormatFeatureFlagBits STORAGE_IMAGE = VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
constexpr VkFormatFeatureFlagBits STORAGE_IMAGE_ATOMIC = VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT;
constexpr VkFormatFeatureFlagBits STORAGE_TEXEL_BUFFER = VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
constexpr VkFormatFeatureFlagBits STORAGE_TEXEL_BUFFER_ATOMIC = VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT;
constexpr VkFormatFeatureFlagBits UNIFORM_TEXEL_BUFFER = VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
constexpr VkFormatFeatureFlagBits VERTEX_BUFFER = VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
using namespace angle;
constexpr FormatMap<VkFormatProperties> kFormatProperties = {{
{format_case_data}
}};
}} // anonymous namespace
const VkFormatProperties& GetMandatoryFormatSupport(FormatID formatID)
{{
return kFormatProperties[formatID];
}}
}} // namespace vk
}} // namespace rx
"""
TEMPLATE_FORMAT_PROPERTY = """{{FormatID::{format_id}, {{0, {optimal_features}, {buffer_features}}}}}"""
def script_relative(path):
return os.path.join(os.path.dirname(sys.argv[0]), path)
def gen_format_case(format_id, vk_format, vk_map):
def de(str):
return str.replace("VK_FORMAT_FEATURE_", "").replace("_BIT", "")
if vk_format in vk_map and len(vk_map[vk_format]) > 0:
# Check which feature is a buffer feature or not.
buffer_features = [de(x) for x in vk_map[vk_format] if x.find("_BUFFER_") != -1]
optimal_features = [de(x) for x in vk_map[vk_format] if x.find("_BUFFER_") == -1]
optimal_features_str = "|".join(sorted(optimal_features)) if len(optimal_features) else "0"
buffer_features_str = "|".join(sorted(buffer_features)) if len(buffer_features) else "0"
else:
optimal_features_str = "0"
buffer_features_str = "0"
return TEMPLATE_FORMAT_PROPERTY.format(
format_id=format_id,
vk_format=vk_format,
optimal_features=optimal_features_str,
buffer_features=buffer_features_str)
def main():
input_file_name = 'vk_mandatory_format_support_data.json'
vk_format_map_path = 'vk_format_map.json'
out_file_name = 'vk_mandatory_format_support_table_autogen.cpp'
vk_xml_file = '../../../../third_party/vulkan-deps/vulkan-headers/src/registry/vk.xml'
# auto_script parameters.
if len(sys.argv) > 1:
inputs = [
'../angle_format.py',
input_file_name,
vk_format_map_path,
vk_xml_file,
]
outputs = [out_file_name]
if sys.argv[1] == 'inputs':
print(','.join(inputs))
elif sys.argv[1] == 'outputs':
print(','.join(outputs))
else:
print('Invalid script parameters')
return 1
return 0
tree = etree.parse(script_relative(vk_xml_file))
root = tree.getroot()
vk_format_enums = root.findall(".//enums[@name='VkFormat']/enum")
vk_map = angle_format.load_json(input_file_name)
vk_format_map = angle_format.load_json(vk_format_map_path)
vk_cases = [
gen_format_case(format_id, vk_format, vk_map)
for format_id, vk_format in sorted(vk_format_map["map"].items())
]
output_cpp = TEMPLATE_TABLE_AUTOGEN_CPP.format(
format_case_data=",\n".join(vk_cases),
script_name=os.path.basename(__file__),
out_file_name=out_file_name,
input_file_name=input_file_name)
with open(out_file_name, 'wt') as out_file:
out_file.write(output_cpp)
out_file.close()
return 0
if __name__ == '__main__':
sys.exit(main())