1#!/usr/bin/env python3 2 3import argparse 4import base64 5import pathlib 6import requests 7import subprocess 8import typing 9 10 11def error(msg: str) -> None: 12 print('\033[31m' + msg + '\033[0m') 13 14 15class Source: 16 def __init__(self, filename: str, url: typing.Optional[str], 17 template: typing.Optional[str] = None, remove: 18 typing.Optional[str] = None): 19 self.file = pathlib.Path(filename) 20 self.url = url 21 self.template = template 22 self.remove = remove 23 24 def sync(self) -> None: 25 if self.url is None: 26 return 27 28 print('Syncing {}...'.format(self.file), end=' ', flush=True) 29 req = requests.get(self.url) 30 31 if not req.ok: 32 error('Failed to retrieve file: {} {}'.format(req.status_code, req.reason)) 33 return 34 35 # Gitiles returns base64-encoded strings. 36 # Google has been resisting for years to the idea of allowing plain text: https://github.com/google/gitiles/issues/7 37 if 'format=TEXT' in self.url: 38 content = base64.b64decode(req.content) 39 else: 40 content = req.content 41 42 content = str(content, encoding='utf-8') 43 if self.remove is not None: 44 content = content.replace(self.remove, '') 45 if self.template is not None: 46 content = self.template % content 47 48 with open(self.file, 'w') as f: 49 f.write(content) 50 51 print('Done') 52 53 54VK_ANDROID_NATIVE_BUFFER_TEMPLATE = """\ 55/* MESA: A hack to avoid #ifdefs in driver code. */ 56#ifdef __ANDROID__ 57 58#include <cutils/native_handle.h> 59#if ANDROID_API_LEVEL < 28 60/* buffer_handle_t was defined in the deprecated system/window.h */ 61typedef const native_handle_t *buffer_handle_t; 62#endif 63 64#else 65 66typedef void *buffer_handle_t; 67 68#endif 69 70%s\ 71""" 72 73# a URL of `None` means there is no upstream, because *we* are the upstream 74SOURCES = [ 75 { 76 'api': 'khr', 77 'inc_folder': 'KHR', 78 'sources': [ 79 Source('include/KHR/khrplatform.h', 'https://github.com/KhronosGroup/EGL-Registry/raw/main/api/KHR/khrplatform.h'), 80 ], 81 }, 82 83 { 84 'api': 'egl', 85 'inc_folder': 'EGL', 86 'sources': [ 87 Source('src/egl/generate/egl.xml', 'https://github.com/KhronosGroup/EGL-Registry/raw/main/api/egl.xml'), 88 Source('include/EGL/egl.h', 'https://github.com/KhronosGroup/EGL-Registry/raw/main/api/EGL/egl.h'), 89 Source('include/EGL/eglplatform.h', 'https://github.com/KhronosGroup/EGL-Registry/raw/main/api/EGL/eglplatform.h'), 90 Source('include/EGL/eglext.h', 'https://github.com/KhronosGroup/EGL-Registry/raw/main/api/EGL/eglext.h'), 91 Source('include/EGL/eglext_angle.h', 'https://chromium.googlesource.com/angle/angle/+/refs/heads/main/include/EGL/eglext_angle.h?format=TEXT'), 92 Source('include/EGL/eglmesaext.h', None), 93 ], 94 }, 95 96 { 97 'api': 'gl', 98 'inc_folder': 'GL', 99 'sources': [ 100 Source('src/mapi/glapi/registry/gl.xml', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/xml/gl.xml'), 101 Source('include/GL/glcorearb.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GL/glcorearb.h'), 102 Source('include/GL/glext.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GL/glext.h'), 103 Source('include/GL/glxext.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GL/glxext.h'), 104 Source('include/GL/wglext.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GL/wglext.h'), 105 Source('include/GL/gl.h', None), # FIXME: I don't know what the canonical source is 106 Source('include/GL/glx.h', None), # FIXME: I don't know what the canonical source is 107 Source('include/GL/internal/', None), 108 Source('include/GL/mesa_glinterop.h', None), 109 Source('include/GL/osmesa.h', None), 110 ], 111 }, 112 113 { 114 'api': 'gles1', 115 'inc_folder': 'GLES', 116 'sources': [ 117 Source('include/GLES/gl.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GLES/gl.h'), 118 Source('include/GLES/glplatform.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GLES/glplatform.h'), 119 Source('include/GLES/glext.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GLES/glext.h'), 120 Source('include/GLES/egl.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GLES/egl.h'), 121 ], 122 }, 123 124 { 125 'api': 'gles2', 126 'inc_folder': 'GLES2', 127 'sources': [ 128 Source('include/GLES2/gl2.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GLES2/gl2.h'), 129 Source('include/GLES2/gl2platform.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GLES2/gl2platform.h'), 130 Source('include/GLES2/gl2ext.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GLES2/gl2ext.h'), 131 ], 132 }, 133 134 { 135 'api': 'gles3', 136 'inc_folder': 'GLES3', 137 'sources': [ 138 Source('include/GLES3/gl3.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GLES3/gl3.h'), 139 Source('include/GLES3/gl31.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GLES3/gl31.h'), 140 Source('include/GLES3/gl32.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GLES3/gl32.h'), 141 Source('include/GLES3/gl3platform.h', 'https://github.com/KhronosGroup/OpenGL-Registry/raw/main/api/GLES3/gl3platform.h'), 142 Source('include/GLES3/gl3ext.h', None), # FIXME: I don't know what the canonical source is 143 ], 144 }, 145 146 { 147 'api': 'opencl', 148 'inc_folder': 'CL', 149 'sources': [ 150 Source('include/CL/opencl.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/opencl.h'), 151 Source('include/CL/cl.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl.h'), 152 Source('include/CL/cl_platform.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_platform.h'), 153 Source('include/CL/cl_gl.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_gl.h'), 154 Source('include/CL/cl_gl_ext.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_gl_ext.h'), 155 Source('include/CL/cl_ext.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_ext.h'), 156 Source('include/CL/cl_version.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_version.h'), 157 Source('include/CL/cl_icd.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_icd.h'), 158 Source('include/CL/cl_egl.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_egl.h'), 159 Source('include/CL/cl_d3d10.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_d3d10.h'), 160 Source('include/CL/cl_d3d11.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_d3d11.h'), 161 Source('include/CL/cl_dx9_media_sharing.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_dx9_media_sharing.h'), 162 Source('include/CL/cl_dx9_media_sharing_intel.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_dx9_media_sharing_intel.h'), 163 Source('include/CL/cl_ext_intel.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_ext_intel.h'), 164 Source('include/CL/cl_va_api_media_sharing_intel.h', 'https://github.com/KhronosGroup/OpenCL-Headers/raw/main/CL/cl_va_api_media_sharing_intel.h'), 165 166 Source('include/CL/cl.hpp', 'https://github.com/KhronosGroup/OpenCL-CLHPP/raw/5f3cc41df821a3e5988490232082a3e3b82c0283/include/CL/cl.hpp'), 167 Source('include/CL/cl2.hpp', 'https://github.com/KhronosGroup/OpenCL-CLHPP/raw/main/include/CL/cl2.hpp'), 168 Source('include/CL/opencl.hpp', 'https://github.com/KhronosGroup/OpenCL-CLHPP/raw/main/include/CL/opencl.hpp'), 169 ], 170 }, 171 172 { 173 'api': 'spirv', 174 'sources': [ 175 Source('src/compiler/spirv/spirv.h', 'https://github.com/KhronosGroup/SPIRV-Headers/raw/main/include/spirv/unified1/spirv.h'), 176 Source('src/compiler/spirv/spirv.core.grammar.json', 'https://github.com/KhronosGroup/SPIRV-Headers/raw/main/include/spirv/unified1/spirv.core.grammar.json'), 177 Source('src/compiler/spirv/OpenCL.std.h', 'https://github.com/KhronosGroup/SPIRV-Headers/raw/main/include/spirv/unified1/OpenCL.std.h'), 178 Source('src/compiler/spirv/GLSL.std.450.h', 'https://github.com/KhronosGroup/SPIRV-Headers/raw/main/include/spirv/unified1/GLSL.std.450.h'), 179 Source('src/compiler/spirv/GLSL.ext.AMD.h', 'https://github.com/KhronosGroup/glslang/raw/main/SPIRV/GLSL.ext.AMD.h'), # FIXME: is this the canonical source? 180 ], 181 }, 182 183 { 184 'api': 'vulkan', 185 'inc_folder': 'vulkan', 186 'sources': [ 187 Source('src/vulkan/registry/vk.xml', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/registry/vk.xml'), 188 Source('include/vulkan/vulkan.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan.h'), 189 Source('include/vulkan/vulkan_core.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_core.h'), 190 Source('include/vulkan/vulkan_beta.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_beta.h'), 191 Source('include/vulkan/vk_icd.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vk_icd.h'), 192 Source('include/vulkan/vk_layer.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vk_layer.h'), 193 Source('include/vulkan/vk_platform.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vk_platform.h'), 194 Source('include/vulkan/vulkan_android.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_android.h'), 195 Source('include/vulkan/vulkan_directfb.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_directfb.h'), 196 Source('include/vulkan/vulkan_fuchsia.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_fuchsia.h'), 197 Source('include/vulkan/vulkan_ggp.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_ggp.h'), 198 Source('include/vulkan/vulkan_ios.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_ios.h'), 199 Source('include/vulkan/vulkan_macos.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_macos.h'), 200 Source('include/vulkan/vulkan_metal.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_metal.h'), 201 Source('include/vulkan/vulkan_screen.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_screen.h'), 202 Source('include/vulkan/vulkan_vi.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_vi.h'), 203 Source('include/vulkan/vulkan_wayland.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_wayland.h'), 204 Source('include/vulkan/vulkan_win32.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_win32.h'), 205 Source('include/vulkan/vulkan_xcb.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_xcb.h'), 206 Source('include/vulkan/vulkan_xlib.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_xlib.h'), 207 Source('include/vulkan/vulkan_xlib_xrandr.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vulkan/vulkan_xlib_xrandr.h'), 208 Source('include/vulkan/vk_android_native_buffer.h', 'https://android.googlesource.com/platform/frameworks/native/+/master/vulkan/include/vulkan/vk_android_native_buffer.h?format=TEXT', 209 template=VK_ANDROID_NATIVE_BUFFER_TEMPLATE, remove='#include <cutils/native_handle.h>\n'), 210 Source('include/vk_video/vulkan_video_codec_av1std.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vk_video/vulkan_video_codec_av1std.h'), 211 Source('include/vk_video/vulkan_video_codec_av1std_decode.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vk_video/vulkan_video_codec_av1std_decode.h'), 212 Source('include/vk_video/vulkan_video_codec_h264std.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vk_video/vulkan_video_codec_h264std.h'), 213 Source('include/vk_video/vulkan_video_codec_h264std_decode.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vk_video/vulkan_video_codec_h264std_decode.h'), 214 Source('include/vk_video/vulkan_video_codec_h264std_encode.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vk_video/vulkan_video_codec_h264std_encode.h'), 215 Source('include/vk_video/vulkan_video_codec_h265std.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vk_video/vulkan_video_codec_h265std.h'), 216 Source('include/vk_video/vulkan_video_codec_h265std_decode.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vk_video/vulkan_video_codec_h265std_decode.h'), 217 Source('include/vk_video/vulkan_video_codec_h265std_encode.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vk_video/vulkan_video_codec_h265std_encode.h'), 218 Source('include/vk_video/vulkan_video_codecs_common.h', 'https://github.com/KhronosGroup/Vulkan-Headers/raw/main/include/vk_video/vulkan_video_codecs_common.h'), 219 Source('include/vulkan/.editorconfig', None), 220 ], 221 }, 222] 223 224 225if __name__ == '__main__': 226 git_toplevel = subprocess.check_output(['git', 'rev-parse', '--show-toplevel'], 227 stderr=subprocess.DEVNULL).decode("ascii").strip() 228 if not pathlib.Path(git_toplevel).resolve() == pathlib.Path('.').resolve(): 229 error('Please run this script from the root folder ({})'.format(git_toplevel)) 230 exit(1) 231 232 parser = argparse.ArgumentParser() 233 parser.add_argument('apis', nargs='*', 234 # the `[[]]` here is a workaround for python bug 9625 235 # where having `choices` breaks `nargs='*'`: 236 # https://bugs.python.org/issue9625 237 choices=[group['api'] for group in SOURCES] + [[]], 238 help='Only update the APIs specified.') 239 args = parser.parse_args() 240 241 # These APIs all depend on the KHR header 242 depend_on_khr = set(['egl', 'gl', 'gles', 'gles2', 'gles3']) 243 if args.apis and 'khr' not in args.apis and depend_on_khr.intersection(set(args.apis)): 244 args.apis = ['khr'] + args.apis 245 246 for group in SOURCES: 247 if args.apis and group['api'] not in args.apis: 248 continue 249 250 for source in group['sources']: 251 source.sync() 252 253 # Make sure all the API files are handled by this script 254 if 'inc_folder' in group: 255 for file in pathlib.Path('include/' + group['inc_folder']).iterdir(): 256 if file not in [source.file for source in group['sources']]: 257 error('{} is unknown, please add it to SOURCES'.format(file)) 258