Path: blob/main_old/src/common/gen_packed_gl_enums.py
1693 views
#!/usr/bin/python21# Copyright 2018 The ANGLE Project Authors. All rights reserved.2# Use of this source code is governed by a BSD-style license that can be3# found in the LICENSE file.4#5# gen_packed_gl_enums.py:6# Code generation for the packed enums.7# NOTE: don't run this script directly. Run scripts/run_code_generation.py.89import json, os, sys10from collections import namedtuple11from collections import OrderedDict1213Enum = namedtuple('Enum', ['name', 'values', 'max_value'])14EnumValue = namedtuple('EnumValue', ['name', 'gl_name', 'value'])1516Generators = [17{18'json': 'packed_gl_enums.json',19'output': 'PackedGLEnums',20'includes': '#include <angle_gl.h>',21'namespace': 'gl',22'enum_type': 'GLenum',23},24{25'json': 'packed_egl_enums.json',26'output': 'PackedEGLEnums',27'includes': '#include <EGL/egl.h>\n#include <EGL/eglext.h>',28'namespace': 'egl',29'enum_type': 'EGLenum',30},31{32'json': 'packed_cl_enums.json',33'output': 'PackedCLEnums',34'includes': '#include <angle_cl.h>\ntypedef cl_uint CLenum;',35'namespace': 'cl',36'enum_type': 'CLenum',37},38]394041def load_enums(path):42with open(path) as map_file:43enums_dict = json.loads(map_file.read(), object_pairs_hook=OrderedDict)4445enums = []46for (enum_name, value_list) in enums_dict.iteritems():4748values = []49i = 05051for (value_name, value_gl_name) in value_list.iteritems():52values.append(EnumValue(value_name, value_gl_name, i))53i += 15455assert (i < 255) # This makes sure enums fit in the uint8_t56enums.append(Enum(enum_name, values, i))5758enums.sort(key=lambda enum: enum.name)59return enums606162def generate_include_guard(path):63return path.replace(".", "_").upper()646566def header_name_from_cpp_name(path):67return path.replace(".cpp", ".h")686970header_template = """// GENERATED FILE - DO NOT EDIT.71// Generated by {script_name} using data from {data_source_name}.72//73// Copyright 2017 The ANGLE Project Authors. All rights reserved.74// Use of this source code is governed by a BSD-style license that can be75// found in the LICENSE file.76//77// {file_name}:78// Declares ANGLE-specific enums classes for {api_enum_name}s and functions operating79// on them.8081#ifndef COMMON_{include_guard}_82#define COMMON_{include_guard}_8384{includes}8586#include <cstdint>87#include <ostream>8889namespace {namespace}90{{9192template<typename Enum>93Enum From{api_enum_name}({api_enum_name} from);94{content}95}} // namespace {namespace}9697#endif // COMMON_{include_guard}_98"""99100enum_declaration_template = """101enum class {enum_name} : uint8_t102{{103{value_declarations}104105InvalidEnum = {max_value},106EnumCount = {max_value},107}};108109template <>110{enum_name} From{api_enum_name}<{enum_name}>({api_enum_name} from);111{api_enum_name} To{api_enum_name}({enum_name} from);112std::ostream &operator<<(std::ostream &os, {enum_name} value);113"""114115116def write_header(enums, path_prefix, file_name, data_source_name, includes, namespace,117api_enum_name):118content = ['']119120for enum in enums:121value_declarations = []122for value in enum.values:123value_declarations.append(' ' + value.name + ' = ' + str(value.value) + ',')124125content.append(126enum_declaration_template.format(127enum_name=enum.name,128max_value=str(enum.max_value),129value_declarations='\n'.join(value_declarations),130api_enum_name=api_enum_name))131132header = header_template.format(133content=''.join(content),134data_source_name=data_source_name,135script_name=sys.argv[0],136file_name=file_name,137include_guard=generate_include_guard(file_name),138includes=includes,139namespace=namespace,140api_enum_name=api_enum_name)141142with (open(path_prefix + file_name, 'wt')) as f:143f.write(header)144145146cpp_template = """// GENERATED FILE - DO NOT EDIT.147// Generated by {script_name} using data from {data_source_name}.148//149// Copyright 2017 The ANGLE Project Authors. All rights reserved.150// Use of this source code is governed by a BSD-style license that can be151// found in the LICENSE file.152//153// {file_name}:154// Implements ANGLE-specific enums classes for {api_enum_name}s and functions operating155// on them.156157#include "common/debug.h"158#include "common/{header_name}"159160namespace {namespace}161{{162{content}163}} // namespace {namespace}164"""165166enum_implementation_template = """167template <>168{enum_name} From{api_enum_name}<{enum_name}>({api_enum_name} from)169{{170switch (from)171{{172{from_glenum_cases}173default:174return {enum_name}::InvalidEnum;175}}176}}177178{api_enum_name} To{api_enum_name}({enum_name} from)179{{180switch (from)181{{182{to_glenum_cases}183default:184UNREACHABLE();185return 0;186}}187}}188189std::ostream &operator<<(std::ostream &os, {enum_name} value)190{{191switch (value)192{{193{ostream_cases}194default:195os << "GL_INVALID_ENUM";196break;197}}198return os;199}}200"""201202203def write_cpp(enums, path_prefix, file_name, data_source_name, namespace, api_enum_name):204content = ['']205206for enum in enums:207from_glenum_cases = []208to_glenum_cases = []209ostream_cases = []210for value in enum.values:211qualified_name = enum.name + '::' + value.name212from_glenum_cases.append(' case ' + value.gl_name + ':\n return ' +213qualified_name + ';')214to_glenum_cases.append(' case ' + qualified_name + ':\n return ' +215value.gl_name + ';')216ostream_cases.append(' case ' + qualified_name + ':\n os << "' +217value.gl_name + '";\n break;')218219content.append(220enum_implementation_template.format(221enum_name=enum.name,222from_glenum_cases='\n'.join(from_glenum_cases),223max_value=str(enum.max_value),224to_glenum_cases='\n'.join(to_glenum_cases),225api_enum_name=api_enum_name,226ostream_cases='\n'.join(ostream_cases)))227228cpp = cpp_template.format(229content=''.join(content),230data_source_name=data_source_name,231script_name=sys.argv[0],232file_name=file_name,233header_name=header_name_from_cpp_name(file_name),234namespace=namespace,235api_enum_name=api_enum_name)236237with (open(path_prefix + file_name, 'wt')) as f:238f.write(cpp)239240241def main():242243# auto_script parameters.244if len(sys.argv) > 1:245inputs = []246outputs = []247for generator in Generators:248inputs += [generator['json']]249outputs += [250generator['output'] + '_autogen.cpp',251generator['output'] + '_autogen.h',252]253254if sys.argv[1] == 'inputs':255print ','.join(inputs)256elif sys.argv[1] == 'outputs':257print ','.join(outputs)258else:259print('Invalid script parameters')260return 1261return 0262263path_prefix = os.path.dirname(os.path.realpath(__file__)) + os.path.sep264265for generator in Generators:266json_file = generator['json']267output_file = generator['output']268includes = generator['includes']269namespace = generator['namespace']270enum_type = generator['enum_type']271enums = load_enums(path_prefix + json_file)272write_header(enums, path_prefix, output_file + '_autogen.h', json_file, includes,273namespace, enum_type)274write_cpp(enums, path_prefix, output_file + '_autogen.cpp', json_file, namespace,275enum_type)276return 0277278279if __name__ == '__main__':280sys.exit(main())281282283