xref: /aosp_15_r20/external/angle/src/libANGLE/gen_extensions.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/python3
2*8975f5c5SAndroid Build Coastguard Worker#
3*8975f5c5SAndroid Build Coastguard Worker# Copyright 2021 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_extensions.py:
8*8975f5c5SAndroid Build Coastguard Worker#   Generates files from supported extensions data.
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 json
12*8975f5c5SAndroid Build Coastguard Workerimport os
13*8975f5c5SAndroid Build Coastguard Workerimport re
14*8975f5c5SAndroid Build Coastguard Workerimport sys
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Workerd = os.path.dirname
17*8975f5c5SAndroid Build Coastguard WorkerTHIS_DIR = d(os.path.abspath(__file__))
18*8975f5c5SAndroid Build Coastguard WorkerANGLE_SRC_DIR = d(d(THIS_DIR))
19*8975f5c5SAndroid Build Coastguard WorkerSCRIPTS_DIR = os.path.join(ANGLE_SRC_DIR, 'scripts')
20*8975f5c5SAndroid Build Coastguard Workersys.path.insert(0, SCRIPTS_DIR)
21*8975f5c5SAndroid Build Coastguard Worker
22*8975f5c5SAndroid Build Coastguard Workerimport registry_xml
23*8975f5c5SAndroid Build Coastguard Worker
24*8975f5c5SAndroid Build Coastguard Worker_MD_GLES_GPU_CONFIGS = [
25*8975f5c5SAndroid Build Coastguard Worker    'NVIDIA 1660 Win10',
26*8975f5c5SAndroid Build Coastguard Worker    'Intel 630 Win10',
27*8975f5c5SAndroid Build Coastguard Worker    'NVIDIA 1660 Linux',
28*8975f5c5SAndroid Build Coastguard Worker    'Intel 630 Linux',
29*8975f5c5SAndroid Build Coastguard Worker    'SwiftShader Win10',
30*8975f5c5SAndroid Build Coastguard Worker    'Pixel 4 Android 11',
31*8975f5c5SAndroid Build Coastguard Worker    'Pixel 6 Android 13',
32*8975f5c5SAndroid Build Coastguard Worker]
33*8975f5c5SAndroid Build Coastguard Worker
34*8975f5c5SAndroid Build Coastguard Worker_MD_GLES1_GPU_CONFIGS = [
35*8975f5c5SAndroid Build Coastguard Worker    'SwiftShader Win10',
36*8975f5c5SAndroid Build Coastguard Worker]
37*8975f5c5SAndroid Build Coastguard Worker
38*8975f5c5SAndroid Build Coastguard Worker_GLES_EXTENSIONS_TEMPLATE = """\
39*8975f5c5SAndroid Build Coastguard Worker// GENERATED FILE - DO NOT EDIT.
40*8975f5c5SAndroid Build Coastguard Worker// Generated by {script_name} using data from {data_source_name}
41*8975f5c5SAndroid Build Coastguard Worker//
42*8975f5c5SAndroid Build Coastguard Worker// Copyright 2021 The ANGLE Project Authors. All rights reserved.
43*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be
44*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file.
45*8975f5c5SAndroid Build Coastguard Worker//
46*8975f5c5SAndroid Build Coastguard Worker// {filename}: GLES extension information.
47*8975f5c5SAndroid Build Coastguard Worker
48*8975f5c5SAndroid Build Coastguard Worker#ifndef LIBANGLE_GLES_EXTENSIONS_AUTOGEN_H_
49*8975f5c5SAndroid Build Coastguard Worker#define LIBANGLE_GLES_EXTENSIONS_AUTOGEN_H_
50*8975f5c5SAndroid Build Coastguard Worker
51*8975f5c5SAndroid Build Coastguard Workernamespace gl
52*8975f5c5SAndroid Build Coastguard Worker{{
53*8975f5c5SAndroid Build Coastguard Workerclass TextureCapsMap;
54*8975f5c5SAndroid Build Coastguard Worker
55*8975f5c5SAndroid Build Coastguard Workerstruct Extensions
56*8975f5c5SAndroid Build Coastguard Worker{{
57*8975f5c5SAndroid Build Coastguard Worker    Extensions();
58*8975f5c5SAndroid Build Coastguard Worker    Extensions(const Extensions &other);
59*8975f5c5SAndroid Build Coastguard Worker
60*8975f5c5SAndroid Build Coastguard Worker    Extensions &operator=(const Extensions &other);
61*8975f5c5SAndroid Build Coastguard Worker
62*8975f5c5SAndroid Build Coastguard Worker    // Generate a vector of supported extension strings
63*8975f5c5SAndroid Build Coastguard Worker    std::vector<std::string> getStrings() const;
64*8975f5c5SAndroid Build Coastguard Worker
65*8975f5c5SAndroid Build Coastguard Worker    // Set all texture related extension support based on the supported textures.
66*8975f5c5SAndroid Build Coastguard Worker    // Determines support for:
67*8975f5c5SAndroid Build Coastguard Worker    // GL_OES_packed_depth_stencil
68*8975f5c5SAndroid Build Coastguard Worker    // GL_OES_rgb8_rgba8
69*8975f5c5SAndroid Build Coastguard Worker    // GL_EXT_texture_format_BGRA8888
70*8975f5c5SAndroid Build Coastguard Worker    // GL_EXT_color_buffer_half_float,
71*8975f5c5SAndroid Build Coastguard Worker    // GL_OES_texture_half_float, GL_OES_texture_half_float_linear
72*8975f5c5SAndroid Build Coastguard Worker    // GL_OES_texture_float, GL_OES_texture_float_linear
73*8975f5c5SAndroid Build Coastguard Worker    // GL_EXT_texture_rg
74*8975f5c5SAndroid Build Coastguard Worker    // GL_EXT_texture_type_2_10_10_10_REV
75*8975f5c5SAndroid Build Coastguard Worker    // GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3,
76*8975f5c5SAndroid Build Coastguard Worker    // GL_ANGLE_texture_compression_dxt5
77*8975f5c5SAndroid Build Coastguard Worker    // GL_KHR_texture_compression_astc_ldr, GL_OES_texture_compression_astc.
78*8975f5c5SAndroid Build Coastguard Worker    //     NOTE: GL_KHR_texture_compression_astc_hdr must be enabled separately. Support for the
79*8975f5c5SAndroid Build Coastguard Worker    //           HDR profile cannot be determined from the format enums alone.
80*8975f5c5SAndroid Build Coastguard Worker    // GL_OES_compressed_ETC1_RGB8_texture
81*8975f5c5SAndroid Build Coastguard Worker    // GL_EXT_sRGB
82*8975f5c5SAndroid Build Coastguard Worker    // GL_ANGLE_depth_texture, GL_OES_depth32
83*8975f5c5SAndroid Build Coastguard Worker    // GL_EXT_color_buffer_float
84*8975f5c5SAndroid Build Coastguard Worker    // GL_EXT_texture_norm16
85*8975f5c5SAndroid Build Coastguard Worker    // GL_EXT_texture_compression_bptc
86*8975f5c5SAndroid Build Coastguard Worker    // GL_EXT_texture_compression_rgtc
87*8975f5c5SAndroid Build Coastguard Worker    void setTextureExtensionSupport(const TextureCapsMap &textureCaps);
88*8975f5c5SAndroid Build Coastguard Worker
89*8975f5c5SAndroid Build Coastguard Worker    // Helper functions
90*8975f5c5SAndroid Build Coastguard Worker{helper_functions}
91*8975f5c5SAndroid Build Coastguard Worker
92*8975f5c5SAndroid Build Coastguard Worker    // GLES 2.0+ extensions
93*8975f5c5SAndroid Build Coastguard Worker    // --------------------
94*8975f5c5SAndroid Build Coastguard Worker
95*8975f5c5SAndroid Build Coastguard Worker{gles_extensions}
96*8975f5c5SAndroid Build Coastguard Worker    // ANGLE unofficial extensions
97*8975f5c5SAndroid Build Coastguard Worker    // ---------------------------
98*8975f5c5SAndroid Build Coastguard Worker
99*8975f5c5SAndroid Build Coastguard Worker{angle_extensions}
100*8975f5c5SAndroid Build Coastguard Worker    // GLES 1.0 and 1.1 extensions
101*8975f5c5SAndroid Build Coastguard Worker    // ---------------------------
102*8975f5c5SAndroid Build Coastguard Worker
103*8975f5c5SAndroid Build Coastguard Worker{gles1_extensions}}};
104*8975f5c5SAndroid Build Coastguard Worker}}  // namespace gl
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Worker#endif  // LIBANGLE_GLES_EXTENSIONS_AUTOGEN_H_
107*8975f5c5SAndroid Build Coastguard Worker"""
108*8975f5c5SAndroid Build Coastguard Worker
109*8975f5c5SAndroid Build Coastguard Worker_EXT_MEMBER_TEMPLATE = """\
110*8975f5c5SAndroid Build Coastguard Worker    // {full_name}
111*8975f5c5SAndroid Build Coastguard Worker    bool {name_camel_case}{vendor} = false;
112*8975f5c5SAndroid Build Coastguard Worker"""
113*8975f5c5SAndroid Build Coastguard Worker
114*8975f5c5SAndroid Build Coastguard Worker_HELPER_TEMPLATE = """    bool {ext_name}Any() const {{ return ({expression}); }}"""
115*8975f5c5SAndroid Build Coastguard Worker
116*8975f5c5SAndroid Build Coastguard Worker_GLES_EXT_STRINGS_TEMPLATE = """\
117*8975f5c5SAndroid Build Coastguard Worker// GENERATED FILE - DO NOT EDIT.
118*8975f5c5SAndroid Build Coastguard Worker// Generated by {script_name} using data from {data_source_name}
119*8975f5c5SAndroid Build Coastguard Worker//
120*8975f5c5SAndroid Build Coastguard Worker// Copyright 2021 The ANGLE Project Authors. All rights reserved.
121*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be
122*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file.
123*8975f5c5SAndroid Build Coastguard Worker//
124*8975f5c5SAndroid Build Coastguard Worker// {filename}: GLES extension strings information.
125*8975f5c5SAndroid Build Coastguard Worker
126*8975f5c5SAndroid Build Coastguard Worker#include "anglebase/no_destructor.h"
127*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/Caps.h"
128*8975f5c5SAndroid Build Coastguard Worker
129*8975f5c5SAndroid Build Coastguard Workernamespace gl
130*8975f5c5SAndroid Build Coastguard Worker{{
131*8975f5c5SAndroid Build Coastguard Workerconst ExtensionInfoMap &GetExtensionInfoMap()
132*8975f5c5SAndroid Build Coastguard Worker{{
133*8975f5c5SAndroid Build Coastguard Worker    auto buildExtensionInfoMap = []() {{
134*8975f5c5SAndroid Build Coastguard Worker        auto enableableExtension = [](ExtensionBool member) {{
135*8975f5c5SAndroid Build Coastguard Worker            ExtensionInfo info;
136*8975f5c5SAndroid Build Coastguard Worker            info.Requestable      = true;
137*8975f5c5SAndroid Build Coastguard Worker            info.ExtensionsMember = member;
138*8975f5c5SAndroid Build Coastguard Worker            return info;
139*8975f5c5SAndroid Build Coastguard Worker        }};
140*8975f5c5SAndroid Build Coastguard Worker
141*8975f5c5SAndroid Build Coastguard Worker        auto enableableDisablableExtension = [&](ExtensionBool member) {{
142*8975f5c5SAndroid Build Coastguard Worker            ExtensionInfo info = enableableExtension(member);
143*8975f5c5SAndroid Build Coastguard Worker            info.Disablable    = true;
144*8975f5c5SAndroid Build Coastguard Worker            return info;
145*8975f5c5SAndroid Build Coastguard Worker        }};
146*8975f5c5SAndroid Build Coastguard Worker
147*8975f5c5SAndroid Build Coastguard Worker        auto esOnlyExtension = [](ExtensionBool member) {{
148*8975f5c5SAndroid Build Coastguard Worker            ExtensionInfo info;
149*8975f5c5SAndroid Build Coastguard Worker            info.ExtensionsMember = member;
150*8975f5c5SAndroid Build Coastguard Worker            return info;
151*8975f5c5SAndroid Build Coastguard Worker        }};
152*8975f5c5SAndroid Build Coastguard Worker
153*8975f5c5SAndroid Build Coastguard Worker        // clang-format off
154*8975f5c5SAndroid Build Coastguard Worker        ExtensionInfoMap map;
155*8975f5c5SAndroid Build Coastguard Worker
156*8975f5c5SAndroid Build Coastguard Worker        // GLES 2.0 extension strings
157*8975f5c5SAndroid Build Coastguard Worker        // --------------------------
158*8975f5c5SAndroid Build Coastguard Worker{gles_strings}
159*8975f5c5SAndroid Build Coastguard Worker
160*8975f5c5SAndroid Build Coastguard Worker        // ANGLE unofficial extension strings
161*8975f5c5SAndroid Build Coastguard Worker        // ----------------------------------
162*8975f5c5SAndroid Build Coastguard Worker{angle_strings}
163*8975f5c5SAndroid Build Coastguard Worker
164*8975f5c5SAndroid Build Coastguard Worker        // GLES 1.0 and 1.1 extension strings
165*8975f5c5SAndroid Build Coastguard Worker        // ----------------------------------
166*8975f5c5SAndroid Build Coastguard Worker{gles1_strings}
167*8975f5c5SAndroid Build Coastguard Worker        // clang-format on
168*8975f5c5SAndroid Build Coastguard Worker
169*8975f5c5SAndroid Build Coastguard Worker#if defined(ANGLE_ENABLE_ASSERTS)
170*8975f5c5SAndroid Build Coastguard Worker        // Verify all extension strings start with GL_
171*8975f5c5SAndroid Build Coastguard Worker        for (const auto &extension : map)
172*8975f5c5SAndroid Build Coastguard Worker        {{
173*8975f5c5SAndroid Build Coastguard Worker            ASSERT(extension.first.rfind("GL_", 0) == 0);
174*8975f5c5SAndroid Build Coastguard Worker        }}
175*8975f5c5SAndroid Build Coastguard Worker#endif
176*8975f5c5SAndroid Build Coastguard Worker
177*8975f5c5SAndroid Build Coastguard Worker        return map;
178*8975f5c5SAndroid Build Coastguard Worker    }};
179*8975f5c5SAndroid Build Coastguard Worker
180*8975f5c5SAndroid Build Coastguard Worker    static const angle::base::NoDestructor<ExtensionInfoMap> extensionInfo(buildExtensionInfoMap());
181*8975f5c5SAndroid Build Coastguard Worker    return *extensionInfo;
182*8975f5c5SAndroid Build Coastguard Worker}}
183*8975f5c5SAndroid Build Coastguard Worker}} // namespace gl
184*8975f5c5SAndroid Build Coastguard Worker"""
185*8975f5c5SAndroid Build Coastguard Worker
186*8975f5c5SAndroid Build Coastguard Worker_EXT_STRING_TEMPLATE = """\
187*8975f5c5SAndroid Build Coastguard Worker        map["{full_name}"] = {mode}Extension(&Extensions::{name_camel_case}{vendor});"""
188*8975f5c5SAndroid Build Coastguard Worker
189*8975f5c5SAndroid Build Coastguard WorkerESONLY = 'esOnly'
190*8975f5c5SAndroid Build Coastguard WorkerREQUESTABLE = 'enableable'
191*8975f5c5SAndroid Build Coastguard WorkerTOGGLEABLE = 'enableableDisablable'
192*8975f5c5SAndroid Build Coastguard Worker
193*8975f5c5SAndroid Build Coastguard Worker_MARKDOWN_TEMPLATE = """\
194*8975f5c5SAndroid Build Coastguard Worker# ANGLE Supported Extensions
195*8975f5c5SAndroid Build Coastguard Worker
196*8975f5c5SAndroid Build Coastguard WorkerThis is a list of all extensions currently supported by ANGLE's front-end, and
197*8975f5c5SAndroid Build Coastguard Workersupport listed for some of the tested targets for ANGLE's Vulkan back-end. To
198*8975f5c5SAndroid Build Coastguard Workerproduce a list of all supported extensions in the Vulkan back-end, run
199*8975f5c5SAndroid Build Coastguard Worker`angle_end2end_tests` with `--gtest_filter EGLPrintEGLinfoTest.PrintGLInfo/ES*_Vulkan`.
200*8975f5c5SAndroid Build Coastguard Worker
201*8975f5c5SAndroid Build Coastguard WorkerSpecifications for GLES extensions can be found in the [Khronos OpenGL ES API
202*8975f5c5SAndroid Build Coastguard WorkerRegistry](http://www.khronos.org/registry/gles/)
203*8975f5c5SAndroid Build Coastguard Worker
204*8975f5c5SAndroid Build Coastguard WorkerSpecifications for EGL extensions can be found in the [Khronos EGL API
205*8975f5c5SAndroid Build Coastguard WorkerRegistry](http://www.khronos.org/registry/egl/)
206*8975f5c5SAndroid Build Coastguard Worker
207*8975f5c5SAndroid Build Coastguard WorkerSpecifications for ANGLE-specific extensions can be found in the [ANGLE
208*8975f5c5SAndroid Build Coastguard Workerextension registry](../extensions)
209*8975f5c5SAndroid Build Coastguard Worker
210*8975f5c5SAndroid Build Coastguard WorkerThis list is automatically generated by [`{script_name}`](../src/libANGLE/gen_extensions.py)
211*8975f5c5SAndroid Build Coastguard Workerusing data from {data_source_name}.
212*8975f5c5SAndroid Build Coastguard Worker
213*8975f5c5SAndroid Build Coastguard Worker## GLES 2.0, 3.0, 3.1 and 3.2 extension support
214*8975f5c5SAndroid Build Coastguard Worker
215*8975f5c5SAndroid Build Coastguard Worker*Note: some data is sampled from older drivers, so might not represent the latest driver support.*
216*8975f5c5SAndroid Build Coastguard Worker
217*8975f5c5SAndroid Build Coastguard Worker{gles_md_table_header}
218*8975f5c5SAndroid Build Coastguard Worker{gles_md_exts}
219*8975f5c5SAndroid Build Coastguard Worker
220*8975f5c5SAndroid Build Coastguard Worker## ANGLE unofficial extension support
221*8975f5c5SAndroid Build Coastguard Worker
222*8975f5c5SAndroid Build Coastguard Worker*Note: some ANGLE extensions are currently missing specifications.*
223*8975f5c5SAndroid Build Coastguard Worker
224*8975f5c5SAndroid Build Coastguard Worker{angle_md_table_header}
225*8975f5c5SAndroid Build Coastguard Worker{angle_md_exts}
226*8975f5c5SAndroid Build Coastguard Worker
227*8975f5c5SAndroid Build Coastguard Worker## GLES 1.0 and 1.1 extension support
228*8975f5c5SAndroid Build Coastguard Worker
229*8975f5c5SAndroid Build Coastguard Worker{gles1_md_table_header}
230*8975f5c5SAndroid Build Coastguard Worker{gles1_md_exts}
231*8975f5c5SAndroid Build Coastguard Worker
232*8975f5c5SAndroid Build Coastguard Worker## EGL extension support
233*8975f5c5SAndroid Build Coastguard Worker
234*8975f5c5SAndroid Build Coastguard WorkerCurrently EGL extensions are not automatically tracked by our scripting. For a
235*8975f5c5SAndroid Build Coastguard Workerlist of supported EGL extensions in ANGLE's front-end see
236*8975f5c5SAndroid Build Coastguard Worker[`src/libANGLE/Caps.h`](../src/libANGLE/Caps.h).
237*8975f5c5SAndroid Build Coastguard Worker
238*8975f5c5SAndroid Build Coastguard Worker## Configuration information
239*8975f5c5SAndroid Build Coastguard Worker
240*8975f5c5SAndroid Build Coastguard Worker{md_gpu_info}
241*8975f5c5SAndroid Build Coastguard Worker## How to update supported extension data
242*8975f5c5SAndroid Build Coastguard Worker
243*8975f5c5SAndroid Build Coastguard WorkerSupported extension data is stored in the ANGLE repo as JSON files in
244*8975f5c5SAndroid Build Coastguard Worker[`scripts/extension_data`](../scripts/extension_data). The JSON data is
245*8975f5c5SAndroid Build Coastguard Workersourced from public ANGLE test runs. Look for `angle_end2end_tests` in a bot
246*8975f5c5SAndroid Build Coastguard Workerrun: [example link](https://ci.chromium.org/ui/p/angle/builders/ci/win-test/520/overview).
247*8975f5c5SAndroid Build Coastguard WorkerSearch for "`angle_end2end_tests`", then click on the "cas output" and find
248*8975f5c5SAndroid Build Coastguard Worker`GLinfo_ES3_2_Vulkan.json` or `GLinfo_ES3_1_Vulkan_SwiftShader.json` for
249*8975f5c5SAndroid Build Coastguard WorkerSwiftShader.
250*8975f5c5SAndroid Build Coastguard Worker
251*8975f5c5SAndroid Build Coastguard WorkerAll data except for GLES 1 is automatically updated using
252*8975f5c5SAndroid Build Coastguard Workerthe [`update_extension_data.py`](../scripts/update_extension_data.py) script.
253*8975f5c5SAndroid Build Coastguard WorkerTo use it first authenticate to the `bb` and `luci-go` tools by running `bb
254*8975f5c5SAndroid Build Coastguard Workerauth-login` and `./tools/luci-go/swarming login`. Then run the script and
255*8975f5c5SAndroid Build Coastguard Workerre-run [code generation][CodeGen].
256*8975f5c5SAndroid Build Coastguard Worker
257*8975f5c5SAndroid Build Coastguard WorkerThe GLES 1 data is currently manually updated. Find the relevant
258*8975f5c5SAndroid Build Coastguard Workerfile from the task output (see above) and overwrite the correspoding file.
259*8975f5c5SAndroid Build Coastguard WorkerRe-run [code generation][CodeGen] and create a CL as per our normal process.
260*8975f5c5SAndroid Build Coastguard Worker
261*8975f5c5SAndroid Build Coastguard WorkerTo add a new configuration, first retrieve the JSON data, modify
262*8975f5c5SAndroid Build Coastguard Worker[`gen_extensions.py`](../src/libANGLE/gen_extensions.py) as necessary, then
263*8975f5c5SAndroid Build Coastguard Workerrun [`scripts/run_code_generation.py`][CodeGen] to refresh generated files.
264*8975f5c5SAndroid Build Coastguard WorkerAlso update `update_extension_data.py` as necessary.
265*8975f5c5SAndroid Build Coastguard Worker
266*8975f5c5SAndroid Build Coastguard Worker[CodeGen]: ../scripts/run_code_generation.py
267*8975f5c5SAndroid Build Coastguard Worker"""
268*8975f5c5SAndroid Build Coastguard Worker
269*8975f5c5SAndroid Build Coastguard Worker_MD_TABLE_HEADER_TEMPLATE = """\
270*8975f5c5SAndroid Build Coastguard Worker| Extension Name | {configs} |
271*8975f5c5SAndroid Build Coastguard Worker| -------------- | {dashes} |"""
272*8975f5c5SAndroid Build Coastguard Worker
273*8975f5c5SAndroid Build Coastguard Worker_MD_CONFIG_INFO_TEMPLATE = """\
274*8975f5c5SAndroid Build Coastguard Worker{config}:
275*8975f5c5SAndroid Build Coastguard Worker
276*8975f5c5SAndroid Build Coastguard Worker * `GL_RENDERER` is `{Renderer}`
277*8975f5c5SAndroid Build Coastguard Worker * `GL_VENDOR` is `{Vendor}`
278*8975f5c5SAndroid Build Coastguard Worker * `GL_VERSION` is `{Version}`
279*8975f5c5SAndroid Build Coastguard Worker * Data updated {DateRecorded}
280*8975f5c5SAndroid Build Coastguard Worker"""
281*8975f5c5SAndroid Build Coastguard Worker
282*8975f5c5SAndroid Build Coastguard Worker_MD_GLES_EXT_LINK_TEMPLATE = """[{full_name}](https://khronos.org/registry/OpenGL/extensions/{vendor}/{vendor}_{link}.txt)"""
283*8975f5c5SAndroid Build Coastguard Worker_MD_ANGLE_EXT_LINK_TEMPLATE = """[{full_name}](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/{vendor}_{link}.txt)"""
284*8975f5c5SAndroid Build Coastguard Worker
285*8975f5c5SAndroid Build Coastguard Worker# Some extensions are defined in documents that have different names.
286*8975f5c5SAndroid Build Coastguard Worker_LINK_OVERRIDES = {
287*8975f5c5SAndroid Build Coastguard Worker    'GL_ANGLE_shader_pixel_local_storage_coherent': 'shader_pixel_local_storage',
288*8975f5c5SAndroid Build Coastguard Worker    'GL_EXT_memory_object_fd': 'external_objects_fd',
289*8975f5c5SAndroid Build Coastguard Worker    'GL_EXT_semaphore_fd': 'external_objects_fd',
290*8975f5c5SAndroid Build Coastguard Worker}
291*8975f5c5SAndroid Build Coastguard Worker
292*8975f5c5SAndroid Build Coastguard Worker
293*8975f5c5SAndroid Build Coastguard Workerdef get_camel_case(name_with_underscores):
294*8975f5c5SAndroid Build Coastguard Worker    """ To follow ANGLE naming for member variables, we convert the canonical extension:
295*8975f5c5SAndroid Build Coastguard Worker    0. Delete the API and vendor prefix.
296*8975f5c5SAndroid Build Coastguard Worker    1. Capitalize letters after underscores.
297*8975f5c5SAndroid Build Coastguard Worker    2. Delete underscores.
298*8975f5c5SAndroid Build Coastguard Worker    3. Add back the vendor prefix to the end. """
299*8975f5c5SAndroid Build Coastguard Worker    words = name_with_underscores.split('_')
300*8975f5c5SAndroid Build Coastguard Worker    words = [words[0]] + [(word[0].upper() + word[1:]) for word in words[1:]]
301*8975f5c5SAndroid Build Coastguard Worker    return ''.join(words)
302*8975f5c5SAndroid Build Coastguard Worker
303*8975f5c5SAndroid Build Coastguard Worker
304*8975f5c5SAndroid Build Coastguard Workerdef break_down_ext(ext, expr, mode):
305*8975f5c5SAndroid Build Coastguard Worker    """ This splits an extension name like GL_EXT_buffer_storage into string components. """
306*8975f5c5SAndroid Build Coastguard Worker    m = expr.match(ext)
307*8975f5c5SAndroid Build Coastguard Worker    return {
308*8975f5c5SAndroid Build Coastguard Worker        'full_name': ext,
309*8975f5c5SAndroid Build Coastguard Worker        'api_prefix': m.group(1),
310*8975f5c5SAndroid Build Coastguard Worker        'vendor': m.group(2),
311*8975f5c5SAndroid Build Coastguard Worker        'name_with_underscores': m.group(3),
312*8975f5c5SAndroid Build Coastguard Worker        'name_camel_case': get_camel_case(m.group(3)),
313*8975f5c5SAndroid Build Coastguard Worker        'mode': mode,
314*8975f5c5SAndroid Build Coastguard Worker        'link': _LINK_OVERRIDES.get(ext, m.group(3)),
315*8975f5c5SAndroid Build Coastguard Worker    }
316*8975f5c5SAndroid Build Coastguard Worker
317*8975f5c5SAndroid Build Coastguard Worker
318*8975f5c5SAndroid Build Coastguard Workerdef break_down_exts(exts, expr, mode):
319*8975f5c5SAndroid Build Coastguard Worker    return [break_down_ext(ext, expr, mode) for ext in exts]
320*8975f5c5SAndroid Build Coastguard Worker
321*8975f5c5SAndroid Build Coastguard Worker
322*8975f5c5SAndroid Build Coastguard Workerdef format_exts(ext_infos):
323*8975f5c5SAndroid Build Coastguard Worker    return '\n'.join([_EXT_MEMBER_TEMPLATE.format(**ext_info) for ext_info in ext_infos])
324*8975f5c5SAndroid Build Coastguard Worker
325*8975f5c5SAndroid Build Coastguard Worker
326*8975f5c5SAndroid Build Coastguard Workerdef format_helper_function(ext_name, vendors):
327*8975f5c5SAndroid Build Coastguard Worker    return _HELPER_TEMPLATE.format(
328*8975f5c5SAndroid Build Coastguard Worker        ext_name=ext_name,
329*8975f5c5SAndroid Build Coastguard Worker        expression=' || '.join(['%s%s' % (ext_name, vendor) for vendor in vendors]),
330*8975f5c5SAndroid Build Coastguard Worker    )
331*8975f5c5SAndroid Build Coastguard Worker
332*8975f5c5SAndroid Build Coastguard Worker
333*8975f5c5SAndroid Build Coastguard Workerdef format_ext_strings(ext_infos):
334*8975f5c5SAndroid Build Coastguard Worker    return '\n'.join([_EXT_STRING_TEMPLATE.format(**ext_info) for ext_info in ext_infos])
335*8975f5c5SAndroid Build Coastguard Worker
336*8975f5c5SAndroid Build Coastguard Worker
337*8975f5c5SAndroid Build Coastguard Workerdef write_file(fname, template, format_args):
338*8975f5c5SAndroid Build Coastguard Worker    with open(fname, 'w') as f:
339*8975f5c5SAndroid Build Coastguard Worker        formatted = template.format(**format_args)
340*8975f5c5SAndroid Build Coastguard Worker        f.write(formatted)
341*8975f5c5SAndroid Build Coastguard Worker        f.close()
342*8975f5c5SAndroid Build Coastguard Worker
343*8975f5c5SAndroid Build Coastguard Worker
344*8975f5c5SAndroid Build Coastguard Workerdef sort_by_ext_name(ext_infos):
345*8975f5c5SAndroid Build Coastguard Worker    return sorted(ext_infos, key=lambda e: e['name_camel_case'].lower())
346*8975f5c5SAndroid Build Coastguard Worker
347*8975f5c5SAndroid Build Coastguard Worker
348*8975f5c5SAndroid Build Coastguard Workerdef get_ext_support(ext_name, gpu_data):
349*8975f5c5SAndroid Build Coastguard Worker
350*8975f5c5SAndroid Build Coastguard Worker    def s(ext, support):
351*8975f5c5SAndroid Build Coastguard Worker        SUPPORT_SYM = '&#x2714;'
352*8975f5c5SAndroid Build Coastguard Worker        NOSUPPORT_SYM = ''
353*8975f5c5SAndroid Build Coastguard Worker        return SUPPORT_SYM if ext in support['Extensions'] else NOSUPPORT_SYM
354*8975f5c5SAndroid Build Coastguard Worker
355*8975f5c5SAndroid Build Coastguard Worker    return ' | '.join([s(ext_name, support) for support in gpu_data])
356*8975f5c5SAndroid Build Coastguard Worker
357*8975f5c5SAndroid Build Coastguard Worker
358*8975f5c5SAndroid Build Coastguard Workerdef get_md_table_header(md_gpu_configs):
359*8975f5c5SAndroid Build Coastguard Worker    configs = ' | '.join(md_gpu_configs)
360*8975f5c5SAndroid Build Coastguard Worker    dashes = ' | '.join([(':%s:' % ('-' * (len(config) - 2))) for config in md_gpu_configs])
361*8975f5c5SAndroid Build Coastguard Worker    return _MD_TABLE_HEADER_TEMPLATE.format(configs=configs, dashes=dashes)
362*8975f5c5SAndroid Build Coastguard Worker
363*8975f5c5SAndroid Build Coastguard Worker
364*8975f5c5SAndroid Build Coastguard Workerdef format_md_gpu_info(gpu_data):
365*8975f5c5SAndroid Build Coastguard Worker    return _MD_CONFIG_INFO_TEMPLATE.format(**gpu_data)
366*8975f5c5SAndroid Build Coastguard Worker
367*8975f5c5SAndroid Build Coastguard Worker
368*8975f5c5SAndroid Build Coastguard Workerdef format_md_link(ext_info, link_template):
369*8975f5c5SAndroid Build Coastguard Worker    return link_template.format(**ext_info)
370*8975f5c5SAndroid Build Coastguard Worker
371*8975f5c5SAndroid Build Coastguard Worker
372*8975f5c5SAndroid Build Coastguard Workerdef format_md_ext(ext_info, gpu_json_data, link_template):
373*8975f5c5SAndroid Build Coastguard Worker    return '| %s | %s |' % (format_md_link(
374*8975f5c5SAndroid Build Coastguard Worker        ext_info, link_template), get_ext_support(ext_info['full_name'], gpu_json_data))
375*8975f5c5SAndroid Build Coastguard Worker
376*8975f5c5SAndroid Build Coastguard Worker
377*8975f5c5SAndroid Build Coastguard Workerdef format_md_exts(ext_infos, gpu_json_data, link_template):
378*8975f5c5SAndroid Build Coastguard Worker    return '\n'.join(
379*8975f5c5SAndroid Build Coastguard Worker        [format_md_ext(ext_info, gpu_json_data, link_template) for ext_info in ext_infos])
380*8975f5c5SAndroid Build Coastguard Worker
381*8975f5c5SAndroid Build Coastguard Worker
382*8975f5c5SAndroid Build Coastguard Workerdef main():
383*8975f5c5SAndroid Build Coastguard Worker    # auto_script parameters.
384*8975f5c5SAndroid Build Coastguard Worker    data_source_name = 'registry_xml.py and gl.xml'
385*8975f5c5SAndroid Build Coastguard Worker    gles_h_output_name = 'gles_extensions_autogen.h'
386*8975f5c5SAndroid Build Coastguard Worker    gles_cpp_output_name = 'gles_extensions_autogen.cpp'
387*8975f5c5SAndroid Build Coastguard Worker    md_output_name = '../../doc/ExtensionSupport.md'
388*8975f5c5SAndroid Build Coastguard Worker    ext_jsons = [
389*8975f5c5SAndroid Build Coastguard Worker        '../../scripts/extension_data/%s.json' % s.lower().replace(' ', '_')
390*8975f5c5SAndroid Build Coastguard Worker        for s in _MD_GLES_GPU_CONFIGS
391*8975f5c5SAndroid Build Coastguard Worker    ]
392*8975f5c5SAndroid Build Coastguard Worker    gles1_ext_jsons = [
393*8975f5c5SAndroid Build Coastguard Worker        '../../scripts/extension_data/%s_gles1.json' % s.lower().replace(' ', '_')
394*8975f5c5SAndroid Build Coastguard Worker        for s in _MD_GLES1_GPU_CONFIGS
395*8975f5c5SAndroid Build Coastguard Worker    ]
396*8975f5c5SAndroid Build Coastguard Worker    if len(sys.argv) > 1:
397*8975f5c5SAndroid Build Coastguard Worker        inputs = ['../../scripts/%s' % xml_input for xml_input in registry_xml.xml_inputs
398*8975f5c5SAndroid Build Coastguard Worker                 ] + ext_jsons + gles1_ext_jsons
399*8975f5c5SAndroid Build Coastguard Worker        outputs = [gles_h_output_name, gles_cpp_output_name, md_output_name]
400*8975f5c5SAndroid Build Coastguard Worker        if sys.argv[1] == 'inputs':
401*8975f5c5SAndroid Build Coastguard Worker            print(','.join(inputs))
402*8975f5c5SAndroid Build Coastguard Worker        elif sys.argv[1] == 'outputs':
403*8975f5c5SAndroid Build Coastguard Worker            print(','.join(outputs))
404*8975f5c5SAndroid Build Coastguard Worker        else:
405*8975f5c5SAndroid Build Coastguard Worker            print('Invalid script parameters.')
406*8975f5c5SAndroid Build Coastguard Worker            return 1
407*8975f5c5SAndroid Build Coastguard Worker        return 0
408*8975f5c5SAndroid Build Coastguard Worker
409*8975f5c5SAndroid Build Coastguard Worker    expr = re.compile(r'^([A-Z]+)_([A-Z]+)_(\w+)$')
410*8975f5c5SAndroid Build Coastguard Worker
411*8975f5c5SAndroid Build Coastguard Worker    angle_ext_infos = (
412*8975f5c5SAndroid Build Coastguard Worker        break_down_exts(registry_xml.angle_requestable_extensions, expr, REQUESTABLE) +
413*8975f5c5SAndroid Build Coastguard Worker        break_down_exts(registry_xml.angle_es_only_extensions, expr, ESONLY) +
414*8975f5c5SAndroid Build Coastguard Worker        break_down_exts(registry_xml.angle_toggleable_extensions, expr, TOGGLEABLE))
415*8975f5c5SAndroid Build Coastguard Worker
416*8975f5c5SAndroid Build Coastguard Worker    angle_ext_infos = sort_by_ext_name(angle_ext_infos)
417*8975f5c5SAndroid Build Coastguard Worker
418*8975f5c5SAndroid Build Coastguard Worker    gles_ext_infos = (
419*8975f5c5SAndroid Build Coastguard Worker        break_down_exts(registry_xml.gles_requestable_extensions, expr, REQUESTABLE) +
420*8975f5c5SAndroid Build Coastguard Worker        break_down_exts(registry_xml.gles_es_only_extensions, expr, ESONLY))
421*8975f5c5SAndroid Build Coastguard Worker
422*8975f5c5SAndroid Build Coastguard Worker    gles_ext_infos = sort_by_ext_name(gles_ext_infos)
423*8975f5c5SAndroid Build Coastguard Worker
424*8975f5c5SAndroid Build Coastguard Worker    gles1_ext_infos = break_down_exts(registry_xml.gles1_extensions, expr, REQUESTABLE)
425*8975f5c5SAndroid Build Coastguard Worker
426*8975f5c5SAndroid Build Coastguard Worker    gles1_ext_infos = sort_by_ext_name(gles1_ext_infos)
427*8975f5c5SAndroid Build Coastguard Worker
428*8975f5c5SAndroid Build Coastguard Worker    ext_infos = angle_ext_infos + gles_ext_infos + gles1_ext_infos
429*8975f5c5SAndroid Build Coastguard Worker
430*8975f5c5SAndroid Build Coastguard Worker    ext_name_to_vendors = {}
431*8975f5c5SAndroid Build Coastguard Worker    for info in ext_infos:
432*8975f5c5SAndroid Build Coastguard Worker        ext_name = info['name_camel_case']
433*8975f5c5SAndroid Build Coastguard Worker        if ext_name in ext_name_to_vendors:
434*8975f5c5SAndroid Build Coastguard Worker            ext_name_to_vendors[ext_name] += [info['vendor']]
435*8975f5c5SAndroid Build Coastguard Worker        else:
436*8975f5c5SAndroid Build Coastguard Worker            ext_name_to_vendors[ext_name] = [info['vendor']]
437*8975f5c5SAndroid Build Coastguard Worker
438*8975f5c5SAndroid Build Coastguard Worker    helper_function_data = []
439*8975f5c5SAndroid Build Coastguard Worker    for (ext_name, vendors) in sorted(ext_name_to_vendors.items()):
440*8975f5c5SAndroid Build Coastguard Worker        if len(vendors) > 1:
441*8975f5c5SAndroid Build Coastguard Worker            helper_function_data += [format_helper_function(ext_name, vendors)]
442*8975f5c5SAndroid Build Coastguard Worker
443*8975f5c5SAndroid Build Coastguard Worker    helper_functions = '\n'.join(helper_function_data)
444*8975f5c5SAndroid Build Coastguard Worker
445*8975f5c5SAndroid Build Coastguard Worker    gles_gpu_data = []
446*8975f5c5SAndroid Build Coastguard Worker    for (gpu_config, ext_json) in zip(_MD_GLES_GPU_CONFIGS, ext_jsons):
447*8975f5c5SAndroid Build Coastguard Worker        with open(ext_json) as f:
448*8975f5c5SAndroid Build Coastguard Worker            config_support = json.loads(f.read())
449*8975f5c5SAndroid Build Coastguard Worker            config_support['config'] = gpu_config
450*8975f5c5SAndroid Build Coastguard Worker            gles_gpu_data.append(config_support)
451*8975f5c5SAndroid Build Coastguard Worker
452*8975f5c5SAndroid Build Coastguard Worker    gles1_gpu_data = []
453*8975f5c5SAndroid Build Coastguard Worker    for (gpu_config, ext_json) in zip(_MD_GLES1_GPU_CONFIGS, gles1_ext_jsons):
454*8975f5c5SAndroid Build Coastguard Worker        with open(ext_json) as f:
455*8975f5c5SAndroid Build Coastguard Worker            config_support = json.loads(f.read())
456*8975f5c5SAndroid Build Coastguard Worker            config_support['config'] = gpu_config
457*8975f5c5SAndroid Build Coastguard Worker            gles1_gpu_data.append(config_support)
458*8975f5c5SAndroid Build Coastguard Worker
459*8975f5c5SAndroid Build Coastguard Worker    gles_md_exts = format_md_exts(gles_ext_infos, gles_gpu_data, _MD_GLES_EXT_LINK_TEMPLATE)
460*8975f5c5SAndroid Build Coastguard Worker    angle_md_exts = format_md_exts(angle_ext_infos, gles_gpu_data, _MD_ANGLE_EXT_LINK_TEMPLATE)
461*8975f5c5SAndroid Build Coastguard Worker    gles1_md_exts = format_md_exts(gles1_ext_infos, gles1_gpu_data, _MD_GLES_EXT_LINK_TEMPLATE)
462*8975f5c5SAndroid Build Coastguard Worker    md_gpu_info = [format_md_gpu_info(gpu_data) for gpu_data in gles_gpu_data]
463*8975f5c5SAndroid Build Coastguard Worker
464*8975f5c5SAndroid Build Coastguard Worker    format_args = {
465*8975f5c5SAndroid Build Coastguard Worker        'script_name': os.path.basename(__file__),
466*8975f5c5SAndroid Build Coastguard Worker        'data_source_name': os.path.basename(data_source_name),
467*8975f5c5SAndroid Build Coastguard Worker        'filename': gles_h_output_name,
468*8975f5c5SAndroid Build Coastguard Worker        'gles_extensions': format_exts(gles_ext_infos),
469*8975f5c5SAndroid Build Coastguard Worker        'angle_extensions': format_exts(angle_ext_infos),
470*8975f5c5SAndroid Build Coastguard Worker        'gles1_extensions': format_exts(gles1_ext_infos),
471*8975f5c5SAndroid Build Coastguard Worker        'helper_functions': helper_functions,
472*8975f5c5SAndroid Build Coastguard Worker        'angle_strings': format_ext_strings(angle_ext_infos),
473*8975f5c5SAndroid Build Coastguard Worker        'gles_strings': format_ext_strings(gles_ext_infos),
474*8975f5c5SAndroid Build Coastguard Worker        'gles1_strings': format_ext_strings(gles1_ext_infos),
475*8975f5c5SAndroid Build Coastguard Worker        'gles_md_table_header': get_md_table_header(_MD_GLES_GPU_CONFIGS),
476*8975f5c5SAndroid Build Coastguard Worker        'gles_md_exts': gles_md_exts,
477*8975f5c5SAndroid Build Coastguard Worker        'angle_md_table_header': get_md_table_header(_MD_GLES_GPU_CONFIGS),
478*8975f5c5SAndroid Build Coastguard Worker        'angle_md_exts': angle_md_exts,
479*8975f5c5SAndroid Build Coastguard Worker        'gles1_md_table_header': get_md_table_header(_MD_GLES1_GPU_CONFIGS),
480*8975f5c5SAndroid Build Coastguard Worker        'gles1_md_exts': gles1_md_exts,
481*8975f5c5SAndroid Build Coastguard Worker        'md_gpu_info': '\n'.join(md_gpu_info),
482*8975f5c5SAndroid Build Coastguard Worker    }
483*8975f5c5SAndroid Build Coastguard Worker
484*8975f5c5SAndroid Build Coastguard Worker    write_file(gles_h_output_name, _GLES_EXTENSIONS_TEMPLATE, format_args)
485*8975f5c5SAndroid Build Coastguard Worker    write_file(gles_cpp_output_name, _GLES_EXT_STRINGS_TEMPLATE, format_args)
486*8975f5c5SAndroid Build Coastguard Worker    write_file(md_output_name, _MARKDOWN_TEMPLATE, format_args)
487*8975f5c5SAndroid Build Coastguard Worker
488*8975f5c5SAndroid Build Coastguard Worker    return 0
489*8975f5c5SAndroid Build Coastguard Worker
490*8975f5c5SAndroid Build Coastguard Worker
491*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__':
492*8975f5c5SAndroid Build Coastguard Worker    sys.exit(main())
493