Add support for building Mesa + Zink.

Uses a conditional gclient variable "angle_mesa". You must set
this to True in your .gclient to download and configure Mesa.

After that you must also set angle_build_mesa=true in your GN
args. We call through to meson in order to setup and build.

Mesa sources and targets are written into an auto-generated GNI
file. We must update this file on the same cadence as Mesa rolls.

Because the version of libdrm we use in our sysroot is older than
Mesa requires, this CL also includes a custom libdrm build. Also
in order to run bison and flex on the old sysroot that Chrome
infra runs with, this CL includes a new version of flex and bison
that run without newer versions of GLIBC.

Bug: angleproject:7689
Change-Id: I1aeeda1e6f3cf1d5f878aeab5209afa7e1fb5324
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3933062
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/.gitignore b/.gitignore
index 96fcc96..1819e6c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,10 +52,12 @@
 /third_party/jdk/extras/java_8
 /third_party/jinja2
 /third_party/jsoncpp
+/third_party/libdrm
 /third_party/libjpeg_turbo
 /third_party/libpng/src
 /third_party/llvm-build
 /third_party/markupsafe
+/third_party/meson
 /third_party/nasm
 /third_party/ninja
 /third_party/OpenCL-Docs/src
diff --git a/.vpython3 b/.vpython3
index 50d0059..968a173 100644
--- a/.vpython3
+++ b/.vpython3
@@ -517,3 +517,14 @@
   name: "infra/python/wheels/selenium-py3"
   version: "version:3.14.0"
 >
+
+# Used by meson
+wheel: <
+  name: "infra/python/wheels/markupsafe/${vpython_platform}"
+  version: "version:2.0.1"
+>
+
+wheel: <
+  name: "infra/python/wheels/mako-py3"
+  version: "version:1.2.3"
+>
diff --git a/BUILD.gn b/BUILD.gn
index 9a0e62d..ba57cab 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -88,6 +88,9 @@
     if (angle_enable_cl) {
       deps += [ "$angle_root/src/libOpenCL:angle_cl" ]
     }
+    if (angle_build_mesa) {
+      deps += [ "$angle_root/third_party/mesa" ]
+    }
   }
 }
 
diff --git a/DEPS b/DEPS
index 0b9b2c0..aa344cb 100644
--- a/DEPS
+++ b/DEPS
@@ -38,6 +38,9 @@
   # build ARC++ support libraries.
   'checkout_android_native_support': 'checkout_android or checkout_chromeos',
 
+  # Check out Mesa and libdrm in ANGLE's third_party folder.
+  'angle_mesa': False,
+
   # Version of Chromium our Chromium-based DEPS are mirrored from.
   'chromium_revision': 'c8d10c0b09aba42a2849e283bfea79db014d2ac5',
   # We never want to checkout chromium,
@@ -416,6 +419,12 @@
     'condition': 'checkout_android and not build_with_chromium',
   },
 
+  # We use the upstream/main branch.
+  'third_party/libdrm': {
+    'url': '{chromium_git}/chromiumos/third_party/libdrm@474894ed17a037a464e5bd845a0765a50f647898',
+    'condition': 'angle_mesa',
+  },
+
   # libjpeg_turbo is used by glmark2.
   'third_party/libjpeg_turbo': {
     'url': '{chromium_git}/chromium/deps/libjpeg_turbo.git@ed683925e4897a84b3bffc5c1414c85b97a129a3',
@@ -464,6 +473,18 @@
     'condition': 'checkout_android and not build_with_chromium',
   },
 
+  # We use the upstream/main branch.
+  'third_party/mesa/src': {
+    'url': '{chromium_git}/external/github.com/Mesa3D/mesa@0a6aa58acae2a5b27ef783c22e976ec9b0d33ddc',
+    'condition': 'angle_mesa',
+  },
+
+  # We use the upstream/master branch.
+  'third_party/meson': {
+    'url': '{chromium_git}/external/github.com/mesonbuild/meson@9fd5eb605674067ce6f8876dc27e5e116024e8a6',
+    'condition': 'angle_mesa',
+  },
+
   'third_party/nasm': {
     'url': '{chromium_git}/chromium/deps/nasm.git@5fd9246276814b5ebb7e56b821cedeecab9b674d',
     'condition': 'not build_with_chromium',
@@ -4531,6 +4552,14 @@
                 '-d', 'tools/flex-bison/windows/',
     ],
   },
+
+  # Set up an input file for the Mesa setup step.
+  {
+    'name': 'mesa_input',
+    'pattern': '.',
+    'condition': 'angle_mesa',
+    'action': [ 'python3', 'third_party/mesa/mesa_build.py', 'runhook', ],
+  }
 ]
 
 recursedeps = [
diff --git a/gni/angle.gni b/gni/angle.gni
index d8971a7..7fde305 100644
--- a/gni/angle.gni
+++ b/gni/angle.gni
@@ -276,6 +276,9 @@
   # Enable overlay by default when debug layers are enabled.  This is currently only implemented on
   # Vulkan.
   angle_enable_overlay = angle_enable_vulkan && angle_debug_layers_enabled
+
+  # Build Mesa as a third party dependency
+  angle_build_mesa = false
 }
 
 declare_args() {
diff --git a/scripts/code_generation_hashes/ANGLE_shader_preprocessor.json b/scripts/code_generation_hashes/ANGLE_shader_preprocessor.json
index 99794ed..d2be9d1 100644
--- a/scripts/code_generation_hashes/ANGLE_shader_preprocessor.json
+++ b/scripts/code_generation_hashes/ANGLE_shader_preprocessor.json
@@ -12,9 +12,9 @@
   "src/compiler/preprocessor/preprocessor_tab_autogen.cpp":
     "3f15f3cc604a1ac5668711728ddd8430",
   "tools/flex-bison/linux/bison.sha1":
-    "6eba651f1769883db395dd4e485ba838",
+    "dfc9209e0c76eddd9bed0601c6c189e5",
   "tools/flex-bison/linux/flex.sha1":
-    "3e73ddbd801cf3e8ed759c49572c8bf2",
+    "621fc8947f2114812fb7a2c9df71bdcf",
   "tools/flex-bison/windows/bison.exe.sha1":
     "fd6d2461a2c256179faca7f5f142e689",
   "tools/flex-bison/windows/flex.exe.sha1":
diff --git a/scripts/code_generation_hashes/ANGLE_shader_translator.json b/scripts/code_generation_hashes/ANGLE_shader_translator.json
index 6de5bbe..cf55cf6 100644
--- a/scripts/code_generation_hashes/ANGLE_shader_translator.json
+++ b/scripts/code_generation_hashes/ANGLE_shader_translator.json
@@ -14,9 +14,9 @@
   "src/compiler/translator/glslang_tab_autogen.h":
     "028bdaebf359aefbcdaafae466993ebe",
   "tools/flex-bison/linux/bison.sha1":
-    "6eba651f1769883db395dd4e485ba838",
+    "dfc9209e0c76eddd9bed0601c6c189e5",
   "tools/flex-bison/linux/flex.sha1":
-    "3e73ddbd801cf3e8ed759c49572c8bf2",
+    "621fc8947f2114812fb7a2c9df71bdcf",
   "tools/flex-bison/windows/bison.exe.sha1":
     "fd6d2461a2c256179faca7f5f142e689",
   "tools/flex-bison/windows/flex.exe.sha1":
diff --git a/third_party/mesa/.gitignore b/third_party/mesa/.gitignore
new file mode 100644
index 0000000..7abb817
--- /dev/null
+++ b/third_party/mesa/.gitignore
@@ -0,0 +1,3 @@
+libdrm.stamp
+mesa.stamp
+src
\ No newline at end of file
diff --git a/third_party/mesa/BUILD.gn b/third_party/mesa/BUILD.gn
new file mode 100644
index 0000000..d1cf330
--- /dev/null
+++ b/third_party/mesa/BUILD.gn
@@ -0,0 +1,58 @@
+# Copyright 2022 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("../../gni/angle.gni")
+import("mesa_autogen.gni")
+
+angle_mesa_build_dir = "$root_build_dir/mesa"
+angle_libdrm_build_dir = "$root_build_dir/libdrm"
+
+action("libdrm_setup") {
+  script = "mesa_build.py"
+  args = [
+    "setup",
+    "libdrm",
+    rebase_path(root_build_dir, root_build_dir),
+  ]
+  sources = [ "libdrm.stamp" ]
+  outputs = [ "$angle_libdrm_build_dir/libdrm.stamp" ]
+}
+
+action("libdrm") {
+  script = "mesa_build.py"
+  args = [
+    "compile",
+    rebase_path(angle_libdrm_build_dir, root_build_dir),
+  ]
+  sources = rebase_path(angle_libdrm_sources, ".", "../libdrm")
+  outputs = get_path_info(
+          rebase_path(angle_libdrm_outputs, ".", angle_libdrm_build_dir),
+          "abspath")
+  deps = [ ":libdrm_setup" ]
+}
+
+action("mesa_setup") {
+  script = "mesa_build.py"
+  args = [
+    "setup",
+    "mesa",
+    rebase_path(root_build_dir, root_build_dir),
+  ]
+  sources = [ "mesa.stamp" ]
+  outputs = [ "$angle_mesa_build_dir/mesa.stamp" ]
+  deps = [ ":libdrm" ]
+}
+
+action("mesa") {
+  script = "mesa_build.py"
+  args = [
+    "compile",
+    rebase_path(angle_mesa_build_dir, root_build_dir),
+  ]
+  sources = rebase_path(angle_mesa_sources, ".", "src")
+  outputs =
+      get_path_info(rebase_path(angle_mesa_outputs, ".", angle_mesa_build_dir),
+                    "abspath")
+  deps = [ ":mesa_setup" ]
+}
diff --git a/third_party/mesa/angle_cross.ini b/third_party/mesa/angle_cross.ini
new file mode 100644
index 0000000..97906a8
--- /dev/null
+++ b/third_party/mesa/angle_cross.ini
@@ -0,0 +1,7 @@
+[constants]
+here = '$place/'
+
+[binaries]
+python = 'vpython3'
+python3 = 'vpython3'
+pkgconfig = 'pkg-config'
\ No newline at end of file
diff --git a/third_party/mesa/mesa_autogen.gni b/third_party/mesa/mesa_autogen.gni
new file mode 100644
index 0000000..8364526
--- /dev/null
+++ b/third_party/mesa/mesa_autogen.gni
@@ -0,0 +1,1004 @@
+# GENERATED FILE - DO NOT EDIT.
+# Generated by mesa_build.py
+#
+# Copyright 2022 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# mesa_autogen.gni: ANGLE build information for Mesa.
+
+angle_mesa_outputs = [
+  "src/egl/libEGL.so.1.0.0",
+  "src/gallium/targets/dri/libgallium_dri.so",
+  "src/gbm/libgbm.so.1.0.0",
+  "src/glx/libGL.so.1.2.0",
+  "src/mapi/es1api/libGLESv1_CM.so.1.1.0",
+  "src/mapi/es2api/libGLESv2.so.2.0.0",
+  "src/mapi/shared-glapi/libglapi.so.0.0.0",
+]
+
+angle_mesa_sources = [
+  "src/c11/impl/threads_posix.c",
+  "src/c11/impl/time.c",
+  "src/compiler/glsl/ast_array_index.cpp",
+  "src/compiler/glsl/ast_expr.cpp",
+  "src/compiler/glsl/ast_function.cpp",
+  "src/compiler/glsl/ast_to_hir.cpp",
+  "src/compiler/glsl/ast_type.cpp",
+  "src/compiler/glsl/builtin_functions.cpp",
+  "src/compiler/glsl/builtin_types.cpp",
+  "src/compiler/glsl/builtin_variables.cpp",
+  "src/compiler/glsl/float64.glsl",
+  "src/compiler/glsl/generate_ir.cpp",
+  "src/compiler/glsl/gl_nir_link_atomics.c",
+  "src/compiler/glsl/gl_nir_link_uniform_blocks.c",
+  "src/compiler/glsl/gl_nir_link_uniform_initializers.c",
+  "src/compiler/glsl/gl_nir_link_uniforms.c",
+  "src/compiler/glsl/gl_nir_link_varyings.c",
+  "src/compiler/glsl/gl_nir_link_xfb.c",
+  "src/compiler/glsl/gl_nir_linker.c",
+  "src/compiler/glsl/gl_nir_lower_atomics.c",
+  "src/compiler/glsl/gl_nir_lower_buffers.c",
+  "src/compiler/glsl/gl_nir_lower_images.c",
+  "src/compiler/glsl/gl_nir_lower_packed_varyings.c",
+  "src/compiler/glsl/gl_nir_lower_samplers.c",
+  "src/compiler/glsl/gl_nir_lower_samplers_as_deref.c",
+  "src/compiler/glsl/gl_nir_lower_xfb_varying.c",
+  "src/compiler/glsl/gl_nir_opt_dead_builtin_varyings.c",
+  "src/compiler/glsl/glcpp/glcpp-lex.l",
+  "src/compiler/glsl/glcpp/glcpp-parse.y",
+  "src/compiler/glsl/glcpp/glcpp.c",
+  "src/compiler/glsl/glcpp/pp.c",
+  "src/compiler/glsl/glcpp/pp_standalone_scaffolding.c",
+  "src/compiler/glsl/glsl_lexer.ll",
+  "src/compiler/glsl/glsl_parser.yy",
+  "src/compiler/glsl/glsl_parser_extras.cpp",
+  "src/compiler/glsl/glsl_symbol_table.cpp",
+  "src/compiler/glsl/glsl_to_nir.cpp",
+  "src/compiler/glsl/hir_field_selection.cpp",
+  "src/compiler/glsl/ir.cpp",
+  "src/compiler/glsl/ir_array_refcount.cpp",
+  "src/compiler/glsl/ir_basic_block.cpp",
+  "src/compiler/glsl/ir_builder.cpp",
+  "src/compiler/glsl/ir_builder_print_visitor.cpp",
+  "src/compiler/glsl/ir_clone.cpp",
+  "src/compiler/glsl/ir_constant_expression.cpp",
+  "src/compiler/glsl/ir_equals.cpp",
+  "src/compiler/glsl/ir_expression_flattening.cpp",
+  "src/compiler/glsl/ir_expression_operation.py",
+  "src/compiler/glsl/ir_function.cpp",
+  "src/compiler/glsl/ir_function_can_inline.cpp",
+  "src/compiler/glsl/ir_function_detect_recursion.cpp",
+  "src/compiler/glsl/ir_hierarchical_visitor.cpp",
+  "src/compiler/glsl/ir_hv_accept.cpp",
+  "src/compiler/glsl/ir_print_visitor.cpp",
+  "src/compiler/glsl/ir_reader.cpp",
+  "src/compiler/glsl/ir_rvalue_visitor.cpp",
+  "src/compiler/glsl/ir_set_program_inouts.cpp",
+  "src/compiler/glsl/ir_validate.cpp",
+  "src/compiler/glsl/ir_variable_refcount.cpp",
+  "src/compiler/glsl/link_functions.cpp",
+  "src/compiler/glsl/link_interface_blocks.cpp",
+  "src/compiler/glsl/link_uniform_block_active_visitor.cpp",
+  "src/compiler/glsl/link_uniform_blocks.cpp",
+  "src/compiler/glsl/link_uniforms.cpp",
+  "src/compiler/glsl/link_varyings.cpp",
+  "src/compiler/glsl/linker.cpp",
+  "src/compiler/glsl/linker_util.cpp",
+  "src/compiler/glsl/lower_blend_equation_advanced.cpp",
+  "src/compiler/glsl/lower_builtins.cpp",
+  "src/compiler/glsl/lower_discard.cpp",
+  "src/compiler/glsl/lower_discard_flow.cpp",
+  "src/compiler/glsl/lower_distance.cpp",
+  "src/compiler/glsl/lower_instructions.cpp",
+  "src/compiler/glsl/lower_int64.cpp",
+  "src/compiler/glsl/lower_jumps.cpp",
+  "src/compiler/glsl/lower_mat_op_to_vec.cpp",
+  "src/compiler/glsl/lower_named_interface_blocks.cpp",
+  "src/compiler/glsl/lower_output_reads.cpp",
+  "src/compiler/glsl/lower_packing_builtins.cpp",
+  "src/compiler/glsl/lower_precision.cpp",
+  "src/compiler/glsl/lower_subroutine.cpp",
+  "src/compiler/glsl/lower_tess_level.cpp",
+  "src/compiler/glsl/lower_vec_index_to_cond_assign.cpp",
+  "src/compiler/glsl/lower_vec_index_to_swizzle.cpp",
+  "src/compiler/glsl/lower_vector_derefs.cpp",
+  "src/compiler/glsl/lower_vector_insert.cpp",
+  "src/compiler/glsl/main.cpp",
+  "src/compiler/glsl/opt_algebraic.cpp",
+  "src/compiler/glsl/opt_array_splitting.cpp",
+  "src/compiler/glsl/opt_constant_folding.cpp",
+  "src/compiler/glsl/opt_constant_propagation.cpp",
+  "src/compiler/glsl/opt_constant_variable.cpp",
+  "src/compiler/glsl/opt_copy_propagation_elements.cpp",
+  "src/compiler/glsl/opt_dead_builtin_variables.cpp",
+  "src/compiler/glsl/opt_dead_code.cpp",
+  "src/compiler/glsl/opt_dead_code_local.cpp",
+  "src/compiler/glsl/opt_dead_functions.cpp",
+  "src/compiler/glsl/opt_flatten_nested_if_blocks.cpp",
+  "src/compiler/glsl/opt_flip_matrices.cpp",
+  "src/compiler/glsl/opt_function_inlining.cpp",
+  "src/compiler/glsl/opt_if_simplification.cpp",
+  "src/compiler/glsl/opt_minmax.cpp",
+  "src/compiler/glsl/opt_rebalance_tree.cpp",
+  "src/compiler/glsl/opt_structure_splitting.cpp",
+  "src/compiler/glsl/opt_tree_grafting.cpp",
+  "src/compiler/glsl/propagate_invariance.cpp",
+  "src/compiler/glsl/s_expression.cpp",
+  "src/compiler/glsl/serialize.cpp",
+  "src/compiler/glsl/shader_cache.cpp",
+  "src/compiler/glsl/standalone.cpp",
+  "src/compiler/glsl/standalone_scaffolding.cpp",
+  "src/compiler/glsl/string_to_uint_map.cpp",
+  "src/compiler/glsl/test.cpp",
+  "src/compiler/glsl/test_optpass.cpp",
+  "src/compiler/glsl_types.cpp",
+  "src/compiler/nir/nir.c",
+  "src/compiler/nir/nir_builder.c",
+  "src/compiler/nir/nir_builder_opcodes_h.py",
+  "src/compiler/nir/nir_builtin_builder.c",
+  "src/compiler/nir/nir_clone.c",
+  "src/compiler/nir/nir_constant_expressions.py",
+  "src/compiler/nir/nir_control_flow.c",
+  "src/compiler/nir/nir_convert_ycbcr.c",
+  "src/compiler/nir/nir_deref.c",
+  "src/compiler/nir/nir_divergence_analysis.c",
+  "src/compiler/nir/nir_dominance.c",
+  "src/compiler/nir/nir_from_ssa.c",
+  "src/compiler/nir/nir_gather_info.c",
+  "src/compiler/nir/nir_gather_ssa_types.c",
+  "src/compiler/nir/nir_gather_xfb_info.c",
+  "src/compiler/nir/nir_group_loads.c",
+  "src/compiler/nir/nir_gs_count_vertices.c",
+  "src/compiler/nir/nir_inline_functions.c",
+  "src/compiler/nir/nir_inline_uniforms.c",
+  "src/compiler/nir/nir_instr_set.c",
+  "src/compiler/nir/nir_intrinsics_c.py",
+  "src/compiler/nir/nir_intrinsics_h.py",
+  "src/compiler/nir/nir_intrinsics_indices_h.py",
+  "src/compiler/nir/nir_linking_helpers.c",
+  "src/compiler/nir/nir_liveness.c",
+  "src/compiler/nir/nir_loop_analyze.c",
+  "src/compiler/nir/nir_lower_alpha_test.c",
+  "src/compiler/nir/nir_lower_alu.c",
+  "src/compiler/nir/nir_lower_alu_width.c",
+  "src/compiler/nir/nir_lower_amul.c",
+  "src/compiler/nir/nir_lower_array_deref_of_vec.c",
+  "src/compiler/nir/nir_lower_atomics_to_ssbo.c",
+  "src/compiler/nir/nir_lower_bit_size.c",
+  "src/compiler/nir/nir_lower_bitmap.c",
+  "src/compiler/nir/nir_lower_blend.c",
+  "src/compiler/nir/nir_lower_bool_to_bitsize.c",
+  "src/compiler/nir/nir_lower_bool_to_float.c",
+  "src/compiler/nir/nir_lower_bool_to_int32.c",
+  "src/compiler/nir/nir_lower_cl_images.c",
+  "src/compiler/nir/nir_lower_clamp_color_outputs.c",
+  "src/compiler/nir/nir_lower_clip.c",
+  "src/compiler/nir/nir_lower_clip_cull_distance_arrays.c",
+  "src/compiler/nir/nir_lower_clip_disable.c",
+  "src/compiler/nir/nir_lower_clip_halfz.c",
+  "src/compiler/nir/nir_lower_const_arrays_to_uniforms.c",
+  "src/compiler/nir/nir_lower_convert_alu_types.c",
+  "src/compiler/nir/nir_lower_discard_if.c",
+  "src/compiler/nir/nir_lower_discard_or_demote.c",
+  "src/compiler/nir/nir_lower_double_ops.c",
+  "src/compiler/nir/nir_lower_drawpixels.c",
+  "src/compiler/nir/nir_lower_fb_read.c",
+  "src/compiler/nir/nir_lower_flatshade.c",
+  "src/compiler/nir/nir_lower_flrp.c",
+  "src/compiler/nir/nir_lower_fp16_conv.c",
+  "src/compiler/nir/nir_lower_fragcolor.c",
+  "src/compiler/nir/nir_lower_fragcoord_wtrans.c",
+  "src/compiler/nir/nir_lower_frexp.c",
+  "src/compiler/nir/nir_lower_global_vars_to_local.c",
+  "src/compiler/nir/nir_lower_goto_ifs.c",
+  "src/compiler/nir/nir_lower_gs_intrinsics.c",
+  "src/compiler/nir/nir_lower_idiv.c",
+  "src/compiler/nir/nir_lower_image.c",
+  "src/compiler/nir/nir_lower_indirect_derefs.c",
+  "src/compiler/nir/nir_lower_input_attachments.c",
+  "src/compiler/nir/nir_lower_int64.c",
+  "src/compiler/nir/nir_lower_int_to_float.c",
+  "src/compiler/nir/nir_lower_interpolation.c",
+  "src/compiler/nir/nir_lower_io.c",
+  "src/compiler/nir/nir_lower_io_arrays_to_elements.c",
+  "src/compiler/nir/nir_lower_io_to_scalar.c",
+  "src/compiler/nir/nir_lower_io_to_temporaries.c",
+  "src/compiler/nir/nir_lower_io_to_vector.c",
+  "src/compiler/nir/nir_lower_is_helper_invocation.c",
+  "src/compiler/nir/nir_lower_load_const_to_scalar.c",
+  "src/compiler/nir/nir_lower_locals_to_regs.c",
+  "src/compiler/nir/nir_lower_mediump.c",
+  "src/compiler/nir/nir_lower_memcpy.c",
+  "src/compiler/nir/nir_lower_memory_model.c",
+  "src/compiler/nir/nir_lower_multiview.c",
+  "src/compiler/nir/nir_lower_non_uniform_access.c",
+  "src/compiler/nir/nir_lower_packing.c",
+  "src/compiler/nir/nir_lower_passthrough_edgeflags.c",
+  "src/compiler/nir/nir_lower_patch_vertices.c",
+  "src/compiler/nir/nir_lower_phis_to_scalar.c",
+  "src/compiler/nir/nir_lower_pntc_ytransform.c",
+  "src/compiler/nir/nir_lower_point_size.c",
+  "src/compiler/nir/nir_lower_point_size_mov.c",
+  "src/compiler/nir/nir_lower_point_smooth.c",
+  "src/compiler/nir/nir_lower_poly_line_smooth.c",
+  "src/compiler/nir/nir_lower_printf.c",
+  "src/compiler/nir/nir_lower_readonly_images_to_tex.c",
+  "src/compiler/nir/nir_lower_regs_to_ssa.c",
+  "src/compiler/nir/nir_lower_returns.c",
+  "src/compiler/nir/nir_lower_samplers.c",
+  "src/compiler/nir/nir_lower_scratch.c",
+  "src/compiler/nir/nir_lower_shader_calls.c",
+  "src/compiler/nir/nir_lower_single_sampled.c",
+  "src/compiler/nir/nir_lower_ssbo.c",
+  "src/compiler/nir/nir_lower_subgroups.c",
+  "src/compiler/nir/nir_lower_system_values.c",
+  "src/compiler/nir/nir_lower_sysvals_to_varyings.c",
+  "src/compiler/nir/nir_lower_task_shader.c",
+  "src/compiler/nir/nir_lower_tex.c",
+  "src/compiler/nir/nir_lower_tex_shadow.c",
+  "src/compiler/nir/nir_lower_texcoord_replace.c",
+  "src/compiler/nir/nir_lower_to_source_mods.c",
+  "src/compiler/nir/nir_lower_two_sided_color.c",
+  "src/compiler/nir/nir_lower_ubo_vec4.c",
+  "src/compiler/nir/nir_lower_undef_to_zero.c",
+  "src/compiler/nir/nir_lower_uniforms_to_ubo.c",
+  "src/compiler/nir/nir_lower_var_copies.c",
+  "src/compiler/nir/nir_lower_variable_initializers.c",
+  "src/compiler/nir/nir_lower_vars_to_ssa.c",
+  "src/compiler/nir/nir_lower_vec3_to_vec4.c",
+  "src/compiler/nir/nir_lower_vec_to_movs.c",
+  "src/compiler/nir/nir_lower_viewport_transform.c",
+  "src/compiler/nir/nir_lower_wpos_center.c",
+  "src/compiler/nir/nir_lower_wpos_ytransform.c",
+  "src/compiler/nir/nir_lower_wrmasks.c",
+  "src/compiler/nir/nir_metadata.c",
+  "src/compiler/nir/nir_move_vec_src_uses_to_dest.c",
+  "src/compiler/nir/nir_normalize_cubemap_coords.c",
+  "src/compiler/nir/nir_opcodes_c.py",
+  "src/compiler/nir/nir_opcodes_h.py",
+  "src/compiler/nir/nir_opt_access.c",
+  "src/compiler/nir/nir_opt_algebraic.py",
+  "src/compiler/nir/nir_opt_barriers.c",
+  "src/compiler/nir/nir_opt_combine_stores.c",
+  "src/compiler/nir/nir_opt_comparison_pre.c",
+  "src/compiler/nir/nir_opt_conditional_discard.c",
+  "src/compiler/nir/nir_opt_constant_folding.c",
+  "src/compiler/nir/nir_opt_copy_prop_vars.c",
+  "src/compiler/nir/nir_opt_copy_propagate.c",
+  "src/compiler/nir/nir_opt_cse.c",
+  "src/compiler/nir/nir_opt_dce.c",
+  "src/compiler/nir/nir_opt_dead_cf.c",
+  "src/compiler/nir/nir_opt_dead_write_vars.c",
+  "src/compiler/nir/nir_opt_find_array_copies.c",
+  "src/compiler/nir/nir_opt_fragdepth.c",
+  "src/compiler/nir/nir_opt_gcm.c",
+  "src/compiler/nir/nir_opt_idiv_const.c",
+  "src/compiler/nir/nir_opt_if.c",
+  "src/compiler/nir/nir_opt_intrinsics.c",
+  "src/compiler/nir/nir_opt_large_constants.c",
+  "src/compiler/nir/nir_opt_load_store_vectorize.c",
+  "src/compiler/nir/nir_opt_loop_unroll.c",
+  "src/compiler/nir/nir_opt_memcpy.c",
+  "src/compiler/nir/nir_opt_move.c",
+  "src/compiler/nir/nir_opt_move_discards_to_top.c",
+  "src/compiler/nir/nir_opt_non_uniform_access.c",
+  "src/compiler/nir/nir_opt_offsets.c",
+  "src/compiler/nir/nir_opt_peephole_select.c",
+  "src/compiler/nir/nir_opt_phi_precision.c",
+  "src/compiler/nir/nir_opt_preamble.c",
+  "src/compiler/nir/nir_opt_ray_queries.c",
+  "src/compiler/nir/nir_opt_rematerialize_compares.c",
+  "src/compiler/nir/nir_opt_remove_phis.c",
+  "src/compiler/nir/nir_opt_shrink_stores.c",
+  "src/compiler/nir/nir_opt_shrink_vectors.c",
+  "src/compiler/nir/nir_opt_sink.c",
+  "src/compiler/nir/nir_opt_trivial_continues.c",
+  "src/compiler/nir/nir_opt_undef.c",
+  "src/compiler/nir/nir_opt_uniform_atomics.c",
+  "src/compiler/nir/nir_opt_vectorize.c",
+  "src/compiler/nir/nir_phi_builder.c",
+  "src/compiler/nir/nir_print.c",
+  "src/compiler/nir/nir_propagate_invariant.c",
+  "src/compiler/nir/nir_range_analysis.c",
+  "src/compiler/nir/nir_remove_dead_variables.c",
+  "src/compiler/nir/nir_repair_ssa.c",
+  "src/compiler/nir/nir_scale_fdiv.c",
+  "src/compiler/nir/nir_schedule.c",
+  "src/compiler/nir/nir_search.c",
+  "src/compiler/nir/nir_serialize.c",
+  "src/compiler/nir/nir_split_64bit_vec3_and_vec4.c",
+  "src/compiler/nir/nir_split_per_member_structs.c",
+  "src/compiler/nir/nir_split_var_copies.c",
+  "src/compiler/nir/nir_split_vars.c",
+  "src/compiler/nir/nir_sweep.c",
+  "src/compiler/nir/nir_to_lcssa.c",
+  "src/compiler/nir/nir_validate.c",
+  "src/compiler/nir/nir_worklist.c",
+  "src/compiler/nir_types.cpp",
+  "src/compiler/shader_enums.c",
+  "src/compiler/spirv/gl_spirv.c",
+  "src/compiler/spirv/nir_load_libclc.c",
+  "src/compiler/spirv/nir_lower_libclc.c",
+  "src/compiler/spirv/spir-v.xml",
+  "src/compiler/spirv/spirv.core.grammar.json",
+  "src/compiler/spirv/spirv2nir.c",
+  "src/compiler/spirv/spirv_info_c.py",
+  "src/compiler/spirv/spirv_to_nir.c",
+  "src/compiler/spirv/vtn_alu.c",
+  "src/compiler/spirv/vtn_amd.c",
+  "src/compiler/spirv/vtn_cfg.c",
+  "src/compiler/spirv/vtn_gather_types_c.py",
+  "src/compiler/spirv/vtn_generator_ids_h.py",
+  "src/compiler/spirv/vtn_glsl450.c",
+  "src/compiler/spirv/vtn_opencl.c",
+  "src/compiler/spirv/vtn_subgroup.c",
+  "src/compiler/spirv/vtn_variables.c",
+  "src/egl/generate/egl.xml",
+  "src/egl/generate/egl_other.xml",
+  "src/egl/generate/gen_egl_dispatch.py",
+  "src/egl/main/egl.def.in",
+  "src/gallium/auxiliary/cso_cache/cso_cache.c",
+  "src/gallium/auxiliary/cso_cache/cso_context.c",
+  "src/gallium/auxiliary/cso_cache/cso_hash.c",
+  "src/gallium/auxiliary/draw/draw_context.c",
+  "src/gallium/auxiliary/draw/draw_fs.c",
+  "src/gallium/auxiliary/draw/draw_gs.c",
+  "src/gallium/auxiliary/draw/draw_pipe.c",
+  "src/gallium/auxiliary/draw/draw_pipe_aaline.c",
+  "src/gallium/auxiliary/draw/draw_pipe_aapoint.c",
+  "src/gallium/auxiliary/draw/draw_pipe_clip.c",
+  "src/gallium/auxiliary/draw/draw_pipe_cull.c",
+  "src/gallium/auxiliary/draw/draw_pipe_flatshade.c",
+  "src/gallium/auxiliary/draw/draw_pipe_offset.c",
+  "src/gallium/auxiliary/draw/draw_pipe_pstipple.c",
+  "src/gallium/auxiliary/draw/draw_pipe_stipple.c",
+  "src/gallium/auxiliary/draw/draw_pipe_twoside.c",
+  "src/gallium/auxiliary/draw/draw_pipe_unfilled.c",
+  "src/gallium/auxiliary/draw/draw_pipe_user_cull.c",
+  "src/gallium/auxiliary/draw/draw_pipe_util.c",
+  "src/gallium/auxiliary/draw/draw_pipe_validate.c",
+  "src/gallium/auxiliary/draw/draw_pipe_vbuf.c",
+  "src/gallium/auxiliary/draw/draw_pipe_wide_line.c",
+  "src/gallium/auxiliary/draw/draw_pipe_wide_point.c",
+  "src/gallium/auxiliary/draw/draw_prim_assembler.c",
+  "src/gallium/auxiliary/draw/draw_pt.c",
+  "src/gallium/auxiliary/draw/draw_pt_emit.c",
+  "src/gallium/auxiliary/draw/draw_pt_fetch.c",
+  "src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c",
+  "src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c",
+  "src/gallium/auxiliary/draw/draw_pt_post_vs.c",
+  "src/gallium/auxiliary/draw/draw_pt_so_emit.c",
+  "src/gallium/auxiliary/draw/draw_pt_util.c",
+  "src/gallium/auxiliary/draw/draw_pt_vsplit.c",
+  "src/gallium/auxiliary/draw/draw_tess.c",
+  "src/gallium/auxiliary/draw/draw_vertex.c",
+  "src/gallium/auxiliary/draw/draw_vs.c",
+  "src/gallium/auxiliary/draw/draw_vs_exec.c",
+  "src/gallium/auxiliary/draw/draw_vs_variant.c",
+  "src/gallium/auxiliary/driver_ddebug/dd_context.c",
+  "src/gallium/auxiliary/driver_ddebug/dd_draw.c",
+  "src/gallium/auxiliary/driver_ddebug/dd_screen.c",
+  "src/gallium/auxiliary/driver_noop/noop_pipe.c",
+  "src/gallium/auxiliary/driver_noop/noop_state.c",
+  "src/gallium/auxiliary/driver_rbug/rbug_context.c",
+  "src/gallium/auxiliary/driver_rbug/rbug_core.c",
+  "src/gallium/auxiliary/driver_rbug/rbug_objects.c",
+  "src/gallium/auxiliary/driver_rbug/rbug_screen.c",
+  "src/gallium/auxiliary/driver_trace/tr_context.c",
+  "src/gallium/auxiliary/driver_trace/tr_dump.c",
+  "src/gallium/auxiliary/driver_trace/tr_dump_state.c",
+  "src/gallium/auxiliary/driver_trace/tr_screen.c",
+  "src/gallium/auxiliary/driver_trace/tr_texture.c",
+  "src/gallium/auxiliary/hud/font.c",
+  "src/gallium/auxiliary/hud/hud_context.c",
+  "src/gallium/auxiliary/hud/hud_cpu.c",
+  "src/gallium/auxiliary/hud/hud_cpufreq.c",
+  "src/gallium/auxiliary/hud/hud_diskstat.c",
+  "src/gallium/auxiliary/hud/hud_driver_query.c",
+  "src/gallium/auxiliary/hud/hud_fps.c",
+  "src/gallium/auxiliary/hud/hud_nic.c",
+  "src/gallium/auxiliary/hud/hud_sensors_temp.c",
+  "src/gallium/auxiliary/nir/nir_draw_helpers.c",
+  "src/gallium/auxiliary/nir/nir_helpers.c",
+  "src/gallium/auxiliary/nir/nir_to_tgsi.c",
+  "src/gallium/auxiliary/nir/tgsi_to_nir.c",
+  "src/gallium/auxiliary/os/os_process.c",
+  "src/gallium/auxiliary/pipe-loader/pipe_loader.c",
+  "src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c",
+  "src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c",
+  "src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c",
+  "src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c",
+  "src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c",
+  "src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c",
+  "src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c",
+  "src/gallium/auxiliary/pipebuffer/pb_cache.c",
+  "src/gallium/auxiliary/pipebuffer/pb_slab.c",
+  "src/gallium/auxiliary/pipebuffer/pb_validate.c",
+  "src/gallium/auxiliary/postprocess/pp_celshade.c",
+  "src/gallium/auxiliary/postprocess/pp_colors.c",
+  "src/gallium/auxiliary/postprocess/pp_init.c",
+  "src/gallium/auxiliary/postprocess/pp_mlaa.c",
+  "src/gallium/auxiliary/postprocess/pp_program.c",
+  "src/gallium/auxiliary/postprocess/pp_run.c",
+  "src/gallium/auxiliary/rbug/rbug_connection.c",
+  "src/gallium/auxiliary/rbug/rbug_context.c",
+  "src/gallium/auxiliary/rbug/rbug_core.c",
+  "src/gallium/auxiliary/rbug/rbug_demarshal.c",
+  "src/gallium/auxiliary/rbug/rbug_shader.c",
+  "src/gallium/auxiliary/rbug/rbug_texture.c",
+  "src/gallium/auxiliary/renderonly/renderonly.c",
+  "src/gallium/auxiliary/rtasm/rtasm_execmem.c",
+  "src/gallium/auxiliary/rtasm/rtasm_x86sse.c",
+  "src/gallium/auxiliary/tgsi/tgsi_aa_point.c",
+  "src/gallium/auxiliary/tgsi/tgsi_build.c",
+  "src/gallium/auxiliary/tgsi/tgsi_dump.c",
+  "src/gallium/auxiliary/tgsi/tgsi_dynamic_indexing.c",
+  "src/gallium/auxiliary/tgsi/tgsi_exec.c",
+  "src/gallium/auxiliary/tgsi/tgsi_from_mesa.c",
+  "src/gallium/auxiliary/tgsi/tgsi_info.c",
+  "src/gallium/auxiliary/tgsi/tgsi_iterate.c",
+  "src/gallium/auxiliary/tgsi/tgsi_lowering.c",
+  "src/gallium/auxiliary/tgsi/tgsi_parse.c",
+  "src/gallium/auxiliary/tgsi/tgsi_point_sprite.c",
+  "src/gallium/auxiliary/tgsi/tgsi_sanity.c",
+  "src/gallium/auxiliary/tgsi/tgsi_scan.c",
+  "src/gallium/auxiliary/tgsi/tgsi_strings.c",
+  "src/gallium/auxiliary/tgsi/tgsi_text.c",
+  "src/gallium/auxiliary/tgsi/tgsi_transform.c",
+  "src/gallium/auxiliary/tgsi/tgsi_two_side.c",
+  "src/gallium/auxiliary/tgsi/tgsi_ureg.c",
+  "src/gallium/auxiliary/tgsi/tgsi_util.c",
+  "src/gallium/auxiliary/tgsi/tgsi_vpos.c",
+  "src/gallium/auxiliary/translate/translate.c",
+  "src/gallium/auxiliary/translate/translate_cache.c",
+  "src/gallium/auxiliary/translate/translate_generic.c",
+  "src/gallium/auxiliary/translate/translate_sse.c",
+  "src/gallium/auxiliary/util/u_async_debug.c",
+  "src/gallium/auxiliary/util/u_bitmask.c",
+  "src/gallium/auxiliary/util/u_blitter.c",
+  "src/gallium/auxiliary/util/u_cache.c",
+  "src/gallium/auxiliary/util/u_compute.c",
+  "src/gallium/auxiliary/util/u_debug_flush.c",
+  "src/gallium/auxiliary/util/u_debug_image.c",
+  "src/gallium/auxiliary/util/u_draw.c",
+  "src/gallium/auxiliary/util/u_draw_quad.c",
+  "src/gallium/auxiliary/util/u_driconf.c",
+  "src/gallium/auxiliary/util/u_dump_defines.c",
+  "src/gallium/auxiliary/util/u_dump_state.c",
+  "src/gallium/auxiliary/util/u_framebuffer.c",
+  "src/gallium/auxiliary/util/u_gen_mipmap.c",
+  "src/gallium/auxiliary/util/u_handle_table.c",
+  "src/gallium/auxiliary/util/u_helpers.c",
+  "src/gallium/auxiliary/util/u_index_modify.c",
+  "src/gallium/auxiliary/util/u_linear.c",
+  "src/gallium/auxiliary/util/u_live_shader_cache.c",
+  "src/gallium/auxiliary/util/u_log.c",
+  "src/gallium/auxiliary/util/u_network.c",
+  "src/gallium/auxiliary/util/u_prim.c",
+  "src/gallium/auxiliary/util/u_prim_restart.c",
+  "src/gallium/auxiliary/util/u_pstipple.c",
+  "src/gallium/auxiliary/util/u_resource.c",
+  "src/gallium/auxiliary/util/u_sampler.c",
+  "src/gallium/auxiliary/util/u_screen.c",
+  "src/gallium/auxiliary/util/u_simple_shaders.c",
+  "src/gallium/auxiliary/util/u_split_draw.c",
+  "src/gallium/auxiliary/util/u_suballoc.c",
+  "src/gallium/auxiliary/util/u_surface.c",
+  "src/gallium/auxiliary/util/u_tests.c",
+  "src/gallium/auxiliary/util/u_texture.c",
+  "src/gallium/auxiliary/util/u_threaded_context.c",
+  "src/gallium/auxiliary/util/u_tile.c",
+  "src/gallium/auxiliary/util/u_trace_gallium.c",
+  "src/gallium/auxiliary/util/u_tracepoints.py",
+  "src/gallium/auxiliary/util/u_transfer.c",
+  "src/gallium/auxiliary/util/u_transfer_helper.c",
+  "src/gallium/auxiliary/util/u_upload_mgr.c",
+  "src/gallium/auxiliary/util/u_vbuf.c",
+  "src/gallium/auxiliary/util/u_vertex_state_cache.c",
+  "src/gallium/auxiliary/vl/vl_bicubic_filter.c",
+  "src/gallium/auxiliary/vl/vl_codec.c",
+  "src/gallium/auxiliary/vl/vl_compositor.c",
+  "src/gallium/auxiliary/vl/vl_compositor_cs.c",
+  "src/gallium/auxiliary/vl/vl_compositor_gfx.c",
+  "src/gallium/auxiliary/vl/vl_csc.c",
+  "src/gallium/auxiliary/vl/vl_decoder.c",
+  "src/gallium/auxiliary/vl/vl_deint_filter.c",
+  "src/gallium/auxiliary/vl/vl_idct.c",
+  "src/gallium/auxiliary/vl/vl_matrix_filter.c",
+  "src/gallium/auxiliary/vl/vl_mc.c",
+  "src/gallium/auxiliary/vl/vl_median_filter.c",
+  "src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c",
+  "src/gallium/auxiliary/vl/vl_mpeg12_decoder.c",
+  "src/gallium/auxiliary/vl/vl_stubs.c",
+  "src/gallium/auxiliary/vl/vl_vertex_buffers.c",
+  "src/gallium/auxiliary/vl/vl_video_buffer.c",
+  "src/gallium/auxiliary/vl/vl_winsys_dri.c",
+  "src/gallium/auxiliary/vl/vl_winsys_dri3.c",
+  "src/gallium/auxiliary/vl/vl_winsys_dri_vgem.c",
+  "src/gallium/auxiliary/vl/vl_winsys_drm.c",
+  "src/gallium/auxiliary/vl/vl_zscan.c",
+  "src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c",
+  "src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c",
+  "src/gallium/drivers/zink/nir_to_spirv/zink_nir_algebraic.py",
+  "src/gallium/drivers/zink/zink_batch.c",
+  "src/gallium/drivers/zink/zink_blit.c",
+  "src/gallium/drivers/zink/zink_bo.c",
+  "src/gallium/drivers/zink/zink_clear.c",
+  "src/gallium/drivers/zink/zink_compiler.c",
+  "src/gallium/drivers/zink/zink_context.c",
+  "src/gallium/drivers/zink/zink_descriptors.c",
+  "src/gallium/drivers/zink/zink_device_info.py",
+  "src/gallium/drivers/zink/zink_draw.cpp",
+  "src/gallium/drivers/zink/zink_fence.c",
+  "src/gallium/drivers/zink/zink_format.c",
+  "src/gallium/drivers/zink/zink_framebuffer.c",
+  "src/gallium/drivers/zink/zink_instance.py",
+  "src/gallium/drivers/zink/zink_kopper.c",
+  "src/gallium/drivers/zink/zink_lower_cubemap_to_array.c",
+  "src/gallium/drivers/zink/zink_pipeline.c",
+  "src/gallium/drivers/zink/zink_program.c",
+  "src/gallium/drivers/zink/zink_query.c",
+  "src/gallium/drivers/zink/zink_render_pass.c",
+  "src/gallium/drivers/zink/zink_resource.c",
+  "src/gallium/drivers/zink/zink_screen.c",
+  "src/gallium/drivers/zink/zink_state.c",
+  "src/gallium/drivers/zink/zink_surface.c",
+  "src/gallium/frontends/dri/dri2.c",
+  "src/gallium/frontends/dri/dri_context.c",
+  "src/gallium/frontends/dri/dri_drawable.c",
+  "src/gallium/frontends/dri/dri_helpers.c",
+  "src/gallium/frontends/dri/dri_query_renderer.c",
+  "src/gallium/frontends/dri/dri_screen.c",
+  "src/gallium/frontends/dri/dri_util.c",
+  "src/gallium/frontends/dri/drisw.c",
+  "src/gallium/frontends/dri/kopper.c",
+  "src/gallium/include/pipe/p_defines.h",
+  "src/gallium/winsys/sw/dri/dri_sw_winsys.c",
+  "src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c",
+  "src/gallium/winsys/sw/null/null_sw_winsys.c",
+  "src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c",
+  "src/glx/apple/apple_cgl.c",
+  "src/glx/apple/apple_glapi.c",
+  "src/glx/apple/apple_glx.c",
+  "src/glx/apple/apple_glx_context.c",
+  "src/glx/apple/apple_glx_drawable.c",
+  "src/glx/apple/apple_glx_log.c",
+  "src/glx/apple/apple_glx_pbuffer.c",
+  "src/glx/apple/apple_glx_pixmap.c",
+  "src/glx/apple/apple_glx_surface.c",
+  "src/glx/apple/apple_visual.c",
+  "src/glx/apple/apple_xgl_api_read.c",
+  "src/glx/apple/apple_xgl_api_stereo.c",
+  "src/glx/apple/apple_xgl_api_viewport.c",
+  "src/glx/apple/appledri.c",
+  "src/glx/apple/glx_empty.c",
+  "src/glx/clientattrib.c",
+  "src/glx/clientinfo.c",
+  "src/glx/compsize.c",
+  "src/glx/create_context.c",
+  "src/glx/dri2.c",
+  "src/glx/dri2_glx.c",
+  "src/glx/dri3_glx.c",
+  "src/glx/dri_common.c",
+  "src/glx/dri_common_interop.c",
+  "src/glx/dri_common_query_renderer.c",
+  "src/glx/drisw_glx.c",
+  "src/glx/eval.c",
+  "src/glx/glx_error.c",
+  "src/glx/glx_pbuffer.c",
+  "src/glx/glx_query.c",
+  "src/glx/glxcmds.c",
+  "src/glx/glxconfig.c",
+  "src/glx/glxcurrent.c",
+  "src/glx/glxext.c",
+  "src/glx/glxextensions.c",
+  "src/glx/glxhash.c",
+  "src/glx/indirect_glx.c",
+  "src/glx/indirect_texture_compression.c",
+  "src/glx/indirect_transpose_matrix.c",
+  "src/glx/indirect_vertex_array.c",
+  "src/glx/indirect_vertex_program.c",
+  "src/glx/indirect_window_pos.c",
+  "src/glx/pixel.c",
+  "src/glx/pixelstore.c",
+  "src/glx/query_renderer.c",
+  "src/glx/render2.c",
+  "src/glx/renderpix.c",
+  "src/glx/single2.c",
+  "src/glx/singlepix.c",
+  "src/glx/vertarr.c",
+  "src/glx/xfont.c",
+  "src/gtest/src/gtest-all.cc",
+  "src/gtest/src/gtest_main.cc",
+  "src/loader/loader.c",
+  "src/loader/loader_dri3_helper.c",
+  "src/loader/loader_dri_helper.c",
+  "src/mapi/entry.c",
+  "src/mapi/es1api/gles1.def.in",
+  "src/mapi/es2api/gles2.def.in",
+  "src/mapi/glapi/gen/api_beginend_init_h.py",
+  "src/mapi/glapi/gen/api_exec_decl_h.py",
+  "src/mapi/glapi/gen/api_exec_init.py",
+  "src/mapi/glapi/gen/api_hw_select_init_h.py",
+  "src/mapi/glapi/gen/api_save_h.py",
+  "src/mapi/glapi/gen/api_save_init_h.py",
+  "src/mapi/glapi/gen/glX_proto_send.py",
+  "src/mapi/glapi/gen/glX_proto_size.py",
+  "src/mapi/glapi/gen/gl_API.xml",
+  "src/mapi/glapi/gen/gl_SPARC_asm.py",
+  "src/mapi/glapi/gen/gl_and_es_API.xml",
+  "src/mapi/glapi/gen/gl_apitemp.py",
+  "src/mapi/glapi/gen/gl_enums.py",
+  "src/mapi/glapi/gen/gl_gentable.py",
+  "src/mapi/glapi/gen/gl_marshal.py",
+  "src/mapi/glapi/gen/gl_marshal_h.py",
+  "src/mapi/glapi/gen/gl_procs.py",
+  "src/mapi/glapi/gen/gl_table.py",
+  "src/mapi/glapi/gen/gl_x86-64_asm.py",
+  "src/mapi/glapi/gen/gl_x86_asm.py",
+  "src/mapi/glapi/gen/remap_helper.py",
+  "src/mapi/glapi/registry/gl.xml",
+  "src/mapi/mapi_abi.py",
+  "src/mapi/new/gen_gldispatch_mapi.py",
+  "src/mesa/main/accum.c",
+  "src/mesa/main/api_arrayelt.c",
+  "src/mesa/main/arbprogram.c",
+  "src/mesa/main/arrayobj.c",
+  "src/mesa/main/atifragshader.c",
+  "src/mesa/main/attrib.c",
+  "src/mesa/main/barrier.c",
+  "src/mesa/main/bbox.c",
+  "src/mesa/main/blend.c",
+  "src/mesa/main/blit.c",
+  "src/mesa/main/bufferobj.c",
+  "src/mesa/main/buffers.c",
+  "src/mesa/main/clear.c",
+  "src/mesa/main/clip.c",
+  "src/mesa/main/compute.c",
+  "src/mesa/main/condrender.c",
+  "src/mesa/main/conservativeraster.c",
+  "src/mesa/main/context.c",
+  "src/mesa/main/copyimage.c",
+  "src/mesa/main/cpuinfo.c",
+  "src/mesa/main/debug.c",
+  "src/mesa/main/debug_output.c",
+  "src/mesa/main/depth.c",
+  "src/mesa/main/dlist.c",
+  "src/mesa/main/draw.c",
+  "src/mesa/main/draw_validate.c",
+  "src/mesa/main/drawpix.c",
+  "src/mesa/main/drawtex.c",
+  "src/mesa/main/enable.c",
+  "src/mesa/main/errors.c",
+  "src/mesa/main/es1_conversion.c",
+  "src/mesa/main/eval.c",
+  "src/mesa/main/extensions.c",
+  "src/mesa/main/extensions_table.c",
+  "src/mesa/main/externalobjects.c",
+  "src/mesa/main/fbobject.c",
+  "src/mesa/main/feedback.c",
+  "src/mesa/main/ff_fragment_shader.cpp",
+  "src/mesa/main/ffvertex_prog.c",
+  "src/mesa/main/fog.c",
+  "src/mesa/main/format_fallback.py",
+  "src/mesa/main/format_info.py",
+  "src/mesa/main/format_utils.c",
+  "src/mesa/main/formatquery.c",
+  "src/mesa/main/formats.c",
+  "src/mesa/main/formats.csv",
+  "src/mesa/main/framebuffer.c",
+  "src/mesa/main/genmipmap.c",
+  "src/mesa/main/get.c",
+  "src/mesa/main/get_hash_generator.py",
+  "src/mesa/main/getstring.c",
+  "src/mesa/main/glformats.c",
+  "src/mesa/main/glspirv.c",
+  "src/mesa/main/glthread.c",
+  "src/mesa/main/glthread_bufferobj.c",
+  "src/mesa/main/glthread_draw.c",
+  "src/mesa/main/glthread_get.c",
+  "src/mesa/main/glthread_list.c",
+  "src/mesa/main/glthread_shaderobj.c",
+  "src/mesa/main/glthread_varray.c",
+  "src/mesa/main/hash.c",
+  "src/mesa/main/hint.c",
+  "src/mesa/main/image.c",
+  "src/mesa/main/light.c",
+  "src/mesa/main/lines.c",
+  "src/mesa/main/matrix.c",
+  "src/mesa/main/mipmap.c",
+  "src/mesa/main/multisample.c",
+  "src/mesa/main/objectlabel.c",
+  "src/mesa/main/pack.c",
+  "src/mesa/main/pbo.c",
+  "src/mesa/main/performance_monitor.c",
+  "src/mesa/main/performance_query.c",
+  "src/mesa/main/pipelineobj.c",
+  "src/mesa/main/pixel.c",
+  "src/mesa/main/pixelstore.c",
+  "src/mesa/main/pixeltransfer.c",
+  "src/mesa/main/points.c",
+  "src/mesa/main/polygon.c",
+  "src/mesa/main/program_binary.c",
+  "src/mesa/main/program_resource.c",
+  "src/mesa/main/querymatrix.c",
+  "src/mesa/main/queryobj.c",
+  "src/mesa/main/rastpos.c",
+  "src/mesa/main/readpix.c",
+  "src/mesa/main/remap.c",
+  "src/mesa/main/renderbuffer.c",
+  "src/mesa/main/robustness.c",
+  "src/mesa/main/samplerobj.c",
+  "src/mesa/main/scissor.c",
+  "src/mesa/main/shader_query.cpp",
+  "src/mesa/main/shaderapi.c",
+  "src/mesa/main/shaderimage.c",
+  "src/mesa/main/shaderobj.c",
+  "src/mesa/main/shared.c",
+  "src/mesa/main/spirv_extensions.c",
+  "src/mesa/main/sse_minmax.c",
+  "src/mesa/main/state.c",
+  "src/mesa/main/stencil.c",
+  "src/mesa/main/syncobj.c",
+  "src/mesa/main/texcompress.c",
+  "src/mesa/main/texcompress_astc.cpp",
+  "src/mesa/main/texcompress_bptc.c",
+  "src/mesa/main/texcompress_cpal.c",
+  "src/mesa/main/texcompress_etc.c",
+  "src/mesa/main/texcompress_fxt1.c",
+  "src/mesa/main/texcompress_rgtc.c",
+  "src/mesa/main/texcompress_s3tc.c",
+  "src/mesa/main/texenv.c",
+  "src/mesa/main/texgen.c",
+  "src/mesa/main/texgetimage.c",
+  "src/mesa/main/teximage.c",
+  "src/mesa/main/texobj.c",
+  "src/mesa/main/texparam.c",
+  "src/mesa/main/texstate.c",
+  "src/mesa/main/texstorage.c",
+  "src/mesa/main/texstore.c",
+  "src/mesa/main/texturebindless.c",
+  "src/mesa/main/textureview.c",
+  "src/mesa/main/transformfeedback.c",
+  "src/mesa/main/uniform_query.cpp",
+  "src/mesa/main/uniforms.c",
+  "src/mesa/main/varray.c",
+  "src/mesa/main/vdpau.c",
+  "src/mesa/main/version.c",
+  "src/mesa/main/viewport.c",
+  "src/mesa/math/m_debug_clip.c",
+  "src/mesa/math/m_debug_norm.c",
+  "src/mesa/math/m_debug_xform.c",
+  "src/mesa/math/m_eval.c",
+  "src/mesa/math/m_matrix.c",
+  "src/mesa/math/m_vector.c",
+  "src/mesa/program/arbprogparse.c",
+  "src/mesa/program/dummy_errors.c",
+  "src/mesa/program/link_program.cpp",
+  "src/mesa/program/prog_cache.c",
+  "src/mesa/program/prog_instruction.c",
+  "src/mesa/program/prog_parameter.c",
+  "src/mesa/program/prog_parameter_layout.c",
+  "src/mesa/program/prog_print.c",
+  "src/mesa/program/prog_statevars.c",
+  "src/mesa/program/prog_to_nir.c",
+  "src/mesa/program/program.c",
+  "src/mesa/program/program_lexer.l",
+  "src/mesa/program/program_parse.y",
+  "src/mesa/program/program_parse_extra.c",
+  "src/mesa/program/programopt.c",
+  "src/mesa/program/symbol_table.c",
+  "src/mesa/state_tracker/st_atifs_to_nir.c",
+  "src/mesa/state_tracker/st_atom.c",
+  "src/mesa/state_tracker/st_atom_array.cpp",
+  "src/mesa/state_tracker/st_atom_atomicbuf.c",
+  "src/mesa/state_tracker/st_atom_blend.c",
+  "src/mesa/state_tracker/st_atom_clip.c",
+  "src/mesa/state_tracker/st_atom_constbuf.c",
+  "src/mesa/state_tracker/st_atom_depth.c",
+  "src/mesa/state_tracker/st_atom_framebuffer.c",
+  "src/mesa/state_tracker/st_atom_image.c",
+  "src/mesa/state_tracker/st_atom_msaa.c",
+  "src/mesa/state_tracker/st_atom_pixeltransfer.c",
+  "src/mesa/state_tracker/st_atom_rasterizer.c",
+  "src/mesa/state_tracker/st_atom_sampler.c",
+  "src/mesa/state_tracker/st_atom_scissor.c",
+  "src/mesa/state_tracker/st_atom_shader.c",
+  "src/mesa/state_tracker/st_atom_stipple.c",
+  "src/mesa/state_tracker/st_atom_storagebuf.c",
+  "src/mesa/state_tracker/st_atom_tess.c",
+  "src/mesa/state_tracker/st_atom_texture.c",
+  "src/mesa/state_tracker/st_atom_viewport.c",
+  "src/mesa/state_tracker/st_cb_bitmap.c",
+  "src/mesa/state_tracker/st_cb_clear.c",
+  "src/mesa/state_tracker/st_cb_copyimage.c",
+  "src/mesa/state_tracker/st_cb_drawpixels.c",
+  "src/mesa/state_tracker/st_cb_drawtex.c",
+  "src/mesa/state_tracker/st_cb_eglimage.c",
+  "src/mesa/state_tracker/st_cb_feedback.c",
+  "src/mesa/state_tracker/st_cb_flush.c",
+  "src/mesa/state_tracker/st_cb_rasterpos.c",
+  "src/mesa/state_tracker/st_cb_readpixels.c",
+  "src/mesa/state_tracker/st_cb_texture.c",
+  "src/mesa/state_tracker/st_context.c",
+  "src/mesa/state_tracker/st_copytex.c",
+  "src/mesa/state_tracker/st_debug.c",
+  "src/mesa/state_tracker/st_draw.c",
+  "src/mesa/state_tracker/st_draw_feedback.c",
+  "src/mesa/state_tracker/st_draw_hw_select.c",
+  "src/mesa/state_tracker/st_extensions.c",
+  "src/mesa/state_tracker/st_format.c",
+  "src/mesa/state_tracker/st_gen_mipmap.c",
+  "src/mesa/state_tracker/st_glsl_to_ir.cpp",
+  "src/mesa/state_tracker/st_glsl_to_nir.cpp",
+  "src/mesa/state_tracker/st_manager.c",
+  "src/mesa/state_tracker/st_nir_builtins.c",
+  "src/mesa/state_tracker/st_nir_lower_builtin.c",
+  "src/mesa/state_tracker/st_nir_lower_tex_src_plane.c",
+  "src/mesa/state_tracker/st_pbo.c",
+  "src/mesa/state_tracker/st_pbo_compute.c",
+  "src/mesa/state_tracker/st_program.c",
+  "src/mesa/state_tracker/st_sampler_view.c",
+  "src/mesa/state_tracker/st_scissor.c",
+  "src/mesa/state_tracker/st_shader_cache.c",
+  "src/mesa/state_tracker/st_texture.c",
+  "src/mesa/state_tracker/st_vdpau.c",
+  "src/mesa/vbo/vbo_context.c",
+  "src/mesa/vbo/vbo_exec.c",
+  "src/mesa/vbo/vbo_exec_api.c",
+  "src/mesa/vbo/vbo_exec_draw.c",
+  "src/mesa/vbo/vbo_exec_eval.c",
+  "src/mesa/vbo/vbo_minmax_index.c",
+  "src/mesa/vbo/vbo_noop.c",
+  "src/mesa/vbo/vbo_save.c",
+  "src/mesa/vbo/vbo_save_api.c",
+  "src/mesa/vbo/vbo_save_draw.c",
+  "src/mesa/vbo/vbo_save_loopback.c",
+  "src/mesa/x86/common_x86.c",
+  "src/util/00-mesa-defaults.conf",
+  "src/util/anon_file.c",
+  "src/util/bitscan.c",
+  "src/util/blob.c",
+  "src/util/build_id.c",
+  "src/util/compress.c",
+  "src/util/crc32.c",
+  "src/util/dag.c",
+  "src/util/debug.c",
+  "src/util/disk_cache.c",
+  "src/util/disk_cache_os.c",
+  "src/util/double.c",
+  "src/util/driconf_static.py",
+  "src/util/fast_idiv_by_const.c",
+  "src/util/format/u_format.c",
+  "src/util/format/u_format.csv",
+  "src/util/format/u_format_bptc.c",
+  "src/util/format/u_format_etc.c",
+  "src/util/format/u_format_fxt1.c",
+  "src/util/format/u_format_latc.c",
+  "src/util/format/u_format_other.c",
+  "src/util/format/u_format_rgtc.c",
+  "src/util/format/u_format_s3tc.c",
+  "src/util/format/u_format_table.py",
+  "src/util/format/u_format_tests.c",
+  "src/util/format/u_format_unpack_neon.c",
+  "src/util/format/u_format_yuv.c",
+  "src/util/format/u_format_zs.c",
+  "src/util/format_srgb.py",
+  "src/util/fossilize_db.c",
+  "src/util/half_float.c",
+  "src/util/hash_table.c",
+  "src/util/indices/u_indices_gen.py",
+  "src/util/indices/u_primconvert.c",
+  "src/util/indices/u_unfilled_gen.py",
+  "src/util/log.c",
+  "src/util/memstream.c",
+  "src/util/mesa-sha1.c",
+  "src/util/mesa_cache_db.c",
+  "src/util/os_file.c",
+  "src/util/os_memory_fd.c",
+  "src/util/os_misc.c",
+  "src/util/os_socket.c",
+  "src/util/os_time.c",
+  "src/util/perf/u_trace.c",
+  "src/util/ralloc.c",
+  "src/util/rand_xor.c",
+  "src/util/rb_tree.c",
+  "src/util/register_allocate.c",
+  "src/util/rgtc.c",
+  "src/util/set.c",
+  "src/util/sha1/sha1.c",
+  "src/util/simple_mtx.c",
+  "src/util/slab.c",
+  "src/util/softfloat.c",
+  "src/util/sparse_array.c",
+  "src/util/streaming-load-memcpy.c",
+  "src/util/string_buffer.c",
+  "src/util/strtod.c",
+  "src/util/u_atomic.c",
+  "src/util/u_call_once.c",
+  "src/util/u_cpu_detect.c",
+  "src/util/u_debug.c",
+  "src/util/u_debug_describe.c",
+  "src/util/u_debug_memory.c",
+  "src/util/u_debug_refcnt.c",
+  "src/util/u_debug_stack.c",
+  "src/util/u_debug_symbol.c",
+  "src/util/u_dl.c",
+  "src/util/u_hash_table.c",
+  "src/util/u_idalloc.c",
+  "src/util/u_math.c",
+  "src/util/u_mm.c",
+  "src/util/u_printf.c",
+  "src/util/u_process.c",
+  "src/util/u_qsort.cpp",
+  "src/util/u_queue.c",
+  "src/util/u_vector.c",
+  "src/util/u_worklist.c",
+  "src/util/vma.c",
+  "src/util/xmlconfig.c",
+  "src/util/xxd.py",
+  "src/vulkan/registry/vk.xml",
+  "src/vulkan/runtime/vk_buffer.c",
+  "src/vulkan/runtime/vk_cmd_copy.c",
+  "src/vulkan/runtime/vk_cmd_enqueue.c",
+  "src/vulkan/runtime/vk_command_buffer.c",
+  "src/vulkan/runtime/vk_command_pool.c",
+  "src/vulkan/runtime/vk_debug_report.c",
+  "src/vulkan/runtime/vk_debug_utils.c",
+  "src/vulkan/runtime/vk_deferred_operation.c",
+  "src/vulkan/runtime/vk_descriptor_set_layout.c",
+  "src/vulkan/runtime/vk_descriptor_update_template.c",
+  "src/vulkan/runtime/vk_descriptors.c",
+  "src/vulkan/runtime/vk_device.c",
+  "src/vulkan/runtime/vk_drm_syncobj.c",
+  "src/vulkan/runtime/vk_fence.c",
+  "src/vulkan/runtime/vk_framebuffer.c",
+  "src/vulkan/runtime/vk_graphics_state.c",
+  "src/vulkan/runtime/vk_image.c",
+  "src/vulkan/runtime/vk_instance.c",
+  "src/vulkan/runtime/vk_log.c",
+  "src/vulkan/runtime/vk_nir.c",
+  "src/vulkan/runtime/vk_object.c",
+  "src/vulkan/runtime/vk_physical_device.c",
+  "src/vulkan/runtime/vk_physical_device_features.py",
+  "src/vulkan/runtime/vk_pipeline.c",
+  "src/vulkan/runtime/vk_pipeline_cache.c",
+  "src/vulkan/runtime/vk_pipeline_layout.c",
+  "src/vulkan/runtime/vk_queue.c",
+  "src/vulkan/runtime/vk_render_pass.c",
+  "src/vulkan/runtime/vk_sampler.c",
+  "src/vulkan/runtime/vk_semaphore.c",
+  "src/vulkan/runtime/vk_shader_module.c",
+  "src/vulkan/runtime/vk_standard_sample_locations.c",
+  "src/vulkan/runtime/vk_sync.c",
+  "src/vulkan/runtime/vk_sync_binary.c",
+  "src/vulkan/runtime/vk_sync_dummy.c",
+  "src/vulkan/runtime/vk_sync_timeline.c",
+  "src/vulkan/runtime/vk_synchronization2.c",
+  "src/vulkan/util/gen_enum_to_str.py",
+  "src/vulkan/util/vk_alloc.c",
+  "src/vulkan/util/vk_cmd_queue_gen.py",
+  "src/vulkan/util/vk_dispatch_table_gen.py",
+  "src/vulkan/util/vk_dispatch_trampolines_gen.py",
+  "src/vulkan/util/vk_entrypoints_gen.py",
+  "src/vulkan/util/vk_extensions_gen.py",
+  "src/vulkan/util/vk_format.c",
+  "src/vulkan/util/vk_util.c",
+  "src/vulkan/vulkan_api.def.in",
+  "src/vulkan/wsi/wsi_common.c",
+  "src/vulkan/wsi/wsi_common_display.c",
+  "src/vulkan/wsi/wsi_common_drm.c",
+  "src/vulkan/wsi/wsi_common_x11.c",
+]
+
+angle_libdrm_outputs = [ "libdrm.so.2.4.0" ]
+
+angle_libdrm_sources = [
+  "include/drm/drm_fourcc.h",
+  "xf86drm.c",
+  "xf86drmHash.c",
+  "xf86drmMode.c",
+  "xf86drmRandom.c",
+  "xf86drmSL.c",
+]
diff --git a/third_party/mesa/mesa_build.py b/third_party/mesa/mesa_build.py
new file mode 100755
index 0000000..6505c07
--- /dev/null
+++ b/third_party/mesa/mesa_build.py
@@ -0,0 +1,327 @@
+#!/usr/bin/env vpython3
+#
+# Copyright 2022 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# mesa_build.py:
+#   Helper script for building Mesa in an ANGLE checkout.
+
+import argparse
+import json
+import logging
+import os
+import shutil
+import subprocess
+import sys
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+ANGLE_DIR = os.path.dirname(os.path.dirname(SCRIPT_DIR))
+DEFAULT_LOG_LEVEL = 'info'
+EXIT_SUCCESS = 0
+EXIT_FAILURE = 1
+MESON = os.path.join(ANGLE_DIR, 'third_party', 'meson', 'meson.py')
+MESA_SOURCE_DIR = os.path.join(ANGLE_DIR, 'third_party', 'mesa', 'src')
+LIBDRM_SOURCE_DIR = os.path.join(ANGLE_DIR, 'third_party', 'libdrm')
+LIBDRM_BUILD_DIR = os.path.join(ANGLE_DIR, 'out', 'libdrm-build')
+MESA_STAMP = 'mesa.stamp'
+LIBDRM_STAMP = 'libdrm.stamp'
+
+MESA_OPTIONS = [
+    '-Dzstd=disabled',
+    '-Dplatforms=x11',
+    '-Dgallium-drivers=zink',
+    '-Dvulkan-drivers=',
+    '-Dvalgrind=disabled',
+]
+LIBDRM_OPTIONS = [
+    '-Dtests=false', '-Dintel=disabled', '-Dnouveau=disabled', '-Damdgpu=disabled',
+    '-Dradeon=disabled', '-Dvmwgfx=disabled'
+]
+
+
+def main(raw_args):
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        '-l',
+        '--log',
+        '--log-level',
+        help='Logging level. Default is %s.' % DEFAULT_LOG_LEVEL,
+        default=DEFAULT_LOG_LEVEL)
+
+    subparser = parser.add_subparsers(dest='command')
+
+    mesa = subparser.add_parser('mesa')
+    mesa.add_argument('build_dir', help='Target build directory.')
+    mesa.add_argument('-j', '--jobs', help='Compile jobs.')
+
+    compile_parser = subparser.add_parser('compile')
+    compile_parser.add_argument('-j', '--jobs', help='Compile jobs.')
+    compile_parser.add_argument('build_dir', help='Target build directory.')
+
+    gni = subparser.add_parser('gni')
+    gni.add_argument('output', help='Output location for gni file.')
+    gni.add_argument('mesa_build_dir', help='Target Mesa build directory.')
+    gni.add_argument('libdrm_build_dir', help='Target libdrm build directory.')
+
+    libdrm = subparser.add_parser('libdrm')
+
+    runhook_parser = subparser.add_parser('runhook')
+    runhook_parser.add_argument(
+        '-o', '--output', help='Output location for stamp sha1 file.', default=MESA_STAMP)
+
+    setup_parser = subparser.add_parser('setup')
+    setup_parser.add_argument('target', help='Project: mesa or libdrm.')
+    setup_parser.add_argument('build_dir', help='Target build directory.')
+    setup_parser.add_argument('-w', '--wipe', help='Wipe output directory.', action='store_true')
+
+    args, extra_args = parser.parse_known_args(raw_args)
+
+    logging.basicConfig(level=args.log.upper())
+
+    assert os.path.exists(MESON), 'Could not find meson.py: %s' % MESON
+
+    if args.command == 'mesa':
+        SetupBuild(args.build_dir, MESA_SOURCE_DIR, MESA_OPTIONS)
+        Compile(args, args.build_dir)
+    elif args.command == 'compile':
+        Compile(args, args.build_dir)
+    elif args.command == 'gni':
+        GenerateGni(args)
+    elif args.command == 'libdrm':
+        SetupBuild(args.build_dir, LIBDRM_SOURCE_DIR, LIBDRM_OPTIONS)
+        Compile(args, args.build_dir)
+    elif args.command == 'runhook':
+        RunHook(args)
+    elif args.command == 'setup':
+        LazySetup(args, args.build_dir)
+
+    return EXIT_SUCCESS
+
+
+def SetupBuild(build_dir, source_dir, options, pkg_config_paths=[]):
+    if not os.path.exists(build_dir):
+        os.mkdir(build_dir)
+
+    sysroot_dir = os.path.join(ANGLE_DIR, 'build', 'linux', 'debian_bullseye_amd64-sysroot')
+
+    cflags = ' '.join([
+        '--sysroot=%s' % sysroot_dir,
+        '-Wno-constant-conversion',
+        '-Wno-deprecated-builtins',
+        '-Wno-deprecated-declarations',
+        '-Wno-deprecated-non-prototype',
+        '-Wno-enum-compare-conditional',
+        '-Wno-enum-conversion',
+        '-Wno-implicit-const-int-float-conversion',
+        '-Wno-implicit-function-declaration',
+        '-Wno-initializer-overrides',
+        '-Wno-sometimes-uninitialized',
+        '-Wno-unused-but-set-variable',
+        '-Wno-unused-function',
+    ])
+
+    pkg_config_paths += [
+        '%s/usr/share/pkgconfig' % sysroot_dir,
+        '%s/usr/lib/pkgconfig' % sysroot_dir
+    ]
+
+    extra_env = {
+        'CC': 'clang',
+        'CC_LD': 'lld',
+        'CXX': 'clang++',
+        'CXX_LD': 'lld',
+        'CFLAGS': cflags,
+        'CXXFLAGS': cflags,
+        'PKG_CONFIG_PATH': ':'.join(pkg_config_paths),
+    }
+
+    args = [source_dir, build_dir, '--cross-file',
+            os.path.join(SCRIPT_DIR, 'angle_cross.ini')] + options
+    if os.path.isdir(os.path.join(build_dir, 'meson-info')):
+        args += ['--wipe']
+
+    return Meson(build_dir, 'setup', args, extra_env)
+
+
+def Compile(args, build_dir):
+    return Meson(build_dir, 'compile', ['-C', build_dir])
+
+
+def MakeEnv():
+    clang_dir = os.path.join(ANGLE_DIR, 'third_party', 'llvm-build', 'Release+Asserts', 'bin')
+    flex_bison_dir = os.path.join(ANGLE_DIR, 'tools', 'flex-bison')
+
+    # TODO: Windows
+    flex_bison_platform = 'linux'
+    flex_bison_bin_dir = os.path.join(flex_bison_dir, flex_bison_platform)
+
+    depot_tools_dir = os.path.join(ANGLE_DIR, 'third_party', 'depot_tools')
+
+    env = os.environ.copy()
+    paths = [clang_dir, flex_bison_bin_dir, depot_tools_dir, env['PATH']]
+    env['PATH'] = ':'.join(paths)
+    env['BISON_PKGDATADIR'] = os.path.join(flex_bison_dir, 'third_party')
+    return env
+
+
+GNI_TEMPLATE = """\
+# GENERATED FILE - DO NOT EDIT.
+# Generated by {script_name}
+#
+# Copyright 2022 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# {filename}: ANGLE build information for Mesa.
+
+angle_mesa_outputs = [
+{angle_mesa_outputs}]
+
+angle_mesa_sources = [
+{angle_mesa_sources}]
+
+angle_libdrm_outputs = [
+{angle_libdrm_outputs}]
+
+angle_libdrm_sources = [
+{angle_libdrm_sources}]
+"""
+
+
+def GenerateGni(args):
+    mesa_sources_filter = lambda target: target['type'] != 'shared library'
+    mesa_outputs_filter = lambda target: target['type'] == 'shared library'
+    mesa_sources, mesa_outputs = GetMesonSourcesAndOutputs(args.mesa_build_dir,
+                                                           mesa_sources_filter,
+                                                           mesa_outputs_filter)
+
+    libdrm_sources_filter = lambda target: True
+    libdrm_outputs_filter = lambda target: target['type'] == 'shared library'
+    libdrm_sources, libdrm_outputs = GetMesonSourcesAndOutputs(args.libdrm_build_dir,
+                                                               libdrm_sources_filter,
+                                                               libdrm_outputs_filter)
+
+    fmt_list = lambda l, rp: ''.join(
+        sorted(list(set(['  "%s",\n' % os.path.relpath(li, rp) for li in l]))))
+
+    format_args = {
+        'script_name': os.path.basename(__file__),
+        'filename': os.path.basename(args.output),
+        'angle_mesa_outputs': fmt_list(mesa_outputs, args.mesa_build_dir),
+        'angle_mesa_sources': fmt_list(mesa_sources, MESA_SOURCE_DIR),
+        'angle_libdrm_outputs': fmt_list(libdrm_outputs, args.libdrm_build_dir),
+        'angle_libdrm_sources': fmt_list(libdrm_sources, LIBDRM_SOURCE_DIR),
+    }
+
+    gni_text = GNI_TEMPLATE.format(**format_args)
+
+    with open(args.output, 'w') as outf:
+        outf.write(gni_text)
+        outf.close()
+        logging.info('Saved GNI data to %s' % args.output)
+
+
+def GetMesonSourcesAndOutputs(build_dir, sources_filter, output_filter):
+    text_data = Meson(build_dir, 'introspect', [build_dir, '--targets'], stdout=subprocess.PIPE)
+    json_data = json.loads(text_data)
+    outputs = []
+    all_sources = []
+    generated = []
+    for target in json_data:
+        generated += target['filename']
+        if output_filter(target):
+            outputs += target['filename']
+        if sources_filter(target):
+            for target_source in target['target_sources']:
+                all_sources += target_source['sources']
+
+    sources = list(filter(lambda s: (s not in generated), all_sources))
+
+    for source in sources:
+        assert os.path.exists(source), '%s does not exist' % source
+
+    return sources, outputs
+
+
+def Meson(build_dir, command, args, extra_env={}, stdout=None):
+    meson_cmd = [MESON, command] + args
+    env = MakeEnv()
+    for k, v in extra_env.items():
+        env[k] = v
+    # TODO: Remove when crbug.com/1373441 is fixed.
+    env['VPYTHON_DEFAULT_SPEC'] = os.path.join(ANGLE_DIR, '.vpython3')
+    logging.info(' '.join(['%s=%s' % (k, v) for (k, v) in extra_env.items()] + meson_cmd))
+    completed = subprocess.run(meson_cmd, env=env, stdout=stdout)
+    if completed.returncode != EXIT_SUCCESS:
+        logging.fatal('Got error from meson:')
+        with open(os.path.join(build_dir, 'meson-logs', 'meson-log.txt')) as logf:
+            lines = logf.readlines()
+            for line in lines[-10:]:
+                logging.fatal('  %s' % line.strip())
+        sys.exit(EXIT_FAILURE)
+    if stdout:
+        return completed.stdout
+
+
+def RunHook(args):
+    output = os.path.join(SCRIPT_DIR, args.output)
+    Stamp(args, MESA_SOURCE_DIR, output)
+    libdrm_out = os.path.join(SCRIPT_DIR, LIBDRM_STAMP)
+    Stamp(args, LIBDRM_SOURCE_DIR, libdrm_out)
+
+
+def Stamp(args, source_dir, output):
+    commit_id = GrabOutput('git rev-parse HEAD', source_dir)
+    with open(output, 'w') as outf:
+        outf.write(commit_id)
+        outf.close()
+        logging.info('Saved git hash data to %s' % output)
+
+
+def GrabOutput(command, cwd):
+    return subprocess.Popen(
+        command, stdout=subprocess.PIPE, shell=True, cwd=cwd).communicate()[0].strip().decode()
+
+
+def LazySetup(args, build_dir):
+    stamp = args.target + '.stamp'
+    in_stamp = os.path.join(SCRIPT_DIR, stamp)
+    out_stamp = os.path.join(build_dir, args.target, stamp)
+    if not args.wipe and SameStamps(in_stamp, out_stamp):
+        logging.info('%s setup up-to-date.' % args.target)
+        sys.exit(EXIT_SUCCESS)
+
+    if args.target == 'mesa':
+        source_dir = MESA_SOURCE_DIR
+        options = MESA_OPTIONS
+        pkg_config_paths = [os.path.join(build_dir, 'libdrm', 'meson-uninstalled')]
+    else:
+        assert (args.target == 'libdrm')
+        source_dir = LIBDRM_SOURCE_DIR
+        options = LIBDRM_OPTIONS
+        pkg_config_paths = []
+
+    SetupBuild(os.path.join(build_dir, args.target), source_dir, options, pkg_config_paths)
+    shutil.copyfile(in_stamp, out_stamp)
+    logging.info('Finished setup and updated %s.' % out_stamp)
+
+
+def SameStamps(in_stamp, out_stamp):
+    assert os.path.exists(in_stamp)
+    if not os.path.exists(out_stamp):
+        return False
+    in_data = ReadFile(in_stamp)
+    out_data = ReadFile(out_stamp)
+    return in_data == out_data
+
+
+def ReadFile(path):
+    with open(path, 'rt') as inf:
+        all_data = inf.read()
+        inf.close()
+        return all_data
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1:]))
diff --git a/tools/flex-bison/linux/bison.sha1 b/tools/flex-bison/linux/bison.sha1
index 67000e2..e3e7ea5 100644
--- a/tools/flex-bison/linux/bison.sha1
+++ b/tools/flex-bison/linux/bison.sha1
@@ -1 +1 @@
-ecf11699b180eb967b8c4d08011b5704a445adeb
\ No newline at end of file
+36625019a2442ac8efc92c32e1d61bd3f450b7ab
\ No newline at end of file
diff --git a/tools/flex-bison/linux/flex.sha1 b/tools/flex-bison/linux/flex.sha1
index d340047..9717340 100644
--- a/tools/flex-bison/linux/flex.sha1
+++ b/tools/flex-bison/linux/flex.sha1
@@ -1 +1 @@
-e830e6c0508d9685876e77304bbe7c4a122c08e8
\ No newline at end of file
+3c9694c62a4ad0d1f95b45bb748855c3688c923e
\ No newline at end of file