#!/usr/bin/python3 # Copyright 2016 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_format_map.py: # Code generation for GL format map. The format map matches between # {format,type} and internal format. # NOTE: don't run this script directly. Run scripts/run_code_generation.py. import sys sys.path.append('renderer') import angle_format template_cpp = """// GENERATED FILE - DO NOT EDIT. // Generated by {script_name} using data from {data_source_name}. // ES3 format info from {es3_data_source_name}. // // Copyright 2016 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. // // format_map: // Determining the sized internal format from a (format,type) pair. // Also check es3 format combinations for validity. #include "angle_gl.h" #include "common/debug.h" namespace gl {{ GLenum GetSizedFormatInternal(GLenum format, GLenum type) {{ switch (format) {{ {format_cases} case GL_NONE: return GL_NONE; default: break; }} return GL_NONE; }} bool ValidES3Format(GLenum format) {{ switch (format) {{ {es3_format_cases} return true; default: return false; }} }} bool ValidES3Type(GLenum type) {{ switch (type) {{ {es3_type_cases} return true; default: return false; }} }} bool ValidES3FormatCombination(GLenum format, GLenum type, GLenum internalFormat) {{ ASSERT(ValidES3Format(format) && ValidES3Type(type)); switch (format) {{ {es3_combo_cases} default: UNREACHABLE(); break; }} return false; }} }} // namespace gl """ template_format_case = """ case {format}: switch (type) {{ {type_cases} default: break; }} break; """ template_simple_case = """ case {key}: return {result}; """ template_es3_combo_type_case = """ case {type}: {{ switch (internalFormat) {{ {internal_format_cases} return true; default: break; }} break; }} """ def parse_type_case(type, result): return template_simple_case.format(key=type, result=result) def parse_format_case(format, type_map): type_cases = "" for type, internal_format in sorted(type_map.items()): type_cases += parse_type_case(type, internal_format) return template_format_case.format(format=format, type_cases=type_cases) def main(): # auto_script parameters. if len(sys.argv) > 1: inputs = [ 'renderer/angle_format.py', 'es3_format_type_combinations.json', 'format_map_data.json' ] outputs = ['format_map_autogen.cpp'] 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 input_script = 'format_map_data.json' format_map = angle_format.load_json(input_script) format_cases = "" for format, type_map in sorted(format_map.items()): format_cases += parse_format_case(format, type_map) combo_data_file = 'es3_format_type_combinations.json' es3_combo_data = angle_format.load_json(combo_data_file) combo_data = [combo for sublist in es3_combo_data.values() for combo in sublist] types = set() formats = set() combos = {} for internal_format, format, type in combo_data: types.update([type]) formats.update([format]) if format not in combos: combos[format] = {} if type not in combos[format]: combos[format][type] = [internal_format] else: combos[format][type] += [internal_format] es3_format_cases = "" for format in sorted(formats): es3_format_cases += " case " + format + ":\n" es3_type_cases = "" for type in sorted(types): es3_type_cases += " case " + type + ":\n" es3_combo_cases = "" for format, type_combos in sorted(combos.items()): this_type_cases = "" for type, combos in sorted(type_combos.items()): internal_format_cases = "" for internal_format in combos: internal_format_cases += " case " + internal_format + ":\n" this_type_cases += template_es3_combo_type_case.format( type=type, internal_format_cases=internal_format_cases) es3_combo_cases += template_format_case.format(format=format, type_cases=this_type_cases) with open('format_map_autogen.cpp', 'wt') as out_file: output_cpp = template_cpp.format( script_name=sys.argv[0], data_source_name=input_script, es3_data_source_name=combo_data_file, format_cases=format_cases, es3_format_cases=es3_format_cases, es3_type_cases=es3_type_cases, es3_combo_cases=es3_combo_cases) out_file.write(output_cpp) return 0 if __name__ == '__main__': sys.exit(main())