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 = '✔' 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