xref: /aosp_15_r20/external/angle/scripts/gen_gl_enum_utils.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/python3
2*8975f5c5SAndroid Build Coastguard Worker#
3*8975f5c5SAndroid Build Coastguard Worker# Copyright 2019 The ANGLE Project Authors. All rights reserved.
4*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
5*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file.
6*8975f5c5SAndroid Build Coastguard Worker#
7*8975f5c5SAndroid Build Coastguard Worker# gen_gl_enum_utils.py:
8*8975f5c5SAndroid Build Coastguard Worker#   Generates GLenum value to string mapping for ANGLE
9*8975f5c5SAndroid Build Coastguard Worker#   NOTE: don't run this script directly. Run scripts/run_code_generation.py.
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Workerimport sys
12*8975f5c5SAndroid Build Coastguard Workerimport os
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Workerimport registry_xml
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Workertemplate_gl_enums_header = """// GENERATED FILE - DO NOT EDIT.
17*8975f5c5SAndroid Build Coastguard Worker// Generated by {script_name} using data from {data_source_name}.
18*8975f5c5SAndroid Build Coastguard Worker//
19*8975f5c5SAndroid Build Coastguard Worker// Copyright 2019 The ANGLE Project Authors. All rights reserved.
20*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be
21*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file.
22*8975f5c5SAndroid Build Coastguard Worker//
23*8975f5c5SAndroid Build Coastguard Worker// gl_enum_utils_autogen.h:
24*8975f5c5SAndroid Build Coastguard Worker//   mapping of GLenum value to string.
25*8975f5c5SAndroid Build Coastguard Worker
26*8975f5c5SAndroid Build Coastguard Worker# ifndef COMMON_GL_ENUM_UTILS_AUTOGEN_H_
27*8975f5c5SAndroid Build Coastguard Worker# define COMMON_GL_ENUM_UTILS_AUTOGEN_H_
28*8975f5c5SAndroid Build Coastguard Worker
29*8975f5c5SAndroid Build Coastguard Workernamespace gl
30*8975f5c5SAndroid Build Coastguard Worker{{
31*8975f5c5SAndroid Build Coastguard Workerenum class GLESEnum
32*8975f5c5SAndroid Build Coastguard Worker{{
33*8975f5c5SAndroid Build Coastguard Worker    {gles_enum_groups}
34*8975f5c5SAndroid Build Coastguard Worker}};
35*8975f5c5SAndroid Build Coastguard Worker
36*8975f5c5SAndroid Build Coastguard Workerenum class BigGLEnum
37*8975f5c5SAndroid Build Coastguard Worker{{
38*8975f5c5SAndroid Build Coastguard Worker    {gl_enum_groups}
39*8975f5c5SAndroid Build Coastguard Worker}};
40*8975f5c5SAndroid Build Coastguard Worker}}  // namespace gl
41*8975f5c5SAndroid Build Coastguard Worker
42*8975f5c5SAndroid Build Coastguard Worker# endif  // COMMON_GL_ENUM_UTILS_AUTOGEN_H_
43*8975f5c5SAndroid Build Coastguard Worker"""
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Workertemplate_gl_enums_source = """// GENERATED FILE - DO NOT EDIT.
46*8975f5c5SAndroid Build Coastguard Worker// Generated by {script_name} using data from {data_source_name}.
47*8975f5c5SAndroid Build Coastguard Worker//
48*8975f5c5SAndroid Build Coastguard Worker// Copyright 2019 The ANGLE Project Authors. All rights reserved.
49*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be
50*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file.
51*8975f5c5SAndroid Build Coastguard Worker//
52*8975f5c5SAndroid Build Coastguard Worker// gl_enum_utils_autogen.cpp:
53*8975f5c5SAndroid Build Coastguard Worker//   mapping of GLenum value to string.
54*8975f5c5SAndroid Build Coastguard Worker
55*8975f5c5SAndroid Build Coastguard Worker#include "common/gl_enum_utils_autogen.h"
56*8975f5c5SAndroid Build Coastguard Worker
57*8975f5c5SAndroid Build Coastguard Worker#include "common/debug.h"
58*8975f5c5SAndroid Build Coastguard Worker#include "common/gl_enum_utils.h"
59*8975f5c5SAndroid Build Coastguard Worker
60*8975f5c5SAndroid Build Coastguard Worker#include <algorithm>
61*8975f5c5SAndroid Build Coastguard Worker#include <cstring>
62*8975f5c5SAndroid Build Coastguard Worker
63*8975f5c5SAndroid Build Coastguard Workernamespace gl
64*8975f5c5SAndroid Build Coastguard Worker{{
65*8975f5c5SAndroid Build Coastguard Workernamespace
66*8975f5c5SAndroid Build Coastguard Worker{{
67*8975f5c5SAndroid Build Coastguard Workerconst char *UnknownEnumToString(unsigned int value)
68*8975f5c5SAndroid Build Coastguard Worker{{
69*8975f5c5SAndroid Build Coastguard Worker    constexpr size_t kBufferSize = 64;
70*8975f5c5SAndroid Build Coastguard Worker    static thread_local char sBuffer[kBufferSize];
71*8975f5c5SAndroid Build Coastguard Worker    snprintf(sBuffer, kBufferSize, "0x%04X", value);
72*8975f5c5SAndroid Build Coastguard Worker    return sBuffer;
73*8975f5c5SAndroid Build Coastguard Worker}}
74*8975f5c5SAndroid Build Coastguard Worker}}  // anonymous namespace
75*8975f5c5SAndroid Build Coastguard Worker
76*8975f5c5SAndroid Build Coastguard Workerconst char *GLenumToString(GLESEnum enumGroup, unsigned int value)
77*8975f5c5SAndroid Build Coastguard Worker{{
78*8975f5c5SAndroid Build Coastguard Worker    switch (enumGroup)
79*8975f5c5SAndroid Build Coastguard Worker    {{
80*8975f5c5SAndroid Build Coastguard Worker        {gles_enums_value_to_string_table}
81*8975f5c5SAndroid Build Coastguard Worker        default:
82*8975f5c5SAndroid Build Coastguard Worker            return UnknownEnumToString(value);
83*8975f5c5SAndroid Build Coastguard Worker    }}
84*8975f5c5SAndroid Build Coastguard Worker}}
85*8975f5c5SAndroid Build Coastguard Worker
86*8975f5c5SAndroid Build Coastguard Workerconst char *GLenumToString(BigGLEnum enumGroup, unsigned int value)
87*8975f5c5SAndroid Build Coastguard Worker{{
88*8975f5c5SAndroid Build Coastguard Worker    switch (enumGroup)
89*8975f5c5SAndroid Build Coastguard Worker    {{
90*8975f5c5SAndroid Build Coastguard Worker        {gl_enums_value_to_string_table}
91*8975f5c5SAndroid Build Coastguard Worker        default:
92*8975f5c5SAndroid Build Coastguard Worker            return UnknownEnumToString(value);
93*8975f5c5SAndroid Build Coastguard Worker    }}
94*8975f5c5SAndroid Build Coastguard Worker}}
95*8975f5c5SAndroid Build Coastguard Worker
96*8975f5c5SAndroid Build Coastguard Workernamespace
97*8975f5c5SAndroid Build Coastguard Worker{{
98*8975f5c5SAndroid Build Coastguard Workerusing StringEnumEntry = std::pair<const char*, unsigned int>;
99*8975f5c5SAndroid Build Coastguard Workerstatic StringEnumEntry g_stringEnumTable[] = {{
100*8975f5c5SAndroid Build Coastguard Worker    {string_to_enum_table}
101*8975f5c5SAndroid Build Coastguard Worker}};
102*8975f5c5SAndroid Build Coastguard Worker
103*8975f5c5SAndroid Build Coastguard Workerconst size_t g_numStringEnums = std::size(g_stringEnumTable);
104*8975f5c5SAndroid Build Coastguard Worker}}  // anonymous namespace
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Workerunsigned int StringToGLenum(const char *str)
107*8975f5c5SAndroid Build Coastguard Worker{{
108*8975f5c5SAndroid Build Coastguard Worker    auto it = std::lower_bound(
109*8975f5c5SAndroid Build Coastguard Worker        &g_stringEnumTable[0], &g_stringEnumTable[g_numStringEnums], str,
110*8975f5c5SAndroid Build Coastguard Worker        [](const StringEnumEntry& a, const char* b) {{ return strcmp(a.first, b) < 0; }});
111*8975f5c5SAndroid Build Coastguard Worker
112*8975f5c5SAndroid Build Coastguard Worker    if (strcmp(it->first, str) == 0)
113*8975f5c5SAndroid Build Coastguard Worker    {{
114*8975f5c5SAndroid Build Coastguard Worker        return it->second;
115*8975f5c5SAndroid Build Coastguard Worker    }}
116*8975f5c5SAndroid Build Coastguard Worker
117*8975f5c5SAndroid Build Coastguard Worker    UNREACHABLE();
118*8975f5c5SAndroid Build Coastguard Worker    return 0;
119*8975f5c5SAndroid Build Coastguard Worker}}
120*8975f5c5SAndroid Build Coastguard Worker}}  // namespace gl
121*8975f5c5SAndroid Build Coastguard Worker
122*8975f5c5SAndroid Build Coastguard Worker"""
123*8975f5c5SAndroid Build Coastguard Worker
124*8975f5c5SAndroid Build Coastguard Workertemplate_enum_group_case = """case {api_enum}::{group_name}: {{
125*8975f5c5SAndroid Build Coastguard Worker    switch (value) {{
126*8975f5c5SAndroid Build Coastguard Worker        {inner_group_cases}
127*8975f5c5SAndroid Build Coastguard Worker        default:
128*8975f5c5SAndroid Build Coastguard Worker            return UnknownEnumToString(value);
129*8975f5c5SAndroid Build Coastguard Worker    }}
130*8975f5c5SAndroid Build Coastguard Worker}}
131*8975f5c5SAndroid Build Coastguard Worker"""
132*8975f5c5SAndroid Build Coastguard Worker
133*8975f5c5SAndroid Build Coastguard Workertemplate_enum_value_to_string_case = """case {value}: return {name};"""
134*8975f5c5SAndroid Build Coastguard Workerexclude_enum_groups = {'SpecialNumbers'}
135*8975f5c5SAndroid Build Coastguard Worker
136*8975f5c5SAndroid Build Coastguard Worker# Special enum groups that don't have any enum values.
137*8975f5c5SAndroid Build Coastguard Worker# Add groups here if you get missing group compile errors.
138*8975f5c5SAndroid Build Coastguard Workerempty_enum_groups = ['SemaphoreParameterName', 'ShaderBinaryFormat']
139*8975f5c5SAndroid Build Coastguard Worker
140*8975f5c5SAndroid Build Coastguard Worker
141*8975f5c5SAndroid Build Coastguard Workerdef dump_value_to_string_mapping(enum_groups, api_enum):
142*8975f5c5SAndroid Build Coastguard Worker    exporting_groups = list()
143*8975f5c5SAndroid Build Coastguard Worker    for group_name, inner_mapping in enum_groups.items():
144*8975f5c5SAndroid Build Coastguard Worker        # Convert to pairs and strip out-of-range values.
145*8975f5c5SAndroid Build Coastguard Worker        string_value_pairs = list(
146*8975f5c5SAndroid Build Coastguard Worker            filter(lambda x: x[1] >= 0 and x[1] <= 0xFFFFFFFFF, inner_mapping.items()))
147*8975f5c5SAndroid Build Coastguard Worker        if not string_value_pairs:
148*8975f5c5SAndroid Build Coastguard Worker            continue
149*8975f5c5SAndroid Build Coastguard Worker
150*8975f5c5SAndroid Build Coastguard Worker        # sort according values
151*8975f5c5SAndroid Build Coastguard Worker        string_value_pairs.sort(key=lambda x: (x[1], len(x[0]), x[0]))
152*8975f5c5SAndroid Build Coastguard Worker
153*8975f5c5SAndroid Build Coastguard Worker        # remove all duplicate values from the pairs list
154*8975f5c5SAndroid Build Coastguard Worker        # some value may have more than one GLenum mapped to them, such as:
155*8975f5c5SAndroid Build Coastguard Worker        #     GL_DRAW_FRAMEBUFFER_BINDING and GL_FRAMEBUFFER_BINDING
156*8975f5c5SAndroid Build Coastguard Worker        #     GL_BLEND_EQUATION_RGB and GL_BLEND_EQUATION
157*8975f5c5SAndroid Build Coastguard Worker        # it is safe to output either one of them, for simplity here just
158*8975f5c5SAndroid Build Coastguard Worker        # choose the shorter one which comes first in the sorted list
159*8975f5c5SAndroid Build Coastguard Worker        exporting_string_value_pairs = list()
160*8975f5c5SAndroid Build Coastguard Worker        for index, pair in enumerate(string_value_pairs):
161*8975f5c5SAndroid Build Coastguard Worker            if index == 0 or pair[1] != string_value_pairs[index - 1][1]:
162*8975f5c5SAndroid Build Coastguard Worker                exporting_string_value_pairs.append(pair)
163*8975f5c5SAndroid Build Coastguard Worker
164*8975f5c5SAndroid Build Coastguard Worker        inner_code_block = "\n".join([
165*8975f5c5SAndroid Build Coastguard Worker            template_enum_value_to_string_case.format(
166*8975f5c5SAndroid Build Coastguard Worker                value='0x%X' % value,
167*8975f5c5SAndroid Build Coastguard Worker                name='"%s"' % name,
168*8975f5c5SAndroid Build Coastguard Worker            ) for name, value in exporting_string_value_pairs
169*8975f5c5SAndroid Build Coastguard Worker        ])
170*8975f5c5SAndroid Build Coastguard Worker
171*8975f5c5SAndroid Build Coastguard Worker        exporting_groups.append((group_name, inner_code_block))
172*8975f5c5SAndroid Build Coastguard Worker
173*8975f5c5SAndroid Build Coastguard Worker    return "\n".join([
174*8975f5c5SAndroid Build Coastguard Worker        template_enum_group_case.format(
175*8975f5c5SAndroid Build Coastguard Worker            api_enum=api_enum,
176*8975f5c5SAndroid Build Coastguard Worker            group_name=group_name,
177*8975f5c5SAndroid Build Coastguard Worker            inner_group_cases=inner_code_block,
178*8975f5c5SAndroid Build Coastguard Worker        ) for group_name, inner_code_block in sorted(exporting_groups, key=lambda x: x[0])
179*8975f5c5SAndroid Build Coastguard Worker    ])
180*8975f5c5SAndroid Build Coastguard Worker
181*8975f5c5SAndroid Build Coastguard Worker
182*8975f5c5SAndroid Build Coastguard Workerdef dump_string_to_value_mapping(enums_and_values):
183*8975f5c5SAndroid Build Coastguard Worker
184*8975f5c5SAndroid Build Coastguard Worker    def f(value):
185*8975f5c5SAndroid Build Coastguard Worker        if value < 0:
186*8975f5c5SAndroid Build Coastguard Worker            return str(value)
187*8975f5c5SAndroid Build Coastguard Worker        if value < 0xFFFF:
188*8975f5c5SAndroid Build Coastguard Worker            return "0x%04X" % value
189*8975f5c5SAndroid Build Coastguard Worker        if value <= 0xFFFFFFFF:
190*8975f5c5SAndroid Build Coastguard Worker            return "0x%X" % value
191*8975f5c5SAndroid Build Coastguard Worker        else:
192*8975f5c5SAndroid Build Coastguard Worker            return "0xFFFFFFFF"
193*8975f5c5SAndroid Build Coastguard Worker
194*8975f5c5SAndroid Build Coastguard Worker    return '\n'.join('{"%s", %s},' % (k, f(v)) for k, v in sorted(enums_and_values))
195*8975f5c5SAndroid Build Coastguard Worker
196*8975f5c5SAndroid Build Coastguard Worker
197*8975f5c5SAndroid Build Coastguard Workerdef main(header_output_path, source_output_path):
198*8975f5c5SAndroid Build Coastguard Worker    xml = registry_xml.RegistryXML('gl.xml', 'gl_angle_ext.xml')
199*8975f5c5SAndroid Build Coastguard Worker
200*8975f5c5SAndroid Build Coastguard Worker    # Compute a list of all GLES enums.
201*8975f5c5SAndroid Build Coastguard Worker    gles_enums = set()
202*8975f5c5SAndroid Build Coastguard Worker    bigl_enums = set()
203*8975f5c5SAndroid Build Coastguard Worker    for feature in xml.root.findall('feature'):
204*8975f5c5SAndroid Build Coastguard Worker        for require in feature.findall('require'):
205*8975f5c5SAndroid Build Coastguard Worker            assert 'api' not in require.attrib
206*8975f5c5SAndroid Build Coastguard Worker            if 'gles' in feature.attrib['api']:
207*8975f5c5SAndroid Build Coastguard Worker                for enum in require.findall('enum'):
208*8975f5c5SAndroid Build Coastguard Worker                    gles_enums.add(enum.attrib['name'])
209*8975f5c5SAndroid Build Coastguard Worker            if feature.attrib['api'] == 'gl':
210*8975f5c5SAndroid Build Coastguard Worker                for enum in require.findall('enum'):
211*8975f5c5SAndroid Build Coastguard Worker                    bigl_enums.add(enum.attrib['name'])
212*8975f5c5SAndroid Build Coastguard Worker
213*8975f5c5SAndroid Build Coastguard Worker    for extensions in xml.root.findall('extensions'):
214*8975f5c5SAndroid Build Coastguard Worker        for extension in extensions.findall('extension'):
215*8975f5c5SAndroid Build Coastguard Worker            if extension.attrib['name'] in registry_xml.supported_extensions:
216*8975f5c5SAndroid Build Coastguard Worker                for require in extension.findall('require'):
217*8975f5c5SAndroid Build Coastguard Worker                    ext_apis = extension.attrib['supported'].split('|')
218*8975f5c5SAndroid Build Coastguard Worker                    if ('api' not in require.attrib or 'gles' in require.attrib['api']) and (
219*8975f5c5SAndroid Build Coastguard Worker                            'gles' in extension.attrib['supported']):
220*8975f5c5SAndroid Build Coastguard Worker                        for enum in require.findall('enum'):
221*8975f5c5SAndroid Build Coastguard Worker                            gles_enums.add(enum.attrib['name'])
222*8975f5c5SAndroid Build Coastguard Worker                    if ('api' not in require.attrib or
223*8975f5c5SAndroid Build Coastguard Worker                            feature.attrib['api'] == 'gl') and ('gl' in ext_apis):
224*8975f5c5SAndroid Build Coastguard Worker                        for enum in require.findall('enum'):
225*8975f5c5SAndroid Build Coastguard Worker                            bigl_enums.add(enum.attrib['name'])
226*8975f5c5SAndroid Build Coastguard Worker
227*8975f5c5SAndroid Build Coastguard Worker    # Build a map from GLenum name to its value
228*8975f5c5SAndroid Build Coastguard Worker    gl_enum_groups = dict()
229*8975f5c5SAndroid Build Coastguard Worker    gles_enum_groups = dict()
230*8975f5c5SAndroid Build Coastguard Worker
231*8975f5c5SAndroid Build Coastguard Worker    # Add all enums to default groups
232*8975f5c5SAndroid Build Coastguard Worker    gl_default_enums = dict()
233*8975f5c5SAndroid Build Coastguard Worker    gles_default_enums = dict()
234*8975f5c5SAndroid Build Coastguard Worker    gl_enum_groups[registry_xml.default_enum_group_name] = gl_default_enums
235*8975f5c5SAndroid Build Coastguard Worker    gles_enum_groups[registry_xml.default_enum_group_name] = gles_default_enums
236*8975f5c5SAndroid Build Coastguard Worker    enums_and_values = []
237*8975f5c5SAndroid Build Coastguard Worker
238*8975f5c5SAndroid Build Coastguard Worker    for enums_node in xml.root.findall('enums'):
239*8975f5c5SAndroid Build Coastguard Worker        for enum in enums_node.findall('enum'):
240*8975f5c5SAndroid Build Coastguard Worker            enum_name = enum.attrib['name']
241*8975f5c5SAndroid Build Coastguard Worker            enum_value = int(enum.attrib['value'], base=16)
242*8975f5c5SAndroid Build Coastguard Worker            enums_and_values.append((enum_name, enum_value))
243*8975f5c5SAndroid Build Coastguard Worker
244*8975f5c5SAndroid Build Coastguard Worker            if enum_name in gles_enums:
245*8975f5c5SAndroid Build Coastguard Worker                gles_default_enums[enum_name] = enum_value
246*8975f5c5SAndroid Build Coastguard Worker            if enum_name in bigl_enums:
247*8975f5c5SAndroid Build Coastguard Worker                gl_default_enums[enum_name] = enum_value
248*8975f5c5SAndroid Build Coastguard Worker
249*8975f5c5SAndroid Build Coastguard Worker            if 'group' in enum.attrib:
250*8975f5c5SAndroid Build Coastguard Worker                for enum_group in enum.attrib['group'].split(','):
251*8975f5c5SAndroid Build Coastguard Worker                    if enum_group in exclude_enum_groups:
252*8975f5c5SAndroid Build Coastguard Worker                        continue
253*8975f5c5SAndroid Build Coastguard Worker                    if enum_name in gles_enums:
254*8975f5c5SAndroid Build Coastguard Worker                        if enum_group not in gles_enum_groups:
255*8975f5c5SAndroid Build Coastguard Worker                            gles_enum_groups[enum_group] = dict()
256*8975f5c5SAndroid Build Coastguard Worker                        gles_enum_groups[enum_group][enum_name] = enum_value
257*8975f5c5SAndroid Build Coastguard Worker                    if enum_name in bigl_enums:
258*8975f5c5SAndroid Build Coastguard Worker                        if enum_group not in gl_enum_groups:
259*8975f5c5SAndroid Build Coastguard Worker                            gl_enum_groups[enum_group] = dict()
260*8975f5c5SAndroid Build Coastguard Worker                        gl_enum_groups[enum_group][enum_name] = enum_value
261*8975f5c5SAndroid Build Coastguard Worker
262*8975f5c5SAndroid Build Coastguard Worker    for empty_group in empty_enum_groups:
263*8975f5c5SAndroid Build Coastguard Worker        assert not empty_group in gles_enum_groups or not empty_group in gl_enum_groups, 'Remove %s from the empty groups list, it has enums now.' % empty_group
264*8975f5c5SAndroid Build Coastguard Worker        if empty_group not in gles_enum_groups:
265*8975f5c5SAndroid Build Coastguard Worker            gles_enum_groups[empty_group] = dict()
266*8975f5c5SAndroid Build Coastguard Worker        if empty_group not in gl_enum_groups:
267*8975f5c5SAndroid Build Coastguard Worker            gl_enum_groups[empty_group] = dict()
268*8975f5c5SAndroid Build Coastguard Worker
269*8975f5c5SAndroid Build Coastguard Worker    # Write GLenum groups into the header file.
270*8975f5c5SAndroid Build Coastguard Worker    header_content = template_gl_enums_header.format(
271*8975f5c5SAndroid Build Coastguard Worker        script_name=os.path.basename(sys.argv[0]),
272*8975f5c5SAndroid Build Coastguard Worker        data_source_name="gl.xml and gl_angle_ext.xml",
273*8975f5c5SAndroid Build Coastguard Worker        gles_enum_groups=',\n'.join(sorted(gles_enum_groups.keys())),
274*8975f5c5SAndroid Build Coastguard Worker        gl_enum_groups=',\n'.join(sorted(gl_enum_groups.keys())))
275*8975f5c5SAndroid Build Coastguard Worker
276*8975f5c5SAndroid Build Coastguard Worker    header_output_path = registry_xml.script_relative(header_output_path)
277*8975f5c5SAndroid Build Coastguard Worker    with open(header_output_path, 'w') as f:
278*8975f5c5SAndroid Build Coastguard Worker        f.write(header_content)
279*8975f5c5SAndroid Build Coastguard Worker
280*8975f5c5SAndroid Build Coastguard Worker    # Write mapping to source file
281*8975f5c5SAndroid Build Coastguard Worker    gles_enums_value_to_string_table = dump_value_to_string_mapping(gles_enum_groups, 'GLESEnum')
282*8975f5c5SAndroid Build Coastguard Worker    gl_enums_value_to_string_table = dump_value_to_string_mapping(gl_enum_groups, 'BigGLEnum')
283*8975f5c5SAndroid Build Coastguard Worker    string_to_enum_table = dump_string_to_value_mapping(enums_and_values)
284*8975f5c5SAndroid Build Coastguard Worker    source_content = template_gl_enums_source.format(
285*8975f5c5SAndroid Build Coastguard Worker        script_name=os.path.basename(sys.argv[0]),
286*8975f5c5SAndroid Build Coastguard Worker        data_source_name="gl.xml and gl_angle_ext.xml",
287*8975f5c5SAndroid Build Coastguard Worker        gles_enums_value_to_string_table=gles_enums_value_to_string_table,
288*8975f5c5SAndroid Build Coastguard Worker        gl_enums_value_to_string_table=gl_enums_value_to_string_table,
289*8975f5c5SAndroid Build Coastguard Worker        string_to_enum_table=string_to_enum_table,
290*8975f5c5SAndroid Build Coastguard Worker    )
291*8975f5c5SAndroid Build Coastguard Worker
292*8975f5c5SAndroid Build Coastguard Worker    source_output_path = registry_xml.script_relative(source_output_path)
293*8975f5c5SAndroid Build Coastguard Worker    with open(source_output_path, 'w') as f:
294*8975f5c5SAndroid Build Coastguard Worker        f.write(source_content)
295*8975f5c5SAndroid Build Coastguard Worker
296*8975f5c5SAndroid Build Coastguard Worker    return 0
297*8975f5c5SAndroid Build Coastguard Worker
298*8975f5c5SAndroid Build Coastguard Worker
299*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__':
300*8975f5c5SAndroid Build Coastguard Worker    inputs = [
301*8975f5c5SAndroid Build Coastguard Worker        '../third_party/OpenGL-Registry/src/xml/gl.xml',
302*8975f5c5SAndroid Build Coastguard Worker        'gl_angle_ext.xml',
303*8975f5c5SAndroid Build Coastguard Worker        'registry_xml.py',
304*8975f5c5SAndroid Build Coastguard Worker    ]
305*8975f5c5SAndroid Build Coastguard Worker
306*8975f5c5SAndroid Build Coastguard Worker    gl_enum_utils_autogen_base_path = '../src/common/gl_enum_utils_autogen'
307*8975f5c5SAndroid Build Coastguard Worker    outputs = [
308*8975f5c5SAndroid Build Coastguard Worker        gl_enum_utils_autogen_base_path + '.h',
309*8975f5c5SAndroid Build Coastguard Worker        gl_enum_utils_autogen_base_path + '.cpp',
310*8975f5c5SAndroid Build Coastguard Worker    ]
311*8975f5c5SAndroid Build Coastguard Worker
312*8975f5c5SAndroid Build Coastguard Worker    if len(sys.argv) > 1:
313*8975f5c5SAndroid Build Coastguard Worker        if sys.argv[1] == 'inputs':
314*8975f5c5SAndroid Build Coastguard Worker            print(','.join(inputs))
315*8975f5c5SAndroid Build Coastguard Worker        elif sys.argv[1] == 'outputs':
316*8975f5c5SAndroid Build Coastguard Worker            print(','.join(outputs))
317*8975f5c5SAndroid Build Coastguard Worker    else:
318*8975f5c5SAndroid Build Coastguard Worker        sys.exit(
319*8975f5c5SAndroid Build Coastguard Worker            main(
320*8975f5c5SAndroid Build Coastguard Worker                registry_xml.script_relative(outputs[0]),
321*8975f5c5SAndroid Build Coastguard Worker                registry_xml.script_relative(outputs[1])))
322