1#!/usr/bin/python3 2# Copyright 2016 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_dxgi_format_table.py: 7# Code generation for DXGI format map. 8# NOTE: don't run this script directly. Run scripts/run_code_generation.py. 9 10import sys 11import angle_format 12import os 13 14from functools import reduce 15 16template_cpp = """// GENERATED FILE - DO NOT EDIT. 17// Generated by {script_name} using data from {data_source_name}. 18// 19// Copyright 2020 The ANGLE Project Authors. All rights reserved. 20// Use of this source code is governed by a BSD-style license that can be 21// found in the LICENSE file. 22// 23// DXGI format info: 24// Determining metadata about a DXGI format. 25 26#include "libANGLE/renderer/Format.h" 27 28using namespace angle; 29 30namespace rx 31{{ 32 33namespace d3d11 34{{ 35 36GLenum GetComponentType(DXGI_FORMAT dxgiFormat) 37{{ 38 switch (dxgiFormat) 39 {{ 40{component_type_cases} default: 41 break; 42 }} 43 44 UNREACHABLE(); 45 return GL_NONE; 46}} 47 48}} // namespace d3d11 49 50namespace d3d11_angle 51{{ 52 53const Format &GetFormat(DXGI_FORMAT dxgiFormat) 54{{ 55 switch (dxgiFormat) 56 {{ 57{format_cases} default: 58 break; 59 }} 60 61 UNREACHABLE(); 62 return Format::Get(FormatID::NONE); 63}} 64 65}} // namespace d3d11_angle 66 67}} // namespace rx 68""" 69 70template_format_case = """ case DXGI_FORMAT_{dxgi_format}: 71 return {result}; 72""" 73 74template_undefined_case = """ case DXGI_FORMAT_{dxgi_format}: 75 break; 76""" 77 78 79def format_case(dxgi_format, result): 80 return template_format_case.format(dxgi_format=dxgi_format, result=result) 81 82 83def undefined_case(dxgi_format): 84 return template_undefined_case.format(dxgi_format=dxgi_format) 85 86 87def main(): 88 89 # auto_script parameters. 90 if len(sys.argv) > 1: 91 inputs = [ 92 'angle_format.py', 93 'angle_format_map.json', 94 'dxgi_format_data.json', 95 ] 96 outputs = ['dxgi_format_map_autogen.cpp'] 97 98 if sys.argv[1] == 'inputs': 99 print(','.join(inputs)) 100 elif sys.argv[1] == 'outputs': 101 print(','.join(outputs)) 102 else: 103 print('Invalid script parameters') 104 return 1 105 return 0 106 107 component_cases = "" 108 format_cases = "" 109 110 input_data = 'dxgi_format_data.json' 111 112 dxgi_map = angle_format.load_json(input_data) 113 114 types = { 115 'SNORM': 'GL_SIGNED_NORMALIZED', 116 'UNORM': 'GL_UNSIGNED_NORMALIZED', 117 'SINT': 'GL_INT', 118 'UINT': 'GL_UNSIGNED_INT', 119 'FLOAT': 'GL_FLOAT', 120 'SHAREDEXP': 'GL_FLOAT' 121 } 122 123 all_angle = angle_format.get_all_angle_formats() 124 125 for dxgi_format, a_format in sorted(dxgi_map.items()): 126 127 found = [ctype in dxgi_format for ctype in types.keys()] 128 count = reduce((lambda a, b: int(a) + int(b)), found) 129 130 component_type = 'GL_NONE' 131 132 if count == 1: 133 gltype = next( 134 gltype for ctype, gltype in sorted(types.items()) if ctype in dxgi_format) 135 component_cases += format_case(dxgi_format, gltype) 136 else: 137 component_cases += undefined_case(dxgi_format) 138 139 if a_format == "": 140 a_format = dxgi_format 141 142 if a_format in all_angle: 143 a_format = "Format::Get(FormatID::" + a_format + ")" 144 format_cases += format_case(dxgi_format, a_format) 145 else: 146 format_cases += undefined_case(dxgi_format) 147 148 with open('dxgi_format_map_autogen.cpp', 'wt') as out_file: 149 output_cpp = template_cpp.format( 150 script_name=os.path.basename(sys.argv[0]), 151 data_source_name=input_data, 152 component_type_cases=component_cases, 153 format_cases=format_cases) 154 out_file.write(output_cpp) 155 out_file.close() 156 return 0 157 158 159if __name__ == '__main__': 160 sys.exit(main()) 161