Browse Source

Merge tag 'JH7110_MM_v5.2.0' into vf2-devel

Note: From this version, the IMG DDK will be upgraded to 1.19
Andy Hu 11 months ago
parent
commit
9ff7877caf
100 changed files with 6786 additions and 7270 deletions
  1. 5 5
      package/libdrm/libdrm.hash
  2. 1 1
      package/libdrm/libdrm.mk
  3. 1 1
      package/mesa3d-headers/mesa3d-headers.mk
  4. 588 185
      package/mesa3d/0001-Add-PVR-Gallium-driver.patch
  5. 0 0
      package/mesa3d/0002-Force-Mesa-to-use-the-PVR-driver-for-platform-device.patch
  6. 18 18
      package/mesa3d/0002-dri-Add-some-new-DRI-formats-and-fourccs.patch
  7. 14 27
      package/mesa3d/0003-GL_EXT_sparse_texture-entry-points.patch
  8. 14 14
      package/mesa3d/0004-Add-support-for-various-GLES-extensions.patch
  9. 17 17
      package/mesa3d/0005-Add-EGL_IMG_cl_image-extension.patch
  10. 5 5
      package/mesa3d/0006-egl-optimise-eglMakeCurrent-for-the-case-where-nothi.patch
  11. 12 12
      package/mesa3d/0007-GL_EXT_shader_pixel_local_storage2-entry-points.patch
  12. 0 51
      package/mesa3d/0007-egl-Be-stricter-when-making-a-context-current-withou.patch
  13. 11 11
      package/mesa3d/0008-GL_IMG_framebuffer_downsample-entry-points.patch
  14. 10 10
      package/mesa3d/0009-GL_OVR_multiview-entry-points.patch
  15. 10 10
      package/mesa3d/0010-Add-OVR_multiview_multisampled_render_to_texture.patch
  16. 2 2
      package/mesa3d/0011-wayland-drm-install-wayland-drm.xml-to-the-configure.patch
  17. 4 4
      package/mesa3d/0012-Enable-buffer-sharing-in-the-kms_swrast-driver.patch
  18. 5 5
      package/mesa3d/0013-egl-wayland-add-support-for-RGB565-back-buffers.patch
  19. 6 6
      package/mesa3d/0014-egl-automatically-call-eglReleaseThread-on-thread-te.patch
  20. 4 4
      package/mesa3d/0015-egl-wayland-post-maximum-damage-when-blitting.patch
  21. 0 49
      package/mesa3d/0016-egl-dri3-fix-segfault-in-eglCopyBuffers.patch
  22. 5 5
      package/mesa3d/0016-egl-wayland-flush-the-drawable-before-blitting.patch
  23. 11 11
      package/mesa3d/0017-dri-use-a-supported-API-in-driCreateNewContext.patch
  24. 0 1636
      package/mesa3d/0018-egl-add-Tizen-platform-support.patch
  25. 18 27
      package/mesa3d/0018-gbm-add-gbm_bo_blit.patch
  26. 0 231
      package/mesa3d/0019-egl-add-support-for-EGL_TIZEN_image_native_surface.patch
  27. 5 5
      package/mesa3d/0019-gbm-don-t-assert-if-DRI-context-creation-fails.patch
  28. 44 39
      package/mesa3d/0020-egl-wayland-add-pbuffer-support.patch
  29. 2 2
      package/mesa3d/0021-egl-eglBindAPI-workaround-for-dEQP-bug.patch
  30. 10 10
      package/mesa3d/0022-GL_EXT_multi_draw_indirect-entry-points.patch
  31. 0 380
      package/mesa3d/0022-egl-tizen-create-an-internal-_EGLImage-for-each-tbm-.patch
  32. 243 161
      package/mesa3d/0023-dri-add-support-for-YUV-DRI-config.patch
  33. 25 25
      package/mesa3d/0024-egl-add-support-for-EXT_yuv_surface.patch
  34. 4 4
      package/mesa3d/0025-dri-add-missing-__DRI_IMAGE_COMPONENTS-define-for-EG.patch
  35. 13 13
      package/mesa3d/0026-egl-wayland-expose-EXT_yuv_surface-support.patch
  36. 0 121
      package/mesa3d/0027-egl-tizen-support-DRI-driver-handling-of-swap-preser.patch
  37. 7 7
      package/mesa3d/0027-gbm-add-some-new-GBM-formats.patch
  38. 85 91
      package/mesa3d/0028-egl-add-null-platform.patch
  39. 20 32
      package/mesa3d/0029-egl-add-support-for-EXT_image_gl_colorspace.patch
  40. 4 4
      package/mesa3d/0030-meson-force-C-2011-for-thread_local.patch
  41. 31 29
      package/mesa3d/0031-dri2-add-support-for-swap-intervals-other-than-1.patch
  42. 5 5
      package/mesa3d/0032-null_platform-add-support-for-explicit-synchronisati.patch
  43. 6 23
      package/mesa3d/0033-egl-null-add-support-for-DRM-image-format-modifiers.patch
  44. 11 11
      package/mesa3d/0034-egl-query-the-supported-ES2-context-version.patch
  45. 0 357
      package/mesa3d/0034-egl-tizen-expose-EXT_yuv_surface-support.patch
  46. 37 28
      package/mesa3d/0035-meson-allow-libGL-to-be-built-without-GLX.patch
  47. 6 6
      package/mesa3d/0036-egl-wayland-process-non-resized-window-movement.patch
  48. 41 208
      package/mesa3d/0037-Separate-EXT_framebuffer_object-from-ARB-version.patch
  49. 0 509
      package/mesa3d/0037-egl-add-config-debug-printout.patch
  50. 19 19
      package/mesa3d/0038-egl-null-add-support-for-async-flip-with-front-buffe.patch
  51. 8 8
      package/mesa3d/0039-gbm-add-pbuffer-support.patch
  52. 86 57
      package/mesa3d/0040-egl-null-expose-EXT_yuv_surface-support.patch
  53. 54 45
      package/mesa3d/0041-dri-preserve-the-original-FD-for-driver-use.patch
  54. 131 0
      package/mesa3d/0042-egl-wayland-a-linear-buffer-is-not-needed-with-DRM-f.patch
  55. 25 25
      package/mesa3d/0043-dri3-a-linear-buffer-is-not-needed-with-DRM-format-m.patch
  56. 20 20
      package/mesa3d/0044-egl-drm-add-support-for-DRI_PRIME-GPU-selection.patch
  57. 94 34
      package/mesa3d/0045-egl-null-add-support-for-DRI_PRIME-GPU-selection.patch
  58. 6 6
      package/mesa3d/0046-egl-null-introduce-NULL_DRM_DISPLAY.patch
  59. 6 15
      package/mesa3d/0047-vulkan-wsi-check-the-DRI3-and-Present-XCB-reply-poin.patch
  60. 642 0
      package/mesa3d/0048-vulkan-wsi-make-the-display-FD-available.patch
  61. 3114 0
      package/mesa3d/0049-pvr-wsi-add-PowerVR-Vulkan-WSI-library.patch
  62. 9 9
      package/mesa3d/0050-vulkan-wsi-Disable-use-of-VK_EXT_pci_bus_info.patch
  63. 0 56
      package/mesa3d/0051-egl-wayland-a-linear-buffer-is-not-needed-with-DRM-f.patch
  64. 4 4
      package/mesa3d/0051-vulkan-wsi-default-to-force_bgra8_unorm_first-true.patch
  65. 4 4
      package/mesa3d/0052-vulkan-wsi-enable-additional-formats-for-Display.patch
  66. 15 15
      package/mesa3d/0053-mesa-partially-revert-pbuffer-attribute-removal.patch
  67. 6 6
      package/mesa3d/0054-egl_dri2-set-pbuffer-config-attribs-to-0-for-non-pbu.patch
  68. 13 13
      package/mesa3d/0055-GL_ARB_geometry_shader4-entry-points.patch
  69. 285 0
      package/mesa3d/0056-egl-wayland-add-EGL_BUFFER_PRESERVED-support.patch
  70. 28 0
      package/mesa3d/0057-glapi-restore-exec-dynamic.patch
  71. 0 143
      package/mesa3d/0057-vulkan-wsi-Allow-host-visible-memory-to-be-requested.patch
  72. 42 0
      package/mesa3d/0058-Revert-meson-check-mtls-if-has_exe_wrapper.patch
  73. 0 419
      package/mesa3d/0058-vulkan-wsi-make-the-display-FD-available.patch
  74. 85 0
      package/mesa3d/0059-gbm-add-GBM_FORMAT_AXBXGXRX106106106106.patch
  75. 0 1343
      package/mesa3d/0059-pvr-wsi-add-PowerVR-Vulkan-WSI-library.patch
  76. 37 0
      package/mesa3d/0060-gallium-pvr-Add-DRM_FORMAT_AXBXGXRX106106106106.patch
  77. 73 0
      package/mesa3d/0061-gallium-pvr-add-the-DRIconfigOptions-extension.patch
  78. 347 0
      package/mesa3d/0062-gallium-pvr-support-DRI-Image-extension-v21.patch
  79. 0 64
      package/mesa3d/0062-vulkan-wsi-enable-additional-formats-for-Wayland.patch
  80. 0 183
      package/mesa3d/0064-mesa-main-dri-add-YUV420_3PLANE-and-YVU420_3PLANE.patch
  81. 0 58
      package/mesa3d/0065-egl-null-add-support-for-YU12-and-YV12.patch
  82. 57 89
      package/mesa3d/Config.in
  83. 4 4
      package/mesa3d/mesa3d.hash
  84. 52 30
      package/mesa3d/mesa3d.mk
  85. 1 1
      package/starfive/img-gpu-powervr/Config.in
  86. 1 0
      package/starfive/img-gpu-powervr/img-gpu-powervr.hash
  87. 1 1
      package/starfive/img-gpu-powervr/img-gpu-powervr.mk
  88. 0 42
      package/wayland-protocols/0001-meson.build-wayland-scanner-is-only-needed-for-tests.patch
  89. 3 4
      package/wayland-protocols/wayland-protocols.hash
  90. 2 2
      package/wayland-protocols/wayland-protocols.mk
  91. 46 0
      package/wayland-utils/0001-wayland-info-Fix-build-without-libdrm.patch
  92. 5 5
      package/wayland-utils/wayland-utils.hash
  93. 9 2
      package/wayland-utils/wayland-utils.mk
  94. 0 58
      package/wayland/0001-build-add-option-to-disable-tests.patch
  95. 44 0
      package/wayland/0001-build-the-wayland-scanner-is-not-always-required.patch
  96. 0 59
      package/wayland/0002-meson-only-require-cpp-for-tests.patch
  97. 3 3
      package/wayland/wayland.hash
  98. 2 2
      package/wayland/wayland.mk
  99. 5 5
      package/weston/0001-backend-drm-disable-bo-geometry-out-of-bounds-messag.patch
  100. 38 0
      package/weston/0001-tests-Add-dependency-on-screenshooter-client-protocol.patch

+ 5 - 5
package/libdrm/libdrm.hash

@@ -1,6 +1,6 @@
-# From https://lists.freedesktop.org/archives/dri-devel/2021-November/330279.html
-sha256  a1d7948cbc536763fde14b4beb5e4da7867607966d4cf46301087e8b8fe3d6a0  libdrm-2.4.108.tar.xz
-sha512  6a841dc3eb8eae7d75e1d35d23a14d51aff758e5a251dbcf6fc8c28d973d935a4a2f6751b405e956b2777d93c651721199ac80c3cd14b87d021668120d6bc974  libdrm-2.4.108.tar.xz
-
+# From https://lists.freedesktop.org/archives/dri-devel/2022-February/342405.html
+sha256  eecee4c4b47ed6d6ce1a9be3d6d92102548ea35e442282216d47d05293cf9737  libdrm-2.4.110.tar.xz
+sha512  52f92ef1fe4c218a1d7dba53ef43334dbfca80e3209afe59f3a32c4bf67473126534e990df07a931a12d46a3b997c21ef17c1c4d8a0c88d44d5c6c040e3b6be3  libdrm-2.4.110.tar.xz
+ 
 # Hash for license file
-sha256  7e952c6666ed17c99f91ee7af13c688b8769b0feaf6f4558bf6ad3e07512e1e6  xf86drm.c
+sha256  d0a616a9020dc0271e36e6dd4bad174b4e2c2a42636f13785f8e18dd5f85fd83  data/meson.build

+ 1 - 1
package/libdrm/libdrm.mk

@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-LIBDRM_VERSION = 2.4.108
+LIBDRM_VERSION = 2.4.110
 LIBDRM_SOURCE = libdrm-$(LIBDRM_VERSION).tar.xz
 LIBDRM_SITE = https://dri.freedesktop.org/libdrm
 LIBDRM_LICENSE = MIT

+ 1 - 1
package/mesa3d-headers/mesa3d-headers.mk

@@ -12,7 +12,7 @@ endif
 
 # Not possible to directly refer to mesa3d variables, because of
 # first/second expansion trickery...
-MESA3D_HEADERS_VERSION = 21.1.8
+MESA3D_HEADERS_VERSION = 22.1.3
 MESA3D_HEADERS_SOURCE = mesa-$(MESA3D_HEADERS_VERSION).tar.xz
 MESA3D_HEADERS_SITE = https://archive.mesa3d.org
 MESA3D_HEADERS_DL_SUBDIR = mesa3d

+ 588 - 185
package/mesa3d/0001-Add-pvr-dri-driver.patch → package/mesa3d/0001-Add-PVR-Gallium-driver.patch

@@ -1,135 +1,426 @@
-From 1546e69ae9fec54134bc06146143511b4374bf4a Mon Sep 17 00:00:00 2001
-From: Frank Binns <frank.binns@imgtec.com>
-Date: Tue, 14 Apr 2020 09:47:46 +0100
-Subject: [PATCH 01/67] Add pvr dri driver
+From c4b06c903526b72a211ae5d90d630bb6c0bafad6 Mon Sep 17 00:00:00 2001
+From: Brendan King <Brendan.King@imgtec.com>
+Date: Mon, 21 Mar 2022 19:08:33 +0000
+Subject: [PATCH 01/58] Add PVR Gallium driver
 
+The driver is essentially a Gallium frontend for the proprietary
+Imagination Technologies driver. It makes use of the Gallium DRI
+infrastructure, but little else.
+
+Commit 9c772de270408c8a9b9e84b734d9fc0cee2d4265, "dri: Fold away
+some unused indirection in __DriverAPIRec", has been reverted as
+part of this change. The indirection removed by the commit is
+needed by the PVR Gallium frontend, which does not use the same
+context related code as dri2 and drisw.
 ---
- meson.build                               |  19 +-
- meson_options.txt                         |   2 +-
- src/mesa/drivers/dri/meson.build          |   5 +
- src/mesa/drivers/dri/pvr/dri_support.h    | 581 +++++++++++++++
- src/mesa/drivers/dri/pvr/img_drm_fourcc.h | 113 +++
- src/mesa/drivers/dri/pvr/imgpixfmts.h     | 307 ++++++++
- src/mesa/drivers/dri/pvr/imgyuv.h         |  58 ++
- src/mesa/drivers/dri/pvr/mesa_context.c   | 208 ++++++
- src/mesa/drivers/dri/pvr/meson.build      |  48 ++
- src/mesa/drivers/dri/pvr/pvrcb.c          | 328 +++++++++
- src/mesa/drivers/dri/pvr/pvrcompat.c      | 838 ++++++++++++++++++++++
- src/mesa/drivers/dri/pvr/pvrdri.c         | 613 ++++++++++++++++
- src/mesa/drivers/dri/pvr/pvrdri.h         | 188 +++++
- src/mesa/drivers/dri/pvr/pvrdri_support.h | 206 ++++++
- src/mesa/drivers/dri/pvr/pvrext.c         | 704 ++++++++++++++++++
- src/mesa/drivers/dri/pvr/pvrmesa.h        |  36 +
- src/mesa/drivers/dri/pvr/pvrutil.c        | 239 ++++++
- src/meson.build                           |   1 +
- 18 files changed, 4485 insertions(+), 9 deletions(-)
- create mode 100644 src/mesa/drivers/dri/pvr/dri_support.h
- create mode 100644 src/mesa/drivers/dri/pvr/img_drm_fourcc.h
- create mode 100644 src/mesa/drivers/dri/pvr/imgpixfmts.h
- create mode 100644 src/mesa/drivers/dri/pvr/imgyuv.h
- create mode 100644 src/mesa/drivers/dri/pvr/mesa_context.c
- create mode 100644 src/mesa/drivers/dri/pvr/meson.build
- create mode 100644 src/mesa/drivers/dri/pvr/pvrcb.c
- create mode 100644 src/mesa/drivers/dri/pvr/pvrcompat.c
- create mode 100644 src/mesa/drivers/dri/pvr/pvrdri.c
- create mode 100644 src/mesa/drivers/dri/pvr/pvrdri.h
- create mode 100644 src/mesa/drivers/dri/pvr/pvrdri_support.h
- create mode 100644 src/mesa/drivers/dri/pvr/pvrext.c
- create mode 100644 src/mesa/drivers/dri/pvr/pvrmesa.h
- create mode 100644 src/mesa/drivers/dri/pvr/pvrutil.c
+ meson.build                                |  18 +-
+ meson_options.txt                          |   8 +-
+ src/gallium/drivers/pvr/meson.build        |  23 +
+ src/gallium/drivers/pvr_alias/meson.build  |  23 +
+ src/gallium/frontends/dri/dri2.c           |   8 +
+ src/gallium/frontends/dri/dri_screen.h     |   2 +
+ src/gallium/frontends/dri/dri_util.c       |  41 +-
+ src/gallium/frontends/dri/dri_util.h       |  23 +
+ src/gallium/frontends/dri/drisw.c          |   4 +
+ src/gallium/frontends/dri/meson.build      |   4 +
+ src/gallium/frontends/pvr/dri_support.h    | 587 +++++++++++++++
+ src/gallium/frontends/pvr/img_drm_fourcc.h | 113 +++
+ src/gallium/frontends/pvr/imgpixfmts.h     | 307 ++++++++
+ src/gallium/frontends/pvr/imgyuv.h         |  58 ++
+ src/gallium/frontends/pvr/mesa_context.c   | 208 +++++
+ src/gallium/frontends/pvr/meson.build      |  46 ++
+ src/gallium/frontends/pvr/pvrcb.c          | 344 +++++++++
+ src/gallium/frontends/pvr/pvrcompat.c      | 838 +++++++++++++++++++++
+ src/gallium/frontends/pvr/pvrdri.c         | 607 +++++++++++++++
+ src/gallium/frontends/pvr/pvrdri.h         | 190 +++++
+ src/gallium/frontends/pvr/pvrdri_support.h | 206 +++++
+ src/gallium/frontends/pvr/pvrext.c         | 704 +++++++++++++++++
+ src/gallium/frontends/pvr/pvrmesa.h        |  36 +
+ src/gallium/frontends/pvr/pvrutil.c        | 235 ++++++
+ src/gallium/meson.build                    |  15 +
+ src/gallium/targets/dri/meson.build        |   8 +-
+ src/gallium/targets/dri/target.c           |  18 +
+ src/meson.build                            |   2 +
+ 28 files changed, 4662 insertions(+), 14 deletions(-)
+ create mode 100644 src/gallium/drivers/pvr/meson.build
+ create mode 100644 src/gallium/drivers/pvr_alias/meson.build
+ create mode 100644 src/gallium/frontends/pvr/dri_support.h
+ create mode 100644 src/gallium/frontends/pvr/img_drm_fourcc.h
+ create mode 100644 src/gallium/frontends/pvr/imgpixfmts.h
+ create mode 100644 src/gallium/frontends/pvr/imgyuv.h
+ create mode 100644 src/gallium/frontends/pvr/mesa_context.c
+ create mode 100644 src/gallium/frontends/pvr/meson.build
+ create mode 100644 src/gallium/frontends/pvr/pvrcb.c
+ create mode 100644 src/gallium/frontends/pvr/pvrcompat.c
+ create mode 100644 src/gallium/frontends/pvr/pvrdri.c
+ create mode 100644 src/gallium/frontends/pvr/pvrdri.h
+ create mode 100644 src/gallium/frontends/pvr/pvrdri_support.h
+ create mode 100644 src/gallium/frontends/pvr/pvrext.c
+ create mode 100644 src/gallium/frontends/pvr/pvrmesa.h
+ create mode 100644 src/gallium/frontends/pvr/pvrutil.c
 
 diff --git a/meson.build b/meson.build
-index 155db287796..968b4f5f499 100644
+index cdff0312e56..d9fbb1fd8d9 100644
 --- a/meson.build
 +++ b/meson.build
-@@ -171,11 +171,11 @@ if dri_drivers.contains('auto')
-   if system_has_kms_drm
-     # TODO: PPC, Sparc
+@@ -189,16 +189,16 @@ if gallium_drivers.contains('auto')
      if ['x86', 'x86_64'].contains(host_machine.cpu_family())
--      dri_drivers = ['i915', 'i965', 'r100', 'r200', 'nouveau']
-+      dri_drivers = ['i915', 'i965', 'r100', 'r200', 'nouveau', 'pvr']
+       gallium_drivers = [
+         'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'svga', 'swrast',
+-        'iris', 'crocus', 'i915'
++        'iris', 'crocus', 'i915', 'pvr'
+       ]
      elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
--      dri_drivers = []
-+      dri_drivers = ['pvr']
+       gallium_drivers = [
+         'v3d', 'vc4', 'freedreno', 'etnaviv', 'nouveau',
+-        'tegra', 'virgl', 'lima', 'panfrost', 'swrast'
++        'tegra', 'virgl', 'lima', 'panfrost', 'swrast', 'pvr'
+       ]
      elif ['mips', 'mips64', 'riscv32', 'riscv64'].contains(host_machine.cpu_family())
--      dri_drivers = ['r100', 'r200', 'nouveau']
-+      dri_drivers = ['r100', 'r200', 'nouveau', 'pvr']
+       gallium_drivers = [
+-        'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'swrast'
++        'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'swrast', 'pvr'
+       ]
      else
-       error('Unknown architecture @0@. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.'.format(
-             host_machine.cpu_family()))
-@@ -194,6 +194,7 @@ with_dri_i965 = dri_drivers.contains('i965')
- with_dri_r100 = dri_drivers.contains('r100')
- with_dri_r200 = dri_drivers.contains('r200')
- with_dri_nouveau = dri_drivers.contains('nouveau')
-+with_dri_pvr = dri_drivers.contains('pvr')
- 
- with_dri = dri_drivers.length() != 0
- 
-@@ -1516,14 +1517,16 @@ _drm_amdgpu_ver = '2.4.107'
- _drm_radeon_ver = '2.4.71'
- _drm_nouveau_ver = '2.4.102'
- _drm_intel_ver = '2.4.75'
-+_drm_pvr_ver = '2.4.60'
- _drm_ver = '2.4.81'
- 
- _libdrm_checks = [
--  ['intel', with_dri_i915 or with_gallium_i915],
--  ['amdgpu', (with_amd_vk and not with_platform_windows) or with_gallium_radeonsi],
-+  ['intel', with_dri_i915 or with_gallium_i915, true],
-+  ['amdgpu', (with_amd_vk and not with_platform_windows) or with_gallium_radeonsi, true],
-   ['radeon', (with_gallium_radeonsi or with_dri_r100 or with_dri_r200 or
--              with_gallium_r300 or with_gallium_r600)],
--  ['nouveau', (with_gallium_nouveau or with_dri_nouveau)],
-+              with_gallium_r300 or with_gallium_r600), true],
-+  ['nouveau', (with_gallium_nouveau or with_dri_nouveau), true],
-+  ['pvr', with_dri_pvr, false],
- ]
+       error('Unknown architecture @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
+@@ -231,6 +231,7 @@ with_gallium_lima = gallium_drivers.contains('lima')
+ with_gallium_zink = gallium_drivers.contains('zink')
+ with_gallium_d3d12 = gallium_drivers.contains('d3d12')
+ with_gallium_asahi = gallium_drivers.contains('asahi')
++with_gallium_pvr = gallium_drivers.contains('pvr')
+ foreach gallium_driver : gallium_drivers
+   pre_args += '-DHAVE_@0@'.format(gallium_driver.to_upper())
+ endforeach
+@@ -238,6 +239,17 @@ endforeach
+ with_gallium = gallium_drivers.length() != 0
+ with_gallium_kmsro = with_gallium_v3d or with_gallium_vc4 or with_gallium_etnaviv or with_gallium_panfrost or with_gallium_lima or with_gallium_freedreno
  
- # VC4 only needs core libdrm support of this version, not a libdrm_vc4
-@@ -1553,7 +1556,7 @@ endif
- 
- # Then get each libdrm module
- foreach d : _libdrm_checks
--  if d[1]
-+  if d[1] and d[2]
-     set_variable(
-       'dep_libdrm_' + d[0],
-       dependency('libdrm_' + d[0], version : '>=' + _drm_ver)
++if with_gallium_pvr
++  gallium_pvr_alias = get_option('gallium-pvr-alias')
++  if gallium_pvr_alias == 'pvr'
++    gallium_pvr_alias = ''
++  endif
++  with_gallium_pvr_alias = gallium_pvr_alias != ''
++else
++  gallium_pvr_alias = ''
++  with_gallium_pvr_alias = false
++endif
++
+ if with_gallium and system_has_kms_drm
+   _glx = get_option('glx')
+   _egl = get_option('egl')
 diff --git a/meson_options.txt b/meson_options.txt
-index 29c402c4844..dac791099a1 100644
+index 5baa70d051b..3f401d39225 100644
 --- a/meson_options.txt
 +++ b/meson_options.txt
-@@ -55,7 +55,7 @@ option(
-   'dri-drivers',
-   type : 'array',
-   value : ['auto'],
--  choices : ['auto', 'i915', 'i965', 'r100', 'r200', 'nouveau'],
-+  choices : ['auto', 'i915', 'i965', 'r100', 'r200', 'nouveau', 'pvr'],
-   description : 'List of dri drivers to build. If this is set to auto all drivers applicable to the target OS/architecture will be built'
+@@ -75,10 +75,16 @@ option(
+   choices : [
+     'auto', 'kmsro', 'radeonsi', 'r300', 'r600', 'nouveau', 'freedreno',
+     'swrast', 'v3d', 'vc4', 'etnaviv', 'tegra', 'i915', 'svga', 'virgl',
+-    'panfrost', 'iris', 'lima', 'zink', 'd3d12', 'asahi', 'crocus'
++    'panfrost', 'iris', 'lima', 'zink', 'd3d12', 'asahi', 'crocus', 'pvr'
+   ],
+   description : 'List of gallium drivers to build. If this is set to auto all drivers applicable to the target OS/architecture will be built'
  )
++option(
++  'gallium-pvr-alias',
++  type : 'string',
++  value : '',
++  description : 'Gallium PVR alias. This must match the name of the kernel display driver.'
++)
  option(
-diff --git a/src/mesa/drivers/dri/meson.build b/src/mesa/drivers/dri/meson.build
-index 239ca962c2a..88a973bb84f 100644
---- a/src/mesa/drivers/dri/meson.build
-+++ b/src/mesa/drivers/dri/meson.build
-@@ -48,6 +48,11 @@ if with_dri_nouveau
-   _dri_drivers += libnouveau_vieux
-   _dri_link += 'nouveau_vieux_dri.so'
+   'gallium-extra-hud',
+   type : 'boolean',
+diff --git a/src/gallium/drivers/pvr/meson.build b/src/gallium/drivers/pvr/meson.build
+new file mode 100644
+index 00000000000..4f3e2005ee4
+--- /dev/null
++++ b/src/gallium/drivers/pvr/meson.build
+@@ -0,0 +1,23 @@
++# Copyright (c) Imagination Technologies Ltd.
++
++# Permission is hereby granted, free of charge, to any person obtaining a copy
++# of this software and associated documentation files (the "Software"), to deal
++# in the Software without restriction, including without limitation the rights
++# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++# copies of the Software, and to permit persons to whom the Software is
++# furnished to do so, subject to the following conditions:
++
++# The above copyright notice and this permission notice shall be included in
++# all copies or substantial portions of the Software.
++
++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++# SOFTWARE.
++
++driver_pvr = declare_dependency(
++  compile_args : '-DGALLIUM_PVR'
++)
+diff --git a/src/gallium/drivers/pvr_alias/meson.build b/src/gallium/drivers/pvr_alias/meson.build
+new file mode 100644
+index 00000000000..128efd7b5fb
+--- /dev/null
++++ b/src/gallium/drivers/pvr_alias/meson.build
+@@ -0,0 +1,23 @@
++# Copyright (c) Imagination Technologies Ltd.
++
++# Permission is hereby granted, free of charge, to any person obtaining a copy
++# of this software and associated documentation files (the "Software"), to deal
++# in the Software without restriction, including without limitation the rights
++# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++# copies of the Software, and to permit persons to whom the Software is
++# furnished to do so, subject to the following conditions:
++
++# The above copyright notice and this permission notice shall be included in
++# all copies or substantial portions of the Software.
++
++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++# SOFTWARE.
++
++driver_pvr_alias = declare_dependency(
++  compile_args: '-DGALLIUM_PVR_ALIAS=@0@'.format(gallium_pvr_alias)
++)
+diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c
+index 63ac9d5c0ee..cfc14dabf28 100644
+--- a/src/gallium/frontends/dri/dri2.c
++++ b/src/gallium/frontends/dri/dri2.c
+@@ -2594,8 +2594,12 @@ dri2_create_buffer(__DRIscreen * sPriv,
+ const struct __DriverAPIRec galliumdrm_driver_api = {
+    .InitScreen = dri2_init_screen,
+    .DestroyScreen = dri_destroy_screen,
++   .CreateContext = dri_create_context,
++   .DestroyContext = dri_destroy_context,
+    .CreateBuffer = dri2_create_buffer,
+    .DestroyBuffer = dri_destroy_buffer,
++   .MakeCurrent = dri_make_current,
++   .UnbindContext = dri_unbind_context,
+ 
+    .AllocateBuffer = dri2_allocate_buffer,
+    .ReleaseBuffer  = dri2_release_buffer,
+@@ -2616,8 +2620,12 @@ static const struct __DRIDriverVtableExtensionRec galliumdrm_vtable = {
+ const struct __DriverAPIRec dri_kms_driver_api = {
+    .InitScreen = dri_kms_init_screen,
+    .DestroyScreen = dri_destroy_screen,
++   .CreateContext = dri_create_context,
++   .DestroyContext = dri_destroy_context,
+    .CreateBuffer = dri2_create_buffer,
+    .DestroyBuffer = dri_destroy_buffer,
++   .MakeCurrent = dri_make_current,
++   .UnbindContext = dri_unbind_context,
+ 
+    .AllocateBuffer = dri2_allocate_buffer,
+    .ReleaseBuffer  = dri2_release_buffer,
+diff --git a/src/gallium/frontends/dri/dri_screen.h b/src/gallium/frontends/dri/dri_screen.h
+index 0ee2feb5616..69e59d700df 100644
+--- a/src/gallium/frontends/dri/dri_screen.h
++++ b/src/gallium/frontends/dri/dri_screen.h
+@@ -178,6 +178,8 @@ extern const struct __DriverAPIRec galliumvk_driver_api;
+ extern const __DRIextension *galliumvk_driver_extensions[];
+ extern const __DRIconfigOptionsExtension gallium_config_options;
+ 
++extern const struct __DriverAPIRec pvr_driver_api;
++extern const __DRIextension *pvr_driver_extensions[];
+ #endif
+ 
+ /* vim: set sw=3 ts=8 sts=3 expandtab: */
+diff --git a/src/gallium/frontends/dri/dri_util.c b/src/gallium/frontends/dri/dri_util.c
+index 8d60526f45b..b562572a15f 100644
+--- a/src/gallium/frontends/dri/dri_util.c
++++ b/src/gallium/frontends/dri/dri_util.c
+@@ -41,7 +41,6 @@
+ 
+ #include <stdbool.h>
+ #include "dri_util.h"
+-#include "dri_context.h"
+ #include "dri_screen.h"
+ #include "utils.h"
+ #include "util/u_endian.h"
+@@ -191,6 +190,18 @@ swkmsCreateNewScreen(int scrn, int fd,
+                               driver_configs, data);
+ }
+ 
++#if defined(GALLIUM_PVR)
++static __DRIscreen *
++pvrCreateNewScreen(int scrn, int fd,
++		   const __DRIextension **extensions,
++		   const __DRIconfig ***driver_configs, void *data)
++{
++   return driCreateNewScreen2(scrn, fd, extensions,
++                              pvr_driver_extensions,
++                              driver_configs, data);
++}
++#endif
++
+ /** swrast driver createNewScreen entrypoint. */
+ static __DRIscreen *
+ driSWRastCreateNewScreen(int scrn, const __DRIextension **extensions,
+@@ -476,8 +487,8 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
+     context->driDrawablePriv = NULL;
+     context->driReadablePriv = NULL;
+ 
+-    if (!dri_create_context(mesa_api, modes, context, &ctx_config, error,
+-                            shareCtx)) {
++    if (!screen->driver->CreateContext(mesa_api, modes, context,
++                                       &ctx_config, error, shareCtx)) {
+         free(context);
+         return NULL;
+     }
+@@ -516,7 +527,7 @@ static void
+ driDestroyContext(__DRIcontext *pcp)
+ {
+     if (pcp) {
+-	dri_destroy_context(pcp);
++	pcp->driScreenPriv->driver->DestroyContext(pcp);
+ 	free(pcp);
+     }
+ }
+@@ -569,7 +580,7 @@ static int driBindContext(__DRIcontext *pcp,
+ 	dri_get_drawable(prp);
+     }
+ 
+-    return dri_make_current(pcp, pdp, prp);
++    return pcp->driScreenPriv->driver->MakeCurrent(pcp, pdp, prp);
+ }
+ 
+ /**
+@@ -602,10 +613,10 @@ static int driUnbindContext(__DRIcontext *pcp)
+ 	return GL_FALSE;
+ 
+     /*
+-    ** Call dri_unbind_context before checking for valid drawables
++    ** Call driUnbindContext before checking for valid drawables
+     ** to handle surfaceless contexts properly.
+     */
+-    dri_unbind_context(pcp);
++    pcp->driScreenPriv->driver->UnbindContext(pcp);
+ 
+     pdp = pcp->driDrawablePriv;
+     prp = pcp->driReadablePriv;
+@@ -837,6 +848,22 @@ const __DRIdri2Extension swkmsDRI2Extension = {
+     .createNewScreen2           = driCreateNewScreen2,
+ };
+ 
++#if defined(GALLIUM_PVR)
++const __DRIdri2Extension pvrDRI2Extension = {
++    .base = { __DRI_DRI2, 4 },
++
++    .createNewScreen            = pvrCreateNewScreen,
++    .createNewDrawable          = driCreateNewDrawable,
++    .createNewContext           = driCreateNewContext,
++    .getAPIMask                 = driGetAPIMask,
++    .createNewContextForAPI     = driCreateNewContextForAPI,
++    .allocateBuffer             = dri2AllocateBuffer,
++    .releaseBuffer              = dri2ReleaseBuffer,
++    .createContextAttribs       = driCreateContextAttribs,
++    .createNewScreen2           = driCreateNewScreen2,
++};
++#endif
++
+ const __DRIswrastExtension driSWRastExtension = {
+     .base = { __DRI_SWRAST, 4 },
+ 
+diff --git a/src/gallium/frontends/dri/dri_util.h b/src/gallium/frontends/dri/dri_util.h
+index 6b9a71d6f16..9d11a2b1c6b 100644
+--- a/src/gallium/frontends/dri/dri_util.h
++++ b/src/gallium/frontends/dri/dri_util.h
+@@ -75,6 +75,10 @@ extern const __DRI2configQueryExtension dri2ConfigQueryExtension;
+ extern const __DRIcopySubBufferExtension driCopySubBufferExtension;
+ extern const __DRI2flushControlExtension dri2FlushControlExtension;
+ 
++#if defined(GALLIUM_PVR)
++extern const __DRIdri2Extension pvrDRI2Extension;
++#endif
++
+ /**
+  * Description of the attributes used to create a config.
+  *
+@@ -118,12 +122,25 @@ struct __DriverContextConfig {
+  *
+  * Each DRI driver must have one of these structures with all the pointers set
+  * to appropriate functions within the driver.
++ * 
++ * When glXCreateContext() is called, for example, it'll call a helper function
++ * dri_util.c which in turn will jump through the \a CreateContext pointer in
++ * this structure.
+  */
+ struct __DriverAPIRec {
+     const __DRIconfig **(*InitScreen) (__DRIscreen * priv);
+ 
+     void (*DestroyScreen)(__DRIscreen *driScrnPriv);
+ 
++    GLboolean (*CreateContext)(gl_api api,
++                               const struct gl_config *glVis,
++                               __DRIcontext *driContextPriv,
++                               const struct __DriverContextConfig *ctx_config,
++                               unsigned *error,
++                               void *sharedContextPrivate);
++
++    void (*DestroyContext)(__DRIcontext *driContextPriv);
++
+     GLboolean (*CreateBuffer)(__DRIscreen *driScrnPriv,
+                               __DRIdrawable *driDrawPriv,
+                               const struct gl_config *glVis,
+@@ -133,6 +150,12 @@ struct __DriverAPIRec {
+ 
+     void (*SwapBuffers)(__DRIdrawable *driDrawPriv);
+ 
++    GLboolean (*MakeCurrent)(__DRIcontext *driContextPriv,
++                             __DRIdrawable *driDrawPriv,
++                             __DRIdrawable *driReadPriv);
++
++    GLboolean (*UnbindContext)(__DRIcontext *driContextPriv);
++
+     __DRIbuffer *(*AllocateBuffer) (__DRIscreen *screenPrivate,
+                                     unsigned int attachment,
+                                     unsigned int format,
+diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c
+index fa6769d3b57..0e84bc7ba72 100644
+--- a/src/gallium/frontends/dri/drisw.c
++++ b/src/gallium/frontends/dri/drisw.c
+@@ -603,9 +603,13 @@ drisw_create_buffer(__DRIscreen * sPriv,
+ const struct __DriverAPIRec galliumsw_driver_api = {
+    .InitScreen = drisw_init_screen,
+    .DestroyScreen = dri_destroy_screen,
++   .CreateContext = dri_create_context,
++   .DestroyContext = dri_destroy_context,
+    .CreateBuffer = drisw_create_buffer,
+    .DestroyBuffer = dri_destroy_buffer,
+    .SwapBuffers = drisw_swap_buffers,
++   .MakeCurrent = dri_make_current,
++   .UnbindContext = dri_unbind_context,
+    .CopySubBuffer = drisw_copy_sub_buffer,
+ };
+ 
+diff --git a/src/gallium/frontends/dri/meson.build b/src/gallium/frontends/dri/meson.build
+index cb4f434c775..77a04406b34 100644
+--- a/src/gallium/frontends/dri/meson.build
++++ b/src/gallium/frontends/dri/meson.build
+@@ -59,6 +59,10 @@ if with_gallium_softpipe
+   libdri_c_args += '-DGALLIUM_SOFTPIPE'
  endif
-+if with_dri_pvr
-+  subdir('pvr')
-+  _dri_drivers += libpvr
-+  _dri_link += 'pvr_dri.so'
-+endif
  
- if _dri_drivers != []
-   libmesa_dri_drivers = shared_library(
-diff --git a/src/mesa/drivers/dri/pvr/dri_support.h b/src/mesa/drivers/dri/pvr/dri_support.h
++if with_gallium_pvr
++  libdri_c_args += '-DGALLIUM_PVR'
++endif
++
+ libdri = static_library(
+   'dri',
+   files_libdri,
+diff --git a/src/gallium/frontends/pvr/dri_support.h b/src/gallium/frontends/pvr/dri_support.h
 new file mode 100644
-index 00000000000..631410438fd
+index 00000000000..0e6f50727f2
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/dri_support.h
-@@ -0,0 +1,581 @@
++++ b/src/gallium/frontends/pvr/dri_support.h
+@@ -0,0 +1,587 @@
 +/* -*- mode: c; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
 +/* vi: set ts=8 sw=8 sts=8: */
 +/*************************************************************************/ /*!
@@ -708,14 +999,20 @@ index 00000000000..631410438fd
 +		void (*DrawableRemoveReference)
 +			(void *pvReferenceHandle);
 +	} v3;
++	/* The v4 interface is an extension of v3, so v3 is required as well */
++	struct {
++		void (*DestroyLoaderImageState)
++			(const struct __DRIscreenRec *psDRIScreen,
++			 void *pvLoaderPrivate);
++	} v4;
 +};
 +
 +#endif /* defined(__PVRDRIIFCE_H__) */
-diff --git a/src/mesa/drivers/dri/pvr/img_drm_fourcc.h b/src/mesa/drivers/dri/pvr/img_drm_fourcc.h
+diff --git a/src/gallium/frontends/pvr/img_drm_fourcc.h b/src/gallium/frontends/pvr/img_drm_fourcc.h
 new file mode 100644
 index 00000000000..8d570ff8f53
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/img_drm_fourcc.h
++++ b/src/gallium/frontends/pvr/img_drm_fourcc.h
 @@ -0,0 +1,113 @@
 +/*************************************************************************/ /*!
 +@File
@@ -830,11 +1127,11 @@ index 00000000000..8d570ff8f53
 +#define DRM_FORMAT_MOD_PVR_FBCDC_16x4_V7     fourcc_mod_code(PVR, 12)
 +
 +#endif /* IMG_DRM_FOURCC_H */
-diff --git a/src/mesa/drivers/dri/pvr/imgpixfmts.h b/src/mesa/drivers/dri/pvr/imgpixfmts.h
+diff --git a/src/gallium/frontends/pvr/imgpixfmts.h b/src/gallium/frontends/pvr/imgpixfmts.h
 new file mode 100644
 index 00000000000..da12a0fb5f6
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/imgpixfmts.h
++++ b/src/gallium/frontends/pvr/imgpixfmts.h
 @@ -0,0 +1,307 @@
 +/*************************************************************************/ /*!
 +@File           imgpixfmts.h
@@ -1143,11 +1440,11 @@ index 00000000000..da12a0fb5f6
 +} IMG_PIXFMT;
 +
 +#endif /* IMGPIXFMTS_H */
-diff --git a/src/mesa/drivers/dri/pvr/imgyuv.h b/src/mesa/drivers/dri/pvr/imgyuv.h
+diff --git a/src/gallium/frontends/pvr/imgyuv.h b/src/gallium/frontends/pvr/imgyuv.h
 new file mode 100644
 index 00000000000..7ae8fd19ac0
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/imgyuv.h
++++ b/src/gallium/frontends/pvr/imgyuv.h
 @@ -0,0 +1,58 @@
 +/*************************************************************************/ /*!
 +@File
@@ -1207,11 +1504,11 @@ index 00000000000..7ae8fd19ac0
 +
 +
 +#endif /* IMGYUV_H */
-diff --git a/src/mesa/drivers/dri/pvr/mesa_context.c b/src/mesa/drivers/dri/pvr/mesa_context.c
+diff --git a/src/gallium/frontends/pvr/mesa_context.c b/src/gallium/frontends/pvr/mesa_context.c
 new file mode 100644
 index 00000000000..d36bae5ac54
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/mesa_context.c
++++ b/src/gallium/frontends/pvr/mesa_context.c
 @@ -0,0 +1,208 @@
 +/**
 + * \file context.c
@@ -1421,12 +1718,12 @@ index 00000000000..d36bae5ac54
 +
 +   _glapi_set_dispatch(psTable);
 +}
-diff --git a/src/mesa/drivers/dri/pvr/meson.build b/src/mesa/drivers/dri/pvr/meson.build
+diff --git a/src/gallium/frontends/pvr/meson.build b/src/gallium/frontends/pvr/meson.build
 new file mode 100644
-index 00000000000..59cccf8add4
+index 00000000000..e13b8be687b
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/meson.build
-@@ -0,0 +1,48 @@
++++ b/src/gallium/frontends/pvr/meson.build
+@@ -0,0 +1,46 @@
 +# Copyright (c) Imagination Technologies Ltd.
 +#
 +# The contents of this file are subject to the MIT license as set out below.
@@ -1449,7 +1746,7 @@ index 00000000000..59cccf8add4
 +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 +# THE SOFTWARE.
 +
-+files_pvr = files(
++files_libpvr = files(
 +  'mesa_context.c',
 +  'pvrcb.c',
 +  'pvrcompat.c',
@@ -1458,29 +1755,27 @@ index 00000000000..59cccf8add4
 +  'pvrutil.c',
 +)
 +
-+dep_libpvr = [
-+  dep_libdrm,
-+]
++libpvr_c_args = ['-DGALLIUM_PVR']
 +
-+if with_platform_tizen
-+  dep_libpvr += dep_dlog
-+endif
++libpvr_dep = [dep_libdrm]
 +
 +libpvr = static_library(
 +  'pvr',
-+  [files_pvr, main_dispatch_h],
-+  include_directories : [inc_include, inc_src, inc_mapi, inc_mesa,
-+                         inc_dri_common, inc_util, inc_pvr],
-+  c_args : [no_override_init_args],
++  [files_libpvr, main_dispatch_h],
++  include_directories : [
++    inc_include, inc_util, inc_mesa, inc_mapi, inc_src, inc_gallium,
++    inc_gallium_aux, inc_pvr,
++  ],
++  c_args : [libpvr_c_args],
 +  gnu_symbol_visibility : 'hidden',
-+  dependencies : [dep_libpvr],
++  dependencies : [libpvr_dep],
 +)
-diff --git a/src/mesa/drivers/dri/pvr/pvrcb.c b/src/mesa/drivers/dri/pvr/pvrcb.c
+diff --git a/src/gallium/frontends/pvr/pvrcb.c b/src/gallium/frontends/pvr/pvrcb.c
 new file mode 100644
-index 00000000000..ea8911c64d5
+index 00000000000..b6ee53c5954
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/pvrcb.c
-@@ -0,0 +1,328 @@
++++ b/src/gallium/frontends/pvr/pvrcb.c
+@@ -0,0 +1,344 @@
 +/*
 + * Copyright (c) Imagination Technologies Ltd.
 + *
@@ -1809,11 +2104,27 @@ index 00000000000..ea8911c64d5
 +
 +   PVRDRIDrawableRemoveReference(psPVRDrawable);
 +}
-diff --git a/src/mesa/drivers/dri/pvr/pvrcompat.c b/src/mesa/drivers/dri/pvr/pvrcompat.c
++
++void
++MODSUPDestroyLoaderImageState(const struct __DRIscreenRec *psDRIScreen,
++                              void *pvLoaderPrivate)
++{
++   const __DRIimageLoaderExtension *psImageLoader = psDRIScreen->image.loader;
++   const __DRIdri2LoaderExtension *psDRI2Loader = psDRIScreen->dri2.loader;
++
++   if (psImageLoader && psImageLoader->base.version >= 4 &&
++       psImageLoader->destroyLoaderImageState) {
++      psImageLoader->destroyLoaderImageState(pvLoaderPrivate);
++   } else if (psDRI2Loader && psDRI2Loader->base.version >= 5 &&
++       psDRI2Loader->destroyLoaderImageState) {
++      psDRI2Loader->destroyLoaderImageState(pvLoaderPrivate);
++   }
++}
+diff --git a/src/gallium/frontends/pvr/pvrcompat.c b/src/gallium/frontends/pvr/pvrcompat.c
 new file mode 100644
 index 00000000000..23a57dde682
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/pvrcompat.c
++++ b/src/gallium/frontends/pvr/pvrcompat.c
 @@ -0,0 +1,838 @@
 +/*
 + * Copyright (c) Imagination Technologies Ltd.
@@ -2653,12 +2964,12 @@ index 00000000000..23a57dde682
 +
 +   return true;
 +}
-diff --git a/src/mesa/drivers/dri/pvr/pvrdri.c b/src/mesa/drivers/dri/pvr/pvrdri.c
+diff --git a/src/gallium/frontends/pvr/pvrdri.c b/src/gallium/frontends/pvr/pvrdri.c
 new file mode 100644
-index 00000000000..ab941f71567
+index 00000000000..945aafaeaf0
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/pvrdri.c
-@@ -0,0 +1,613 @@
++++ b/src/gallium/frontends/pvr/pvrdri.c
+@@ -0,0 +1,607 @@
 +/*
 + * Copyright (c) Imagination Technologies Ltd.
 + *
@@ -2689,6 +3000,8 @@ index 00000000000..ab941f71567
 +#include "util/u_atomic.h"
 +#include "utils.h"
 +
++#include "dri_screen.h"
++
 +#include "pvrdri.h"
 +#include "pvrmesa.h"
 +
@@ -2853,12 +3166,14 @@ index 00000000000..ab941f71567
 +      .v3.DrawableGetReferenceHandle = MODSUPDrawableGetReferenceHandle,
 +      .v3.DrawableAddReference = MODSUPDrawableAddReference,
 +      .v3.DrawableRemoveReference = MODSUPDrawableRemoveReference,
++      /* Version 4 callbacks */
++      .v4.DestroyLoaderImageState = MODSUPDestroyLoaderImageState,
 +   };
 +
 +   if (!PVRLoaderIsSupported(psDRIScreen))
 +      return NULL;
 +
-+   if (!PVRDRICompatInit(&sDRICallbacksV2, 3, 0))
++   if (!PVRDRICompatInit(&sDRICallbacksV2, 4, 0))
 +      return NULL;
 +
 +   psPVRScreen = calloc(1, sizeof(*psPVRScreen));
@@ -3236,7 +3551,7 @@ index 00000000000..ab941f71567
 +   free(psPVRBuffer);
 +}
 +
-+static const struct __DriverAPIRec pvr_driver_api = {
++const struct __DriverAPIRec pvr_driver_api = {
 +   .InitScreen = PVRDRIInitScreen,
 +   .DestroyScreen = PVRDRIDestroyScreen,
 +   .CreateContext = PVRDRICreateContext,
@@ -3255,29 +3570,19 @@ index 00000000000..ab941f71567
 +   .vtable = &pvr_driver_api,
 +};
 +
-+static const __DRIextension *pvr_driver_extensions[] = {
++const __DRIextension *pvr_driver_extensions[] = {
 +   &driCoreExtension.base,
 +   &driImageDriverExtension.base,
-+   &driDRI2Extension.base,
++   &pvrDRI2Extension.base,
 +   &pvr_vtable.base,
 +   NULL
 +};
-+
-+const __DRIextension **__driDriverGetExtensions_pvr(void);
-+
-+PUBLIC const __DRIextension **
-+__driDriverGetExtensions_pvr(void)
-+{
-+   globalDriverAPI = &pvr_driver_api;
-+
-+   return pvr_driver_extensions;
-+}
-diff --git a/src/mesa/drivers/dri/pvr/pvrdri.h b/src/mesa/drivers/dri/pvr/pvrdri.h
+diff --git a/src/gallium/frontends/pvr/pvrdri.h b/src/gallium/frontends/pvr/pvrdri.h
 new file mode 100644
-index 00000000000..fd465bf7f5c
+index 00000000000..58591d83fdf
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/pvrdri.h
-@@ -0,0 +1,188 @@
++++ b/src/gallium/frontends/pvr/pvrdri.h
+@@ -0,0 +1,190 @@
 +/*
 + * Copyright (c) Imagination Technologies Ltd.
 + *
@@ -3465,12 +3770,14 @@ index 00000000000..fd465bf7f5c
 +
 +void MODSUPDrawableRemoveReference(void *pvReferenceHandle);
 +
++void MODSUPDestroyLoaderImageState(const struct __DRIscreenRec *psDRIScreen,
++                                   void *pvLoaderPrivate);
 +#endif /* defined(__PVRDRI_H__) */
-diff --git a/src/mesa/drivers/dri/pvr/pvrdri_support.h b/src/mesa/drivers/dri/pvr/pvrdri_support.h
+diff --git a/src/gallium/frontends/pvr/pvrdri_support.h b/src/gallium/frontends/pvr/pvrdri_support.h
 new file mode 100644
 index 00000000000..58ea3505a4d
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/pvrdri_support.h
++++ b/src/gallium/frontends/pvr/pvrdri_support.h
 @@ -0,0 +1,206 @@
 +/*
 + * Copyright (c) Imagination Technologies Ltd.
@@ -3678,11 +3985,11 @@ index 00000000000..58ea3505a4d
 +bool DRISUPHaveGetFenceFromCLEvent(void);
 +
 +#endif /* defined(__PVRDRI_SUPPORT_H__) */
-diff --git a/src/mesa/drivers/dri/pvr/pvrext.c b/src/mesa/drivers/dri/pvr/pvrext.c
+diff --git a/src/gallium/frontends/pvr/pvrext.c b/src/gallium/frontends/pvr/pvrext.c
 new file mode 100644
 index 00000000000..478399618df
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/pvrext.c
++++ b/src/gallium/frontends/pvr/pvrext.c
 @@ -0,0 +1,704 @@
 +/*
 + * Copyright (c) Imagination Technologies Ltd.
@@ -4388,11 +4695,11 @@ index 00000000000..478399618df
 +      break;
 +   }
 +}
-diff --git a/src/mesa/drivers/dri/pvr/pvrmesa.h b/src/mesa/drivers/dri/pvr/pvrmesa.h
+diff --git a/src/gallium/frontends/pvr/pvrmesa.h b/src/gallium/frontends/pvr/pvrmesa.h
 new file mode 100644
 index 00000000000..5e1c9c1b2e6
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/pvrmesa.h
++++ b/src/gallium/frontends/pvr/pvrmesa.h
 @@ -0,0 +1,36 @@
 +/*
 + * Copyright (c) Imagination Technologies Ltd.
@@ -4430,12 +4737,12 @@ index 00000000000..5e1c9c1b2e6
 +void pvrdri_set_dispatch_table(PVRDRIContext *psPVRContext);
 +
 +#endif /* !defined(__PVRMESA_H__) */
-diff --git a/src/mesa/drivers/dri/pvr/pvrutil.c b/src/mesa/drivers/dri/pvr/pvrutil.c
+diff --git a/src/gallium/frontends/pvr/pvrutil.c b/src/gallium/frontends/pvr/pvrutil.c
 new file mode 100644
-index 00000000000..945e18cf220
+index 00000000000..4bb114f64ef
 --- /dev/null
-+++ b/src/mesa/drivers/dri/pvr/pvrutil.c
-@@ -0,0 +1,239 @@
++++ b/src/gallium/frontends/pvr/pvrutil.c
+@@ -0,0 +1,235 @@
 +/*
 + * Copyright (c) Imagination Technologies Ltd.
 + *
@@ -4483,10 +4790,6 @@ index 00000000000..945e18cf220
 +#include <android/log.h>
 +#define err_printf(f, args...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, f, ##args))
 +#define dbg_printf(f, args...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, f, ##args))
-+#elif defined(HAVE_TIZEN_PLATFORM)
-+#include <dlog.h>
-+#define err_printf(f, args...) LOGE(f, ##args)
-+#define dbg_printf(f, args...) LOGD(f, ##args)
 +#else
 +#define err_printf(f, args...) fprintf(stderr, f "\n", ##args)
 +#define dbg_printf(f, args...) fprintf(stderr, "LibGL: " f "\n", ##args)
@@ -4513,10 +4816,10 @@ index 00000000000..945e18cf220
 +   va_list args;
 +
 +   /*
-+    * On Android and Tizen, always print messages; otherwise, only print if
++    * On Android, always print messages; otherwise, only print if
 +    * the environment variable LIBGL_DEBUG=verbose.
 +    */
-+#if !defined(HAVE_ANDROID_PLATFORM) && !defined(HAVE_TIZEN_PLATFORM)
++#if !defined(HAVE_ANDROID_PLATFORM)
 +   char *ev = getenv("LIBGL_DEBUG");
 +
 +   if (!ev || strcmp(ev, "verbose") != 0)
@@ -4675,18 +4978,118 @@ index 00000000000..945e18cf220
 +
 +   return 0;
 +}
+diff --git a/src/gallium/meson.build b/src/gallium/meson.build
+index a678dc02705..26575cc38ca 100644
+--- a/src/gallium/meson.build
++++ b/src/gallium/meson.build
+@@ -150,6 +150,16 @@ if with_gallium_svga
+ else
+   driver_svga = declare_dependency()
+ endif
++if with_gallium_pvr
++  subdir('drivers/pvr')
++else
++  driver_pvr = declare_dependency()
++endif
++if with_gallium_pvr_alias
++  subdir('drivers/pvr_alias')
++else
++  driver_pvr_alias = declare_dependency()
++endif
+ if with_gallium_virgl
+   subdir('winsys/virgl/common')
+   subdir('winsys/virgl/drm')
+@@ -182,6 +192,11 @@ if with_gallium_opencl
+   subdir('frontends/clover')
+   subdir('targets/opencl')
+ endif
++if with_gallium_pvr
++  subdir('frontends/pvr')
++else
++  libpvr = []
++endif
+ if with_dri
+   subdir('frontends/dri')
+   subdir('targets/dri')
+diff --git a/src/gallium/targets/dri/meson.build b/src/gallium/targets/dri/meson.build
+index 8554b15c63a..7640ec1216d 100644
+--- a/src/gallium/targets/dri/meson.build
++++ b/src/gallium/targets/dri/meson.build
+@@ -50,7 +50,7 @@ libgallium_dri = shared_library(
+   link_with : [
+     libdri, libmesa, libgalliumvl,
+     libgallium, libglapi, libpipe_loader_static, libws_null, libwsw, libswdri,
+-    libswkmsdri,
++    libswkmsdri, libpvr,
+   ],
+   dependencies : [
+     dep_selinux, dep_libdrm, dep_llvm, dep_thread, idep_xmlconfig, idep_mesautil,
+@@ -58,7 +58,7 @@ libgallium_dri = shared_library(
+     driver_kmsro, driver_v3d, driver_vc4, driver_freedreno, driver_etnaviv,
+     driver_tegra, driver_i915, driver_svga, driver_virgl,
+     driver_panfrost, driver_iris, driver_lima, driver_zink, driver_d3d12,
+-    driver_asahi, driver_crocus
++    driver_asahi, driver_crocus, driver_pvr, driver_pvr_alias
+   ],
+   # Will be deleted during installation, see install_megadrivers.py
+   install : true,
+@@ -114,7 +114,9 @@ foreach d : [[with_gallium_kmsro, [
+              [with_gallium_lima, 'lima_dri.so'],
+              [with_gallium_zink, 'zink_dri.so'],
+              [with_gallium_d3d12, 'd3d12_dri.so'],
+-             [with_gallium_asahi, 'asahi_dri.so']]
++             [with_gallium_asahi, 'asahi_dri.so'],
++             [with_gallium_pvr, 'pvr_dri.so'],
++             [with_gallium_pvr_alias, gallium_pvr_alias + '_dri.so']]
+   if d[0]
+     gallium_dri_drivers += d[1]
+   endif
+diff --git a/src/gallium/targets/dri/target.c b/src/gallium/targets/dri/target.c
+index 9b78351fa8f..1e660ecb080 100644
+--- a/src/gallium/targets/dri/target.c
++++ b/src/gallium/targets/dri/target.c
+@@ -10,6 +10,16 @@ PUBLIC const __DRIextension **__driDriverGetExtensions_##drivername(void) \
+    return galliumdrm_driver_extensions;                                   \
+ }
+ 
++#define DEFINE_LOADER_PVR_ENTRYPOINT(drivername)                          \
++const __DRIextension **__driDriverGetExtensions_##drivername(void);       \
++PUBLIC const __DRIextension **__driDriverGetExtensions_##drivername(void) \
++{                                                                         \
++   return pvr_driver_extensions;                                          \
++}
++
++#define DEFINE_LOADER_PVR_ALIAS_ENTRYPOINT(drivername)                    \
++   DEFINE_LOADER_PVR_ENTRYPOINT(drivername)
++
+ #if defined(GALLIUM_SOFTPIPE)
+ 
+ const __DRIextension **__driDriverGetExtensions_swrast(void);
+@@ -136,3 +146,11 @@ PUBLIC const __DRIextension **__driDriverGetExtensions_zink(void)
+ #if defined(GALLIUM_D3D12)
+ DEFINE_LOADER_DRM_ENTRYPOINT(d3d12);
+ #endif
++
++#if defined(GALLIUM_PVR)
++DEFINE_LOADER_PVR_ENTRYPOINT(pvr);
++#endif
++
++#if defined(GALLIUM_PVR_ALIAS)
++DEFINE_LOADER_PVR_ALIAS_ENTRYPOINT(GALLIUM_PVR_ALIAS);
++#endif
 diff --git a/src/meson.build b/src/meson.build
-index acc7fe94abb..c3bab27718d 100644
+index 1d42e08df30..91aca307c87 100644
 --- a/src/meson.build
 +++ b/src/meson.build
-@@ -25,6 +25,7 @@ inc_gallium = include_directories('gallium/include')
+@@ -24,6 +24,8 @@ inc_src = include_directories('.')
+ inc_gallium = include_directories('gallium/include')
  inc_gallium_aux = include_directories('gallium/auxiliary')
  inc_amd_common = include_directories('amd/common')
- inc_amd_common_llvm = include_directories('amd/llvm')
-+inc_pvr = include_directories('mesa/main', 'mapi/glapi')
++inc_pvr = include_directories('mesa/main', 'mapi/glapi',
++                              'gallium/frontends/dri')
  inc_tool = include_directories('tool')
+ inc_virtio_gpu = include_directories('virtio/virtio-gpu')
  pps_datasources = []
- pps_includes = []
 -- 
 2.25.1
 

+ 0 - 0
package/mesa3d/0002-Force-Mesa-to-use-the-PVR-driver-for-platform-device.patch


+ 18 - 18
package/mesa3d/0003-dri-Add-some-new-DRI-formats-and-fourccs.patch → package/mesa3d/0002-dri-Add-some-new-DRI-formats-and-fourccs.patch

@@ -1,23 +1,23 @@
-From fec4f46f7cedb6b3e90bf88c3efc3cd5da0d9131 Mon Sep 17 00:00:00 2001
+From e7a7ee27d09c79038f5a3772f6d5148d56a15af2 Mon Sep 17 00:00:00 2001
 From: Frank Binns <frank.binns@imgtec.com>
 Date: Thu, 5 Jun 2014 12:07:01 +0100
-Subject: [PATCH 03/67] dri: Add some new DRI formats and fourccs
+Subject: [PATCH 02/58] dri: Add some new DRI formats and fourccs
 
 Add ARGB4444 DRI format and fourcc.
 Add YVU444_PACK10_IMG DRI format and fourcc.
 Add BGR888 DRI format and fourcc.
 ---
- include/GL/internal/dri_interface.h    | 4 ++++
- include/drm-uapi/drm_fourcc.h          | 1 +
- src/egl/drivers/dri2/egl_dri2.c        | 1 +
- src/mesa/drivers/dri/common/dri_util.c | 5 +++++
+ include/GL/internal/dri_interface.h  | 4 ++++
+ include/drm-uapi/drm_fourcc.h        | 1 +
+ src/egl/drivers/dri2/egl_dri2.c      | 1 +
+ src/gallium/frontends/dri/dri_util.c | 5 +++++
  4 files changed, 11 insertions(+)
 
 diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
-index 66dc0927cb7..510289403d2 100644
+index 6099b2a296f..7f8872f48dd 100644
 --- a/include/GL/internal/dri_interface.h
 +++ b/include/GL/internal/dri_interface.h
-@@ -1367,6 +1367,9 @@ struct __DRIdri2ExtensionRec {
+@@ -1211,6 +1211,9 @@ struct __DRIdri2ExtensionRec {
  #define __DRI_IMAGE_FORMAT_ABGR16161616F 0x1015
  #define __DRI_IMAGE_FORMAT_SXRGB8       0x1016
  #define __DRI_IMAGE_FORMAT_ABGR16161616 0x1017
@@ -27,7 +27,7 @@ index 66dc0927cb7..510289403d2 100644
  
  #define __DRI_IMAGE_USE_SHARE		0x0001
  #define __DRI_IMAGE_USE_SCANOUT		0x0002
-@@ -1397,6 +1400,7 @@ struct __DRIdri2ExtensionRec {
+@@ -1242,6 +1245,7 @@ struct __DRIdri2ExtensionRec {
  #define __DRI_IMAGE_FOURCC_SABGR8888	0x84324258
  #define __DRI_IMAGE_FOURCC_SXRGB8888	0x85324258
  #define __DRI_IMAGE_FOURCC_RGBA16161616 0x38344152  /* fourcc_code('R', 'A', '4', '8' ) */
@@ -36,10 +36,10 @@ index 66dc0927cb7..510289403d2 100644
  /**
   * Queryable on images created by createImageFromNames.
 diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm-uapi/drm_fourcc.h
-index cd3ce8a8c60..57657592a38 100644
+index e5074162bcd..da592ba023f 100644
 --- a/include/drm-uapi/drm_fourcc.h
 +++ b/include/drm-uapi/drm_fourcc.h
-@@ -344,6 +344,7 @@ extern "C" {
+@@ -357,6 +357,7 @@ extern "C" {
  #define DRM_FORMAT_YUV444	fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */
  #define DRM_FORMAT_YVU444	fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */
  
@@ -48,10 +48,10 @@ index cd3ce8a8c60..57657592a38 100644
  /*
   * Format Modifiers:
 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index 9e5a55a287c..eee28eb4726 100644
+index 3682d05be95..a583b913335 100644
 --- a/src/egl/drivers/dri2/egl_dri2.c
 +++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -2652,6 +2652,7 @@ dri2_num_fourcc_format_planes(EGLint format)
+@@ -2678,6 +2678,7 @@ dri2_num_fourcc_format_planes(EGLint format)
     case DRM_FORMAT_Y410:
     case DRM_FORMAT_Y412:
     case DRM_FORMAT_Y416:
@@ -59,11 +59,11 @@ index 9e5a55a287c..eee28eb4726 100644
        return 1;
  
     case DRM_FORMAT_NV12:
-diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
-index e2a11240dea..caed5fa6a68 100644
---- a/src/mesa/drivers/dri/common/dri_util.c
-+++ b/src/mesa/drivers/dri/common/dri_util.c
-@@ -904,6 +904,11 @@ static const struct {
+diff --git a/src/gallium/frontends/dri/dri_util.c b/src/gallium/frontends/dri/dri_util.c
+index b562572a15f..abc84a22ac6 100644
+--- a/src/gallium/frontends/dri/dri_util.c
++++ b/src/gallium/frontends/dri/dri_util.c
+@@ -912,6 +912,11 @@ static const struct {
        .mesa_format     =        MESA_FORMAT_B5G5R5A1_UNORM,
        .internal_format =        GL_RGB5_A1,
     },

+ 14 - 27
package/mesa3d/0004-GL_EXT_sparse_texture-entry-points.patch → package/mesa3d/0003-GL_EXT_sparse_texture-entry-points.patch

@@ -1,21 +1,21 @@
-From e66cd64b65e86a23807260a9a0c73f1355715314 Mon Sep 17 00:00:00 2001
+From e82e274b5dc8393e405bce1fc36926f24fc6ee13 Mon Sep 17 00:00:00 2001
 From: Frank Binns <frank.binns@imgtec.com>
 Date: Wed, 12 Aug 2015 09:11:51 +0100
-Subject: [PATCH 04/67] GL_EXT_sparse_texture entry points
+Subject: [PATCH 03/58] GL_EXT_sparse_texture entry points
 
 ---
- src/mapi/glapi/gen/EXT_sparse_texture.xml | 56 +++++++++++++++++++++++
+ src/mapi/glapi/gen/EXT_sparse_texture.xml | 44 +++++++++++++++++++++++
  src/mapi/glapi/gen/es_EXT.xml             |  3 ++
- src/mapi/glapi/gen/static_data.py         |  2 +
- 3 files changed, 61 insertions(+)
+ src/mapi/glapi/gen/static_data.py         |  1 +
+ 3 files changed, 48 insertions(+)
  create mode 100644 src/mapi/glapi/gen/EXT_sparse_texture.xml
 
 diff --git a/src/mapi/glapi/gen/EXT_sparse_texture.xml b/src/mapi/glapi/gen/EXT_sparse_texture.xml
 new file mode 100644
-index 00000000000..48d03e7b9c0
+index 00000000000..ebeab7d1f9a
 --- /dev/null
 +++ b/src/mapi/glapi/gen/EXT_sparse_texture.xml
-@@ -0,0 +1,56 @@
+@@ -0,0 +1,44 @@
 +<?xml version="1.0"?>
 +<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
 +
@@ -57,26 +57,14 @@ index 00000000000..48d03e7b9c0
 +        <param name="commit" type="GLboolean"/>
 +    </function>
 +
-+    <function name="TexturePageCommitmentEXT" es2="3.1" exec="dynamic">
-+        <param name="texture" type="GLuint"/>
-+        <param name="level" type="GLint"/>
-+        <param name="xoffset" type="GLint"/>
-+        <param name="yoffset" type="GLint"/>
-+        <param name="zoffset" type="GLint"/>
-+        <param name="width" type="GLsizei"/>
-+        <param name="height" type="GLsizei"/>
-+        <param name="depth" type="GLsizei"/>
-+        <param name="commit" type="GLboolean"/>
-+    </function>
-+
 +</category>
 +
 +</OpenGLAPI>
 diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
-index 929b40bbd4a..962170bc58e 100644
+index e96f5b83f71..79761210760 100644
 --- a/src/mapi/glapi/gen/es_EXT.xml
 +++ b/src/mapi/glapi/gen/es_EXT.xml
-@@ -1433,6 +1433,9 @@
+@@ -1459,6 +1459,9 @@
  
  </category>
  
@@ -87,15 +75,14 @@ index 929b40bbd4a..962170bc58e 100644
      <function name="ViewportArrayvOES" es2="3.1" alias="ViewportArrayv">
          <param name="first" type="GLuint"/>
 diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
-index 6accff1b231..d063930bd81 100644
+index c634304d925..82acbf627ef 100644
 --- a/src/mapi/glapi/gen/static_data.py
 +++ b/src/mapi/glapi/gen/static_data.py
-@@ -1689,6 +1689,8 @@ offsets = {
-     "VertexAttribs2hvNV": 1653,
-     "VertexAttribs3hvNV": 1654,
+@@ -1691,6 +1691,7 @@ offsets = {
      "VertexAttribs4hvNV": 1655,
-+    "TexPageCommitmentEXT": 1656,
-+    "TexturePageCommitmentEXT" : 1657,
+     "TexPageCommitmentARB": 1656,
+     "TexturePageCommitmentEXT": 1657,
++    "TexPageCommitmentEXT": 1658,
  }
  
  functions = [

+ 14 - 14
package/mesa3d/0005-Add-support-for-various-GLES-extensions.patch → package/mesa3d/0004-Add-support-for-various-GLES-extensions.patch

@@ -1,7 +1,7 @@
-From 4a1be491de2ea78be95dc4cf08af4b1da5e16d91 Mon Sep 17 00:00:00 2001
+From a5e8c3a310f9dac3ccc7537544e5288d1daadf66 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Mon, 10 Mar 2014 12:27:03 +0000
-Subject: [PATCH 05/67] Add support for various GLES extensions
+Subject: [PATCH 04/58] Add support for various GLES extensions
 
 Add support for:
 	EXT_occlusion_query_boolean
@@ -13,7 +13,7 @@ Add support for:
  2 files changed, 38 insertions(+), 9 deletions(-)
 
 diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
-index 962170bc58e..e586b0ec19b 100644
+index 79761210760..03c78ef9ca5 100644
 --- a/src/mapi/glapi/gen/es_EXT.xml
 +++ b/src/mapi/glapi/gen/es_EXT.xml
 @@ -285,28 +285,25 @@
@@ -85,19 +85,19 @@ index 962170bc58e..e586b0ec19b 100644
  <category name="GL_OES_EGL_image_external" number="87">
      <enum name="TEXTURE_EXTERNAL_OES"                     value="0x8D65"/>
 diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
-index d063930bd81..79b8f19cb75 100644
+index 82acbf627ef..21af0789fee 100644
 --- a/src/mapi/glapi/gen/static_data.py
 +++ b/src/mapi/glapi/gen/static_data.py
-@@ -1691,6 +1691,12 @@ offsets = {
-     "VertexAttribs4hvNV": 1655,
-     "TexPageCommitmentEXT": 1656,
-     "TexturePageCommitmentEXT" : 1657,
-+    "CurrentPaletteMatrixOES" : 1658,
-+    "LoadPaletteFromModelViewMatrixOES" : 1659,
-+    "MatrixIndexPointerOES" : 1660,
-+    "WeightPointerOES" : 1661,
-+    "RenderbufferStorageMultisampleIMG" : 1662,
-+    "FramebufferTexture2DMultisampleIMG" : 1663,
+@@ -1692,6 +1692,12 @@ offsets = {
+     "TexPageCommitmentARB": 1656,
+     "TexturePageCommitmentEXT": 1657,
+     "TexPageCommitmentEXT": 1658,
++    "CurrentPaletteMatrixOES" : 1659,
++    "LoadPaletteFromModelViewMatrixOES" : 1660,
++    "MatrixIndexPointerOES" : 1661,
++    "WeightPointerOES" : 1662,
++    "RenderbufferStorageMultisampleIMG" : 1663,
++    "FramebufferTexture2DMultisampleIMG" : 1664,
  }
  
  functions = [

+ 17 - 17
package/mesa3d/0006-Add-EGL_IMG_cl_image-extension.patch → package/mesa3d/0005-Add-EGL_IMG_cl_image-extension.patch

@@ -1,7 +1,7 @@
-From 7fdeb8bf25be01f122a7cb55dbe2b0e67e4a24a2 Mon Sep 17 00:00:00 2001
+From bf3d2c972cd028d906abccd6777968bfd7c21451 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Tue, 11 Mar 2014 11:50:53 +0000
-Subject: [PATCH 06/67] Add EGL_IMG_cl_image extension
+Subject: [PATCH 05/58] Add EGL_IMG_cl_image extension
 
 Add support for the experimental EGL_IMG_cl_image extension to EGL, and
 the DRI2 EGL driver.
@@ -30,13 +30,13 @@ index f0395a8a58c..5d11f3e488e 100644
  }
  #endif
 diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
-index 510289403d2..b197092939f 100644
+index 7f8872f48dd..ef2f44fad02 100644
 --- a/include/GL/internal/dri_interface.h
 +++ b/include/GL/internal/dri_interface.h
-@@ -1831,6 +1831,19 @@ struct __DRIimageExtensionRec {
-                                             const unsigned int modifier_count,
-                                             unsigned int use,
-                                             void *loaderPrivate);
+@@ -1704,6 +1704,19 @@ struct __DRIimageExtensionRec {
+     * \since 21
+     */
+    void (*setInFenceFd)(__DRIimage *image, int fd);
 +
 +   /**
 +    * Support for experimental EGL_CL_IMAGE_IMG.
@@ -54,10 +54,10 @@ index 510289403d2..b197092939f 100644
  
  
 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index eee28eb4726..dea5899b3a8 100644
+index a583b913335..d3a8fbe4ef7 100644
 --- a/src/egl/drivers/dri2/egl_dri2.c
 +++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -995,6 +995,10 @@ dri2_setup_screen(_EGLDisplay *disp)
+@@ -1007,6 +1007,10 @@ dri2_setup_screen(_EGLDisplay *disp)
           disp->Extensions.EXT_image_dma_buf_import_modifiers = EGL_TRUE;
        }
  #endif
@@ -68,7 +68,7 @@ index eee28eb4726..dea5899b3a8 100644
     }
  
     if (dri2_dpy->flush_control)
-@@ -2360,17 +2364,13 @@ dri2_get_sync_values_chromium(_EGLDisplay *disp, _EGLSurface *surf,
+@@ -2386,17 +2390,13 @@ dri2_get_sync_values_chromium(_EGLDisplay *disp, _EGLSurface *surf,
     return dri2_dpy->vtbl->get_sync_values(disp, surf, ust, msc, sbc);
  }
  
@@ -88,7 +88,7 @@ index eee28eb4726..dea5899b3a8 100644
  }
  
  static _EGLImage *
-@@ -2449,7 +2449,49 @@ dri2_create_image_khr_texture(_EGLDisplay *disp, _EGLContext *ctx,
+@@ -2475,7 +2475,49 @@ dri2_create_image_khr_texture(_EGLDisplay *disp, _EGLContext *ctx,
                                                attrs.GLTextureLevel,
                                                &error,
                                                NULL);
@@ -139,7 +139,7 @@ index eee28eb4726..dea5899b3a8 100644
  
     if (!dri2_img->dri_image) {
        free(dri2_img);
-@@ -2916,7 +2958,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
+@@ -2942,7 +2984,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
              &error,
              NULL);
     }
@@ -148,7 +148,7 @@ index eee28eb4726..dea5899b3a8 100644
  
     if (!dri_image)
        return EGL_NO_IMAGE_KHR;
-@@ -3152,6 +3194,8 @@ dri2_create_image_khr(_EGLDisplay *disp, _EGLContext *ctx, EGLenum target,
+@@ -3178,6 +3220,8 @@ dri2_create_image_khr(_EGLDisplay *disp, _EGLContext *ctx, EGLenum target,
     case EGL_WAYLAND_BUFFER_WL:
        return dri2_create_image_wayland_wl_buffer(disp, ctx, buffer, attr_list);
  #endif
@@ -158,10 +158,10 @@ index eee28eb4726..dea5899b3a8 100644
        _eglError(EGL_BAD_PARAMETER, "dri2_create_image_khr");
        return EGL_NO_IMAGE_KHR;
 diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
-index 17e36af22e1..6ffcff8b2cc 100644
+index d0238fe95e4..ddad85d3beb 100644
 --- a/src/egl/main/eglapi.c
 +++ b/src/egl/main/eglapi.c
-@@ -549,6 +549,7 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
+@@ -550,6 +550,7 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
     _EGL_CHECK_EXTENSION(WL_bind_wayland_display);
     _EGL_CHECK_EXTENSION(WL_create_wayland_buffer_from_image);
  
@@ -170,10 +170,10 @@ index 17e36af22e1..6ffcff8b2cc 100644
  }
  
 diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
-index 4d2afbc712e..5b05dcc1e6d 100644
+index 25b4ea79541..d95c7b9144a 100644
 --- a/src/egl/main/egldisplay.h
 +++ b/src/egl/main/egldisplay.h
-@@ -150,6 +150,8 @@ struct _egl_extensions
+@@ -152,6 +152,8 @@ struct _egl_extensions
  
     EGLBoolean WL_bind_wayland_display;
     EGLBoolean WL_create_wayland_buffer_from_image;

+ 5 - 5
package/mesa3d/0008-egl-optimise-eglMakeCurrent-for-the-case-where-nothi.patch → package/mesa3d/0006-egl-optimise-eglMakeCurrent-for-the-case-where-nothi.patch

@@ -1,7 +1,7 @@
-From f556292d5811750d119acea6c7dc0c5ebd3e1af6 Mon Sep 17 00:00:00 2001
+From 403a583fd53ac1bcd40179e62bc0692d838cc23b Mon Sep 17 00:00:00 2001
 From: Frank Binns <frank.binns@imgtec.com>
 Date: Tue, 15 Sep 2015 14:15:31 +0100
-Subject: [PATCH 08/67] egl: optimise eglMakeCurrent for the case where nothing
+Subject: [PATCH 06/58] egl: optimise eglMakeCurrent for the case where nothing
  has changed
 
 When an application calls eglMakeCurrent with a context, draw surface and
@@ -12,10 +12,10 @@ thread don't perform a flush as this is an expensive operation.
  1 file changed, 11 insertions(+), 1 deletion(-)
 
 diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
-index 3cd69b96a0f..234449adf64 100644
+index ddad85d3beb..7e2542bae6d 100644
 --- a/src/egl/main/eglapi.c
 +++ b/src/egl/main/eglapi.c
-@@ -853,6 +853,7 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
+@@ -858,6 +858,7 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
                 EGLContext ctx)
  {
     _EGLDisplay *disp = _eglLockDisplay(dpy);
@@ -23,7 +23,7 @@ index 3cd69b96a0f..234449adf64 100644
     _EGLContext *context = _eglLookupContext(ctx, disp);
     _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
     _EGLSurface *read_surf = _eglLookupSurface(read, disp);
-@@ -909,7 +910,16 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
+@@ -911,7 +912,16 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
         draw_surf && !draw_surf->ProtectedContent)
        RETURN_EGL_ERROR(disp, EGL_BAD_ACCESS, EGL_FALSE);
  

+ 12 - 12
package/mesa3d/0009-GL_EXT_shader_pixel_local_storage2-entry-points.patch → package/mesa3d/0007-GL_EXT_shader_pixel_local_storage2-entry-points.patch

@@ -1,7 +1,7 @@
-From 13e925af5ba3bd763eb4c9e5d0781f92981550f6 Mon Sep 17 00:00:00 2001
+From fbc371ceb3e97b829b3e9d3dd55674b156109646 Mon Sep 17 00:00:00 2001
 From: Rufus Hamade <rufus.hamade@imgtec.com>
 Date: Thu, 4 Feb 2016 14:09:26 +0000
-Subject: [PATCH 09/67] GL_EXT_shader_pixel_local_storage2 entry points
+Subject: [PATCH 07/58] GL_EXT_shader_pixel_local_storage2 entry points
 
 ---
  .../gen/EXT_shader_pixel_local_storage2.xml   | 35 +++++++++++++++++++
@@ -52,10 +52,10 @@ index 00000000000..20e186c0f0d
 +
 +</OpenGLAPI>
 diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
-index e586b0ec19b..a3bfe86a888 100644
+index 03c78ef9ca5..0ed0e003bae 100644
 --- a/src/mapi/glapi/gen/es_EXT.xml
 +++ b/src/mapi/glapi/gen/es_EXT.xml
-@@ -1459,6 +1459,9 @@
+@@ -1485,6 +1485,9 @@
  <!-- 240. EXT_sparse_texture -->
  <xi:include href="EXT_sparse_texture.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
  
@@ -66,16 +66,16 @@ index e586b0ec19b..a3bfe86a888 100644
      <function name="ViewportArrayvOES" es2="3.1" alias="ViewportArrayv">
          <param name="first" type="GLuint"/>
 diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
-index 79b8f19cb75..99729e21b7f 100644
+index 21af0789fee..f89dcf24e4e 100644
 --- a/src/mapi/glapi/gen/static_data.py
 +++ b/src/mapi/glapi/gen/static_data.py
-@@ -1697,6 +1697,9 @@ offsets = {
-     "WeightPointerOES" : 1661,
-     "RenderbufferStorageMultisampleIMG" : 1662,
-     "FramebufferTexture2DMultisampleIMG" : 1663,
-+    "ClearPixelLocalStorageuiEXT" : 1664,
-+    "FramebufferPixelLocalStorageSizeEXT" : 1665,
-+    "GetFramebufferPixelLocalStorageSizeEXT" : 1666,
+@@ -1698,6 +1698,9 @@ offsets = {
+     "WeightPointerOES" : 1662,
+     "RenderbufferStorageMultisampleIMG" : 1663,
+     "FramebufferTexture2DMultisampleIMG" : 1664,
++    "ClearPixelLocalStorageuiEXT" : 1665,
++    "FramebufferPixelLocalStorageSizeEXT" : 1666,
++    "GetFramebufferPixelLocalStorageSizeEXT" : 1667,
  }
  
  functions = [

+ 0 - 51
package/mesa3d/0007-egl-Be-stricter-when-making-a-context-current-withou.patch

@@ -1,51 +0,0 @@
-From fa57726f60bc6fc6e7094f16300cdc41b44ff4f3 Mon Sep 17 00:00:00 2001
-From: Frank Binns <frank.binns@imgtec.com>
-Date: Wed, 18 Jun 2014 17:10:28 +0100
-Subject: [PATCH 07/67] egl: Be stricter when making a context current without
- any surfaces
-
-The EGL_KHR_surfaceless_context extension spec states for eglMakeCurrent:
-    "If <ctx> does not support being bound without read and draw
-    surfaces, and both <draw> and <read> are EGL_NO_SURFACE, an
-    EGL_BAD_MATCH error is generated."
-
-Only OpenGLES contexts support this, via the GL_OES_surfaceless_context,
-so if EGL_KHR_surfaceless_context is supported and the context isn't an
-OpenGLES context then set the EGL error to EGL_BAD_MATCH.
-
-NOTE: This patch can't be upstreamed as is because we set the error to
-EGL_BAD_MATCH if we have an OpenGLES 1.x context but the
-GL_OES_surfaceless_context extension spec says:
-    "This extension is written against the OpenGL ES 2.0 Specification
-    but can apply to OpenGL ES 1.1 with the GL_OES_framebuffer_object
-    extension."
-
-All Mesa OpenGLES drivers support GL_OES_framebuffer_object, but we
-don't, so there would never be a reason to check whether or not this
-extension is supported.
-
-In order to upstream this patch the check would need to be changed
-to set the error to EGL_BAD_MATCH if EGL_KHR_surfaceless_context is
-supported and the context API isn't OpenGLES or the OpenGLES version
-is 1.0.
----
- src/egl/main/eglapi.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
-index 6ffcff8b2cc..3cd69b96a0f 100644
---- a/src/egl/main/eglapi.c
-+++ b/src/egl/main/eglapi.c
-@@ -888,6 +888,9 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
-          RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
-       if (draw_surf || read_surf)
-          RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
-+      if (disp->Extensions.KHR_surfaceless_context && context &&
-+          (context->ClientAPI != EGL_OPENGL_ES_API || context->ClientMajorVersion == 1))
-+         RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
-    }
- 
-    /*    If a native window underlying either draw or read is no longer valid,
--- 
-2.25.1
-

+ 11 - 11
package/mesa3d/0010-GL_IMG_framebuffer_downsample-entry-points.patch → package/mesa3d/0008-GL_IMG_framebuffer_downsample-entry-points.patch

@@ -1,7 +1,7 @@
-From f43a3258b8f4859ff3e0e3d3d356b319dd6a5435 Mon Sep 17 00:00:00 2001
+From 3d1c30412a91c9d6f8b824a9850ae1ba3f67be44 Mon Sep 17 00:00:00 2001
 From: Rufus Hamade <rufus.hamade@imgtec.com>
 Date: Thu, 4 Feb 2016 14:09:26 +0000
-Subject: [PATCH 10/67] GL_IMG_framebuffer_downsample entry points
+Subject: [PATCH 08/58] GL_IMG_framebuffer_downsample entry points
 
 ---
  .../glapi/gen/IMG_framebuffer_downsample.xml  | 37 +++++++++++++++++++
@@ -54,10 +54,10 @@ index 00000000000..b5ce77dfb08
 +
 +</OpenGLAPI>
 diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
-index a3bfe86a888..b3432820ba6 100644
+index 0ed0e003bae..94696d535b9 100644
 --- a/src/mapi/glapi/gen/es_EXT.xml
 +++ b/src/mapi/glapi/gen/es_EXT.xml
-@@ -1462,6 +1462,9 @@
+@@ -1488,6 +1488,9 @@
  <!-- 253. GL_EXT_shader_pixel_local_storage2 -->
  <xi:include href="EXT_shader_pixel_local_storage2.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
  
@@ -68,15 +68,15 @@ index a3bfe86a888..b3432820ba6 100644
      <function name="ViewportArrayvOES" es2="3.1" alias="ViewportArrayv">
          <param name="first" type="GLuint"/>
 diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
-index 99729e21b7f..c723cb3fab8 100644
+index f89dcf24e4e..e363994a298 100644
 --- a/src/mapi/glapi/gen/static_data.py
 +++ b/src/mapi/glapi/gen/static_data.py
-@@ -1700,6 +1700,8 @@ offsets = {
-     "ClearPixelLocalStorageuiEXT" : 1664,
-     "FramebufferPixelLocalStorageSizeEXT" : 1665,
-     "GetFramebufferPixelLocalStorageSizeEXT" : 1666,
-+    "FramebufferTexture2DDownsampleIMG" : 1667,
-+    "FramebufferTextureLayerDownsampleIMG" : 1668,
+@@ -1701,6 +1701,8 @@ offsets = {
+     "ClearPixelLocalStorageuiEXT" : 1665,
+     "FramebufferPixelLocalStorageSizeEXT" : 1666,
+     "GetFramebufferPixelLocalStorageSizeEXT" : 1667,
++    "FramebufferTexture2DDownsampleIMG" : 1668,
++    "FramebufferTextureLayerDownsampleIMG" : 1669,
  }
  
  functions = [

+ 10 - 10
package/mesa3d/0011-GL_OVR_multiview-entry-points.patch → package/mesa3d/0009-GL_OVR_multiview-entry-points.patch

@@ -1,7 +1,7 @@
-From cbc7a7501ea4ceffd55ca389deb55d12ff9ceb3f Mon Sep 17 00:00:00 2001
+From c6e612d89356cd0df802ebd849108d7124c80427 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Mon, 11 Jul 2016 12:45:30 +0100
-Subject: [PATCH 11/67] GL_OVR_multiview entry points
+Subject: [PATCH 09/58] GL_OVR_multiview entry points
 
 ---
  src/mapi/glapi/gen/gl_API.xml     | 17 +++++++++++++++++
@@ -9,10 +9,10 @@ Subject: [PATCH 11/67] GL_OVR_multiview entry points
  2 files changed, 18 insertions(+)
 
 diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
-index cf5a0f0a0c0..4e35de0f4ea 100644
+index cc5d9488d84..f6657e6ffeb 100644
 --- a/src/mapi/glapi/gen/gl_API.xml
 +++ b/src/mapi/glapi/gen/gl_API.xml
-@@ -13125,6 +13125,23 @@
+@@ -12664,6 +12664,23 @@
      </function>
  </category>
  
@@ -37,14 +37,14 @@ index cf5a0f0a0c0..4e35de0f4ea 100644
  
  <!-- 520. GL_EXT_shader_framebuffer_fetch -->
 diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
-index c723cb3fab8..73625c7fe41 100644
+index e363994a298..f97fedabb38 100644
 --- a/src/mapi/glapi/gen/static_data.py
 +++ b/src/mapi/glapi/gen/static_data.py
-@@ -1702,6 +1702,7 @@ offsets = {
-     "GetFramebufferPixelLocalStorageSizeEXT" : 1666,
-     "FramebufferTexture2DDownsampleIMG" : 1667,
-     "FramebufferTextureLayerDownsampleIMG" : 1668,
-+    "FramebufferTextureMultiviewOVR" : 1669,
+@@ -1703,6 +1703,7 @@ offsets = {
+     "GetFramebufferPixelLocalStorageSizeEXT" : 1667,
+     "FramebufferTexture2DDownsampleIMG" : 1668,
+     "FramebufferTextureLayerDownsampleIMG" : 1669,
++    "FramebufferTextureMultiviewOVR" : 1670,
  }
  
  functions = [

+ 10 - 10
package/mesa3d/0012-Add-OVR_multiview_multisampled_render_to_texture.patch → package/mesa3d/0010-Add-OVR_multiview_multisampled_render_to_texture.patch

@@ -1,7 +1,7 @@
-From 91ea37486db99fd403654ebff2a0a8401f7cd600 Mon Sep 17 00:00:00 2001
+From caadab7fb5f2c31b767dd58321b135b78179ed7f Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Mon, 11 Jul 2016 13:29:51 +0100
-Subject: [PATCH 12/67] Add OVR_multiview_multisampled_render_to_texture
+Subject: [PATCH 10/58] Add OVR_multiview_multisampled_render_to_texture
 
 ---
  ...ltiview_multisampled_render_to_texture.xml | 21 +++++++++++++++++++
@@ -38,10 +38,10 @@ index 00000000000..86bebc728e9
 +
 +</OpenGLAPI>
 diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
-index b3432820ba6..fe8f27e1e6f 100644
+index 94696d535b9..b59e85d3281 100644
 --- a/src/mapi/glapi/gen/es_EXT.xml
 +++ b/src/mapi/glapi/gen/es_EXT.xml
-@@ -1459,6 +1459,9 @@
+@@ -1485,6 +1485,9 @@
  <!-- 240. EXT_sparse_texture -->
  <xi:include href="EXT_sparse_texture.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
  
@@ -52,14 +52,14 @@ index b3432820ba6..fe8f27e1e6f 100644
  <xi:include href="EXT_shader_pixel_local_storage2.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
  
 diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
-index 73625c7fe41..dc6bdc9dcce 100644
+index f97fedabb38..fda952a1bdb 100644
 --- a/src/mapi/glapi/gen/static_data.py
 +++ b/src/mapi/glapi/gen/static_data.py
-@@ -1703,6 +1703,7 @@ offsets = {
-     "FramebufferTexture2DDownsampleIMG" : 1667,
-     "FramebufferTextureLayerDownsampleIMG" : 1668,
-     "FramebufferTextureMultiviewOVR" : 1669,
-+    "FramebufferTextureMultisampleMultiviewOVR" : 1670,
+@@ -1704,6 +1704,7 @@ offsets = {
+     "FramebufferTexture2DDownsampleIMG" : 1668,
+     "FramebufferTextureLayerDownsampleIMG" : 1669,
+     "FramebufferTextureMultiviewOVR" : 1670,
++    "FramebufferTextureMultisampleMultiviewOVR" : 1671,
  }
  
  functions = [

+ 2 - 2
package/mesa3d/0013-wayland-drm-install-wayland-drm.xml-to-the-configure.patch → package/mesa3d/0011-wayland-drm-install-wayland-drm.xml-to-the-configure.patch

@@ -1,7 +1,7 @@
-From b38c4118c7a3a060ef1c8b8477200f5a73305397 Mon Sep 17 00:00:00 2001
+From e02408aadb8f9a73c8af428548e1726015669a46 Mon Sep 17 00:00:00 2001
 From: Frank Binns <frank.binns@imgtec.com>
 Date: Thu, 18 Aug 2016 15:52:28 +0100
-Subject: [PATCH 13/67] wayland-drm: install wayland-drm.xml to the configured
+Subject: [PATCH 11/58] wayland-drm: install wayland-drm.xml to the configured
  pkgdatadir
 
 Add a pkg-config file as well so that it can be located without hardcoding the

+ 4 - 4
package/mesa3d/0014-Enable-buffer-sharing-in-the-kms_swrast-driver.patch → package/mesa3d/0012-Enable-buffer-sharing-in-the-kms_swrast-driver.patch

@@ -1,7 +1,7 @@
-From b80c78b05ebb661e7f088d0a369b0f0d2990afca Mon Sep 17 00:00:00 2001
+From 7c77b96ecd34995fb84d009bad0ecb0b144605d4 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Wed, 26 Oct 2016 16:24:28 +0100
-Subject: [PATCH 14/67] Enable buffer sharing in the kms_swrast driver
+Subject: [PATCH 12/58] Enable buffer sharing in the kms_swrast driver
 
 Enable buffer sharing, so that a DRI driver can be loaded by a
 Wayland client when kms_swrast is being used by the compositor.
@@ -10,10 +10,10 @@ Wayland client when kms_swrast is being used by the compositor.
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c
-index ebc18a73c86..09f4b02e758 100644
+index cfc14dabf28..58f25eadbcc 100644
 --- a/src/gallium/frontends/dri/dri2.c
 +++ b/src/gallium/frontends/dri/dri2.c
-@@ -2400,7 +2400,7 @@ dri_kms_init_screen(__DRIscreen * sPriv)
+@@ -2538,7 +2538,7 @@ dri_kms_init_screen(__DRIscreen * sPriv)
     if (!configs)
        goto destroy_screen;
  

+ 5 - 5
package/mesa3d/0015-egl-wayland-add-support-for-RGB565-back-buffers.patch → package/mesa3d/0013-egl-wayland-add-support-for-RGB565-back-buffers.patch

@@ -1,17 +1,17 @@
-From 55a15a019dd792477e39f6225f2b4e50a1359b66 Mon Sep 17 00:00:00 2001
+From 5b0fbff52f731f510afb48245f9880681aed7b6d Mon Sep 17 00:00:00 2001
 From: James Glanville <James.Glanville@imgtec.com>
 Date: Tue, 28 Feb 2017 16:08:47 +0000
-Subject: [PATCH 15/67] egl/wayland: add support for RGB565 back buffers
+Subject: [PATCH 13/58] egl/wayland: add support for RGB565 back buffers
 
 ---
  src/egl/drivers/dri2/platform_wayland.c | 13 +++++++++++--
  1 file changed, 11 insertions(+), 2 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
-index cfff0ade90e..c18edc0de4e 100644
+index 5b886f8d62d..6eca68efe41 100644
 --- a/src/egl/drivers/dri2/platform_wayland.c
 +++ b/src/egl/drivers/dri2/platform_wayland.c
-@@ -633,18 +633,27 @@ back_bo_to_dri_buffer(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
+@@ -1096,18 +1096,27 @@ back_bo_to_dri_buffer(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
     struct dri2_egl_display *dri2_dpy =
        dri2_egl_display(dri2_surf->base.Resource.Display);
     __DRIimage *image;
@@ -40,7 +40,7 @@ index cfff0ade90e..c18edc0de4e 100644
 +   }
  }
  
- static int
+ /* Value chosen empirically as a compromise between avoiding frequent
 -- 
 2.25.1
 

+ 6 - 6
package/mesa3d/0017-egl-automatically-call-eglReleaseThread-on-thread-te.patch → package/mesa3d/0014-egl-automatically-call-eglReleaseThread-on-thread-te.patch

@@ -1,7 +1,7 @@
-From d98cd46b5841ecb785a801a977a1b341d98d08c4 Mon Sep 17 00:00:00 2001
+From eb4fecd3e6ef59580a32801e8689f3071d0a9f00 Mon Sep 17 00:00:00 2001
 From: Iosif Antochi <iosif.antochi@imgtec.com>
 Date: Wed, 14 Jun 2017 14:49:55 +0100
-Subject: [PATCH 17/67] egl: automatically call eglReleaseThread on thread
+Subject: [PATCH 14/58] egl: automatically call eglReleaseThread on thread
  termination
 
 EGL thread cleanup conformance tests could run out of memory as the contexts
@@ -22,10 +22,10 @@ dEQP-EGL.functional.robustness.create_context.query_robust_access
  1 file changed, 26 insertions(+), 1 deletion(-)
 
 diff --git a/src/egl/main/eglcurrent.c b/src/egl/main/eglcurrent.c
-index 11277d3e4c0..c87eac0d007 100644
+index 3a82a2d0d77..6342e00ee45 100644
 --- a/src/egl/main/eglcurrent.c
 +++ b/src/egl/main/eglcurrent.c
-@@ -44,6 +44,7 @@ static mtx_t _egl_TSDMutex = _MTX_INITIALIZER_NP;
+@@ -45,6 +45,7 @@ static mtx_t _egl_TSDMutex = _MTX_INITIALIZER_NP;
  static EGLBoolean _egl_TSDInitialized;
  static tss_t _egl_TSD;
  static void _eglDestroyThreadInfo(_EGLThreadInfo *t);
@@ -33,7 +33,7 @@ index 11277d3e4c0..c87eac0d007 100644
  
  #ifdef USE_ELF_TLS
  static __THREAD_INITIAL_EXEC const _EGLThreadInfo *_egl_TLS;
-@@ -86,7 +87,7 @@ static inline EGLBoolean _eglInitTSD()
+@@ -87,7 +88,7 @@ static inline EGLBoolean _eglInitTSD()
  
        /* check again after acquiring lock */
        if (!_egl_TSDInitialized) {
@@ -42,7 +42,7 @@ index 11277d3e4c0..c87eac0d007 100644
              mtx_unlock(&_egl_TSDMutex);
              return EGL_FALSE;
           }
-@@ -135,6 +136,30 @@ _eglDestroyThreadInfo(_EGLThreadInfo *t)
+@@ -142,6 +143,30 @@ _eglDestroyThreadInfo(_EGLThreadInfo *t)
  }
  
  

+ 4 - 4
package/mesa3d/0020-egl-wayland-post-maximum-damage-when-blitting.patch → package/mesa3d/0015-egl-wayland-post-maximum-damage-when-blitting.patch

@@ -1,7 +1,7 @@
-From 54d08798efca8f8929744a238e2b8b2851083317 Mon Sep 17 00:00:00 2001
+From 2aa69df0cf419a376581cb48f8cf43cc92d98102 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Wed, 8 Nov 2017 15:15:20 +0000
-Subject: [PATCH 20/67] egl/wayland: post maximum damage when blitting
+Subject: [PATCH 15/58] egl/wayland: post maximum damage when blitting
 
 When blitting, as part of the "is_different_gpu" case when swapping
 buffers, the blit is done using the full surface dimensions, ignoring
@@ -15,10 +15,10 @@ when the number of damage rectangles is 1.
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
-index c18edc0de4e..c2e428769fe 100644
+index 6eca68efe41..17133ca9cd4 100644
 --- a/src/egl/drivers/dri2/platform_wayland.c
 +++ b/src/egl/drivers/dri2/platform_wayland.c
-@@ -1112,7 +1112,8 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
+@@ -1565,7 +1565,8 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
     /* If the compositor doesn't support damage_buffer, we deliberately
      * ignore the damage region and post maximum damage, due to
      * https://bugs.freedesktop.org/78190 */

+ 0 - 49
package/mesa3d/0016-egl-dri3-fix-segfault-in-eglCopyBuffers.patch

@@ -1,49 +0,0 @@
-From 03f4f18f9edb4090c6aeca16e6f4de602aea68bf Mon Sep 17 00:00:00 2001
-From: Brendan King <Brendan.King@imgtec.com>
-Date: Thu, 13 Apr 2017 10:12:40 +0100
-Subject: [PATCH 16/67] egl/dri3: fix segfault in eglCopyBuffers
-
-The loader_dri3_copy_drawable function expected the drawable to have
-a fake front buffer, resulting in a segfault if there wasn't one,
-when dri3_fence_reset was called.
-If there is no fake front buffer, but there are back buffers, use the
-current back buffer.
----
- src/loader/loader_dri3_helper.c | 15 ++++++++++++---
- 1 file changed, 12 insertions(+), 3 deletions(-)
-
-diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
-index 6e825f9a898..ff6d1ffc660 100644
---- a/src/loader/loader_dri3_helper.c
-+++ b/src/loader/loader_dri3_helper.c
-@@ -863,15 +863,24 @@ loader_dri3_copy_drawable(struct loader_dri3_drawable *draw,
-                           xcb_drawable_t dest,
-                           xcb_drawable_t src)
- {
-+   struct loader_dri3_buffer *buffer;
-+
-+   if (draw->have_fake_front)
-+      buffer = dri3_fake_front_buffer(draw);
-+   else if (draw->have_back)
-+      buffer = dri3_back_buffer(draw);
-+   else
-+      return;
-+
-    loader_dri3_flush(draw, __DRI2_FLUSH_DRAWABLE, __DRI2_THROTTLE_COPYSUBBUFFER);
- 
--   dri3_fence_reset(draw->conn, dri3_fake_front_buffer(draw));
-+   dri3_fence_reset(draw->conn, buffer);
-    dri3_copy_area(draw->conn,
-                   src, dest,
-                   dri3_drawable_gc(draw),
-                   0, 0, 0, 0, draw->width, draw->height);
--   dri3_fence_trigger(draw->conn, dri3_fake_front_buffer(draw));
--   dri3_fence_await(draw->conn, draw, dri3_fake_front_buffer(draw));
-+   dri3_fence_trigger(draw->conn, buffer);
-+   dri3_fence_await(draw->conn, draw, buffer);
- }
- 
- void
--- 
-2.25.1
-

+ 5 - 5
package/mesa3d/0021-egl-wayland-flush-the-drawable-before-blitting.patch → package/mesa3d/0016-egl-wayland-flush-the-drawable-before-blitting.patch

@@ -1,7 +1,7 @@
-From a6aa5c866c25f7f334afbbcc3835467d50eb8965 Mon Sep 17 00:00:00 2001
+From eddfa511f99790d87c66bdf848052ad065b83650 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Wed, 8 Nov 2017 15:26:25 +0000
-Subject: [PATCH 21/67] egl/wayland: flush the drawable before blitting
+Subject: [PATCH 16/58] egl/wayland: flush the drawable before blitting
 
 Flush the drawable before blitting in the "is_different_gpu" case when
 swapping buffers, and pass the flush flag to the blitImage call. The
@@ -17,10 +17,10 @@ invalid.
  1 file changed, 3 insertions(+), 2 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
-index c2e428769fe..811d28bd669 100644
+index 17133ca9cd4..a699f735583 100644
 --- a/src/egl/drivers/dri2/platform_wayland.c
 +++ b/src/egl/drivers/dri2/platform_wayland.c
-@@ -1117,6 +1117,8 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
+@@ -1570,6 +1570,8 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
        wl_surface_damage(dri2_surf->wl_surface_wrapper,
                          0, 0, INT32_MAX, INT32_MAX);
  
@@ -29,7 +29,7 @@ index c2e428769fe..811d28bd669 100644
     if (dri2_dpy->is_different_gpu) {
        _EGLContext *ctx = _eglGetCurrentContext();
        struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
-@@ -1126,10 +1128,9 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
+@@ -1579,10 +1581,9 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
                                   0, 0, dri2_surf->base.Width,
                                   dri2_surf->base.Height,
                                   0, 0, dri2_surf->base.Width,

+ 11 - 11
package/mesa3d/0023-dri-use-a-supported-API-in-driCreateNewContext.patch → package/mesa3d/0017-dri-use-a-supported-API-in-driCreateNewContext.patch

@@ -1,27 +1,27 @@
-From 1f4a1a21384b00e28b8a9dd2c29f9c261f201c6f Mon Sep 17 00:00:00 2001
+From ab34a212ab8980dd68c7022f31c3ddf70f9b2647 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Thu, 23 Nov 2017 15:50:21 +0000
-Subject: [PATCH 23/67] dri: use a supported API in driCreateNewContext
+Subject: [PATCH 17/58] dri: use a supported API in driCreateNewContext
 
 Don't assume the screen supports OpenGL when creating a new context,
 use an API that the screen supports.
 ---
- src/mesa/drivers/dri/common/dri_util.c | 14 +++++++++++++-
+ src/gallium/frontends/dri/dri_util.c | 14 +++++++++++++-
  1 file changed, 13 insertions(+), 1 deletion(-)
 
-diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
-index caed5fa6a68..6c45eb007fc 100644
---- a/src/mesa/drivers/dri/common/dri_util.c
-+++ b/src/mesa/drivers/dri/common/dri_util.c
-@@ -50,6 +50,7 @@
+diff --git a/src/gallium/frontends/dri/dri_util.c b/src/gallium/frontends/dri/dri_util.c
+index abc84a22ac6..e22a3eb8e6b 100644
+--- a/src/gallium/frontends/dri/dri_util.c
++++ b/src/gallium/frontends/dri/dri_util.c
+@@ -49,6 +49,7 @@
+ #include "main/version.h"
  #include "main/debug_output.h"
  #include "main/errors.h"
- #include "main/macros.h"
 +#include "util/bitscan.h"
  
  driOptionDescription __dri2ConfigOptions[] = {
        DRI_CONF_SECTION_DEBUG
-@@ -332,7 +333,11 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
+@@ -333,7 +334,11 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
  	mesa_api = API_OPENGLES;
  	break;
      case __DRI_API_GLES2:
@@ -33,7 +33,7 @@ index caed5fa6a68..6c45eb007fc 100644
  	mesa_api = API_OPENGLES2;
  	break;
      case __DRI_API_OPENGL_CORE:
-@@ -515,7 +520,14 @@ static __DRIcontext *
+@@ -512,7 +517,14 @@ static __DRIcontext *
  driCreateNewContext(__DRIscreen *screen, const __DRIconfig *config,
                      __DRIcontext *shared, void *data)
  {

+ 0 - 1636
package/mesa3d/0018-egl-add-Tizen-platform-support.patch

@@ -1,1636 +0,0 @@
-From a2fea4d0fb40d7bdfd2a3860132c37288f3d7864 Mon Sep 17 00:00:00 2001
-From: Frank Binns <frank.binns@imgtec.com>
-Date: Fri, 6 Jan 2017 16:35:00 +0000
-Subject: [PATCH 18/67] egl: add Tizen platform support
-
-Add a new "tizen" platform to support drm/gbm and Wayland on Tizen.
-The platform can be enabled by passing "-Dplatforms=tizen" to Meson.
----
- meson.build                           |  25 +-
- meson_options.txt                     |   2 +-
- src/egl/drivers/dri2/egl_dri2.c       | 182 ++++-
- src/egl/drivers/dri2/egl_dri2.h       |  59 +-
- src/egl/drivers/dri2/platform_tizen.c | 980 ++++++++++++++++++++++++++
- src/egl/main/eglapi.c                 |   7 +
- src/egl/main/egldisplay.c             |  32 +-
- src/egl/main/egldisplay.h             |   7 +
- src/egl/main/egllog.c                 |  27 +-
- src/egl/meson.build                   |   7 +-
- 10 files changed, 1313 insertions(+), 15 deletions(-)
- create mode 100644 src/egl/drivers/dri2/platform_tizen.c
-
-diff --git a/meson.build b/meson.build
-index 968b4f5f499..3d9d345dbf2 100644
---- a/meson.build
-+++ b/meson.build
-@@ -358,6 +358,11 @@ with_platform_x11 = _platforms.contains('x11')
- with_platform_wayland = _platforms.contains('wayland')
- with_platform_haiku = _platforms.contains('haiku')
- with_platform_windows = _platforms.contains('windows')
-+with_platform_tizen = _platforms.contains('tizen')
-+
-+if with_platform_tizen and _platforms.length() != 1
-+  error('tizen cannot be enabled at the same time as other platforms')
-+endif
- 
- with_glx = get_option('glx')
- if with_glx == 'auto'
-@@ -910,7 +915,7 @@ else
-   pre_args += '-DEGL_NO_X11'
-   gl_pkgconfig_c_flags += '-DEGL_NO_X11'
- endif
--if with_gbm and not with_platform_android
-+if with_gbm and not with_platform_android and not with_platform_tizen
-   pre_args += '-DHAVE_DRM_PLATFORM'
- endif
- 
-@@ -944,6 +949,15 @@ endif
- if with_platform_haiku
-   pre_args += '-DHAVE_HAIKU_PLATFORM'
- endif
-+if with_platform_tizen
-+  dep_dlog = dependency('dlog')
-+  dep_tizen = [
-+    dep_dlog,
-+    dependency('libtbm'),
-+    dependency('tpl-egl'),
-+  ]
-+  pre_args += '-DHAVE_TIZEN_PLATFORM'
-+endif
- 
- prog_python = import('python').find_installation('python3')
- has_mako = run_command(
-@@ -1568,7 +1582,8 @@ with_gallium_drisw_kms = false
- dep_libdrm = dependency(
-   'libdrm', version : '>=' + _drm_ver,
-   # GNU/Hurd includes egl_dri2, without drm.
--  required : (with_dri2 and host_machine.system() != 'gnu') or with_dri3
-+  required : (with_dri2 and host_machine.system() != 'gnu') or with_dri3 or
-+             with_platform_tizen
- )
- if dep_libdrm.found()
-   pre_args += '-DHAVE_LIBDRM'
-@@ -2187,8 +2202,10 @@ if with_egl
-   lines += 'EGL drivers:     ' + ' '.join(egl_drivers)
- endif
- if with_egl or with_any_vk
--  _platforms += 'surfaceless'
--  if with_gbm and not with_platform_android
-+  if not with_platform_tizen
-+    _platforms += 'surfaceless'
-+  endif
-+  if with_gbm and not with_platform_android and not with_platform_tizen
-     _platforms += 'drm'
-   endif
-   lines += 'EGL/Vulkan/VL platforms:   ' + ' '.join(_platforms)
-diff --git a/meson_options.txt b/meson_options.txt
-index dac791099a1..8230db93c70 100644
---- a/meson_options.txt
-+++ b/meson_options.txt
-@@ -23,7 +23,7 @@ option(
-   type : 'array',
-   value : ['auto'],
-   choices : [
--    'auto', 'x11', 'wayland', 'haiku', 'android', 'windows',
-+    'auto', 'x11', 'wayland', 'haiku', 'android', 'windows', 'tizen',
-   ],
-   description : 'window systems to support. If this is set to `auto`, all platforms applicable will be enabled.'
- )
-diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index dea5899b3a8..6d34395d65d 100644
---- a/src/egl/drivers/dri2/egl_dri2.c
-+++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -1179,6 +1179,11 @@ dri2_initialize(_EGLDisplay *disp)
-    case _EGL_PLATFORM_ANDROID:
-       ret = dri2_initialize_android(disp);
-       break;
-+#ifdef HAVE_TIZEN_PLATFORM
-+   case _EGL_PLATFORM_TIZEN:
-+      ret = dri2_initialize_tizen(disp);
-+      break;
-+#endif
-    default:
-       unreachable("Callers ensure we cannot get here.");
-       return EGL_FALSE;
-@@ -1253,6 +1258,12 @@ dri2_display_destroy(_EGLDisplay *disp)
-    case _EGL_PLATFORM_WAYLAND:
-       dri2_teardown_wayland(dri2_dpy);
-       break;
-+#ifdef HAVE_TIZEN_PLATFORM
-+   case _EGL_PLATFORM_TIZEN:
-+      if (dri2_dpy->tpl_dpy)
-+         tpl_object_unreference((tpl_object_t *) dri2_dpy->tpl_dpy);
-+      break;
-+#endif
-    default:
-       /* TODO: add teardown for other platforms */
-       break;
-@@ -2293,8 +2304,96 @@ dri2_create_image_khr_renderbuffer(_EGLDisplay *disp, _EGLContext *ctx,
-    return dri2_create_image_from_dri(disp, dri_image);
- }
- 
--#ifdef HAVE_WAYLAND_PLATFORM
-+#ifdef HAVE_TIZEN_PLATFORM
-+int
-+dri2_fourcc_from_tbm_format(tbm_format format)
-+{
-+   switch (format) {
-+   case TBM_FORMAT_ARGB8888:
-+      return DRM_FORMAT_ARGB8888;
-+   case TBM_FORMAT_XRGB8888:
-+      return DRM_FORMAT_XRGB8888;
-+   case TBM_FORMAT_RGB565:
-+      return DRM_FORMAT_RGB565;
-+   default:
-+      _eglLog(_EGL_DEBUG, "%s: unsupported tbm format %#x", __func__, format);
-+      return 0;
-+   }
-+}
- 
-+static _EGLImage *
-+dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
-+                                          EGLClientBuffer _buffer,
-+                                          const EGLint *attr_list)
-+{
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-+   __DRIimage *dri_image;
-+   _EGLImageAttribs attrs;
-+   tbm_surface_h tbm_surf;
-+   tbm_bo tbm_buf;
-+   tbm_surface_info_s info;
-+   int fourcc, fd, pitch, offset;
-+
-+   tbm_surf = tpl_display_get_buffer_from_native_pixmap(dri2_dpy->tpl_dpy,
-+                                                        (tpl_handle_t) _buffer);
-+   if (!tbm_surf) {
-+      _eglError(EGL_BAD_PARAMETER, "tpl_display_get_buffer_from_native_pixmap");
-+      return NULL;
-+   }
-+
-+   if (!_eglParseImageAttribList(&attrs, disp, attr_list)) {
-+      _eglError(EGL_BAD_PARAMETER, "dri2_create_image_wayland_wl_buffer_tizen");
-+      return NULL;
-+   }
-+
-+   if (tbm_surface_get_info(tbm_surf, &info)) {
-+      _eglError(EGL_BAD_PARAMETER, "tbm_surface_get_info");
-+      return NULL;
-+   }
-+
-+   if (info.num_planes > 1) {
-+      _eglError(EGL_BAD_PARAMETER,
-+                "dri2_create_image_wayland_wl_buffer_tizen (multi-plane format)");
-+      return NULL;
-+   }
-+
-+   if (attrs.PlaneWL < 0 || attrs.PlaneWL >= info.num_planes) {
-+      _eglError(EGL_BAD_PARAMETER,
-+                "dri2_create_image_wayland_wl_buffer_tizen (plane out of bounds)");
-+      return NULL;
-+   }
-+
-+   tbm_buf = tbm_surface_internal_get_bo(tbm_surf, attrs.PlaneWL);
-+   if (!tbm_buf) {
-+      _eglError(EGL_BAD_PARAMETER, "tbm_surface_internal_get_bo");
-+      return NULL;
-+   }
-+
-+   fourcc = dri2_fourcc_from_tbm_format(info.format);
-+   pitch = info.planes[attrs.PlaneWL].stride;
-+   offset = info.planes[attrs.PlaneWL].offset;
-+   fd = tbm_bo_export_fd(tbm_buf);
-+
-+   dri_image = dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
-+                                                   info.width,
-+                                                   info.height,
-+                                                   fourcc,
-+                                                   &fd,
-+                                                   1,
-+                                                   &pitch,
-+                                                   &offset,
-+                                                   tbm_surf);
-+   close(fd);
-+   if (dri_image == NULL) {
-+      _eglError(EGL_BAD_PARAMETER, "createImageFromFds");
-+      return NULL;
-+   }
-+
-+   return dri2_create_image_from_dri(disp, dri_image);
-+}
-+#endif
-+
-+#ifdef HAVE_WAYLAND_PLATFORM
- /* This structure describes how a wl_buffer maps to one or more
-  * __DRIimages.  A wl_drm_buffer stores the wl_drm format code and the
-  * offsets and strides of the planes in the buffer.  This table maps a
-@@ -3193,6 +3292,10 @@ dri2_create_image_khr(_EGLDisplay *disp, _EGLContext *ctx, EGLenum target,
- #ifdef HAVE_WAYLAND_PLATFORM
-    case EGL_WAYLAND_BUFFER_WL:
-       return dri2_create_image_wayland_wl_buffer(disp, ctx, buffer, attr_list);
-+#endif
-+#ifdef HAVE_TIZEN_PLATFORM
-+   case EGL_WAYLAND_BUFFER_WL:
-+      return dri2_create_image_wayland_wl_buffer_tizen(disp, ctx, buffer, attr_list);
- #endif
-    case EGL_CL_IMAGE_IMG:
-       return dri2_create_image_img_buffer(disp, ctx, target, buffer, attr_list);
-@@ -3214,6 +3317,78 @@ dri2_destroy_image_khr(_EGLDisplay *disp, _EGLImage *image)
-    return EGL_TRUE;
- }
- 
-+#ifdef HAVE_TIZEN_PLATFORM
-+
-+static EGLint get_texture_format_from_gbm_format(tbm_format format)
-+{
-+   switch (format) {
-+   case TBM_FORMAT_ARGB8888:
-+      return EGL_TEXTURE_RGBA;
-+   default:
-+      _eglLog(_EGL_DEBUG, "%s: unsupported tbm format %#x", __func__, format);
-+      return 0;
-+   }
-+}
-+
-+static EGLBoolean
-+dri2_bind_wayland_display_wl_tizen(_EGLDisplay *disp, struct wl_display *wl_dpy)
-+{
-+   (void) disp;
-+   (void) wl_dpy;
-+
-+   return EGL_TRUE;
-+}
-+
-+static EGLBoolean
-+dri2_unbind_wayland_display_wl_tizen(_EGLDisplay *disp,
-+                                     struct wl_display *wl_dpy)
-+{
-+   (void) disp;
-+   (void) wl_dpy;
-+
-+   return EGL_TRUE;
-+}
-+
-+static EGLBoolean
-+dri2_query_wayland_buffer_wl_tizen(_EGLDisplay *disp,
-+                                   struct wl_resource *buffer_resource,
-+                                   EGLint attribute, EGLint *value)
-+{
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-+   tpl_handle_t pixmap = (tpl_handle_t) buffer_resource;
-+   tbm_surface_h tbm_surf;
-+   tbm_format format;
-+   EGLint tex_format;
-+
-+   tbm_surf = tpl_display_get_buffer_from_native_pixmap(dri2_dpy->tpl_dpy,
-+                                                        pixmap);
-+   if (!tbm_surf)
-+      return EGL_FALSE;
-+
-+   switch (attribute) {
-+   case EGL_TEXTURE_FORMAT:
-+      format = tbm_surface_get_format(tbm_surf);
-+      tex_format = get_texture_format_from_gbm_format(format);
-+      if (!tex_format)
-+         return EGL_FALSE;
-+
-+      *value = tex_format;
-+      break;
-+   case EGL_WIDTH:
-+      *value = tbm_surface_get_width(tbm_surf);
-+      break;
-+   case EGL_HEIGHT:
-+      *value = tbm_surface_get_height(tbm_surf);
-+      break;
-+   default:
-+      return EGL_FALSE;
-+   }
-+
-+   return EGL_TRUE;
-+}
-+
-+#endif
-+
- #ifdef HAVE_WAYLAND_PLATFORM
- 
- static void
-@@ -3755,6 +3930,11 @@ const _EGLDriver _eglDriver = {
-    .BindWaylandDisplayWL = dri2_bind_wayland_display_wl,
-    .UnbindWaylandDisplayWL = dri2_unbind_wayland_display_wl,
-    .QueryWaylandBufferWL = dri2_query_wayland_buffer_wl,
-+#endif
-+#ifdef HAVE_TIZEN_PLATFORM
-+   .BindWaylandDisplayWL = dri2_bind_wayland_display_wl_tizen,
-+   .UnbindWaylandDisplayWL = dri2_unbind_wayland_display_wl_tizen,
-+   .QueryWaylandBufferWL = dri2_query_wayland_buffer_wl_tizen,
- #endif
-    .GetSyncValuesCHROMIUM = dri2_get_sync_values_chromium,
-    .CreateSyncKHR = dri2_create_sync,
-diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
-index 6a7eedea112..a8bfe45b1f5 100644
---- a/src/egl/drivers/dri2/egl_dri2.h
-+++ b/src/egl/drivers/dri2/egl_dri2.h
-@@ -62,9 +62,9 @@ struct zwp_linux_dmabuf_v1;
- #include <gbm_driint.h>
- #endif
- 
--#ifdef HAVE_ANDROID_PLATFORM
- #define LOG_TAG "EGL-DRI2"
- 
-+#ifdef HAVE_ANDROID_PLATFORM
- #include <hardware/gralloc.h>
- 
- #if ANDROID_API_LEVEL >= 26
-@@ -75,6 +75,12 @@ struct zwp_linux_dmabuf_v1;
- 
- #endif /* HAVE_ANDROID_PLATFORM */
- 
-+#ifdef HAVE_TIZEN_PLATFORM
-+#include <pthread.h>
-+#include <tpl.h>
-+#include <tbm_surface_internal.h>
-+#endif
-+
- #include "eglconfig.h"
- #include "eglcontext.h"
- #include "egldevice.h"
-@@ -259,6 +265,10 @@ struct dri2_egl_display
- 
-    bool                      is_render_node;
-    bool                      is_different_gpu;
-+
-+#ifdef HAVE_TIZEN_PLATFORM
-+   tpl_display_t            *tpl_dpy;
-+#endif
- };
- 
- struct dri2_egl_context
-@@ -276,6 +286,18 @@ enum wayland_buffer_type {
- };
- #endif
- 
-+#define DRI2_SURFACE_NUM_COLOR_BUFFERS 4
-+
-+#ifdef HAVE_TIZEN_PLATFORM
-+struct tpl_swap_queue_elem
-+{
-+   tbm_surface_h       tbm_surf;
-+   EGLint             *rects;
-+   EGLint              n_rects_max;
-+   EGLint              n_rects;
-+};
-+#endif
-+
- struct dri2_egl_surface
- {
-    _EGLSurface          base;
-@@ -308,15 +330,33 @@ struct dri2_egl_surface
-    struct gbm_dri_surface *gbm_surf;
- #endif
- 
-+#ifdef HAVE_TIZEN_PLATFORM
-+   tpl_surface_t         *tpl_surf;
-+   bool                   reset;
-+   /*
-+    * Protects swap_queue_idx_head, swap_queue_idx_tail and
-+    * color_buffers.locked.
-+    */
-+   pthread_mutex_t        mutex;
-+   pthread_cond_t         swap_queue_cond;
-+   struct tpl_swap_queue_elem swap_queue[DRI2_SURFACE_NUM_COLOR_BUFFERS];
-+   int                    swap_queue_idx_head;
-+   int                    swap_queue_idx_tail;
-+   pthread_t              swap_queue_processor;
-+#endif
-+
-    /* EGL-owned buffers */
-    __DRIbuffer           *local_buffers[__DRI_BUFFER_COUNT];
- 
--#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM)
-+#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM) || \
-+    defined(HAVE_TIZEN_PLATFORM)
-    struct {
-+#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_TIZEN_PLATFORM)
-+      __DRIimage         *dri_image;
-+#endif
- #ifdef HAVE_WAYLAND_PLATFORM
-       struct wl_buffer   *wl_buffer;
-       bool                wl_release;
--      __DRIimage         *dri_image;
-       /* for is_different_gpu case. NULL else */
-       __DRIimage         *linear_copy;
-       /* for swrast */
-@@ -325,6 +365,9 @@ struct dri2_egl_surface
- #endif
- #ifdef HAVE_DRM_PLATFORM
-       struct gbm_bo       *bo;
-+#endif
-+#ifdef HAVE_TIZEN_PLATFORM
-+      tbm_surface_h       tbm_surf;
- #endif
-       bool                locked;
-       int                 age;
-@@ -525,6 +568,11 @@ dri2_initialize_android(_EGLDisplay *disp)
- EGLBoolean
- dri2_initialize_surfaceless(_EGLDisplay *disp);
- 
-+#ifdef HAVE_TIZEN_PLATFORM
-+EGLBoolean
-+dri2_initialize_tizen(_EGLDisplay *disp);
-+#endif
-+
- EGLBoolean
- dri2_initialize_device(_EGLDisplay *disp);
- static inline void
-@@ -559,6 +607,11 @@ dri2_set_WL_bind_wayland_display(_EGLDisplay *disp)
- #endif
- }
- 
-+#ifdef HAVE_TIZEN_PLATFORM
-+int
-+dri2_fourcc_from_tbm_format(tbm_format format);
-+#endif
-+
- void
- dri2_display_destroy(_EGLDisplay *disp);
- 
-diff --git a/src/egl/drivers/dri2/platform_tizen.c b/src/egl/drivers/dri2/platform_tizen.c
-new file mode 100644
-index 00000000000..a08bc8c07bf
---- /dev/null
-+++ b/src/egl/drivers/dri2/platform_tizen.c
-@@ -0,0 +1,980 @@
-+/*
-+ * Mesa 3-D graphics library
-+ *
-+ * Copyright (c) Imagination Technologies Ltd.
-+ * Copyright © 2011 Intel Corporation
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included
-+ * in all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#include <dlfcn.h>
-+#include <pthread.h>
-+#include <stdio.h>
-+#include <string.h>
-+#include <tpl.h>
-+#include <xf86drm.h>
-+
-+#include "egl_dri2.h"
-+#include "loader.h"
-+
-+#define TIZEN_DRM_RENDER_MINOR_START 128
-+#define TIZEN_DRM_RENDER_MINOR_MAX 191
-+
-+#define TIZEN_SWAP_N_RECTS_MIN 32
-+
-+struct rgba_shifts_and_sizes {
-+   int shifts[4];
-+   unsigned int sizes[4];
-+};
-+
-+static void *swap_queue_processor_worker(void *data)
-+{
-+   struct dri2_egl_surface *dri2_surf = data;
-+
-+   pthread_mutex_lock(&dri2_surf->mutex);
-+   while (1) {
-+      struct tpl_swap_queue_elem *queue_elem;
-+      int i;
-+      tpl_result_t res;
-+
-+      if (dri2_surf->swap_queue_idx_head == dri2_surf->swap_queue_idx_tail) {
-+         /* Wait for new swaps to be added to the queue */
-+         pthread_cond_wait(&dri2_surf->swap_queue_cond, &dri2_surf->mutex);
-+         continue;
-+      }
-+
-+      queue_elem = &dri2_surf->swap_queue[dri2_surf->swap_queue_idx_head];
-+      pthread_mutex_unlock(&dri2_surf->mutex);
-+
-+      res = tpl_surface_enqueue_buffer_with_damage(dri2_surf->tpl_surf,
-+                                                   queue_elem->tbm_surf,
-+                                                   queue_elem->n_rects,
-+                                                   queue_elem->rects);
-+      if (res != TPL_ERROR_NONE)
-+         return NULL;
-+
-+      pthread_mutex_lock(&dri2_surf->mutex);
-+      for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
-+         if (dri2_surf->color_buffers[i].tbm_surf == queue_elem->tbm_surf) {
-+            dri2_surf->color_buffers[i].locked = false;
-+            break;
-+         }
-+      }
-+
-+      dri2_surf->swap_queue_idx_head++;
-+      dri2_surf->swap_queue_idx_head %= ARRAY_SIZE(dri2_surf->swap_queue);
-+
-+      /*
-+       * Notify get_back_bo that a buffer has become available, reset_surface_cb
-+       * that it may be able to reset the surface or dri2_tizen_destroy_surface
-+       * that it may be able to proceed with surface destruction.
-+       */
-+      pthread_cond_signal(&dri2_surf->swap_queue_cond);
-+   }
-+   pthread_mutex_unlock(&dri2_surf->mutex);
-+
-+   return NULL;
-+}
-+
-+static __DRIimage *
-+create_image_from_native(struct dri2_egl_surface *dri2_surf,
-+                         tbm_surface_h tbm_surf,
-+                         int *width, int *height,
-+                         void *loaderPrivate)
-+{
-+   _EGLSurface *surf = &dri2_surf->base;
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(surf->Resource.Display);
-+   tbm_bo tbm_buf;
-+   tbm_surface_info_s info;
-+   int fd, fourcc, offset, pitch;
-+   __DRIimage *dri_image;
-+
-+   tbm_buf = tbm_surface_internal_get_bo(tbm_surf, 0);
-+   if (!tbm_buf) {
-+      _eglLog(_EGL_DEBUG, "%s: failed to get bo for tbm surface", __func__);
-+      return NULL;
-+   }
-+
-+   if (tbm_surface_get_info(tbm_surf, &info)) {
-+      _eglLog(_EGL_DEBUG, "%s: failed to get tbm surface info", __func__);
-+      return NULL;
-+   }
-+
-+   fd = tbm_bo_export_fd(tbm_buf);
-+   fourcc = dri2_fourcc_from_tbm_format(info.format);
-+   offset = info.planes[0].offset;
-+   pitch = info.planes[0].stride;
-+
-+   dri_image = dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
-+                                                   info.width,
-+                                                   info.height,
-+                                                   fourcc,
-+                                                   &fd,
-+                                                   1,
-+                                                   &pitch,
-+                                                   &offset,
-+                                                   loaderPrivate);
-+   close(fd);
-+
-+   if (!dri_image) {
-+      _eglLog(_EGL_DEBUG, "%s: failed to create dri image from tbm bo", __func__);
-+      return NULL;
-+   }
-+
-+   if (width)
-+      *width = info.width;
-+
-+   if (height)
-+      *height = info.height;
-+
-+   return dri_image;
-+}
-+
-+static int
-+get_back_bo(struct dri2_egl_surface *dri2_surf, bool allow_update)
-+{
-+   struct dri2_egl_display *dri2_dpy =
-+      dri2_egl_display(dri2_surf->base.Resource.Display);
-+   tbm_surface_h tbm_surf;
-+   tpl_bool_t tpl_surf_valid;
-+   int i;
-+
-+   if (dri2_surf->base.Type == EGL_PIXMAP_BIT) {
-+      _eglLog(_EGL_DEBUG, "%s: can't get back bo for pixmap surface", __func__);
-+      return -1;
-+   }
-+
-+   if (dri2_surf->back && !allow_update)
-+      return 0;
-+
-+   /*
-+    * If the tpl surface is no longer valid, e.g. it has been resized, then
-+    * we should get a new back buffer.
-+    */
-+   tpl_surf_valid = tpl_surface_validate(dri2_surf->tpl_surf);
-+   if (dri2_surf->back && tpl_surf_valid == TPL_TRUE)
-+      return 0;
-+
-+   tbm_surf = tpl_surface_dequeue_buffer(dri2_surf->tpl_surf);
-+   if (!tbm_surf) {
-+      _eglLog(_EGL_DEBUG, "%s: surface buffer dequeue failed", __func__);
-+      return -1;
-+   }
-+
-+   pthread_mutex_lock(&dri2_surf->mutex);
-+   /*
-+    * If the tpl surface is no longer valid, e.g. it has been resized, then the
-+    * call to tpl_surface should've resulted in a call to reset_surface_cb,
-+    * which sets the dri2_surf reset flag. In this case we need to reset the
-+    * color_buffer state.
-+    *
-+    * Note: we can't rely on the return value of tpl_surface_validate
-+    * since the surface may have become invalid between this call and
-+    * tpl_surface_dequeue_buffer.
-+    */
-+   if (dri2_surf->reset) {
-+      /* Wait for any outstanding swaps to complete */
-+      while (dri2_surf->swap_queue_idx_head != dri2_surf->swap_queue_idx_tail)
-+         pthread_cond_wait(&dri2_surf->swap_queue_cond, &dri2_surf->mutex);
-+
-+      /* Cancel the old back buffer */
-+      if (dri2_surf->back) {
-+         tbm_surface_internal_unref(dri2_surf->back->tbm_surf);
-+         dri2_surf->back->locked = false;
-+         dri2_surf->back = NULL;
-+      }
-+
-+      /* Reset the color buffers */
-+      for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
-+         assert(!dri2_surf->color_buffers[i].locked);
-+
-+         if (dri2_surf->color_buffers[i].dri_image) {
-+            dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].dri_image);
-+            dri2_surf->color_buffers[i].dri_image = NULL;
-+         }
-+
-+         dri2_surf->color_buffers[i].tbm_surf = NULL;
-+         dri2_surf->color_buffers[i].age = 0;
-+      }
-+
-+      dri2_surf->back = NULL;
-+      dri2_surf->current = NULL;
-+      dri2_surf->reset = false;
-+   }
-+
-+   assert(!dri2_surf->back);
-+
-+   for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
-+      if (dri2_surf->color_buffers[i].tbm_surf == tbm_surf) {
-+         dri2_surf->back = &dri2_surf->color_buffers[i];
-+         assert(!dri2_surf->back->locked);
-+         break;
-+      }
-+   }
-+
-+   while (!dri2_surf->back) {
-+      int age;
-+
-+      /*
-+       * Search for a free color buffer. Free the oldest buffer if one
-+       * cannot be found.
-+       */
-+      for (i = 0, age = -1; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
-+         if (dri2_surf->color_buffers[i].locked)
-+            continue;
-+         if (!dri2_surf->color_buffers[i].dri_image) {
-+            dri2_surf->back = &dri2_surf->color_buffers[i];
-+            break;
-+         }
-+
-+         if (dri2_surf->color_buffers[i].age > age) {
-+            dri2_surf->back = &dri2_surf->color_buffers[i];
-+            age = dri2_surf->color_buffers[i].age;
-+         }
-+      }
-+
-+      if (!dri2_surf->back) {
-+         /*
-+          * There aren't any available back buffers so wait for
-+          * swap_queue_processor_worker to make one available.
-+          */
-+         pthread_cond_wait(&dri2_surf->swap_queue_cond, &dri2_surf->mutex);
-+         continue;
-+      }
-+
-+      if (dri2_surf->back->dri_image)
-+         dri2_dpy->image->destroyImage(dri2_surf->back->dri_image);
-+
-+      dri2_surf->back->dri_image =
-+         create_image_from_native(dri2_surf, tbm_surf,
-+                                  &dri2_surf->base.Width,
-+                                  &dri2_surf->base.Height,
-+                                  dri2_surf);
-+      if (!dri2_surf->back->dri_image) {
-+         dri2_surf->back = NULL;
-+         pthread_mutex_unlock(&dri2_surf->mutex);
-+         return -1;
-+      }
-+   }
-+
-+   dri2_surf->back->tbm_surf = tbm_surf;
-+   dri2_surf->back->locked = true;
-+
-+   if (dri2_surf->base.SwapBehavior == EGL_BUFFER_PRESERVED &&
-+       dri2_surf->current) {
-+      _EGLContext *ctx = _eglGetCurrentContext();
-+      struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
-+
-+      if (dri2_ctx)
-+      {
-+         dri2_dpy->image->blitImage(dri2_ctx->dri_context,
-+                                    dri2_surf->back->dri_image,
-+                                    dri2_surf->current->dri_image,
-+                                    0, 0, dri2_surf->base.Width,
-+                                    dri2_surf->base.Height,
-+                                    0, 0, dri2_surf->base.Width,
-+                                    dri2_surf->base.Height,
-+                                    __BLIT_FLAG_FLUSH);
-+      }
-+   }
-+
-+   pthread_mutex_unlock(&dri2_surf->mutex);
-+
-+   return 0;
-+}
-+
-+static int
-+get_front_bo(struct dri2_egl_surface *dri2_surf)
-+{
-+   struct dri2_egl_display *dri2_dpy =
-+      dri2_egl_display(dri2_surf->base.Resource.Display);
-+
-+   if (dri2_surf->front)
-+      return 0;
-+
-+   if (dri2_surf->base.Type == EGL_PIXMAP_BIT) {
-+      tbm_surface_h tbm_surf;
-+
-+      tbm_surf = tpl_surface_dequeue_buffer(dri2_surf->tpl_surf);
-+      if (!tbm_surf)
-+         return -1;
-+
-+      dri2_surf->front = create_image_from_native(dri2_surf, tbm_surf,
-+                                                  &dri2_surf->base.Width,
-+                                                  &dri2_surf->base.Height,
-+                                                  dri2_surf);
-+   } else {
-+      dri2_surf->front = dri2_dpy->image->createImage(dri2_dpy->dri_screen,
-+                                                      dri2_surf->base.Width,
-+                                                      dri2_surf->base.Height,
-+                                                      dri2_surf->visual,
-+                                                      0,
-+                                                      dri2_surf);
-+   }
-+
-+   return dri2_surf->front ? 0 : -1;
-+}
-+
-+static _EGLSurface *
-+create_surface(_EGLDisplay *dpy, _EGLConfig *config, EGLint type,
-+               const EGLint *attrib_list)
-+{
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
-+   struct dri2_egl_config *dri2_config = dri2_egl_config(config);
-+   struct dri2_egl_surface *dri2_surf;
-+   const __DRIconfig *dri_config;
-+
-+   dri2_surf = calloc(1, sizeof(*dri2_surf));
-+   if (!dri2_surf) {
-+      _eglError(EGL_BAD_ALLOC, "DRI2: failed to create surface");
-+      return NULL;
-+   }
-+
-+   if (!dri2_init_surface(&dri2_surf->base, dpy, type, config, attrib_list,
-+                          false, NULL))
-+      goto err_free_surface;
-+
-+   dri_config = dri2_get_dri_config(dri2_config, type,
-+                                    dri2_surf->base.GLColorspace);
-+   if (!dri_config) {
-+      _eglError(EGL_BAD_MATCH, "Unsupported surfacetype/colorspace configuration");
-+      goto err_free_surface;
-+   }
-+
-+   dri2_surf->dri_drawable =
-+      dri2_dpy->image_driver->createNewDrawable(dri2_dpy->dri_screen,
-+                                                dri_config, dri2_surf);
-+   if (!dri2_surf->dri_drawable) {
-+      _eglError(EGL_BAD_ALLOC, "DRI2: failed to create drawable");
-+      goto err_free_surface;
-+   }
-+
-+   pthread_mutex_init(&dri2_surf->mutex, NULL);
-+   pthread_cond_init(&dri2_surf->swap_queue_cond, NULL);
-+
-+   return &dri2_surf->base;
-+
-+err_free_surface:
-+   free(dri2_surf);
-+   return NULL;
-+}
-+
-+static void
-+destroy_surface(_EGLSurface *surf)
-+{
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(surf->Resource.Display);
-+   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
-+
-+   pthread_cond_destroy(&dri2_surf->swap_queue_cond);
-+   pthread_mutex_destroy(&dri2_surf->mutex);
-+   dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable);
-+   free(dri2_surf);
-+}
-+
-+static void
-+reset_surface_cb(void *data)
-+{
-+   struct dri2_egl_surface *dri2_surf = data;
-+
-+   dri2_surf->reset = true;
-+}
-+
-+static _EGLSurface *
-+dri2_tizen_create_window_surface(_EGLDisplay *dpy, _EGLConfig *config,
-+                                 void *native_window, const EGLint *attrib_list)
-+{
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
-+   struct dri2_egl_surface *dri2_surf;
-+   _EGLSurface *surf;
-+   int width, height;
-+   tbm_format format;
-+   tpl_result_t res;
-+   int err;
-+
-+   surf = create_surface(dpy, config, EGL_WINDOW_BIT, attrib_list);
-+   if (!surf)
-+      return NULL;
-+
-+   res = tpl_display_get_native_window_info(dri2_dpy->tpl_dpy, native_window,
-+                                            &width, &height, &format,
-+                                            config->RedSize +
-+                                            config->GreenSize +
-+                                            config->BlueSize +
-+                                            config->AlphaSize,
-+                                            config->AlphaSize);
-+   if (res != TPL_ERROR_NONE) {
-+      _eglError(EGL_BAD_NATIVE_WINDOW, "DRI2: failed to get window info");
-+      goto err_destroy_surface;
-+   }
-+
-+   dri2_surf = dri2_egl_surface(surf);
-+   dri2_surf->base.Width = width;
-+   dri2_surf->base.Height = height;
-+
-+   dri2_surf->tpl_surf = tpl_surface_create(dri2_dpy->tpl_dpy, native_window,
-+                                            TPL_SURFACE_TYPE_WINDOW, format);
-+   if (!dri2_surf->tpl_surf) {
-+      _eglError(EGL_BAD_ALLOC, "DRI2: failed to create TPL window surface");
-+      goto err_destroy_surface;
-+   }
-+
-+   res = tpl_surface_set_reset_cb(dri2_surf->tpl_surf, dri2_surf,
-+                                  reset_surface_cb);
-+   if (res != TPL_ERROR_NONE) {
-+      _eglError(EGL_BAD_NATIVE_WINDOW,
-+                "DRI2: failed to register TPL window surface reset callback");
-+      goto err_tpl_surface_destroy;
-+   }
-+
-+   err = pthread_create(&dri2_surf->swap_queue_processor, NULL,
-+                        swap_queue_processor_worker, dri2_surf);
-+   if (err) {
-+      _eglError(EGL_BAD_ALLOC, "DRI2: failed to create TPL window thread");
-+      goto err_tpl_surface_destroy;
-+   }
-+
-+   return surf;
-+
-+err_tpl_surface_destroy:
-+   tpl_object_unreference((tpl_object_t *) dri2_surf->tpl_surf);
-+err_destroy_surface:
-+   destroy_surface(surf);
-+   return NULL;
-+}
-+
-+static _EGLSurface *
-+dri2_tizen_create_pixmap_surface(_EGLDisplay *dpy, _EGLConfig *config,
-+                                 void *native_pixmap, const EGLint *attrib_list)
-+{
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
-+   struct dri2_egl_surface *dri2_surf;
-+   _EGLSurface *surf;
-+   int width, height;
-+   tbm_format format;
-+   tpl_result_t res;
-+
-+   surf = create_surface(dpy, config, EGL_PIXMAP_BIT, attrib_list);
-+   if (!surf)
-+      return NULL;
-+
-+   res = tpl_display_get_native_pixmap_info(dri2_dpy->tpl_dpy, native_pixmap,
-+                                            &width, &height, &format);
-+   if (res != TPL_ERROR_NONE) {
-+      _eglError(EGL_BAD_NATIVE_PIXMAP, "DRI2: failed to get pixmap info");
-+      goto err_destroy_surface;
-+   }
-+
-+   dri2_surf = dri2_egl_surface(surf);
-+   dri2_surf->base.Width = width;
-+   dri2_surf->base.Height = height;
-+
-+   dri2_surf->tpl_surf = tpl_surface_create(dri2_dpy->tpl_dpy, native_pixmap,
-+                                            TPL_SURFACE_TYPE_PIXMAP, format);
-+   if (!dri2_surf->tpl_surf) {
-+      _eglError(EGL_BAD_ALLOC, "DRI2: failed to create TPL pixmap surface");
-+      goto err_destroy_surface;
-+   }
-+
-+   return surf;
-+
-+err_destroy_surface:
-+   destroy_surface(surf);
-+   return NULL;
-+}
-+
-+static _EGLSurface *
-+dri2_tizen_create_pbuffer_surface(_EGLDisplay *dpy, _EGLConfig *config,
-+                                  const EGLint *attrib_list)
-+{
-+   struct dri2_egl_surface *dri2_surf;
-+   _EGLSurface *surf;
-+
-+   surf = create_surface(dpy, config, EGL_PBUFFER_BIT, attrib_list);
-+   if (!surf)
-+      return NULL;
-+
-+   dri2_surf = dri2_egl_surface(surf);
-+
-+   if (config->RedSize == 5)
-+      dri2_surf->visual = __DRI_IMAGE_FORMAT_RGB565;
-+   else if (config->AlphaSize)
-+      dri2_surf->visual = __DRI_IMAGE_FORMAT_ARGB8888;
-+   else
-+      dri2_surf->visual = __DRI_IMAGE_FORMAT_XRGB8888;
-+
-+   return surf;
-+}
-+
-+static EGLBoolean
-+dri2_tizen_destroy_surface(_EGLDisplay *dpy, _EGLSurface *surf)
-+{
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
-+   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
-+   int i;
-+
-+   if (dri2_surf->swap_queue_processor) {
-+      /* Wait for any outstanding swaps to complete */
-+      pthread_mutex_lock(&dri2_surf->mutex);
-+      while (dri2_surf->swap_queue_idx_head != dri2_surf->swap_queue_idx_tail)
-+         pthread_cond_wait(&dri2_surf->swap_queue_cond, &dri2_surf->mutex);
-+      pthread_mutex_unlock(&dri2_surf->mutex);
-+
-+      pthread_cancel(dri2_surf->swap_queue_processor);
-+      pthread_join(dri2_surf->swap_queue_processor, NULL);
-+   }
-+
-+   for (i = 0; i < ARRAY_SIZE(dri2_surf->swap_queue); i++)
-+      free(dri2_surf->swap_queue[i].rects);
-+
-+   if (dri2_surf->front)
-+      dri2_dpy->image->destroyImage(dri2_surf->front);
-+
-+   if (dri2_surf->back) {
-+      tbm_surface_internal_unref(dri2_surf->back->tbm_surf);
-+      dri2_surf->back->locked = false;
-+   }
-+
-+   for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
-+      if (dri2_surf->color_buffers[i].dri_image)
-+         dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].dri_image);
-+      assert(!dri2_surf->color_buffers[i].locked);
-+   }
-+
-+   if (dri2_surf->tpl_surf)
-+      tpl_object_unreference((tpl_object_t *) dri2_surf->tpl_surf);
-+
-+   destroy_surface(surf);
-+
-+   return EGL_TRUE;
-+}
-+
-+static EGLBoolean
-+dri2_tizen_swap_interval(_EGLDisplay *dpy, _EGLSurface *surf, EGLint interval)
-+{
-+   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
-+   tpl_result_t res;
-+
-+   if (interval > surf->Config->MaxSwapInterval)
-+      interval = surf->Config->MaxSwapInterval;
-+   else if (interval < surf->Config->MinSwapInterval)
-+      interval = surf->Config->MinSwapInterval;
-+
-+   if (interval == surf->SwapInterval)
-+      return EGL_TRUE;
-+
-+   res = tpl_surface_set_post_interval(dri2_surf->tpl_surf, interval);
-+   if (res == TPL_ERROR_NONE) {
-+      surf->SwapInterval = interval;
-+      return EGL_TRUE;
-+   }
-+
-+   return EGL_FALSE;
-+}
-+
-+static EGLBoolean
-+dri2_tizen_swap_buffers_with_damage(_EGLDisplay *dpy, _EGLSurface *draw,
-+                                    const EGLint *rects, EGLint n_rects)
-+{
-+   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
-+   struct tpl_swap_queue_elem *queue_elem;
-+   int i;
-+
-+   if (dri2_surf->base.Type != EGL_WINDOW_BIT)
-+      return EGL_TRUE;
-+
-+   for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
-+      if (draw->SwapBehavior == EGL_BUFFER_PRESERVED)
-+         dri2_surf->color_buffers[i].age = 1;
-+      else if (dri2_surf->color_buffers[i].age > 0)
-+         dri2_surf->color_buffers[i].age++;
-+   }
-+
-+   /*
-+    * Make sure we have a back buffer in case we're swapping without ever
-+    * rendering.
-+    */
-+   if (get_back_bo(dri2_surf, false) < 0) {
-+      _eglError(EGL_BAD_ALLOC, "DRI2: failed to get back buffer");
-+      return EGL_FALSE;
-+   }
-+
-+   dri2_flush_drawable_for_swapbuffers(dpy, draw);
-+
-+   pthread_mutex_lock(&dri2_surf->mutex);
-+   queue_elem =
-+      &dri2_surf->swap_queue[dri2_surf->swap_queue_idx_tail];
-+
-+   queue_elem->tbm_surf = dri2_surf->back->tbm_surf;
-+
-+   /* Allocate space for damage rectangles in swap queue element if necessary */
-+   if (queue_elem->n_rects_max < n_rects) {
-+      free(queue_elem->rects);
-+
-+      if (!queue_elem->n_rects_max)
-+         queue_elem->n_rects_max = TIZEN_SWAP_N_RECTS_MIN;
-+
-+      while (queue_elem->n_rects_max <= n_rects)
-+         queue_elem->n_rects_max *= 2;
-+
-+      queue_elem->rects =
-+         malloc(sizeof(*queue_elem->rects) * queue_elem->n_rects_max);
-+      if (!queue_elem->rects) {
-+         _eglError(EGL_BAD_ALLOC,
-+                   "DRI2: failed to allocate space for damage rects");
-+         queue_elem->n_rects_max = 0;
-+         pthread_mutex_unlock(&dri2_surf->mutex);
-+         return EGL_FALSE;
-+      }
-+   }
-+
-+   /* Copy damage rectangles into swap queue element */
-+   STATIC_ASSERT(sizeof(*queue_elem->rects) == sizeof(*rects));
-+   memcpy(&queue_elem->rects[0], &rects[0], sizeof(*rects) * n_rects);
-+   queue_elem->n_rects = n_rects;
-+
-+   dri2_surf->swap_queue_idx_tail++;
-+   dri2_surf->swap_queue_idx_tail %= ARRAY_SIZE(dri2_surf->color_buffers);
-+
-+   /* Notify swap_queue_processor_worker that there's new work */
-+   pthread_cond_signal(&dri2_surf->swap_queue_cond);
-+   pthread_mutex_unlock(&dri2_surf->mutex);
-+
-+   dri2_surf->back->age = 1;
-+   dri2_surf->current = dri2_surf->back;
-+   dri2_surf->back = NULL;
-+
-+   return EGL_TRUE;
-+}
-+
-+static EGLBoolean
-+dri2_tizen_swap_buffers(_EGLDisplay *dpy, _EGLSurface *draw)
-+{
-+   return dri2_tizen_swap_buffers_with_damage(dpy, draw, NULL, 0);
-+}
-+
-+static EGLint
-+dri2_tizen_query_buffer_age(_EGLDisplay *dpy, _EGLSurface *surface)
-+{
-+   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surface);
-+
-+   if (get_back_bo(dri2_surf, false) < 0) {
-+      _eglError(EGL_BAD_ALLOC, "DRI2: failed to get back buffer");
-+      return -1;
-+   }
-+
-+   return dri2_surf->back->age;
-+}
-+
-+
-+static EGLBoolean
-+dri2_tizen_query_surface(_EGLDisplay *dpy, _EGLSurface *surf,
-+                         EGLint attribute, EGLint *value)
-+{
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
-+   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
-+
-+   switch (attribute) {
-+   case EGL_WIDTH:
-+   case EGL_HEIGHT:
-+      if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
-+         tpl_handle_t window;
-+         int width, height;
-+         tbm_format format;
-+         tpl_result_t res;
-+
-+         window = tpl_surface_get_native_handle(dri2_surf->tpl_surf);
-+
-+         res = tpl_display_get_native_window_info(dri2_dpy->tpl_dpy, window,
-+                                                  &width, &height, &format,
-+                                                  surf->Config->RedSize +
-+                                                  surf->Config->GreenSize +
-+                                                  surf->Config->BlueSize +
-+                                                  surf->Config->AlphaSize,
-+                                                  surf->Config->AlphaSize);
-+         if (res == TPL_ERROR_NONE) {
-+            surf->Width = width;
-+            surf->Height = height;
-+         }
-+      }
-+      break;
-+   default:
-+      break;
-+   }
-+
-+   return _eglQuerySurface(dpy, surf, attribute, value);
-+}
-+
-+
-+static struct dri2_egl_display_vtbl dri2_tizen_display_vtbl = {
-+   .create_window_surface = dri2_tizen_create_window_surface,
-+   .create_pixmap_surface = dri2_tizen_create_pixmap_surface,
-+   .create_pbuffer_surface = dri2_tizen_create_pbuffer_surface,
-+   .destroy_surface = dri2_tizen_destroy_surface,
-+   .create_image = dri2_create_image_khr,
-+   .swap_interval = dri2_tizen_swap_interval,
-+   .swap_buffers = dri2_tizen_swap_buffers,
-+   .swap_buffers_with_damage = dri2_tizen_swap_buffers_with_damage,
-+   .query_buffer_age = dri2_tizen_query_buffer_age,
-+   .query_surface = dri2_tizen_query_surface,
-+   .get_dri_drawable = dri2_surface_get_dri_drawable,
-+};
-+
-+static int
-+dri2_tizen_get_buffers(__DRIdrawable *driDrawable,
-+                       unsigned int format,
-+                       uint32_t *stamp,
-+                       void *loaderPrivate,
-+                       uint32_t buffer_mask,
-+                       struct __DRIimageList *buffers)
-+{
-+   struct dri2_egl_surface *dri2_surf = loaderPrivate;
-+
-+   buffers->image_mask = 0;
-+   buffers->front = NULL;
-+   buffers->back = NULL;
-+
-+   if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT)
-+      if (get_front_bo(dri2_surf) < 0)
-+         return 0;
-+
-+   if (buffer_mask & __DRI_IMAGE_BUFFER_BACK)
-+      if (get_back_bo(dri2_surf, true) < 0)
-+         return 0;
-+
-+   if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT) {
-+      buffers->front = dri2_surf->front;
-+      buffers->image_mask |= __DRI_IMAGE_BUFFER_FRONT;
-+   }
-+
-+   if (buffer_mask & __DRI_IMAGE_BUFFER_BACK) {
-+      buffers->back = dri2_surf->back->dri_image;
-+      buffers->image_mask |= __DRI_IMAGE_BUFFER_BACK;
-+   }
-+
-+   return 1;
-+}
-+
-+static void
-+dri2_tizen_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
-+{
-+}
-+
-+static const __DRIimageLoaderExtension tizen_image_loader_extension = {
-+   .base             = { __DRI_IMAGE_LOADER, 1 },
-+   .getBuffers       = dri2_tizen_get_buffers,
-+   .flushFrontBuffer = dri2_tizen_flush_front_buffer,
-+};
-+
-+static const __DRIextension *image_loader_extensions[] = {
-+   &tizen_image_loader_extension.base,
-+   &image_lookup_extension.base,
-+   NULL,
-+};
-+
-+static EGLBoolean
-+dri2_tizen_add_configs(_EGLDisplay *dpy)
-+{
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
-+   int count = 0;
-+
-+   for (unsigned i = 0; dri2_dpy->driver_configs[i]; i++) {
-+      static const struct rgba_shifts_and_sizes pbuffer_sasa[] = {
-+         {
-+            /* ARGB8888 */
-+            { 16, 8, 0, 24 },
-+            { 8, 8, 8, 8 },
-+         },
-+         {
-+            /* RGB888 */
-+            { 16, 8, 0, -1 },
-+            { 8, 8, 8, 0 },
-+         },
-+         {
-+            /* RGB565 */
-+            { 11, 5, 0, -1 },
-+            { 5, 6, 5, 0 },
-+         },
-+      };
-+      struct dri2_egl_config *dri2_cfg;
-+      int shifts[4];
-+      unsigned int sizes[4];
-+      unsigned int caveat = 0;
-+      int surface_type = 0;
-+      tpl_bool_t is_slow;
-+      EGLint attr_list[] = {
-+         EGL_NATIVE_VISUAL_ID, 0,
-+         EGL_CONFIG_CAVEAT, EGL_NONE,
-+         EGL_NONE,
-+      };
-+      tpl_result_t res;
-+
-+      dri2_get_shifts_and_sizes(dri2_dpy->core, dri2_dpy->driver_configs[i],
-+                                shifts, sizes);
-+
-+      dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
-+                                      __DRI_ATTRIB_BUFFER_SIZE, &depth);
-+
-+      dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
-+                                      __DRI_ATTRIB_CONFIG_CAVEAT, &caveat);
-+
-+      res = tpl_display_query_config(dri2_dpy->tpl_dpy, TPL_SURFACE_TYPE_WINDOW,
-+                                     sizes[0], sizes[1], sizes[2], sizes[3],
-+                                     depth, &attr_list[1], &is_slow);
-+      if (res != TPL_ERROR_NONE)
-+         continue;
-+      surface_type |= EGL_WINDOW_BIT;
-+
-+      if (is_slow)
-+         caveat |= __DRI_ATTRIB_SLOW_BIT;
-+
-+      res = tpl_display_query_config(dri2_dpy->tpl_dpy, TPL_SURFACE_TYPE_PIXMAP,
-+                                     sizes[0], sizes[1], sizes[2], sizes[3],
-+                                     depth, NULL, &is_slow);
-+      if (res == TPL_ERROR_NONE) {
-+         surface_type |= EGL_PIXMAP_BIT;
-+
-+         if (is_slow)
-+            caveat |= __DRI_ATTRIB_SLOW_BIT;
-+      }
-+
-+      for (unsigned j = 0; j < ARRAY_SIZE(pbuffer_sasa); j++) {
-+         const struct rgba_shifts_and_sizes *pbuffer_sas = &pbuffer_sasa[j];
-+
-+         if (shifts[0] == pbuffer_sas->shifts[0] &&
-+             shifts[1] == pbuffer_sas->shifts[1] &&
-+             shifts[2] == pbuffer_sas->shifts[2] &&
-+             shifts[3] == pbuffer_sas->shifts[3] &&
-+             sizes[0] == pbuffer_sas->sizes[0] &&
-+             sizes[1] == pbuffer_sas->sizes[1] &&
-+             sizes[2] == pbuffer_sas->sizes[2] &&
-+             sizes[3] == pbuffer_sas->sizes[3]) {
-+            surface_type |= EGL_PBUFFER_BIT;
-+            break;
-+         }
-+      }
-+
-+      if (dri2_dpy->image->base.version >= 9 && dri2_dpy->image->blitImage)
-+         surface_type |= EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
-+
-+      if (caveat & __DRI_ATTRIB_NON_CONFORMANT_CONFIG)
-+         attr_list[3] = EGL_NON_CONFORMANT_CONFIG;
-+      else if (caveat & __DRI_ATTRIB_SLOW_BIT)
-+         attr_list[3] = EGL_SLOW_CONFIG;
-+
-+      dri2_cfg = dri2_add_config(dpy, dri2_dpy->driver_configs[i], count + 1,
-+                                 surface_type, &attr_list[0], NULL, NULL);
-+      if (dri2_cfg)
-+         count++;
-+   }
-+
-+   return count != 0;
-+}
-+
-+EGLBoolean
-+dri2_initialize_tizen(_EGLDisplay *dpy)
-+{
-+   struct dri2_egl_display *dri2_dpy;
-+   int i;
-+
-+   dri2_dpy = calloc(1, sizeof(*dri2_dpy));
-+   if (!dri2_dpy)
-+      return _eglError(EGL_BAD_ALLOC, "DRI2: failed to create display");
-+
-+   dpy->DriverData = (void *) dri2_dpy;
-+   dri2_dpy->fd = -1;
-+
-+   dri2_dpy->tpl_dpy =
-+      tpl_display_create(TPL_BACKEND_UNKNOWN, dpy->PlatformDisplay);
-+   if (!dri2_dpy->tpl_dpy) {
-+      _eglError(EGL_NOT_INITIALIZED, "DRI2: failed to create tpl display");
-+      goto cleanup;
-+   }
-+
-+   for (i = TIZEN_DRM_RENDER_MINOR_START; i <= TIZEN_DRM_RENDER_MINOR_MAX; i++) {
-+      char *render_path;
-+
-+      if (asprintf(&render_path, DRM_RENDER_DEV_NAME, DRM_DIR_NAME, i) < 0)
-+         continue;
-+
-+      dri2_dpy->fd = loader_open_device(render_path);
-+      free(render_path);
-+      if (dri2_dpy->fd < 0)
-+         continue;
-+
-+      dri2_dpy->driver_name = loader_get_driver_for_fd(dri2_dpy->fd);
-+      if (dri2_dpy->driver_name) {
-+         if (dri2_load_driver_dri3(dpy)) {
-+            _EGLDevice *dev = _eglAddDevice(dri2_dpy->fd, false);
-+            if (!dev) {
-+               dlclose(dri2_dpy->driver);
-+               _eglLog(_EGL_WARNING, "DRI2: failed to find EGLDevice");
-+            } else {
-+               dri2_dpy->own_device = 1;
-+               dpy->Device = dev;
-+               break;
-+	    }
-+         }
-+
-+         free(dri2_dpy->driver_name);
-+         dri2_dpy->driver_name = NULL;
-+      }
-+
-+      close(dri2_dpy->fd);
-+      dri2_dpy->fd = -1;
-+   }
-+
-+   if (dri2_dpy->fd < 0) {
-+      _eglError(EGL_NOT_INITIALIZED, "DRI2: failed to load driver");
-+      goto cleanup;
-+   }
-+
-+   dri2_dpy->loader_extensions = &image_loader_extensions[0];
-+
-+   if (!dri2_create_screen(dpy)) {
-+      _eglError(EGL_NOT_INITIALIZED, "DRI2: failed to create screen");
-+      goto cleanup;
-+   }
-+
-+   if (!dri2_setup_extensions(dpy))
-+      goto cleanup;
-+
-+   dri2_setup_screen(dpy);
-+
-+   if (!dri2_tizen_add_configs(dpy)) {
-+      _eglError(EGL_NOT_INITIALIZED, "DRI2: failed to add configs");
-+      goto cleanup;
-+   }
-+
-+   dpy->Extensions.EXT_buffer_age = EGL_TRUE;
-+   dpy->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE;
-+   dpy->Extensions.KHR_image_base = EGL_TRUE;
-+   dpy->Extensions.WL_bind_wayland_display = EGL_TRUE;
-+
-+   /*
-+    * Fill vtbl last to prevent accidentally calling virtual function during
-+    * initialization.
-+    */
-+   dri2_dpy->vtbl = &dri2_tizen_display_vtbl;
-+
-+   return EGL_TRUE;
-+
-+cleanup:
-+   dri2_display_destroy(dpy);
-+   return EGL_FALSE;
-+}
-diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
-index 234449adf64..43c7b917909 100644
---- a/src/egl/main/eglapi.c
-+++ b/src/egl/main/eglapi.c
-@@ -416,6 +416,13 @@ _eglGetPlatformDisplayCommon(EGLenum platform, void *native_display,
-    case EGL_PLATFORM_DEVICE_EXT:
-       disp = _eglGetDeviceDisplay(native_display, attrib_list);
-       break;
-+#ifdef HAVE_TIZEN_PLATFORM
-+   case EGL_PLATFORM_GBM_MESA:
-+   case EGL_PLATFORM_WAYLAND_EXT:
-+      disp = _eglGetTizenDisplay((struct gbm_device*) native_display,
-+                                attrib_list);
-+      break;
-+#endif
-    default:
-       RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, NULL);
-    }
-diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c
-index 765618f0dd0..486ac3b0557 100644
---- a/src/egl/main/egldisplay.c
-+++ b/src/egl/main/egldisplay.c
-@@ -77,6 +77,7 @@ static const struct {
-    { _EGL_PLATFORM_HAIKU, "haiku" },
-    { _EGL_PLATFORM_SURFACELESS, "surfaceless" },
-    { _EGL_PLATFORM_DEVICE, "device" },
-+   { _EGL_PLATFORM_TIZEN, "tizen" },
- };
- 
- 
-@@ -107,6 +108,17 @@ _eglGetNativePlatformFromEnv(void)
-       }
-    }
- 
-+#ifdef HAVE_TIZEN_PLATFORM
-+   switch (plat) {
-+   case _EGL_PLATFORM_DRM:
-+   case _EGL_PLATFORM_WAYLAND:
-+      plat = _EGL_PLATFORM_TIZEN;
-+      break;
-+   default:
-+      break;
-+   }
-+#endif
-+
-    if (plat == _EGL_INVALID_PLATFORM)
-       _eglLog(_EGL_WARNING, "invalid EGL_PLATFORM given");
- 
-@@ -120,6 +132,7 @@ _eglGetNativePlatformFromEnv(void)
- static _EGLPlatformType
- _eglNativePlatformDetectNativeDisplay(void *nativeDisplay)
- {
-+#ifndef HAVE_TIZEN_PLATFORM
-    if (nativeDisplay == EGL_DEFAULT_DISPLAY)
-       return _EGL_INVALID_PLATFORM;
- 
-@@ -141,7 +154,7 @@ _eglNativePlatformDetectNativeDisplay(void *nativeDisplay)
-          return _EGL_PLATFORM_DRM;
- #endif
-    }
--
-+#endif
-    return _EGL_INVALID_PLATFORM;
- }
- 
-@@ -595,6 +608,23 @@ _eglGetAndroidDisplay(void *native_display,
- }
- #endif /* HAVE_ANDROID_PLATFORM */
- 
-+#ifdef HAVE_TIZEN_PLATFORM
-+_EGLDisplay*
-+_eglGetTizenDisplay(void *native_display,
-+                    const EGLint *attrib_list)
-+{
-+   /* EGL_MESA_platform_gbm and EGL_EXT_platform_wayland recognizes no
-+    * attributes. */
-+   if (attrib_list != NULL && attrib_list[0] != EGL_NONE) {
-+      _eglError(EGL_BAD_ATTRIBUTE, "eglGetPlatformDisplay");
-+      return NULL;
-+   }
-+
-+   return _eglFindDisplay(_EGL_PLATFORM_TIZEN, native_display,
-+                          attrib_list);
-+}
-+#endif /* HAVE_TIZEN_PLATFORM */
-+
- _EGLDisplay*
- _eglGetDeviceDisplay(void *native_display,
-                      const EGLAttrib *attrib_list)
-diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
-index 5b05dcc1e6d..cbb098331bf 100644
---- a/src/egl/main/egldisplay.h
-+++ b/src/egl/main/egldisplay.h
-@@ -52,6 +52,7 @@ enum _egl_platform_type {
-    _EGL_PLATFORM_HAIKU,
-    _EGL_PLATFORM_SURFACELESS,
-    _EGL_PLATFORM_DEVICE,
-+   _EGL_PLATFORM_TIZEN,
- 
-    _EGL_NUM_PLATFORMS,
-    _EGL_INVALID_PLATFORM = -1
-@@ -329,6 +330,12 @@ _eglGetAndroidDisplay(void *native_display,
-                          const EGLAttrib *attrib_list);
- #endif
- 
-+#ifdef HAVE_TIZEN_PLATFORM
-+_EGLDisplay*
-+_eglGetTizenDisplay(void *native_display,
-+                    const EGLint *attrib_list);
-+#endif
-+
- _EGLDisplay*
- _eglGetDeviceDisplay(void *native_display,
-                      const EGLAttrib *attrib_list);
-diff --git a/src/egl/main/egllog.c b/src/egl/main/egllog.c
-index 6a91952577f..973b7600ab1 100644
---- a/src/egl/main/egllog.c
-+++ b/src/egl/main/egllog.c
-@@ -46,15 +46,17 @@
- 
- #include "egllog.h"
- 
--#ifdef HAVE_ANDROID_PLATFORM
- #define LOG_TAG "EGL-MAIN"
-+
-+#ifdef HAVE_ANDROID_PLATFORM
- #if ANDROID_API_LEVEL >= 26
- #include <log/log.h>
- #else
- #include <cutils/log.h>
- #endif /* use log/log.h start from android 8 major version */
--
--#endif /* HAVE_ANDROID_PLATFORM */
-+#elif defined(HAVE_TIZEN_PLATFORM)
-+#include <dlog.h>
-+#endif /* HAVE_TIZEN_PLATFORM */
- 
- #define MAXSTRING 1000
- #define FALLBACK_LOG_LEVEL _EGL_WARNING
-@@ -93,9 +95,26 @@ _eglDefaultLogger(EGLint level, const char *msg)
-       [_EGL_DEBUG] = ANDROID_LOG_DEBUG,
-    };
-    LOG_PRI(egl2alog[level], LOG_TAG, "%s", msg);
-+#elif defined(HAVE_TIZEN_PLATFORM)
-+   switch (level) {
-+   case _EGL_DEBUG:
-+      LOGD("%s", msg);
-+      break;
-+   case _EGL_INFO:
-+      LOGI("%s", msg);
-+      break;
-+   case _EGL_WARNING:
-+      LOGW("%s", msg);
-+      break;
-+   case _EGL_FATAL:
-+      LOGF("%s", msg);
-+      break;
-+   default:
-+      break;
-+   }
- #else
-    fprintf(stderr, "libEGL %s: %s\n", level_strings[level], msg);
--#endif /* HAVE_ANDROID_PLATFORM */
-+#endif /* HAVE_TIZEN_PLATFORM */
- }
- 
- 
-diff --git a/src/egl/meson.build b/src/egl/meson.build
-index ab8f4e1fdbe..5749ec88f89 100644
---- a/src/egl/meson.build
-+++ b/src/egl/meson.build
-@@ -106,7 +106,7 @@ if with_dri2
-     endif
-     deps_for_egl += [dep_x11_xcb, dep_xcb_dri2, dep_xcb_xfixes]
-   endif
--  if with_gbm and not with_platform_android
-+  if with_gbm and not with_platform_android and not with_platform_tizen
-     files_egl += files('drivers/dri2/platform_drm.c')
-     link_for_egl += libgbm
-     incs_for_egl += [inc_gbm, include_directories('../gbm/main')]
-@@ -141,6 +141,11 @@ elif with_platform_haiku
-   link_for_egl += libgl
-   deps_for_egl += cpp.find_library('be')
- endif
-+if with_platform_tizen
-+  files_egl += files('drivers/dri2/platform_tizen.c')
-+  incs_for_egl += [inc_loader]
-+  deps_for_egl += [dep_tizen, dep_libdrm]
-+endif
- 
- if cc.has_function('mincore')
-   c_args_for_egl += '-DHAVE_MINCORE'
--- 
-2.25.1
-

+ 18 - 27
package/mesa3d/0024-gbm-add-gbm_bo_blit.patch → package/mesa3d/0018-gbm-add-gbm_bo_blit.patch

@@ -1,7 +1,7 @@
-From 0751612b949f1c90338a14453ff7fa4be8bfd016 Mon Sep 17 00:00:00 2001
+From 8c6ad73f1e75aef977cdd06672effa2597597963 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Tue, 28 Nov 2017 16:27:38 +0000
-Subject: [PATCH 24/67] gbm: add gbm_bo_blit
+Subject: [PATCH 18/58] gbm: add gbm_bo_blit
 
 For the GBM DRI backend, gbm_bo_blit is a wrapper around blitImage in
 the DRI Image extension.
@@ -10,14 +10,14 @@ the DRI Image extension.
  src/gbm/main/gbm.c             | 31 +++++++++++++++++++++++++++++++
  src/gbm/main/gbm.h             | 21 +++++++++++++++++++++
  src/gbm/main/gbm_abi_check.c   | 20 +++++++++++++++++++-
- src/gbm/main/gbm_backend_abi.h | 10 +++++++++-
- 5 files changed, 113 insertions(+), 2 deletions(-)
+ src/gbm/main/gbm_backend_abi.h |  8 ++++++++
+ 5 files changed, 112 insertions(+), 1 deletion(-)
 
 diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
-index 96fa9217255..bd8a80cdecf 100644
+index 644ea3c5639..00fcc57f512 100644
 --- a/src/gbm/backends/dri/gbm_dri.c
 +++ b/src/gbm/backends/dri/gbm_dri.c
-@@ -1355,6 +1355,37 @@ gbm_dri_surface_destroy(struct gbm_surface *_surf)
+@@ -1400,6 +1400,37 @@ gbm_dri_surface_destroy(struct gbm_surface *_surf)
     free(surf);
  }
  
@@ -55,7 +55,7 @@ index 96fa9217255..bd8a80cdecf 100644
  static void
  dri_destroy(struct gbm_device *gbm)
  {
-@@ -1416,6 +1447,8 @@ dri_device_create(int fd, uint32_t gbm_backend_version)
+@@ -1461,6 +1492,8 @@ dri_device_create(int fd, uint32_t gbm_backend_version)
  
     dri->base.v0.name = "drm";
  
@@ -65,10 +65,10 @@ index 96fa9217255..bd8a80cdecf 100644
     dri->num_visuals = ARRAY_SIZE(gbm_dri_visuals_table);
  
 diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c
-index d81931a7483..e2351d34ad8 100644
+index ab685b878e8..3ce816f5169 100644
 --- a/src/gbm/main/gbm.c
 +++ b/src/gbm/main/gbm.c
-@@ -758,6 +758,37 @@ gbm_format_get_name(uint32_t gbm_format, struct gbm_format_name_desc *desc)
+@@ -825,6 +825,37 @@ gbm_format_get_name(uint32_t gbm_format, struct gbm_format_name_desc *desc)
     return desc->name;
  }
  
@@ -107,10 +107,10 @@ index d81931a7483..e2351d34ad8 100644
   * A global table of functions and global variables defined in the core GBM
   * code that need to be accessed directly by GBM backends.
 diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
-index 3a0fe73faae..7c82cd661a3 100644
+index ea3cc1bac55..57fd1b9ab47 100644
 --- a/src/gbm/main/gbm.h
 +++ b/src/gbm/main/gbm.h
-@@ -246,6 +246,21 @@ enum gbm_bo_flags {
+@@ -253,6 +253,21 @@ enum gbm_bo_flags {
     GBM_BO_USE_PROTECTED = (1 << 5),
  };
  
@@ -132,7 +132,7 @@ index 3a0fe73faae..7c82cd661a3 100644
  int
  gbm_device_get_fd(struct gbm_device *gbm);
  
-@@ -425,6 +440,12 @@ gbm_surface_destroy(struct gbm_surface *surface);
+@@ -449,6 +464,12 @@ gbm_surface_destroy(struct gbm_surface *surface);
  char *
  gbm_format_get_name(uint32_t gbm_format, struct gbm_format_name_desc *desc);
  
@@ -146,10 +146,10 @@ index 3a0fe73faae..7c82cd661a3 100644
  }
  #endif
 diff --git a/src/gbm/main/gbm_abi_check.c b/src/gbm/main/gbm_abi_check.c
-index f1137be7baf..02ce23b129e 100644
+index feca0998d9d..0153b5a8754 100644
 --- a/src/gbm/main/gbm_abi_check.c
 +++ b/src/gbm/main/gbm_abi_check.c
-@@ -101,6 +101,21 @@ struct gbm_device_abi0 {
+@@ -106,6 +106,21 @@ struct gbm_device_abi0 {
     struct gbm_device_v0_abi0 v0;
  };
  
@@ -171,7 +171,7 @@ index f1137be7baf..02ce23b129e 100644
  /**
   * GBM buffer object interface corresponding to GBM_BACKEND_ABI_VERSION = 0
   *
-@@ -359,8 +374,11 @@ int main(int argc, char **argv)
+@@ -364,8 +379,11 @@ int main(int argc, char **argv)
     CHECK_MEMBER_CURRENT(gbm_device_v0, _abi0, surface_has_free_buffers);
     CHECK_MEMBER_CURRENT(gbm_device_v0, _abi0, surface_destroy);
  
@@ -185,19 +185,10 @@ index f1137be7baf..02ce23b129e 100644
  
     /* Check current gbm_bo ABI against gbm_bo_abi0*/
 diff --git a/src/gbm/main/gbm_backend_abi.h b/src/gbm/main/gbm_backend_abi.h
-index 962ee74f003..3abf29faa92 100644
+index 222ce3404cb..17f5e0ca808 100644
 --- a/src/gbm/main/gbm_backend_abi.h
 +++ b/src/gbm/main/gbm_backend_abi.h
-@@ -72,7 +72,7 @@ struct gbm_backend_desc;
-  * Core ABI version: 4
-  * ABI version of a buffer object created by a device from the backend: 4
-  */
--#define GBM_BACKEND_ABI_VERSION 0
-+#define GBM_BACKEND_ABI_VERSION 1
- 
- /**
-  * GBM device interface corresponding to GBM_BACKEND_ABI_VERSION = 0
-@@ -149,6 +149,13 @@ struct gbm_device_v0 {
+@@ -157,6 +157,13 @@ struct gbm_device_v0 {
     void (*surface_destroy)(struct gbm_surface *surface);
  };
  
@@ -211,7 +202,7 @@ index 962ee74f003..3abf29faa92 100644
  /**
   * The device used for the memory allocation.
   *
-@@ -161,6 +168,7 @@ struct gbm_device {
+@@ -169,6 +176,7 @@ struct gbm_device {
     /* Hack to make a gbm_device detectable by its first element. */
     struct gbm_device *(*dummy)(int);
     struct gbm_device_v0 v0;

+ 0 - 231
package/mesa3d/0019-egl-add-support-for-EGL_TIZEN_image_native_surface.patch

@@ -1,231 +0,0 @@
-From 230a8cb550dc23a46a96b1852720c262bb244665 Mon Sep 17 00:00:00 2001
-From: Eric Engestrom <eric.engestrom@imgtec.com>
-Date: Mon, 6 Feb 2017 15:54:00 +0000
-Subject: [PATCH 19/67] egl: add support for EGL_TIZEN_image_native_surface
-
----
- src/egl/drivers/dri2/egl_dri2.c       | 127 ++++++++++++++++++++------
- src/egl/drivers/dri2/platform_tizen.c |   1 +
- src/egl/main/eglapi.c                 |   2 +
- src/egl/main/egldisplay.h             |   2 +
- 4 files changed, 102 insertions(+), 30 deletions(-)
-
-diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index 6d34395d65d..eaa0baed066 100644
---- a/src/egl/drivers/dri2/egl_dri2.c
-+++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -58,6 +58,10 @@
- #include "X11/Xlibint.h"
- #endif
- 
-+#ifdef HAVE_TIZEN_PLATFORM
-+#include <tpl.h>
-+#endif
-+
- #include "egldefines.h"
- #include "egl_dri2.h"
- #include "GL/mesa_glinterop.h"
-@@ -2311,28 +2315,115 @@ dri2_fourcc_from_tbm_format(tbm_format format)
-    switch (format) {
-    case TBM_FORMAT_ARGB8888:
-       return DRM_FORMAT_ARGB8888;
-+   case TBM_FORMAT_ABGR8888:
-+      return DRM_FORMAT_ABGR8888;
-    case TBM_FORMAT_XRGB8888:
-       return DRM_FORMAT_XRGB8888;
-+   case TBM_FORMAT_XBGR8888:
-+      return DRM_FORMAT_XBGR8888;
-+   case TBM_FORMAT_ARGB4444:
-+      return DRM_FORMAT_ARGB4444;
-+   case TBM_FORMAT_ARGB1555:
-+      return DRM_FORMAT_ARGB1555;
-    case TBM_FORMAT_RGB565:
-       return DRM_FORMAT_RGB565;
-+   case TBM_FORMAT_YUV420:
-+      return DRM_FORMAT_YUV420;
-+   case TBM_FORMAT_YVU420:
-+      return DRM_FORMAT_YVU420;
-+   case TBM_FORMAT_NV12:
-+      return DRM_FORMAT_NV12;
-+   case TBM_FORMAT_NV21:
-+      return DRM_FORMAT_NV21;
-    default:
-       _eglLog(_EGL_DEBUG, "%s: unsupported tbm format %#x", __func__, format);
-       return 0;
-    }
- }
- 
-+static _EGLImage *
-+dri2_create_image_tbm_surface(_EGLDisplay *disp, _EGLContext *ctx,
-+                              tbm_surface_h tbm_surf)
-+{
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-+   __DRIimage *dri_image;
-+   tbm_surface_info_s info;
-+   int fd[TBM_SURF_PLANE_MAX], pitch[TBM_SURF_PLANE_MAX], offset[TBM_SURF_PLANE_MAX];
-+   int fourcc;
-+   int i;
-+
-+   if (tbm_surface_get_info(tbm_surf, &info)) {
-+      _eglError(EGL_BAD_PARAMETER, "tbm_surface_get_info");
-+      return NULL;
-+   }
-+
-+   fourcc = dri2_fourcc_from_tbm_format(info.format);
-+   if (!fourcc) {
-+      _eglError(EGL_BAD_PARAMETER, "dri2_fourcc_from_tbm_format");
-+      return NULL;
-+   }
-+
-+   for (i = 0; i < info.num_planes; i++) {
-+      tbm_bo tbm_buf;
-+
-+      tbm_buf = tbm_surface_internal_get_bo(tbm_surf, i);
-+      if (!tbm_buf) {
-+         _eglError(EGL_BAD_PARAMETER, "tbm_surface_internal_get_bo");
-+         goto fail_close;
-+      }
-+
-+      pitch[i] = info.planes[i].stride;
-+      offset[i] = info.planes[i].offset;
-+      fd[i] = tbm_bo_export_fd(tbm_buf);
-+   }
-+
-+   dri_image = dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
-+                                                   info.width,
-+                                                   info.height,
-+                                                   fourcc,
-+                                                   &fd[0],
-+                                                   info.num_planes,
-+                                                   &pitch[0],
-+                                                   &offset[0],
-+                                                   tbm_surf);
-+   for (i = 0; i < info.num_planes; i++) {
-+      close(fd[i]);
-+      fd[i] = -1;
-+   }
-+
-+   if (!dri_image) {
-+      _eglError(EGL_BAD_PARAMETER, "createImageFromFds");
-+      return NULL;
-+   }
-+
-+   return dri2_create_image_from_dri(disp, dri_image);
-+
-+fail_close:
-+   while (i--)
-+      close(fd[i]);
-+
-+   return NULL;
-+}
-+
-+static _EGLImage *
-+dri2_create_image_tizen(_EGLDisplay *disp, _EGLContext *ctx,
-+                        EGLClientBuffer _buffer,
-+                        const EGLint *attr_list)
-+{
-+   tbm_surface_h tbm_surf = (tbm_surface_h)_buffer;
-+
-+   return dri2_create_image_tbm_surface(disp, ctx, tbm_surf);
-+}
-+
- static _EGLImage *
- dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
-                                           EGLClientBuffer _buffer,
-                                           const EGLint *attr_list)
- {
-    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
--   __DRIimage *dri_image;
-    _EGLImageAttribs attrs;
-    tbm_surface_h tbm_surf;
--   tbm_bo tbm_buf;
-    tbm_surface_info_s info;
--   int fourcc, fd, pitch, offset;
- 
-    tbm_surf = tpl_display_get_buffer_from_native_pixmap(dri2_dpy->tpl_dpy,
-                                                         (tpl_handle_t) _buffer);
-@@ -2363,33 +2454,7 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
-       return NULL;
-    }
- 
--   tbm_buf = tbm_surface_internal_get_bo(tbm_surf, attrs.PlaneWL);
--   if (!tbm_buf) {
--      _eglError(EGL_BAD_PARAMETER, "tbm_surface_internal_get_bo");
--      return NULL;
--   }
--
--   fourcc = dri2_fourcc_from_tbm_format(info.format);
--   pitch = info.planes[attrs.PlaneWL].stride;
--   offset = info.planes[attrs.PlaneWL].offset;
--   fd = tbm_bo_export_fd(tbm_buf);
--
--   dri_image = dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
--                                                   info.width,
--                                                   info.height,
--                                                   fourcc,
--                                                   &fd,
--                                                   1,
--                                                   &pitch,
--                                                   &offset,
--                                                   tbm_surf);
--   close(fd);
--   if (dri_image == NULL) {
--      _eglError(EGL_BAD_PARAMETER, "createImageFromFds");
--      return NULL;
--   }
--
--   return dri2_create_image_from_dri(disp, dri_image);
-+   return dri2_create_image_tbm_surface(disp, ctx, tbm_surf);
- }
- #endif
- 
-@@ -3296,6 +3361,8 @@ dri2_create_image_khr(_EGLDisplay *disp, _EGLContext *ctx, EGLenum target,
- #ifdef HAVE_TIZEN_PLATFORM
-    case EGL_WAYLAND_BUFFER_WL:
-       return dri2_create_image_wayland_wl_buffer_tizen(disp, ctx, buffer, attr_list);
-+   case EGL_NATIVE_SURFACE_TIZEN:
-+      return dri2_create_image_tizen(disp, ctx, buffer, attr_list);
- #endif
-    case EGL_CL_IMAGE_IMG:
-       return dri2_create_image_img_buffer(disp, ctx, target, buffer, attr_list);
-diff --git a/src/egl/drivers/dri2/platform_tizen.c b/src/egl/drivers/dri2/platform_tizen.c
-index a08bc8c07bf..ad75c115d7e 100644
---- a/src/egl/drivers/dri2/platform_tizen.c
-+++ b/src/egl/drivers/dri2/platform_tizen.c
-@@ -965,6 +965,7 @@ dri2_initialize_tizen(_EGLDisplay *dpy)
-    dpy->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE;
-    dpy->Extensions.KHR_image_base = EGL_TRUE;
-    dpy->Extensions.WL_bind_wayland_display = EGL_TRUE;
-+   dpy->Extensions.TIZEN_image_native_surface = EGL_TRUE;
- 
-    /*
-     * Fill vtbl last to prevent accidentally calling virtual function during
-diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
-index 43c7b917909..e2a7797d73e 100644
---- a/src/egl/main/eglapi.c
-+++ b/src/egl/main/eglapi.c
-@@ -553,6 +553,8 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
- 
-    _EGL_CHECK_EXTENSION(NV_post_sub_buffer);
- 
-+   _EGL_CHECK_EXTENSION(TIZEN_image_native_surface);
-+
-    _EGL_CHECK_EXTENSION(WL_bind_wayland_display);
-    _EGL_CHECK_EXTENSION(WL_create_wayland_buffer_from_image);
- 
-diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
-index cbb098331bf..0a7366b7c07 100644
---- a/src/egl/main/egldisplay.h
-+++ b/src/egl/main/egldisplay.h
-@@ -149,6 +149,8 @@ struct _egl_extensions
- 
-    EGLBoolean NV_post_sub_buffer;
- 
-+   EGLBoolean TIZEN_image_native_surface;
-+
-    EGLBoolean WL_bind_wayland_display;
-    EGLBoolean WL_create_wayland_buffer_from_image;
- 
--- 
-2.25.1
-

+ 5 - 5
package/mesa3d/0025-gbm-don-t-assert-if-DRI-context-creation-fails.patch → package/mesa3d/0019-gbm-don-t-assert-if-DRI-context-creation-fails.patch

@@ -1,7 +1,7 @@
-From dbe611e4cb6f0dddc05ead03f0341274a6b018c8 Mon Sep 17 00:00:00 2001
+From a553d0541555b879a2f9a9645d0766983855d766 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Fri, 1 Dec 2017 08:31:15 +0000
-Subject: [PATCH 25/67] gbm: don't assert if DRI context creation fails
+Subject: [PATCH 19/58] gbm: don't assert if DRI context creation fails
 
 If the DRI backend fails to create a DRI context, return an error,
 rather than asserting.
@@ -10,10 +10,10 @@ rather than asserting.
  1 file changed, 8 insertions(+), 2 deletions(-)
 
 diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
-index bd8a80cdecf..2aa9c7c41ad 100644
+index 00fcc57f512..fc0bbf5fcf9 100644
 --- a/src/gbm/backends/dri/gbm_dri.c
 +++ b/src/gbm/backends/dri/gbm_dri.c
-@@ -1245,8 +1245,11 @@ gbm_dri_bo_map(struct gbm_bo *_bo,
+@@ -1290,8 +1290,11 @@ gbm_dri_bo_map(struct gbm_bo *_bo,
     if (!dri->context)
        dri->context = dri->dri2->createNewContext(dri->screen, NULL,
                                                   NULL, NULL);
@@ -26,7 +26,7 @@ index bd8a80cdecf..2aa9c7c41ad 100644
  
     /* GBM flags and DRI flags are the same, so just pass them on */
     return dri->image->mapImage(dri->context, bo->image, x, y,
-@@ -1374,8 +1377,11 @@ gbm_dri_bo_blit(struct gbm_bo *_dst_bo, struct gbm_bo *_src_bo,
+@@ -1419,8 +1422,11 @@ gbm_dri_bo_blit(struct gbm_bo *_dst_bo, struct gbm_bo *_src_bo,
     if (!dri->context)
        dri->context = dri->dri2->createNewContext(dri->screen, NULL,
                                                   NULL, NULL);

+ 44 - 39
package/mesa3d/0026-egl-wayland-add-pbuffer-support.patch → package/mesa3d/0020-egl-wayland-add-pbuffer-support.patch

@@ -1,7 +1,7 @@
-From f16ea577ee06375423198dced8231d04e94536af Mon Sep 17 00:00:00 2001
+From 18831c70c524c1a14ffedc3038cf76e0d2c64579 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Fri, 17 Mar 2017 16:23:07 +0000
-Subject: [PATCH 26/67] egl/wayland: add pbuffer support
+Subject: [PATCH 20/58] egl/wayland: add pbuffer support
 
 The pbuffer code is based on that in the Surfaceless platform code.
 ---
@@ -10,12 +10,12 @@ The pbuffer code is based on that in the Surfaceless platform code.
  2 files changed, 236 insertions(+), 38 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
-index 546bc0a0dbc..f41f32cd234 100644
+index 89158993efd..35f66ad5453 100644
 --- a/src/egl/drivers/dri2/egl_dri2.h
 +++ b/src/egl/drivers/dri2/egl_dri2.h
-@@ -405,6 +405,10 @@ struct dri2_egl_surface
-    __DRIimage           *front;
-    unsigned int         visual;
+@@ -389,6 +389,10 @@ struct dri2_egl_surface
+    __DRIimage *front;
+    unsigned int visual;
  
 +#ifdef HAVE_WAYLAND_PLATFORM
 +   void                 *swrast_front;
@@ -25,10 +25,10 @@ index 546bc0a0dbc..f41f32cd234 100644
     EGLBoolean enable_out_fence;
  
 diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
-index 811d28bd669..a096d9500c1 100644
+index a699f735583..185c52c110f 100644
 --- a/src/egl/drivers/dri2/platform_wayland.c
 +++ b/src/egl/drivers/dri2/platform_wayland.c
-@@ -427,6 +427,99 @@ dri2_wl_create_pixmap_surface(_EGLDisplay *disp, _EGLConfig *conf,
+@@ -787,6 +787,99 @@ dri2_wl_create_pixmap_surface(_EGLDisplay *disp, _EGLConfig *conf,
     return NULL;
  }
  
@@ -59,7 +59,7 @@ index 811d28bd669..a096d9500c1 100644
 +      goto cleanup_surf;
 +   }
 +
-+   visual_idx = dri2_wl_visual_idx_from_config(dri2_dpy, config);
++   visual_idx = dri2_wl_visual_idx_from_config(dri2_dpy, config, false);
 +   assert(visual_idx != -1);
 +
 +   if (dri2_dpy->wl_dmabuf || dri2_dpy->wl_drm) {
@@ -128,7 +128,7 @@ index 811d28bd669..a096d9500c1 100644
  /**
   * Called via eglDestroySurface(), drv->DestroySurface().
   */
-@@ -453,6 +546,9 @@ dri2_wl_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
+@@ -813,6 +906,9 @@ dri2_wl_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
     if (dri2_dpy->dri2)
        dri2_egl_surface_free_local_buffers(dri2_surf);
  
@@ -138,7 +138,7 @@ index 811d28bd669..a096d9500c1 100644
     if (dri2_surf->throttle_callback)
        wl_callback_destroy(dri2_surf->throttle_callback);
  
-@@ -462,11 +558,14 @@ dri2_wl_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
+@@ -822,8 +918,10 @@ dri2_wl_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
        dri2_surf->wl_win->destroy_window_callback = NULL;
     }
  
@@ -150,13 +150,18 @@ index 811d28bd669..a096d9500c1 100644
 +      wl_proxy_wrapper_destroy(dri2_surf->wl_dpy_wrapper);
     if (dri2_surf->wl_drm_wrapper)
        wl_proxy_wrapper_destroy(dri2_surf->wl_drm_wrapper);
+    if (dri2_surf->wl_dmabuf_feedback) {
+@@ -831,7 +929,8 @@ dri2_wl_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
+       dmabuf_feedback_fini(&dri2_surf->dmabuf_feedback);
+       dmabuf_feedback_fini(&dri2_surf->pending_dmabuf_feedback);
+    }
 -   wl_event_queue_destroy(dri2_surf->wl_queue);
 +   if (dri2_surf->wl_queue)
 +      wl_event_queue_destroy(dri2_surf->wl_queue);
  
     dri2_fini_surface(surf);
     free(surf);
-@@ -628,20 +727,16 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
+@@ -1091,20 +1190,16 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
  
  
  static void
@@ -180,9 +185,9 @@ index 811d28bd669..a096d9500c1 100644
     buffer->name = name;
     buffer->pitch = pitch;
     buffer->flags = 0;
-@@ -656,12 +751,28 @@ back_bo_to_dri_buffer(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
-    }
- }
+@@ -1125,12 +1220,28 @@ back_bo_to_dri_buffer(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
+  */
+ #define BUFFER_TRIM_AGE_HYSTERESIS 20
  
 -static int
 -update_buffers(struct dri2_egl_surface *dri2_surf)
@@ -213,7 +218,7 @@ index 811d28bd669..a096d9500c1 100644
     if (dri2_surf->wl_win &&
         (dri2_surf->base.Width != dri2_surf->wl_win->width ||
          dri2_surf->base.Height != dri2_surf->wl_win->height)) {
-@@ -703,12 +814,13 @@ update_buffers(struct dri2_egl_surface *dri2_surf)
+@@ -1176,12 +1287,13 @@ update_buffers(struct dri2_egl_surface *dri2_surf)
  }
  
  static int
@@ -229,7 +234,7 @@ index 811d28bd669..a096d9500c1 100644
  }
  
  static __DRIbuffer *
-@@ -718,17 +830,25 @@ dri2_wl_get_buffers_with_format(__DRIdrawable * driDrawable,
+@@ -1191,17 +1303,25 @@ dri2_wl_get_buffers_with_format(__DRIdrawable * driDrawable,
                                  int *out_count, void *loaderPrivate)
  {
     struct dri2_egl_surface *dri2_surf = loaderPrivate;
@@ -237,7 +242,7 @@ index 811d28bd669..a096d9500c1 100644
 +      dri2_egl_display(dri2_surf->base.Resource.Display);
     int i, j;
  
--   if (update_buffers(dri2_surf) < 0)
+-   if (update_buffers_if_needed(dri2_surf) < 0)
 -      return NULL;
 -
     for (i = 0, j = 0; i < 2 * count; i += 2, j++) {
@@ -246,7 +251,7 @@ index 811d28bd669..a096d9500c1 100644
        switch (attachments[i]) {
        case __DRI_BUFFER_BACK_LEFT:
 -         back_bo_to_dri_buffer(dri2_surf, &dri2_surf->buffers[j]);
-+         if (update_buffers(dri2_dpy, dri2_surf) < 0)
++         if (update_buffers_if_needed(dri2_dpy, dri2_surf) < 0)
 +            return NULL;
 +
 +         back_bo_to_dri_buffer(dri2_dpy, dri2_surf, &dri2_surf->buffers[j]);
@@ -259,14 +264,14 @@ index 811d28bd669..a096d9500c1 100644
           break;
        default:
           local = dri2_egl_surface_alloc_local_buffer(dri2_surf, attachments[i],
-@@ -798,12 +918,30 @@ image_get_buffers(__DRIdrawable *driDrawable,
+@@ -1271,12 +1391,30 @@ image_get_buffers(__DRIdrawable *driDrawable,
                    struct __DRIimageList *buffers)
  {
     struct dri2_egl_surface *dri2_surf = loaderPrivate;
 +   struct dri2_egl_display *dri2_dpy =
 +      dri2_egl_display(dri2_surf->base.Resource.Display);
  
--   if (update_buffers(dri2_surf) < 0)
+-   if (update_buffers_if_needed(dri2_surf) < 0)
 -      return 0;
 +   buffers->image_mask = 0;
 +   buffers->front = NULL;
@@ -274,11 +279,9 @@ index 811d28bd669..a096d9500c1 100644
 +
 +   if (buffer_mask & __DRI_IMAGE_BUFFER_BACK)
 +   {
-+      if (update_buffers(dri2_dpy, dri2_surf) < 0)
++      if (update_buffers_if_needed(dri2_dpy, dri2_surf) < 0)
 +         return 0;
- 
--   buffers->image_mask = __DRI_IMAGE_BUFFER_BACK;
--   buffers->back = dri2_surf->back->dri_image;
++
 +      buffers->image_mask |= __DRI_IMAGE_BUFFER_BACK;
 +      buffers->back = dri2_surf->back->dri_image;
 +   }
@@ -287,14 +290,16 @@ index 811d28bd669..a096d9500c1 100644
 +   {
 +      if (allocate_front_buffer(dri2_dpy, dri2_surf, EGL_FALSE) < 0)
 +         return 0;
-+
+ 
+-   buffers->image_mask = __DRI_IMAGE_BUFFER_BACK;
+-   buffers->back = dri2_surf->back->dri_image;
 +      buffers->image_mask |= __DRI_IMAGE_BUFFER_FRONT;
 +      buffers->front = dri2_surf->front;
 +   }
  
     return 1;
  }
-@@ -1054,6 +1192,9 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
+@@ -1507,6 +1645,9 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
     struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
     struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
  
@@ -304,7 +309,7 @@ index 811d28bd669..a096d9500c1 100644
     if (!dri2_surf->wl_win)
        return _eglError(EGL_BAD_NATIVE_WINDOW, "dri2_swap_buffers");
  
-@@ -1068,7 +1209,7 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
+@@ -1521,7 +1662,7 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
  
     /* Make sure we have a back buffer in case we're swapping without ever
      * rendering. */
@@ -313,7 +318,7 @@ index 811d28bd669..a096d9500c1 100644
        return _eglError(EGL_BAD_ALLOC, "dri2_swap_buffers");
  
     if (draw->SwapInterval > 0) {
-@@ -1153,9 +1294,13 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
+@@ -1606,9 +1747,13 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
  static EGLint
  dri2_wl_query_buffer_age(_EGLDisplay *disp, _EGLSurface *surface)
  {
@@ -328,15 +333,15 @@ index 811d28bd669..a096d9500c1 100644
        _eglError(EGL_BAD_ALLOC, "dri2_query_buffer_age");
        return -1;
     }
-@@ -1376,6 +1521,7 @@ static const struct dri2_egl_display_vtbl dri2_wl_display_vtbl = {
+@@ -1958,6 +2103,7 @@ static const struct dri2_egl_display_vtbl dri2_wl_display_vtbl = {
     .authenticate = dri2_wl_authenticate,
     .create_window_surface = dri2_wl_create_window_surface,
     .create_pixmap_surface = dri2_wl_create_pixmap_surface,
 +   .create_pbuffer_surface = dri2_wl_create_pbuffer_surface,
     .destroy_surface = dri2_wl_destroy_surface,
+    .swap_interval = dri2_wl_swap_interval,
     .create_image = dri2_create_image_khr,
-    .swap_buffers = dri2_wl_swap_buffers,
-@@ -1418,7 +1564,7 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
+@@ -2001,7 +2147,7 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
              continue;
  
           dri2_conf = dri2_add_config(disp, dri2_dpy->driver_configs[i],
@@ -345,7 +350,7 @@ index 811d28bd669..a096d9500c1 100644
           if (dri2_conf) {
              if (dri2_conf->base.ConfigID == count + 1)
                 count++;
-@@ -1654,6 +1800,23 @@ dri2_wl_swrast_get_stride_for_format(int format, int w)
+@@ -2252,6 +2398,23 @@ dri2_wl_swrast_get_stride_for_format(int format, int w)
     return w * (dri2_wl_visuals[visual_idx].bpp / 8);
  }
  
@@ -369,7 +374,7 @@ index 811d28bd669..a096d9500c1 100644
  static EGLBoolean
  dri2_wl_swrast_allocate_buffer(struct dri2_egl_surface *dri2_surf,
                                 int format, int w, int h,
-@@ -1775,8 +1938,24 @@ swrast_update_buffers(struct dri2_egl_surface *dri2_surf)
+@@ -2383,8 +2546,24 @@ swrast_update_buffers(struct dri2_egl_surface *dri2_surf)
     return 0;
  }
  
@@ -395,7 +400,7 @@ index 811d28bd669..a096d9500c1 100644
  {
     /* if there has been a resize: */
     if (!dri2_surf->current)
-@@ -1846,7 +2025,9 @@ dri2_wl_swrast_get_drawable_info(__DRIdrawable * draw,
+@@ -2454,7 +2633,9 @@ dri2_wl_swrast_get_drawable_info(__DRIdrawable * draw,
  {
     struct dri2_egl_surface *dri2_surf = loaderPrivate;
  
@@ -406,7 +411,7 @@ index 811d28bd669..a096d9500c1 100644
     *x = 0;
     *y = 0;
     *w = dri2_surf->base.Width;
-@@ -1865,7 +2046,11 @@ dri2_wl_swrast_get_image(__DRIdrawable * read,
+@@ -2473,7 +2654,11 @@ dri2_wl_swrast_get_image(__DRIdrawable * read,
     int dst_stride = copy_width;
     char *src, *dst;
  
@@ -419,7 +424,7 @@ index 811d28bd669..a096d9500c1 100644
     if (!src) {
        memset(data, 0, copy_width * h);
        return;
-@@ -1903,14 +2088,20 @@ dri2_wl_swrast_put_image2(__DRIdrawable * draw, int op,
+@@ -2511,14 +2696,20 @@ dri2_wl_swrast_put_image2(__DRIdrawable * draw, int op,
  
     assert(copy_width <= stride);
  
@@ -447,7 +452,7 @@ index 811d28bd669..a096d9500c1 100644
  
     dst += x_offset;
     dst += y * dst_stride;
-@@ -1928,7 +2119,9 @@ dri2_wl_swrast_put_image2(__DRIdrawable * draw, int op,
+@@ -2536,7 +2727,9 @@ dri2_wl_swrast_put_image2(__DRIdrawable * draw, int op,
        src += stride;
        dst += dst_stride;
     }
@@ -458,7 +463,7 @@ index 811d28bd669..a096d9500c1 100644
  }
  
  static void
-@@ -1996,6 +2189,7 @@ static const struct dri2_egl_display_vtbl dri2_wl_swrast_display_vtbl = {
+@@ -2608,6 +2801,7 @@ static const struct dri2_egl_display_vtbl dri2_wl_swrast_display_vtbl = {
     .authenticate = NULL,
     .create_window_surface = dri2_wl_create_window_surface,
     .create_pixmap_surface = dri2_wl_create_pixmap_surface,

+ 2 - 2
package/mesa3d/0028-egl-eglBindAPI-workaround-for-dEQP-bug.patch → package/mesa3d/0021-egl-eglBindAPI-workaround-for-dEQP-bug.patch

@@ -1,7 +1,7 @@
-From 90c87ad050dd7a4deda3ee1609e6cc27ea7dd616 Mon Sep 17 00:00:00 2001
+From 1ae8f535fa7ce80768011d045d17281c264a3ab0 Mon Sep 17 00:00:00 2001
 From: Eric Engestrom <eric.engestrom@imgtec.com>
 Date: Mon, 25 Sep 2017 15:58:49 +0100
-Subject: [PATCH 28/67] egl: eglBindAPI workaround for dEQP bug
+Subject: [PATCH 21/58] egl: eglBindAPI workaround for dEQP bug
 
 dEQP relies on eglBindAPI to only return true if the API can
 successfully be used to create contexts, which the spec does not

+ 10 - 10
package/mesa3d/0029-GL_EXT_multi_draw_indirect-entry-points.patch → package/mesa3d/0022-GL_EXT_multi_draw_indirect-entry-points.patch

@@ -1,7 +1,7 @@
-From a763c01172ee21a26f4c9dbb6055093f78d06fb2 Mon Sep 17 00:00:00 2001
+From 663288d629863e919d509df0678bfea6b3be5d51 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Tue, 30 Jan 2018 10:25:11 +0000
-Subject: [PATCH 29/67] GL_EXT_multi_draw_indirect entry points
+Subject: [PATCH 22/58] GL_EXT_multi_draw_indirect entry points
 
 ---
  src/mapi/glapi/gen/es_EXT.xml     | 19 +++++++++++++++++++
@@ -9,7 +9,7 @@ Subject: [PATCH 29/67] GL_EXT_multi_draw_indirect entry points
  2 files changed, 21 insertions(+)
 
 diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
-index fe8f27e1e6f..e0d60faa9d2 100644
+index b59e85d3281..6ff5432e029 100644
 --- a/src/mapi/glapi/gen/es_EXT.xml
 +++ b/src/mapi/glapi/gen/es_EXT.xml
 @@ -1140,6 +1140,25 @@
@@ -39,15 +39,15 @@ index fe8f27e1e6f..e0d60faa9d2 100644
  
      <function name="CopyImageSubDataEXT" alias="CopyImageSubData" es2="3.0">
 diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
-index dc6bdc9dcce..e231c176264 100644
+index fda952a1bdb..53f381e9297 100644
 --- a/src/mapi/glapi/gen/static_data.py
 +++ b/src/mapi/glapi/gen/static_data.py
-@@ -1704,6 +1704,8 @@ offsets = {
-     "FramebufferTextureLayerDownsampleIMG" : 1668,
-     "FramebufferTextureMultiviewOVR" : 1669,
-     "FramebufferTextureMultisampleMultiviewOVR" : 1670,
-+    "MultiDrawArraysIndirectEXT" : 1671,
-+    "MultiDrawElementsIndirectEXT" : 1672,
+@@ -1705,6 +1705,8 @@ offsets = {
+     "FramebufferTextureLayerDownsampleIMG" : 1669,
+     "FramebufferTextureMultiviewOVR" : 1670,
+     "FramebufferTextureMultisampleMultiviewOVR" : 1671,
++    "MultiDrawArraysIndirectEXT" : 1672,
++    "MultiDrawElementsIndirectEXT" : 1673,
  }
  
  functions = [

+ 0 - 380
package/mesa3d/0022-egl-tizen-create-an-internal-_EGLImage-for-each-tbm-.patch

@@ -1,380 +0,0 @@
-From 404c0e915de381c2337c79657f80b0aa95c1c995 Mon Sep 17 00:00:00 2001
-From: Frank Binns <frank.binns@imgtec.com>
-Date: Wed, 25 Oct 2017 18:15:00 +0100
-Subject: [PATCH 22/67] egl/tizen: create an internal _EGLImage for each tbm
- surface
-
-Create an internal _EGLImage the first time a tbm surface is seen
-by eglCreateImageKHR (with either the EGL_WAYLAND_BUFFER_WL or
-EGL_NATIVE_SURFACE_TIZEN target) and return a copy of it to the
-caller. This avoids some tbm surfaces being frequently mapped and
-then unmapped from the GPU.
----
- src/egl/drivers/dri2/egl_dri2.c       | 236 +++++++++++++++++++++++++-
- src/egl/drivers/dri2/egl_dri2.h       |  12 ++
- src/egl/drivers/dri2/platform_tizen.c |   6 +
- 3 files changed, 251 insertions(+), 3 deletions(-)
-
-diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index eaa0baed066..db993f8f059 100644
---- a/src/egl/drivers/dri2/egl_dri2.c
-+++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -1264,6 +1264,10 @@ dri2_display_destroy(_EGLDisplay *disp)
-       break;
- #ifdef HAVE_TIZEN_PLATFORM
-    case _EGL_PLATFORM_TIZEN:
-+      if (dri2_dpy->image_list_mutex_initialized) {
-+         pthread_mutex_destroy(&dri2_dpy->image_list_mutex);
-+         dri2_dpy->image_list_mutex_initialized = false;
-+      }
-       if (dri2_dpy->tpl_dpy)
-          tpl_object_unreference((tpl_object_t *) dri2_dpy->tpl_dpy);
-       break;
-@@ -1320,6 +1324,60 @@ dri2_egl_surface_free_local_buffers(struct dri2_egl_surface *dri2_surf)
-    }
- }
- 
-+static void
-+dri2_display_release_resources_tizen(_EGLDisplay *disp)
-+{
-+#ifdef HAVE_TIZEN_PLATFORM
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-+   _EGLResource *image_elem;
-+
-+   /* Destroy _EGLImages in the image_list */
-+   pthread_mutex_lock(&dri2_dpy->image_list_mutex);
-+   image_elem = dri2_dpy->image_list;
-+   dri2_dpy->image_list = NULL;
-+   pthread_mutex_unlock(&dri2_dpy->image_list_mutex);
-+
-+   while (image_elem) {
-+      _EGLImage *img = (_EGLImage *) image_elem;
-+      struct dri2_egl_image *dri2_img = dri2_egl_image(img);
-+
-+      image_elem = image_elem->Next;
-+
-+      /*
-+       * Delete the tbm surface user data (_EGLImage), unless the tbm surface
-+       * was destroyed since we started processing the image_list.
-+       */
-+      if (dri2_img->tbm_surf)
-+         tbm_surface_internal_delete_user_data(dri2_img->tbm_surf,
-+                                               (unsigned long) disp);
-+
-+      /*
-+       * dri2_orphan_tbm_surf_egl_image won't be able to transfer the
-+       * _EGLImage to the orphan_image_list once we have started processing
-+       * the image_list so we must destroy it ourselves.
-+       */
-+      dri2_dpy->image->destroyImage(dri2_img->dri_image);
-+      free(dri2_img);
-+   }
-+
-+   /* Destroy _EGLimages  in the orphan_image_list*/
-+   pthread_mutex_lock(&dri2_dpy->image_list_mutex);
-+   image_elem = dri2_dpy->orphan_image_list;
-+   dri2_dpy->orphan_image_list = NULL;
-+   pthread_mutex_unlock(&dri2_dpy->image_list_mutex);
-+
-+   while (image_elem) {
-+      _EGLImage *img = (_EGLImage *) image_elem;
-+      struct dri2_egl_image *dri2_img = dri2_egl_image(img);
-+
-+      image_elem = image_elem->Next;
-+
-+       dri2_dpy->image->destroyImage(dri2_img->dri_image);
-+       free(dri2_img);
-+   }
-+#endif
-+}
-+
- /**
-  * Called via eglTerminate(), drv->Terminate().
-  *
-@@ -1332,6 +1390,8 @@ dri2_terminate(_EGLDisplay *disp)
-    /* Release all non-current Context/Surfaces. */
-    _eglReleaseDisplayResources(disp);
- 
-+   dri2_display_release_resources_tizen(disp);
-+
-    dri2_display_release(disp);
- 
-    return EGL_TRUE;
-@@ -2309,6 +2369,9 @@ dri2_create_image_khr_renderbuffer(_EGLDisplay *disp, _EGLContext *ctx,
- }
- 
- #ifdef HAVE_TIZEN_PLATFORM
-+static EGLBoolean
-+dri2_destroy_image_khr(_EGLDisplay *disp, _EGLImage *image);
-+
- int
- dri2_fourcc_from_tbm_format(tbm_format format)
- {
-@@ -2405,14 +2468,145 @@ fail_close:
-    return NULL;
- }
- 
-+static void
-+dri2_orphan_tbm_surf_egl_image(void *user_data)
-+{
-+   _EGLImage *img = user_data;
-+   struct dri2_egl_image *dri2_img = dri2_egl_image(img);
-+   _EGLDisplay *disp = img->Resource.Display;
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-+
-+   /*
-+    * Transfer the passed in _EGLImage from the image_list to the
-+    * orphan_image_list so that it can be cleaned up at some later
-+    * point. This is necessary as the disp->Mutex needs to be held
-+    * in order destroy the _EGLImage and this could potentially cause
-+    * a deadlock in the event that the tbm surface is destroyed.
-+    */
-+   pthread_mutex_lock(&dri2_dpy->image_list_mutex);
-+   /*
-+    * This may be NULL if called via dri2_terminate or if dri2_terminate is
-+    * running in another thread.
-+    */
-+   if (dri2_dpy->image_list) {
-+      _EGLResource *image_elem;
-+
-+      /* Remove the _EGLImage from the image_list */
-+      image_elem = dri2_dpy->image_list;
-+      if (image_elem != &img->Resource) {
-+         while (image_elem) {
-+            if (image_elem->Next == &img->Resource)
-+               break;
-+            image_elem = image_elem->Next;
-+         }
-+         image_elem->Next = img->Resource.Next;
-+      } else {
-+         dri2_dpy->image_list = img->Resource.Next;
-+      }
-+
-+      /* Add the _EGLImage to the orphan_image_list */
-+      img->Resource.Next = dri2_dpy->orphan_image_list;
-+      dri2_dpy->orphan_image_list = &img->Resource;
-+   }
-+
-+   /*
-+    * This function may have been called via tbm_surface_destroy so tbm_surf
-+    * may be invalid after this function returns.
-+    */
-+   dri2_img->tbm_surf = NULL;
-+   pthread_mutex_unlock(&dri2_dpy->image_list_mutex);
-+}
-+
-+static _EGLImage *
-+dri2_get_tbm_surf_egl_image(_EGLDisplay *disp, _EGLContext *ctx,
-+                            tbm_surface_h tbm_surf)
-+{
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-+   struct dri2_egl_image *dri2_img;
-+   _EGLImage *img;
-+   int ret;
-+
-+   ret = tbm_surface_internal_get_user_data(tbm_surf, (unsigned long) disp,
-+                                            (void **) &img);
-+   if (ret)
-+      return img;
-+
-+   img = dri2_create_image_tbm_surface(disp, ctx, tbm_surf);
-+   if (!img) {
-+      _eglError(EGL_BAD_PARAMETER, "dri2_create_image_tbm_surface failed");
-+      goto fail_exit;
-+   }
-+   dri2_img = dri2_egl_image(img);
-+
-+   /* Use 'disp' as the 'key' as the _EGLimage is tied to it */
-+   ret = tbm_surface_internal_add_user_data(tbm_surf, (unsigned long) disp,
-+                                            dri2_orphan_tbm_surf_egl_image);
-+   if (!ret) {
-+      _eglError(EGL_BAD_PARAMETER, "dri2_get_tbm_surf_egl_image");
-+      goto fail_destroy_image;
-+   }
-+
-+   ret = tbm_surface_internal_set_user_data(tbm_surf, (unsigned long) disp, img);
-+   if (!ret) {
-+      _eglError(EGL_BAD_PARAMETER, "dri2_get_tbm_surf_egl_image");
-+      goto fail_delete_user_data;
-+   }
-+
-+   /*
-+    * Store the tbm surface so that the user data (_EGLImage) can be destroyed
-+    * in dri2_terminate. We don't take a reference on the surface as this would
-+    * prevent it from being destroyed until eglTerminate is called. This isn't
-+    * an issue since it will be set to NULL, via dri2_orphan_tbm_surf_egl_image,
-+    * once the surface is destroyed (although it's actually safe to call tbm
-+    * surface functions with stale/NULL pointers).
-+    */
-+   dri2_img->tbm_surf = tbm_surf;
-+
-+   /*
-+    * Add to the list of _EGLImages that are associated with tbm surfaces.
-+    * This allows the _EGLImage to be destroyed if the application calls
-+    * eglTerminate before the tbm surface is destroyed.
-+    */
-+   pthread_mutex_lock(&dri2_dpy->image_list_mutex);
-+   img->Resource.Next = dri2_dpy->image_list;
-+   dri2_dpy->image_list = &img->Resource;
-+   pthread_mutex_unlock(&dri2_dpy->image_list_mutex);
-+
-+   return img;
-+
-+fail_delete_user_data:
-+   tbm_surface_internal_delete_user_data(tbm_surf, (unsigned long) disp);
-+fail_destroy_image:
-+   dri2_destroy_image_khr(disp, img);
-+fail_exit:
-+   return NULL;
-+}
-+
- static _EGLImage *
- dri2_create_image_tizen(_EGLDisplay *disp, _EGLContext *ctx,
-                         EGLClientBuffer _buffer,
-                         const EGLint *attr_list)
- {
--   tbm_surface_h tbm_surf = (tbm_surface_h)_buffer;
-+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-+   tbm_surface_h tbm_surf = (tbm_surface_h) _buffer;
-+   _EGLImage *img;
-+   struct dri2_egl_image *dri2_img;
-+   __DRIimage *dri_image;
-+
-+   img = dri2_get_tbm_surf_egl_image(disp, ctx, tbm_surf);
-+   if (!img) {
-+      _eglError(EGL_BAD_PARAMETER, "dri2_create_image_tizen");
-+      return NULL;
-+   }
-+   dri2_img = dri2_egl_image(img);
-+
-+   dri_image = dri2_dpy->image->fromPlanar(dri2_img->dri_image, 0, NULL);
-+   if (!dri_image) {
-+      _eglError(EGL_BAD_PARAMETER, "dri2_create_image_tizen");
-+      return NULL;
-+   }
- 
--   return dri2_create_image_tbm_surface(disp, ctx, tbm_surf);
-+   return dri2_create_image_from_dri(disp, dri_image);
- }
- 
- static _EGLImage *
-@@ -2424,6 +2618,9 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
-    _EGLImageAttribs attrs;
-    tbm_surface_h tbm_surf;
-    tbm_surface_info_s info;
-+   _EGLImage *img;
-+   struct dri2_egl_image *dri2_img;
-+   __DRIimage *dri_image;
- 
-    tbm_surf = tpl_display_get_buffer_from_native_pixmap(dri2_dpy->tpl_dpy,
-                                                         (tpl_handle_t) _buffer);
-@@ -2454,7 +2651,21 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
-       return NULL;
-    }
- 
--   return dri2_create_image_tbm_surface(disp, ctx, tbm_surf);
-+   img = dri2_get_tbm_surf_egl_image(disp, ctx, tbm_surf);
-+   if (!img) {
-+      _eglError(EGL_BAD_PARAMETER, "dri2_create_image_wayland_wl_buffer_tizen");
-+      return NULL;
-+   }
-+   dri2_img = dri2_egl_image(img);
-+
-+   dri_image =
-+      dri2_dpy->image->fromPlanar(dri2_img->dri_image, attrs.PlaneWL, NULL);
-+   if (!dri_image) {
-+      _eglError(EGL_BAD_PARAMETER, "dri2_create_image_wayland_wl_buffer_tizen");
-+      return NULL;
-+   }
-+
-+   return dri2_create_image_from_dri(disp, dri_image);
- }
- #endif
- 
-@@ -3377,10 +3588,29 @@ dri2_destroy_image_khr(_EGLDisplay *disp, _EGLImage *image)
- {
-    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-    struct dri2_egl_image *dri2_img = dri2_egl_image(image);
-+#ifdef HAVE_TIZEN_PLATFORM
-+   _EGLResource *image_elem;
-+#endif
- 
-    dri2_dpy->image->destroyImage(dri2_img->dri_image);
-    free(dri2_img);
- 
-+#ifdef HAVE_TIZEN_PLATFORM
-+   /* Take the opportunity to destroy orphaned tbm surface _EGLImages */
-+   pthread_mutex_lock(&dri2_dpy->image_list_mutex);
-+   image_elem = dri2_dpy->orphan_image_list;
-+   dri2_dpy->orphan_image_list = NULL;
-+   pthread_mutex_unlock(&dri2_dpy->image_list_mutex);
-+
-+   while (image_elem) {
-+      dri2_img = dri2_egl_image((_EGLImage *) image_elem);
-+      image_elem = image_elem->Next;
-+
-+      dri2_dpy->image->destroyImage(dri2_img->dri_image);
-+      free(dri2_img);
-+   }
-+#endif
-+
-    return EGL_TRUE;
- }
- 
-diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
-index a8bfe45b1f5..546bc0a0dbc 100644
---- a/src/egl/drivers/dri2/egl_dri2.h
-+++ b/src/egl/drivers/dri2/egl_dri2.h
-@@ -268,6 +268,15 @@ struct dri2_egl_display
- 
- #ifdef HAVE_TIZEN_PLATFORM
-    tpl_display_t            *tpl_dpy;
-+   /*
-+    * The image_list_mutex protects the image_list and orphan_image_list. It
-+    * should never be held while calling a libtbm function as this may result
-+    * in a deadlock.
-+    */
-+   pthread_mutex_t           image_list_mutex;
-+   bool                      image_list_mutex_initialized;
-+   _EGLResource             *image_list;
-+   _EGLResource             *orphan_image_list;
- #endif
- };
- 
-@@ -413,6 +422,9 @@ struct dri2_egl_image
- {
-    _EGLImage   base;
-    __DRIimage *dri_image;
-+#ifdef HAVE_TIZEN_PLATFORM
-+   tbm_surface_h tbm_surf;
-+#endif
- };
- 
- struct dri2_egl_sync {
-diff --git a/src/egl/drivers/dri2/platform_tizen.c b/src/egl/drivers/dri2/platform_tizen.c
-index ad75c115d7e..49462152beb 100644
---- a/src/egl/drivers/dri2/platform_tizen.c
-+++ b/src/egl/drivers/dri2/platform_tizen.c
-@@ -891,6 +891,7 @@ dri2_initialize_tizen(_EGLDisplay *dpy)
- {
-    struct dri2_egl_display *dri2_dpy;
-    int i;
-+   int err;
- 
-    dri2_dpy = calloc(1, sizeof(*dri2_dpy));
-    if (!dri2_dpy)
-@@ -906,6 +907,11 @@ dri2_initialize_tizen(_EGLDisplay *dpy)
-       goto cleanup;
-    }
- 
-+   err = pthread_mutex_init(&dri2_dpy->image_list_mutex, NULL);
-+   if (err)
-+      goto cleanup;
-+   dri2_dpy->image_list_mutex_initialized = true;
-+
-    for (i = TIZEN_DRM_RENDER_MINOR_START; i <= TIZEN_DRM_RENDER_MINOR_MAX; i++) {
-       char *render_path;
- 
--- 
-2.25.1
-

+ 243 - 161
package/mesa3d/0030-dri-add-support-for-YUV-DRI-config.patch → package/mesa3d/0023-dri-add-support-for-YUV-DRI-config.patch

@@ -1,33 +1,31 @@
-From 389e1a41360160bf56182a87cc52b5df9dc1265d Mon Sep 17 00:00:00 2001
+From bfda2098179b9b79124d267b312948f5b9c7b5cf Mon Sep 17 00:00:00 2001
 From: Frank Binns <frank.binns@imgtec.com>
 Date: Fri, 22 Dec 2017 17:17:50 +0000
-Subject: [PATCH 30/67] dri: add support for YUV DRI config
+Subject: [PATCH 23/58] dri: add support for YUV DRI config
 
 This is prerequisite for adding support for EGL_EXT_yuv_surface.
 
 This also adds support for NV12 and NV21 EGL configs.
 ---
- include/GL/internal/dri_interface.h           | 42 ++++++++-
- src/gallium/frontends/dri/dri_screen.c        |  8 +-
- src/gallium/include/pipe/p_format.h           |  2 +
- src/mesa/drivers/dri/common/utils.c           | 88 +++++++++++++++++--
- src/mesa/drivers/dri/common/utils.h           |  3 +-
- src/mesa/drivers/dri/i915/intel_screen.c      |  8 +-
- src/mesa/drivers/dri/i965/brw_screen.c        | 12 ++-
- src/mesa/drivers/dri/nouveau/nouveau_screen.c |  4 +-
- src/mesa/drivers/dri/radeon/radeon_screen.c   |  4 +-
- src/mesa/main/format_info.py                  |  2 +-
- src/mesa/main/formats.c                       |  9 ++
- src/mesa/main/formats.csv                     |  2 +
- src/mesa/main/formats.h                       |  7 ++
- src/mesa/main/mtypes.h                        |  9 ++
- 14 files changed, 181 insertions(+), 19 deletions(-)
+ include/GL/internal/dri_interface.h     |  48 ++++++++-
+ src/gallium/frontends/dri/dri_screen.c  |   8 +-
+ src/gallium/frontends/dri/utils.c       | 133 ++++++++++++++++++++++--
+ src/gallium/frontends/dri/utils.h       |   3 +-
+ src/gallium/frontends/pvr/dri_support.h |   5 +
+ src/gallium/frontends/pvr/pvrutil.c     |  34 ++++++
+ src/gallium/include/pipe/p_format.h     |   9 ++
+ src/mesa/main/format_info.py            |   2 +-
+ src/mesa/main/formats.c                 |  13 +++
+ src/mesa/main/formats.csv               |   6 ++
+ src/mesa/main/formats.h                 |  15 +++
+ src/mesa/main/glconfig.h                |   9 ++
+ 12 files changed, 273 insertions(+), 12 deletions(-)
 
 diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
-index 16cc095ea29..4d5a1874dc2 100644
+index ef2f44fad02..24ccf864f74 100644
 --- a/include/GL/internal/dri_interface.h
 +++ b/include/GL/internal/dri_interface.h
-@@ -826,7 +826,13 @@ struct __DRIuseInvalidateExtensionRec {
+@@ -720,7 +720,13 @@ struct __DRIuseInvalidateExtensionRec {
  #define __DRI_ATTRIB_GREEN_SHIFT		51
  #define __DRI_ATTRIB_BLUE_SHIFT			52
  #define __DRI_ATTRIB_ALPHA_SHIFT		53
@@ -42,7 +40,7 @@ index 16cc095ea29..4d5a1874dc2 100644
  
  /* __DRI_ATTRIB_RENDER_TYPE */
  #define __DRI_ATTRIB_RGBA_BIT			0x01	
-@@ -834,6 +840,7 @@ struct __DRIuseInvalidateExtensionRec {
+@@ -728,6 +734,7 @@ struct __DRIuseInvalidateExtensionRec {
  #define __DRI_ATTRIB_LUMINANCE_BIT		0x04
  #define __DRI_ATTRIB_FLOAT_BIT			0x08
  #define __DRI_ATTRIB_UNSIGNED_FLOAT_BIT		0x10
@@ -50,7 +48,7 @@ index 16cc095ea29..4d5a1874dc2 100644
  
  /* __DRI_ATTRIB_CONFIG_CAVEAT */
  #define __DRI_ATTRIB_SLOW_BIT			0x01
-@@ -860,6 +867,39 @@ struct __DRIuseInvalidateExtensionRec {
+@@ -754,6 +761,39 @@ struct __DRIuseInvalidateExtensionRec {
  #define __DRI_ATTRIB_SWAP_COPY                  0x8062
  #define __DRI_ATTRIB_SWAP_UNDEFINED             0x8063
  
@@ -90,11 +88,24 @@ index 16cc095ea29..4d5a1874dc2 100644
  /**
   * This extension defines the core DRI functionality.
   *
+@@ -1214,6 +1254,12 @@ struct __DRIdri2ExtensionRec {
+ #define __DRI_IMAGE_FORMAT_ARGB4444     0x1018
+ #define __DRI_IMAGE_FORMAT_YVU444_PACK10_IMG 0x1019
+ #define __DRI_IMAGE_FORMAT_BGR888       0x101a
++#define __DRI_IMAGE_FORMAT_NV12         0x101b
++#define __DRI_IMAGE_FORMAT_NV21         0x101c
++#define __DRI_IMAGE_FORMAT_YU12         0x101d
++#define __DRI_IMAGE_FORMAT_YV12         0x101e
++#define __DRI_IMAGE_FORMAT_YVYU         0x101f
++#define __DRI_IMAGE_FORMAT_VYUY         0x1020
+ 
+ #define __DRI_IMAGE_USE_SHARE		0x0001
+ #define __DRI_IMAGE_USE_SCANOUT		0x0002
 diff --git a/src/gallium/frontends/dri/dri_screen.c b/src/gallium/frontends/dri/dri_screen.c
-index b565a1fe8ec..37a0d4add0c 100644
+index e68a8c19eec..903162aab8c 100644
 --- a/src/gallium/frontends/dri/dri_screen.c
 +++ b/src/gallium/frontends/dri/dri_screen.c
-@@ -324,7 +324,9 @@ dri_fill_in_modes(struct dri_screen *screen)
+@@ -273,7 +273,9 @@ dri_fill_in_modes(struct dri_screen *screen)
                                          depth_buffer_factor, back_buffer_modes,
                                          ARRAY_SIZE(back_buffer_modes),
                                          msaa_modes, 1,
@@ -105,7 +116,7 @@ index b565a1fe8ec..37a0d4add0c 100644
           configs = driConcatConfigs(configs, new_configs);
  
           /* Multi-sample configs without an accumulation buffer. */
-@@ -334,7 +336,9 @@ dri_fill_in_modes(struct dri_screen *screen)
+@@ -283,7 +285,9 @@ dri_fill_in_modes(struct dri_screen *screen)
                                             depth_buffer_factor, back_buffer_modes,
                                             ARRAY_SIZE(back_buffer_modes),
                                             msaa_modes+1, num_msaa_modes-1,
@@ -116,24 +127,11 @@ index b565a1fe8ec..37a0d4add0c 100644
              configs = driConcatConfigs(configs, new_configs);
           }
        }
-diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h
-index 0c93d7df6e2..fd653379b7a 100644
---- a/src/gallium/include/pipe/p_format.h
-+++ b/src/gallium/include/pipe/p_format.h
-@@ -513,6 +513,8 @@ enum pipe_format {
-    PIPE_FORMAT_R4G4B4X4_UNORM,
-    PIPE_FORMAT_B10G10R10X2_SNORM,
-    PIPE_FORMAT_R5G6B5_SRGB,
-+   PIPE_FORMAT_YUV420_2PLANE,
-+   PIPE_FORMAT_YVU420_2PLANE,
- 
-    PIPE_FORMAT_COUNT
- };
-diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c
-index a3f2bc57f46..d268dc41fbb 100644
---- a/src/mesa/drivers/dri/common/utils.c
-+++ b/src/mesa/drivers/dri/common/utils.c
-@@ -163,6 +163,21 @@ driGetRendererString( char * buffer, const char * hardware_name,
+diff --git a/src/gallium/frontends/dri/utils.c b/src/gallium/frontends/dri/utils.c
+index 9fb940cf12f..c27d150d7e5 100644
+--- a/src/gallium/frontends/dri/utils.c
++++ b/src/gallium/frontends/dri/utils.c
+@@ -108,6 +108,21 @@
   *                          This forces 32-bit color to have 24-bit depth, and
   *                          16-bit color to have 16-bit depth.
   *
@@ -155,7 +153,7 @@ index a3f2bc57f46..d268dc41fbb 100644
   * \returns
   * Pointer to any array of pointers to the \c __DRIconfig structures created
   * for the specified formats.  If there is an error, \c NULL is returned.
-@@ -175,7 +190,8 @@ driCreateConfigs(mesa_format format,
+@@ -120,7 +135,8 @@ driCreateConfigs(mesa_format format,
  		 unsigned num_depth_stencil_bits,
  		 const GLenum * db_modes, unsigned num_db_modes,
  		 const uint8_t * msaa_samples, unsigned num_msaa_modes,
@@ -165,7 +163,7 @@ index a3f2bc57f46..d268dc41fbb 100644
  {
     static const struct {
        uint32_t masks[4];
-@@ -214,6 +230,9 @@ driCreateConfigs(mesa_format format,
+@@ -159,6 +175,9 @@ driCreateConfigs(mesa_format format,
        /* MESA_FORMAT_RGBA_FLOAT16 */
        {{ 0, 0, 0, 0},
         { 0, 16, 32, 48 }},
@@ -175,7 +173,7 @@ index a3f2bc57f46..d268dc41fbb 100644
     };
  
     const uint32_t * masks;
-@@ -227,6 +246,11 @@ driCreateConfigs(mesa_format format,
+@@ -172,6 +191,11 @@ driCreateConfigs(mesa_format format,
     int green_bits;
     int blue_bits;
     int alpha_bits;
@@ -187,7 +185,7 @@ index a3f2bc57f46..d268dc41fbb 100644
     bool is_srgb;
     bool is_float;
  
-@@ -279,6 +303,33 @@ driCreateConfigs(mesa_format format,
+@@ -224,6 +248,78 @@ driCreateConfigs(mesa_format format,
        masks = format_table[8].masks;
        shifts = format_table[8].shifts;
        break;
@@ -217,11 +215,56 @@ index a3f2bc57f46..d268dc41fbb 100644
 +      yuv_num_planes = 2;
 +      yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT;
 +      yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
++      break;
++   case MESA_FORMAT_YUV420_3PLANE:
++      masks = format_table[11].masks;
++      shifts = format_table[11].shifts;
++      is_yuv = true; /* FIXME: This should come from formats_info.py */
++      yuv_order = __DRI_ATTRIB_YUV_ORDER_YUV_BIT;
++      yuv_num_planes = 3;
++      yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT;
++      yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
++      break;
++   case MESA_FORMAT_YVU420_3PLANE:
++      masks = format_table[11].masks;
++      shifts = format_table[11].shifts;
++      is_yuv = true; /* FIXME: This should come from formats_info.py */
++      yuv_order = __DRI_ATTRIB_YUV_ORDER_YVU_BIT;
++      yuv_num_planes = 3;
++      yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT;
++      yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
++      break;
++   case MESA_FORMAT_YCBCR_REV:
++      masks = format_table[11].masks;
++      shifts = format_table[11].shifts;
++      is_yuv = true; /* FIXME: This should come from formats_info.py */
++      yuv_order = __DRI_ATTRIB_YUV_ORDER_UYVY_BIT;
++      yuv_num_planes = 1;
++      yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_2_BIT;
++      yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
++      break;
++   case MESA_FORMAT_VYUY:
++      masks = format_table[11].masks;
++      shifts = format_table[11].shifts;
++      is_yuv = true; /* FIXME: This should come from formats_info.py */
++      yuv_order = __DRI_ATTRIB_YUV_ORDER_VYUY_BIT;
++      yuv_num_planes = 1;
++      yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_2_BIT;
++      yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
++      break;
++   case MESA_FORMAT_YVYU:
++      masks = format_table[11].masks;
++      shifts = format_table[11].shifts;
++      is_yuv = true; /* FIXME: This should come from formats_info.py */
++      yuv_order = __DRI_ATTRIB_YUV_ORDER_YVYU_BIT;
++      yuv_num_planes = 1;
++      yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_2_BIT;
++      yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
 +      break;
     default:
        fprintf(stderr, "[%s:%u] Unknown framebuffer type %s (%d).\n",
                __func__, __LINE__,
-@@ -334,8 +385,12 @@ driCreateConfigs(mesa_format format,
+@@ -279,8 +375,12 @@ driCreateConfigs(mesa_format format,
  		    modes->greenShift = shifts[1];
  		    modes->blueShift  = shifts[2];
  		    modes->alphaShift = shifts[3];
@@ -236,7 +279,7 @@ index a3f2bc57f46..d268dc41fbb 100644
  
  		    modes->accumRedBits   = 16 * j;
  		    modes->accumGreenBits = 16 * j;
-@@ -345,6 +400,8 @@ driCreateConfigs(mesa_format format,
+@@ -290,6 +390,8 @@ driCreateConfigs(mesa_format format,
  		    modes->stencilBits = stencil_bits[k];
  		    modes->depthBits = depth_bits[k];
  
@@ -245,7 +288,7 @@ index a3f2bc57f46..d268dc41fbb 100644
  		    if (db_modes[i] == __DRI_ATTRIB_SWAP_NONE) {
  		    	modes->doubleBufferMode = GL_FALSE;
  		        modes->swapMethod = __DRI_ATTRIB_SWAP_UNDEFINED;
-@@ -357,6 +414,13 @@ driCreateConfigs(mesa_format format,
+@@ -302,6 +404,13 @@ driCreateConfigs(mesa_format format,
  		    modes->samples = msaa_samples[h];
  
  		    modes->sRGBCapable = is_srgb;
@@ -259,7 +302,7 @@ index a3f2bc57f46..d268dc41fbb 100644
  		}
  	    }
  	}
-@@ -436,10 +500,14 @@ driGetConfigAttribIndex(const __DRIconfig *config,
+@@ -381,10 +490,14 @@ driGetConfigAttribIndex(const __DRIconfig *config,
          break;
      __ATTRIB(__DRI_ATTRIB_SAMPLES,			samples);
      case __DRI_ATTRIB_RENDER_TYPE:
@@ -278,7 +321,7 @@ index a3f2bc57f46..d268dc41fbb 100644
  	break;
      case __DRI_ATTRIB_CONFIG_CAVEAT:
  	if (config->modes.accumRedBits != 0)
-@@ -505,6 +573,12 @@ driGetConfigAttribIndex(const __DRIconfig *config,
+@@ -450,6 +563,12 @@ driGetConfigAttribIndex(const __DRIconfig *config,
      __ATTRIB(__DRI_ATTRIB_GREEN_SHIFT,			greenShift);
      __ATTRIB(__DRI_ATTRIB_BLUE_SHIFT,			blueShift);
      __ATTRIB(__DRI_ATTRIB_ALPHA_SHIFT,			alphaShift);
@@ -291,11 +334,11 @@ index a3f2bc57f46..d268dc41fbb 100644
      default:
          /* XXX log an error or smth */
          return GL_FALSE;
-diff --git a/src/mesa/drivers/dri/common/utils.h b/src/mesa/drivers/dri/common/utils.h
-index 7be0465c261..ebd98d9dc33 100644
---- a/src/mesa/drivers/dri/common/utils.h
-+++ b/src/mesa/drivers/dri/common/utils.h
-@@ -45,7 +45,8 @@ driCreateConfigs(mesa_format format,
+diff --git a/src/gallium/frontends/dri/utils.h b/src/gallium/frontends/dri/utils.h
+index c30c8faab54..8e2b5e9671a 100644
+--- a/src/gallium/frontends/dri/utils.h
++++ b/src/gallium/frontends/dri/utils.h
+@@ -43,7 +43,8 @@ driCreateConfigs(mesa_format format,
  		 unsigned num_depth_stencil_bits,
  		 const GLenum * db_modes, unsigned num_db_modes,
  		 const uint8_t * msaa_samples, unsigned num_msaa_modes,
@@ -305,123 +348,150 @@ index 7be0465c261..ebd98d9dc33 100644
  
  __DRIconfig **driConcatConfigs(__DRIconfig **a,
  			       __DRIconfig **b);
-diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c
-index 6135357c2a0..a94c6de0a06 100644
---- a/src/mesa/drivers/dri/i915/intel_screen.c
-+++ b/src/mesa/drivers/dri/i915/intel_screen.c
-@@ -1083,7 +1083,9 @@ intel_screen_make_configs(__DRIscreen *dri_screen)
-                                      num_depth_stencil_bits,
-                                      back_buffer_modes, 2,
-                                      singlesample_samples, 1,
--                                     false, false);
-+                                     false, false,
-+                                     __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
-+                                     __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
-       configs = driConcatConfigs(configs, new_configs);
-    }
- 
-@@ -1105,7 +1107,9 @@ intel_screen_make_configs(__DRIscreen *dri_screen)
-                                      depth_bits, stencil_bits, 1,
-                                      back_buffer_modes, 1,
-                                      singlesample_samples, 1,
--                                     true, false);
-+                                     true, false,
-+                                     __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
-+                                     __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
-       configs = driConcatConfigs(configs, new_configs);
-    }
- 
-diff --git a/src/mesa/drivers/dri/i965/brw_screen.c b/src/mesa/drivers/dri/i965/brw_screen.c
-index 56811110567..c450bae1054 100644
---- a/src/mesa/drivers/dri/i965/brw_screen.c
-+++ b/src/mesa/drivers/dri/i965/brw_screen.c
-@@ -2292,7 +2292,9 @@ brw_screen_make_configs(__DRIscreen *dri_screen)
-                                      num_depth_stencil_bits,
-                                      back_buffer_modes, 2,
-                                      singlesample_samples, 1,
--                                     false, false);
-+                                     false, false,
-+                                     __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
-+                                     __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
-       configs = driConcatConfigs(configs, new_configs);
-    }
- 
-@@ -2325,7 +2327,9 @@ brw_screen_make_configs(__DRIscreen *dri_screen)
-                                      depth_bits, stencil_bits, 1,
-                                      back_buffer_modes, 1,
-                                      singlesample_samples, 1,
--                                     true, false);
-+                                     true, false,
-+                                     __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
-+                                     __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
-       configs = driConcatConfigs(configs, new_configs);
-    }
+diff --git a/src/gallium/frontends/pvr/dri_support.h b/src/gallium/frontends/pvr/dri_support.h
+index 631410438fd..ca928cf9cef 100644
+--- a/src/gallium/frontends/pvr/dri_support.h
++++ b/src/gallium/frontends/pvr/dri_support.h
+@@ -92,6 +92,11 @@ typedef enum
+ #define PVRDRI_MESA_FORMAT_YVU420_2PLANE	8
+ #define PVRDRI_MESA_FORMAT_B8G8R8A8_SRGB	9
+ #define PVRDRI_MESA_FORMAT_R8G8B8A8_SRGB	10
++#define PVRDRI_MESA_FORMAT_YUV420_3PLANE	11
++#define PVRDRI_MESA_FORMAT_YVU420_3PLANE	12
++#define PVRDRI_MESA_FORMAT_YCBCR_REV		13
++#define PVRDRI_MESA_FORMAT_YVYU        	14
++#define PVRDRI_MESA_FORMAT_VYUY        	15
  
-@@ -2390,7 +2394,9 @@ brw_screen_make_configs(__DRIscreen *dri_screen)
-                                      back_buffer_modes, 1,
-                                      multisample_samples,
-                                      num_msaa_modes,
--                                     false, false);
-+                                     false, false,
-+                                     __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
-+                                     __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
-       configs = driConcatConfigs(configs, new_configs);
-    }
+ typedef struct __DRIimageRec __DRIimage;
  
-diff --git a/src/mesa/drivers/dri/nouveau/nouveau_screen.c b/src/mesa/drivers/dri/nouveau/nouveau_screen.c
-index c92efcd7b20..fc87d5eb395 100644
---- a/src/mesa/drivers/dri/nouveau/nouveau_screen.c
-+++ b/src/mesa/drivers/dri/nouveau/nouveau_screen.c
-@@ -79,7 +79,9 @@ nouveau_get_configs(uint32_t chipset)
- 					  ARRAY_SIZE(back_buffer_modes),
- 					  msaa_samples,
- 					  ARRAY_SIZE(msaa_samples),
--					  GL_TRUE, chipset < 0x10);
-+					  GL_TRUE, chipset < 0x10,
-+					  __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
-+					  __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
- 		assert(config);
- 
- 		configs = driConcatConfigs(configs, config);
-diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c
-index 3764a5d6538..f7628555b8f 100644
---- a/src/mesa/drivers/dri/radeon/radeon_screen.c
-+++ b/src/mesa/drivers/dri/radeon/radeon_screen.c
-@@ -838,7 +838,9 @@ __DRIconfig **radeonInitScreen2(__DRIscreen *psp)
- 				     ARRAY_SIZE(back_buffer_modes),
- 				     msaa_samples_array,
- 				     ARRAY_SIZE(msaa_samples_array),
--				     GL_TRUE, GL_FALSE);
-+				     GL_TRUE, GL_FALSE,
-+				     __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
-+				     __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
-       configs = driConcatConfigs(configs, new_configs);
-    }
+diff --git a/src/gallium/frontends/pvr/pvrutil.c b/src/gallium/frontends/pvr/pvrutil.c
+index 4bb114f64ef..2706b02d7bc 100644
+--- a/src/gallium/frontends/pvr/pvrutil.c
++++ b/src/gallium/frontends/pvr/pvrutil.c
+@@ -114,6 +114,16 @@ PVRDRIMesaFormatToMesaFormat(int pvrdri_mesa_format)
+       return MESA_FORMAT_B8G8R8A8_SRGB;
+    case PVRDRI_MESA_FORMAT_R8G8B8A8_SRGB:
+       return MESA_FORMAT_R8G8B8A8_SRGB;
++   case PVRDRI_MESA_FORMAT_YUV420_3PLANE:
++         return MESA_FORMAT_YUV420_3PLANE;
++   case PVRDRI_MESA_FORMAT_YVU420_3PLANE:
++         return MESA_FORMAT_YVU420_3PLANE;
++   case PVRDRI_MESA_FORMAT_YCBCR_REV:
++      return MESA_FORMAT_YCBCR_REV;
++   case PVRDRI_MESA_FORMAT_YVYU:
++      return MESA_FORMAT_YVYU;
++   case PVRDRI_MESA_FORMAT_VYUY:
++      return MESA_FORMAT_VYUY;
+    default:
+       __driUtilMessage("%s: Unknown format: %d", __func__, pvrdri_mesa_format);
+       break;
+@@ -170,6 +180,18 @@ PVRDRIFormatToFourCC(int dri_format)
+       return DRM_FORMAT_YVU444_PACK10_IMG;
+    case __DRI_IMAGE_FORMAT_BGR888:
+       return DRM_FORMAT_BGR888;
++   case __DRI_IMAGE_FORMAT_NV12:
++      return DRM_FORMAT_NV12;
++   case __DRI_IMAGE_FORMAT_NV21:
++      return DRM_FORMAT_NV21;
++   case __DRI_IMAGE_FORMAT_YU12:
++      return DRM_FORMAT_YUV420;
++   case __DRI_IMAGE_FORMAT_YV12:
++      return DRM_FORMAT_YVU420;
++   case __DRI_IMAGE_FORMAT_YVYU:
++      return DRM_FORMAT_YVYU;
++   case __DRI_IMAGE_FORMAT_VYUY:
++      return DRM_FORMAT_VYUY;
+    default:
+       __driUtilMessage("%s: Unknown format: %d", __func__, dri_format);
+       break;
+@@ -226,6 +248,18 @@ PVRDRIFourCCToDRIFormat(int iFourCC)
+       return __DRI_IMAGE_FORMAT_YVU444_PACK10_IMG;
+    case DRM_FORMAT_BGR888:
+       return __DRI_IMAGE_FORMAT_BGR888;
++   case DRM_FORMAT_NV12:
++      return __DRI_IMAGE_FORMAT_NV12;
++   case DRM_FORMAT_NV21:
++      return __DRI_IMAGE_FORMAT_NV21;
++   case DRM_FORMAT_YUV420:
++      return __DRI_IMAGE_FORMAT_YU12;
++   case DRM_FORMAT_YVU420:
++      return __DRI_IMAGE_FORMAT_YV12;
++   case DRM_FORMAT_YVYU:
++      return __DRI_IMAGE_FORMAT_YVYU;
++   case DRM_FORMAT_VYUY:
++      return __DRI_IMAGE_FORMAT_VYUY;
+    default:
+       __driUtilMessage("%s: Unknown format: %d", __func__, iFourCC);
+       break;
+diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h
+index 7dcbe7bb42b..7436f10dcf3 100644
+--- a/src/gallium/include/pipe/p_format.h
++++ b/src/gallium/include/pipe/p_format.h
+@@ -178,6 +178,8 @@ enum pipe_format {
+    PIPE_FORMAT_L16_UNORM,   /**< ushort luminance */
+    PIPE_FORMAT_UYVY,
+    PIPE_FORMAT_YUYV,
++   PIPE_FORMAT_YVYU,
++   PIPE_FORMAT_VYUY,
+    PIPE_FORMAT_Z16_UNORM,
+    PIPE_FORMAT_Z16_UNORM_S8_UINT,
+    PIPE_FORMAT_Z32_UNORM,
+@@ -520,6 +522,11 @@ enum pipe_format {
+    PIPE_FORMAT_R4G4B4X4_UNORM,
+    PIPE_FORMAT_B10G10R10X2_SNORM,
+    PIPE_FORMAT_R5G6B5_SRGB,
++   PIPE_FORMAT_YUV420_2PLANE,
++   PIPE_FORMAT_YVU420_2PLANE,
++
++   PIPE_FORMAT_YUV420_3PLANE,
++   PIPE_FORMAT_YVU420_3PLANE,
  
+    PIPE_FORMAT_COUNT
+ };
+@@ -622,6 +629,8 @@ pipe_format_to_chroma_format(enum pipe_format format)
+          return PIPE_VIDEO_CHROMA_FORMAT_420;
+       case PIPE_FORMAT_UYVY:
+       case PIPE_FORMAT_YUYV:
++      case PIPE_FORMAT_VYUY:
++      case PIPE_FORMAT_YVYU:
+       case PIPE_FORMAT_YV16:
+       case PIPE_FORMAT_Y8_U8_V8_422_UNORM:
+       case PIPE_FORMAT_Y8_U8V8_422_UNORM:
 diff --git a/src/mesa/main/format_info.py b/src/mesa/main/format_info.py
-index edc0324e60b..d58403ea85e 100644
+index 37b46a27c31..9aa1bb9fc63 100644
 --- a/src/mesa/main/format_info.py
 +++ b/src/mesa/main/format_info.py
-@@ -29,7 +29,7 @@ import sys
+@@ -27,7 +27,7 @@ import sys
  def get_gl_base_format(fmat):
     if fmat.name == 'MESA_FORMAT_NONE':
        return 'GL_NONE'
 -   elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV']:
-+   elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV', 'MESA_FORMAT_YUV420_2PLANE', 'MESA_FORMAT_YVU420_2PLANE']:
++   elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV', 'MESA_FORMAT_YUV420_2PLANE', 'MESA_FORMAT_YVU420_2PLANE', 'MESA_FORMAT_YUV420_3PLANE', 'MESA_FORMAT_YVU420_3PLANE', 'MESA_FORMAT_YVYU', 'MESA_FORMAT_VYUY']:
        return 'GL_YCBCR_MESA'
     elif fmat.has_channel('r'):
        if fmat.has_channel('g'):
 diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
-index 9cd026f7507..f81caeceff4 100644
+index 9cd026f7507..c63e1677717 100644
 --- a/src/mesa/main/formats.c
 +++ b/src/mesa/main/formats.c
-@@ -1452,6 +1452,15 @@ _mesa_format_matches_format_and_type(mesa_format mformat,
+@@ -1024,6 +1024,8 @@ _mesa_uncompressed_format_to_type_and_comps(mesa_format format,
+ 
+    case MESA_FORMAT_YCBCR:
+    case MESA_FORMAT_YCBCR_REV:
++   case MESA_FORMAT_YVYU:
++   case MESA_FORMAT_VYUY:
+    case MESA_FORMAT_RG_RB_UNORM8:
+    case MESA_FORMAT_GR_BR_UNORM8:
+       *datatype = GL_UNSIGNED_SHORT;
+@@ -1452,6 +1454,17 @@ _mesa_format_matches_format_and_type(mesa_format mformat,
     if (error)
        *error = GL_NO_ERROR;
  
 +   switch (mformat) {
 +   case MESA_FORMAT_YUV420_2PLANE:
 +   case MESA_FORMAT_YVU420_2PLANE:
++   case MESA_FORMAT_YUV420_3PLANE:
++   case MESA_FORMAT_YVU420_3PLANE:
 +      return false;
 +
 +   default:
@@ -432,41 +502,53 @@ index 9cd026f7507..f81caeceff4 100644
        if (error)
           *error = GL_INVALID_ENUM;
 diff --git a/src/mesa/main/formats.csv b/src/mesa/main/formats.csv
-index 21cdea26e08..b2d476577e0 100644
+index 21cdea26e08..d1532b19b06 100644
 --- a/src/mesa/main/formats.csv
 +++ b/src/mesa/main/formats.csv
-@@ -92,6 +92,8 @@ MESA_FORMAT_A2R10G10B10_UNORM             , packed, 1, 1, 1, un2 , un10, un10, u
+@@ -92,6 +92,12 @@ MESA_FORMAT_A2R10G10B10_UNORM             , packed, 1, 1, 1, un2 , un10, un10, u
  
  MESA_FORMAT_YCBCR                         , other , 1, 1, 1, x16 ,     ,     ,     , xyzw, yuv
  MESA_FORMAT_YCBCR_REV                     , other , 1, 1, 1, x16 ,     ,     ,     , xyzw, yuv
 +MESA_FORMAT_YUV420_2PLANE                 , other , 1, 1, 1, x8  ,     ,     ,     , y___, yuv
 +MESA_FORMAT_YVU420_2PLANE                 , other , 1, 1, 1, x8  ,     ,     ,     , y___, yuv
++MESA_FORMAT_YUV420_3PLANE                 , other , 1, 1, 1, x8  ,     ,     ,     , y___, yuv
++MESA_FORMAT_YVU420_3PLANE                 , other , 1, 1, 1, x8  ,     ,     ,     , y___, yuv
++MESA_FORMAT_YVYU                          , other , 1, 1, 1, x16 ,     ,     ,     , xyzw, yuv
++MESA_FORMAT_VYUY                          , other , 1, 1, 1, x16 ,     ,     ,     , xyzw, yuv
  
  MESA_FORMAT_RG_RB_UNORM8                  , other , 2, 1, 1, x16 ,     ,     ,     , xyz1, rgb
  MESA_FORMAT_GR_BR_UNORM8                  , other , 2, 1, 1, x16 ,     ,     ,     , xyz1, rgb
 diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
-index 508c9c342d2..0e778d64467 100644
+index 18139680ef2..37a53949fae 100644
 --- a/src/mesa/main/formats.h
 +++ b/src/mesa/main/formats.h
-@@ -617,6 +617,13 @@ typedef enum pipe_format mesa_format;
+@@ -617,6 +617,21 @@ typedef enum pipe_format mesa_format;
  #define MESA_FORMAT_ATC_RGB                      PIPE_FORMAT_ATC_RGB
  #define MESA_FORMAT_ATC_RGBA_EXPLICIT            PIPE_FORMAT_ATC_RGBA_EXPLICIT
  #define MESA_FORMAT_ATC_RGBA_INTERPOLATED        PIPE_FORMAT_ATC_RGBA_INTERPOLATED
++#define MESA_FORMAT_YVYU                         PIPE_FORMAT_YVYU
++#define MESA_FORMAT_VYUY                         PIPE_FORMAT_VYUY
 +
 +#define HAVE_MESA_FORMAT_YUV420_2PLANE
 +#define MESA_FORMAT_YUV420_2PLANE                PIPE_FORMAT_YUV420_2PLANE
 +
 +#define HAVE_MESA_FORMAT_YVU420_2PLANE
 +#define MESA_FORMAT_YVU420_2PLANE                PIPE_FORMAT_YVU420_2PLANE
++
++#define HAVE_MESA_FORMAT_YUV420_3PLANE
++#define MESA_FORMAT_YUV420_3PLANE                PIPE_FORMAT_YUV420_3PLANE
++
++#define HAVE_MESA_FORMAT_YVU420_3PLANE
++#define MESA_FORMAT_YVU420_3PLANE                PIPE_FORMAT_YVU420_3PLANE
 +
  #define MESA_FORMAT_COUNT                        PIPE_FORMAT_COUNT
  
  /* Packed to array format adapters */
-diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
-index 32528a5f16b..8f77d4c58dd 100644
---- a/src/mesa/main/mtypes.h
-+++ b/src/mesa/main/mtypes.h
-@@ -158,6 +158,7 @@ _mesa_varying_slot_in_fs(gl_varying_slot slot)
+diff --git a/src/mesa/main/glconfig.h b/src/mesa/main/glconfig.h
+index 80414d5d78e..d54a4f75cfd 100644
+--- a/src/mesa/main/glconfig.h
++++ b/src/mesa/main/glconfig.h
+@@ -10,6 +10,7 @@
   */
  struct gl_config
  {
@@ -474,7 +556,7 @@ index 32528a5f16b..8f77d4c58dd 100644
     GLboolean floatMode;
     GLuint doubleBufferMode;
     GLuint stereoMode;
-@@ -179,6 +180,14 @@ struct gl_config
+@@ -31,6 +32,14 @@ struct gl_config
  
     /* EXT_framebuffer_sRGB */
     GLint sRGBCapable;

+ 25 - 25
package/mesa3d/0031-egl-add-support-for-EXT_yuv_surface.patch → package/mesa3d/0024-egl-add-support-for-EXT_yuv_surface.patch

@@ -1,7 +1,7 @@
-From 4e65ae659b775259b4f703eb563feffc623c17b7 Mon Sep 17 00:00:00 2001
+From c8cf03b4aee762cca6498be16156a914d62d4895 Mon Sep 17 00:00:00 2001
 From: Frank Binns <frank.binns@imgtec.com>
 Date: Wed, 20 Dec 2017 17:41:38 +0000
-Subject: [PATCH 31/67] egl: add support for EXT_yuv_surface
+Subject: [PATCH 24/58] egl: add support for EXT_yuv_surface
 
 This implements EXT_yuv_surface but doesn't expose it for any platform.
 ---
@@ -14,10 +14,10 @@ This implements EXT_yuv_surface but doesn't expose it for any platform.
  6 files changed, 348 insertions(+), 5 deletions(-)
 
 diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
-index 4d5a1874dc2..62517e4004a 100644
+index 24ccf864f74..b1b5937a012 100644
 --- a/include/GL/internal/dri_interface.h
 +++ b/include/GL/internal/dri_interface.h
-@@ -1154,6 +1154,7 @@ enum dri_loader_cap {
+@@ -1013,6 +1013,7 @@ enum dri_loader_cap {
      */
     DRI_LOADER_CAP_RGBA_ORDERING,
     DRI_LOADER_CAP_FP16,
@@ -26,10 +26,10 @@ index 4d5a1874dc2..62517e4004a 100644
  
  struct __DRIdri2LoaderExtensionRec {
 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index db993f8f059..ee3bcda4d12 100644
+index d3a8fbe4ef7..b8e7bb08619 100644
 --- a/src/egl/drivers/dri2/egl_dri2.c
 +++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -306,6 +306,7 @@ static const EGLint dri2_to_egl_attribute_map[__DRI_ATTRIB_MAX] = {
+@@ -302,6 +302,7 @@ static const EGLint dri2_to_egl_attribute_map[__DRI_ATTRIB_MAX] = {
     [__DRI_ATTRIB_MAX_SWAP_INTERVAL]     = EGL_MAX_SWAP_INTERVAL,
     [__DRI_ATTRIB_MIN_SWAP_INTERVAL]     = EGL_MIN_SWAP_INTERVAL,
     [__DRI_ATTRIB_YINVERTED]             = EGL_Y_INVERTED_NOK,
@@ -37,7 +37,7 @@ index db993f8f059..ee3bcda4d12 100644
  };
  
  const __DRIconfig *
-@@ -432,6 +433,8 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
+@@ -428,6 +429,8 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
              value = EGL_RGB_BUFFER;
           else if (value & __DRI_ATTRIB_LUMINANCE_BIT)
              value = EGL_LUMINANCE_BUFFER;
@@ -46,7 +46,7 @@ index db993f8f059..ee3bcda4d12 100644
           else
              return NULL;
           base.ColorBufferType = value;
-@@ -536,6 +539,73 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
+@@ -532,6 +535,73 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
           if (disp->Extensions.KHR_mutable_render_buffer)
              surface_type |= EGL_MUTABLE_RENDER_BUFFER_BIT_KHR;
           break;
@@ -120,7 +120,7 @@ index db993f8f059..ee3bcda4d12 100644
        default:
           key = dri2_to_egl_attribute_map[attrib];
           if (key != 0)
-@@ -583,6 +653,17 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
+@@ -570,6 +640,17 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
     base.RenderableType = disp->ClientAPIs;
     base.Conformant = disp->ClientAPIs;
  
@@ -138,7 +138,7 @@ index db993f8f059..ee3bcda4d12 100644
     base.MinSwapInterval = dri2_dpy->min_swap_interval;
     base.MaxSwapInterval = dri2_dpy->max_swap_interval;
  
-@@ -1014,6 +1095,8 @@ dri2_setup_screen(_EGLDisplay *disp)
+@@ -1022,6 +1103,8 @@ dri2_setup_screen(_EGLDisplay *disp)
     disp->Extensions.EXT_protected_surface =
        dri2_renderer_query_integer(dri2_dpy,
                                    __DRI2_RENDERER_HAS_PROTECTED_CONTENT);
@@ -148,10 +148,10 @@ index db993f8f059..ee3bcda4d12 100644
  
  void
 diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
-index e2a7797d73e..6d7f62c6851 100644
+index 7e2542bae6d..b7e0d0f53a5 100644
 --- a/src/egl/main/eglapi.c
 +++ b/src/egl/main/eglapi.c
-@@ -512,6 +512,7 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
+@@ -506,6 +506,7 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
     _EGL_CHECK_EXTENSION(EXT_surface_CTA861_3_metadata);
     _EGL_CHECK_EXTENSION(EXT_surface_SMPTE2086_metadata);
     _EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage);
@@ -160,10 +160,10 @@ index e2a7797d73e..6d7f62c6851 100644
     _EGL_CHECK_EXTENSION(IMG_context_priority);
  
 diff --git a/src/egl/main/eglconfig.c b/src/egl/main/eglconfig.c
-index 17d8f3555d4..5e56948ab72 100644
+index eff7733c071..bc4313adcc5 100644
 --- a/src/egl/main/eglconfig.c
 +++ b/src/egl/main/eglconfig.c
-@@ -258,6 +258,24 @@ static const struct {
+@@ -259,6 +259,24 @@ static const struct {
     { EGL_COLOR_COMPONENT_TYPE_EXT,  ATTRIB_TYPE_ENUM,
                                      ATTRIB_CRITERION_EXACT,
                                      EGL_COLOR_COMPONENT_TYPE_FIXED_EXT },
@@ -188,7 +188,7 @@ index 17d8f3555d4..5e56948ab72 100644
  };
  
  
-@@ -296,6 +314,28 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching)
+@@ -297,6 +315,28 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching)
              if (val > 1 || val < 0)
                 valid = EGL_FALSE;
              break;
@@ -217,7 +217,7 @@ index 17d8f3555d4..5e56948ab72 100644
           default:
              if (val < 0)
                 valid = EGL_FALSE;
-@@ -318,7 +358,43 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching)
+@@ -319,7 +359,43 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching)
                 valid = EGL_FALSE;
              break;
           case EGL_COLOR_BUFFER_TYPE:
@@ -262,7 +262,7 @@ index 17d8f3555d4..5e56948ab72 100644
                 valid = EGL_FALSE;
              break;
           case EGL_COLOR_COMPONENT_TYPE_EXT:
-@@ -404,6 +480,11 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching)
+@@ -405,6 +481,11 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching)
        if (conf->LuminanceSize + conf->AlphaSize != conf->BufferSize)
           valid = EGL_FALSE;
        break;
@@ -274,7 +274,7 @@ index 17d8f3555d4..5e56948ab72 100644
     }
     if (!valid) {
        _eglLog(_EGL_DEBUG, "conflicting color buffer type and channel sizes");
-@@ -430,6 +511,88 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching)
+@@ -431,6 +512,88 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching)
        return EGL_FALSE;
     }
  
@@ -363,7 +363,7 @@ index 17d8f3555d4..5e56948ab72 100644
     return valid;
  }
  
-@@ -509,6 +672,28 @@ _eglIsConfigAttribValid(_EGLConfig *conf, EGLint attr)
+@@ -510,6 +673,28 @@ _eglIsConfigAttribValid(_EGLConfig *conf, EGLint attr)
        return conf->Display->Extensions.ANDROID_framebuffer_target;
     case EGL_RECORDABLE_ANDROID:
        return conf->Display->Extensions.ANDROID_recordable;
@@ -392,7 +392,7 @@ index 17d8f3555d4..5e56948ab72 100644
     default:
        break;
     }
-@@ -543,6 +728,9 @@ _eglParseConfigAttribList(_EGLConfig *conf, _EGLDisplay *disp,
+@@ -544,6 +729,9 @@ _eglParseConfigAttribList(_EGLConfig *conf, _EGLDisplay *disp,
        if (!_eglIsConfigAttribValid(conf, attr))
           return EGL_FALSE;
  
@@ -402,7 +402,7 @@ index 17d8f3555d4..5e56948ab72 100644
        _eglSetConfigKey(conf, attr, val);
     }
  
-@@ -617,6 +805,7 @@ _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
+@@ -618,6 +806,7 @@ _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
  
     /* the enum values have the desired ordering */
     STATIC_ASSERT(EGL_RGB_BUFFER < EGL_LUMINANCE_BUFFER);
@@ -410,7 +410,7 @@ index 17d8f3555d4..5e56948ab72 100644
     val1 = conf1->ColorBufferType - conf2->ColorBufferType;
     if (val1)
        return val1;
-@@ -636,16 +825,42 @@ _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
+@@ -637,16 +826,42 @@ _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
              val1 += conf1->BlueSize;
              val2 += conf2->BlueSize;
           }
@@ -457,7 +457,7 @@ index 17d8f3555d4..5e56948ab72 100644
        }
     }
     else {
-@@ -664,6 +879,36 @@ _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
+@@ -665,6 +880,36 @@ _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
           return (val1 - val2);
     }
  
@@ -525,10 +525,10 @@ index 1f2a4008f12..d4a748970b5 100644
     default:
        return -1;
 diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
-index 0a7366b7c07..020529c57e2 100644
+index d95c7b9144a..f59d43325a6 100644
 --- a/src/egl/main/egldisplay.h
 +++ b/src/egl/main/egldisplay.h
-@@ -112,6 +112,7 @@ struct _egl_extensions
+@@ -113,6 +113,7 @@ struct _egl_extensions
     EGLBoolean EXT_surface_CTA861_3_metadata;
     EGLBoolean EXT_surface_SMPTE2086_metadata;
     EGLBoolean EXT_swap_buffers_with_damage;

+ 4 - 4
package/mesa3d/0032-dri-add-missing-__DRI_IMAGE_COMPONENTS-define-for-EG.patch → package/mesa3d/0025-dri-add-missing-__DRI_IMAGE_COMPONENTS-define-for-EG.patch

@@ -1,7 +1,7 @@
-From 5a22280c13e98932ad45fa6a131217abdffd16b4 Mon Sep 17 00:00:00 2001
+From 77e3d423ff883b892fb146f5b8cb3dc8869dcc22 Mon Sep 17 00:00:00 2001
 From: Frank Binns <frank.binns@imgtec.com>
 Date: Fri, 2 Feb 2018 16:59:52 +0000
-Subject: [PATCH 32/67] dri: add missing __DRI_IMAGE_COMPONENTS define for
+Subject: [PATCH 25/58] dri: add missing __DRI_IMAGE_COMPONENTS define for
  EGL_TEXTURE_EXTERNAL_WL
 
 The __DRI_IMAGE_COMPONENTS defines have been re-ordered, to make it
@@ -12,10 +12,10 @@ existing ones.
  1 file changed, 3 insertions(+), 2 deletions(-)
 
 diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
-index 62517e4004a..6490f6e80e2 100644
+index b1b5937a012..80acaf3a7b1 100644
 --- a/include/GL/internal/dri_interface.h
 +++ b/include/GL/internal/dri_interface.h
-@@ -1461,11 +1461,12 @@ struct __DRIdri2ExtensionRec {
+@@ -1312,11 +1312,12 @@ struct __DRIdri2ExtensionRec {
  #define __DRI_IMAGE_COMPONENTS_Y_U_V	0x3003
  #define __DRI_IMAGE_COMPONENTS_Y_UV	0x3004
  #define __DRI_IMAGE_COMPONENTS_Y_XUXV	0x3005

+ 13 - 13
package/mesa3d/0033-egl-wayland-expose-EXT_yuv_surface-support.patch → package/mesa3d/0026-egl-wayland-expose-EXT_yuv_surface-support.patch

@@ -1,7 +1,7 @@
-From 3d47285da42c76fe36ae67c62e8d0a0d76d18da0 Mon Sep 17 00:00:00 2001
+From 61658c083ff6704357075e857923a2901301f642 Mon Sep 17 00:00:00 2001
 From: Frank Binns <frank.binns@imgtec.com>
 Date: Thu, 11 Jan 2018 09:38:47 +0000
-Subject: [PATCH 33/67] egl/wayland: expose EXT_yuv_surface support
+Subject: [PATCH 26/58] egl/wayland: expose EXT_yuv_surface support
 
 This adds support for YUYV configs.
 ---
@@ -10,10 +10,10 @@ This adds support for YUYV configs.
  2 files changed, 15 insertions(+), 1 deletion(-)
 
 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index ee3bcda4d12..d511d73f2ed 100644
+index b8e7bb08619..635c445d234 100644
 --- a/src/egl/drivers/dri2/egl_dri2.c
 +++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -2769,6 +2769,7 @@ static const struct wl_drm_components_descriptor {
+@@ -2420,6 +2420,7 @@ static const struct wl_drm_components_descriptor {
     { __DRI_IMAGE_COMPONENTS_Y_U_V, EGL_TEXTURE_Y_U_V_WL, 3 },
     { __DRI_IMAGE_COMPONENTS_Y_UV, EGL_TEXTURE_Y_UV_WL, 2 },
     { __DRI_IMAGE_COMPONENTS_Y_XUXV, EGL_TEXTURE_Y_XUXV_WL, 2 },
@@ -22,10 +22,10 @@ index ee3bcda4d12..d511d73f2ed 100644
  
  static _EGLImage *
 diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
-index a096d9500c1..72456d5d748 100644
+index 185c52c110f..10a90ff963f 100644
 --- a/src/egl/drivers/dri2/platform_wayland.c
 +++ b/src/egl/drivers/dri2/platform_wayland.c
-@@ -135,6 +135,13 @@ static const struct dri2_wl_visual {
+@@ -151,6 +151,13 @@ static const struct dri2_wl_visual {
        { 11, 5, 0, -1 },
        { 5, 6, 5, 0 },
     },
@@ -38,16 +38,16 @@ index a096d9500c1..72456d5d748 100644
 +   },
  };
  
- static_assert(ARRAY_SIZE(dri2_wl_visuals) <= EGL_DRI2_MAX_FORMATS,
-@@ -958,6 +965,7 @@ dri2_wl_get_capability(void *loaderPrivate, enum dri_loader_cap cap)
+ static int
+@@ -1431,6 +1438,7 @@ dri2_wl_get_capability(void *loaderPrivate, enum dri_loader_cap cap)
  {
     switch (cap) {
     case DRI_LOADER_CAP_FP16:
 +   case DRI_LOADER_CAP_YUV_SURFACE_IMG:
        return 1;
-    default:
-       return 0;
-@@ -1552,6 +1560,7 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
+    case DRI_LOADER_CAP_RGBA_ORDERING:
+       return 1;
+@@ -2135,6 +2143,7 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
     struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
     unsigned int format_count[ARRAY_SIZE(dri2_wl_visuals)] = { 0 };
     unsigned int count = 0;
@@ -55,8 +55,8 @@ index a096d9500c1..72456d5d748 100644
     bool assigned;
  
     for (unsigned i = 0; dri2_dpy->driver_configs[i]; i++) {
-@@ -1563,8 +1572,12 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
-          if (!BITSET_TEST(dri2_dpy->formats, j))
+@@ -2146,8 +2155,12 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
+          if (!BITSET_TEST(dri2_dpy->formats.formats_bitmap, j))
              continue;
  
 +         surface_type = EGL_WINDOW_BIT;

+ 0 - 121
package/mesa3d/0027-egl-tizen-support-DRI-driver-handling-of-swap-preser.patch

@@ -1,121 +0,0 @@
-From 48fe256681d8d7d3892393b102bf0a3ebc697c51 Mon Sep 17 00:00:00 2001
-From: Frank Binns <frank.binns@imgtec.com>
-Date: Mon, 18 Dec 2017 19:22:50 +0000
-Subject: [PATCH 27/67] egl/tizen: support DRI driver handling of swap preserve
-
-This adds a new flag (__DRI_IMAGE_BUFFER_PREV) to the __DRIimageBufferMask
-enum that allows a DRI driver to request the previous back buffer. This
-will only be returned if the swap behaviour is EGL_BUFFER_PRESERVED and
-should result in the DRI driver preserving the previous content instead of
-this being done in the platform code. For hardware that supports it, this
-should avoid a blit being performed every frame, although this will still
-be necessary under certain conditions, e.g. an empty swap.
----
- include/GL/internal/dri_interface.h   |  3 +++
- src/egl/drivers/dri2/platform_tizen.c | 29 +++++++++++++++++++++------
- 2 files changed, 26 insertions(+), 6 deletions(-)
-
-diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
-index b197092939f..16cc095ea29 100644
---- a/include/GL/internal/dri_interface.h
-+++ b/include/GL/internal/dri_interface.h
-@@ -2073,12 +2073,15 @@ enum __DRIimageBufferMask {
-     * OpenGL ES API and little change to the SurfaceFlinger API.
-     */
-    __DRI_IMAGE_BUFFER_SHARED = (1 << 2),
-+#define DRI_IMAGE_HAS_BUFFER_PREV
-+   __DRI_IMAGE_BUFFER_PREV = (1 << 31),
- };
- 
- struct __DRIimageList {
-    uint32_t image_mask;
-    __DRIimage *back;
-    __DRIimage *front;
-+   __DRIimage *prev;
- };
- 
- #define __DRI_IMAGE_LOADER "DRI_IMAGE_LOADER"
-diff --git a/src/egl/drivers/dri2/platform_tizen.c b/src/egl/drivers/dri2/platform_tizen.c
-index 49462152beb..2bc9b3e7c64 100644
---- a/src/egl/drivers/dri2/platform_tizen.c
-+++ b/src/egl/drivers/dri2/platform_tizen.c
-@@ -147,7 +147,8 @@ create_image_from_native(struct dri2_egl_surface *dri2_surf,
- }
- 
- static int
--get_back_bo(struct dri2_egl_surface *dri2_surf, bool allow_update)
-+get_back_bo(struct dri2_egl_surface *dri2_surf, bool allow_update,
-+            bool allow_preserve)
- {
-    struct dri2_egl_display *dri2_dpy =
-       dri2_egl_display(dri2_surf->base.Resource.Display);
-@@ -277,7 +278,7 @@ get_back_bo(struct dri2_egl_surface *dri2_surf, bool allow_update)
-    dri2_surf->back->locked = true;
- 
-    if (dri2_surf->base.SwapBehavior == EGL_BUFFER_PRESERVED &&
--       dri2_surf->current) {
-+       allow_preserve && dri2_surf->current) {
-       _EGLContext *ctx = _eglGetCurrentContext();
-       struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
- 
-@@ -609,7 +610,7 @@ dri2_tizen_swap_buffers_with_damage(_EGLDisplay *dpy, _EGLSurface *draw,
-     * Make sure we have a back buffer in case we're swapping without ever
-     * rendering.
-     */
--   if (get_back_bo(dri2_surf, false) < 0) {
-+   if (get_back_bo(dri2_surf, false, true) < 0) {
-       _eglError(EGL_BAD_ALLOC, "DRI2: failed to get back buffer");
-       return EGL_FALSE;
-    }
-@@ -673,7 +674,7 @@ dri2_tizen_query_buffer_age(_EGLDisplay *dpy, _EGLSurface *surface)
- {
-    struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surface);
- 
--   if (get_back_bo(dri2_surf, false) < 0) {
-+   if (get_back_bo(dri2_surf, false, true) < 0) {
-       _eglError(EGL_BAD_ALLOC, "DRI2: failed to get back buffer");
-       return -1;
-    }
-@@ -748,14 +749,22 @@ dri2_tizen_get_buffers(__DRIdrawable *driDrawable,
-    buffers->image_mask = 0;
-    buffers->front = NULL;
-    buffers->back = NULL;
-+   buffers->prev = NULL;
- 
-    if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT)
-       if (get_front_bo(dri2_surf) < 0)
-          return 0;
- 
--   if (buffer_mask & __DRI_IMAGE_BUFFER_BACK)
--      if (get_back_bo(dri2_surf, true) < 0)
-+   if (buffer_mask & __DRI_IMAGE_BUFFER_BACK) {
-+      /*
-+       * The DRI driver has requested the previous buffer so it will take care
-+       * of preserving the previous content.
-+       */
-+      bool allow_preserve = !(buffer_mask & __DRI_IMAGE_BUFFER_PREV);
-+
-+      if (get_back_bo(dri2_surf, true, allow_preserve) < 0)
-          return 0;
-+   }
- 
-    if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT) {
-       buffers->front = dri2_surf->front;
-@@ -767,6 +776,14 @@ dri2_tizen_get_buffers(__DRIdrawable *driDrawable,
-       buffers->image_mask |= __DRI_IMAGE_BUFFER_BACK;
-    }
- 
-+   if (buffer_mask & __DRI_IMAGE_BUFFER_PREV) {
-+      if (dri2_surf->base.SwapBehavior == EGL_BUFFER_PRESERVED &&
-+          dri2_surf->current) {
-+         buffers->prev = dri2_surf->current->dri_image;
-+         buffers->image_mask |= __DRI_IMAGE_BUFFER_PREV;
-+      }
-+   }
-+
-    return 1;
- }
- 
--- 
-2.25.1
-

+ 7 - 7
package/mesa3d/0035-gbm-add-some-new-GBM-formats.patch → package/mesa3d/0027-gbm-add-some-new-GBM-formats.patch

@@ -1,7 +1,7 @@
-From 5bd42e648dc9068392641436b70fc28a00689c8e Mon Sep 17 00:00:00 2001
+From c87b779348cd6d7be932c97875086770a545f327 Mon Sep 17 00:00:00 2001
 From: Silvestrs Timofejevs <silvestrs.timofejevs@imgtec.com>
 Date: Thu, 30 Aug 2018 13:48:53 +0100
-Subject: [PATCH 35/67] gbm: add some new GBM formats
+Subject: [PATCH 27/58] gbm: add some new GBM formats
 
 GBM_FORMAT_ARGB4444
 GBM_FORMAT_BGR888
@@ -13,10 +13,10 @@ GBM_FORMAT_YVU444_PACK10_IMG
  2 files changed, 18 insertions(+)
 
 diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
-index 2aa9c7c41ad..5acb15b516f 100644
+index fc0bbf5fcf9..17594589f56 100644
 --- a/src/gbm/backends/dri/gbm_dri.c
 +++ b/src/gbm/backends/dri/gbm_dri.c
-@@ -514,11 +514,21 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = {
+@@ -564,11 +564,21 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = {
       { 10, 5, 0, 11 },
       { 5, 5, 5, 1 },
     },
@@ -38,7 +38,7 @@ index 2aa9c7c41ad..5acb15b516f 100644
     {
       GBM_FORMAT_XRGB8888, __DRI_IMAGE_FORMAT_XRGB8888,
       { 16, 8, 0, -1 },
-@@ -571,6 +581,12 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = {
+@@ -621,6 +631,12 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = {
       { 16, 16, 16, 16 },
       true,
     },
@@ -52,10 +52,10 @@ index 2aa9c7c41ad..5acb15b516f 100644
  
  static int
 diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
-index 7c82cd661a3..81308ab9745 100644
+index 57fd1b9ab47..bd4185b723f 100644
 --- a/src/gbm/main/gbm.h
 +++ b/src/gbm/main/gbm.h
-@@ -167,6 +167,8 @@ enum gbm_bo_format {
+@@ -174,6 +174,8 @@ enum gbm_bo_format {
  
  #define GBM_FORMAT_AYUV		__gbm_fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
  

+ 85 - 91
package/mesa3d/0036-egl-add-null-platform.patch → package/mesa3d/0028-egl-add-null-platform.patch

@@ -1,26 +1,26 @@
-From def26b8534e4f8e150e5775dd1f7d2d955580c05 Mon Sep 17 00:00:00 2001
+From 7bcf7068e551b5b78381f8a9d7f848af6efe7e36 Mon Sep 17 00:00:00 2001
 From: Frank Binns <francisbinns@gmail.com>
 Date: Sun, 5 Jun 2016 12:04:40 +0100
-Subject: [PATCH 36/67] egl: add "null" platform
+Subject: [PATCH 28/58] egl: add "null" platform
 
 ---
- meson.build                          |   25 +-
+ meson.build                          |   10 +-
  meson_options.txt                    |    2 +-
  src/egl/drivers/dri2/egl_dri2.c      |   11 +-
- src/egl/drivers/dri2/egl_dri2.h      |   57 +-
+ src/egl/drivers/dri2/egl_dri2.h      |   59 +-
  src/egl/drivers/dri2/platform_null.c | 1179 ++++++++++++++++++++++++++
  src/egl/main/eglapi.c                |    5 +-
  src/egl/main/egldisplay.c            |    1 +
  src/egl/main/egldisplay.h            |    1 +
  src/egl/meson.build                  |    5 +
- 9 files changed, 1277 insertions(+), 9 deletions(-)
+ 9 files changed, 1264 insertions(+), 9 deletions(-)
  create mode 100644 src/egl/drivers/dri2/platform_null.c
 
 diff --git a/meson.build b/meson.build
-index 3d9d345dbf2..2018562a1ec 100644
+index d9fbb1fd8d9..ce81c7d0f9e 100644
 --- a/meson.build
 +++ b/meson.build
-@@ -340,7 +340,7 @@ endif
+@@ -335,7 +335,7 @@ endif
  _platforms = get_option('platforms')
  if _platforms.contains('auto')
    if system_has_kms_drm
@@ -29,68 +29,53 @@ index 3d9d345dbf2..2018562a1ec 100644
    elif ['darwin', 'cygwin'].contains(host_machine.system())
      _platforms = ['x11']
    elif ['haiku'].contains(host_machine.system())
-@@ -359,6 +359,7 @@ with_platform_wayland = _platforms.contains('wayland')
+@@ -353,6 +353,7 @@ with_platform_x11 = _platforms.contains('x11')
+ with_platform_wayland = _platforms.contains('wayland')
  with_platform_haiku = _platforms.contains('haiku')
  with_platform_windows = _platforms.contains('windows')
- with_platform_tizen = _platforms.contains('tizen')
 +with_platform_null = _platforms.contains('null')
  
- if with_platform_tizen and _platforms.length() != 1
-   error('tizen cannot be enabled at the same time as other platforms')
-@@ -958,6 +959,26 @@ if with_platform_tizen
+ with_glx = get_option('glx')
+ if with_glx == 'auto'
+@@ -1014,6 +1015,10 @@ if with_platform_android
    ]
-   pre_args += '-DHAVE_TIZEN_PLATFORM'
  endif
+ 
 +if with_platform_null
 +  pre_args += '-DHAVE_NULL_PLATFORM'
 +endif
-+if with_platform_android
-+  dep_android = [
-+    dependency('cutils'),
-+    dependency('hardware'),
-+    dependency('sync'),
-+  ]
-+  if with_gallium
-+    dep_android += dependency('backtrace')
-+  endif
-+  if get_option('platform-sdk-version') >= 26
-+    dep_android += dependency('nativewindow')
-+  endif
-+  pre_args += '-DHAVE_ANDROID_PLATFORM'
-+endif
-+if with_platform_haiku
-+  pre_args += '-DHAVE_HAIKU_PLATFORM'
-+endif
- 
++
  prog_python = import('python').find_installation('python3')
  has_mako = run_command(
-@@ -1583,7 +1604,7 @@ dep_libdrm = dependency(
+   prog_python, '-c',
+@@ -1640,7 +1645,8 @@ with_gallium_drisw_kms = false
+ dep_libdrm = dependency(
    'libdrm', version : '>=' + _drm_ver,
    # GNU/Hurd includes egl_dri2, without drm.
-   required : (with_dri2 and host_machine.system() != 'gnu') or with_dri3 or
--             with_platform_tizen
-+             with_platform_tizen or with_platform_null
+-  required : (with_dri2 and host_machine.system() != 'gnu') or with_dri3
++  required : (with_dri2 and host_machine.system() != 'gnu') or with_dri3 or
++             with_platform_null
  )
  if dep_libdrm.found()
    pre_args += '-DHAVE_LIBDRM'
 diff --git a/meson_options.txt b/meson_options.txt
-index 8230db93c70..d90a25f97ff 100644
+index 3f401d39225..d76cc4b0405 100644
 --- a/meson_options.txt
 +++ b/meson_options.txt
 @@ -23,7 +23,7 @@ option(
    type : 'array',
    value : ['auto'],
    choices : [
--    'auto', 'x11', 'wayland', 'haiku', 'android', 'windows', 'tizen',
-+    'auto', 'x11', 'wayland', 'haiku', 'android', 'windows', 'tizen', 'null',
+-    'auto', 'x11', 'wayland', 'haiku', 'android', 'windows',
++    'auto', 'x11', 'wayland', 'haiku', 'android', 'windows', 'null',
    ],
    description : 'window systems to support. If this is set to `auto`, all platforms applicable will be enabled.'
  )
 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index d511d73f2ed..2f8414e0c60 100644
+index 635c445d234..68b8fa7346a 100644
 --- a/src/egl/drivers/dri2/egl_dri2.c
 +++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -1253,6 +1253,9 @@ dri2_initialize(_EGLDisplay *disp)
+@@ -1261,6 +1261,9 @@ dri2_initialize(_EGLDisplay *disp)
     case _EGL_PLATFORM_DEVICE:
        ret = dri2_initialize_device(disp);
        break;
@@ -100,7 +85,7 @@ index d511d73f2ed..2f8414e0c60 100644
     case _EGL_PLATFORM_X11:
     case _EGL_PLATFORM_XCB:
        ret = dri2_initialize_x11(disp);
-@@ -1318,8 +1321,6 @@ dri2_display_destroy(_EGLDisplay *disp)
+@@ -1321,8 +1324,6 @@ dri2_display_destroy(_EGLDisplay *disp)
           dri2_dpy->vtbl->close_screen_notify(disp);
        dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
     }
@@ -109,10 +94,10 @@ index d511d73f2ed..2f8414e0c60 100644
  
     /* Don't dlclose the driver when building with the address sanitizer, so you
      * get good symbols from the leak reports.
-@@ -1355,11 +1356,17 @@ dri2_display_destroy(_EGLDisplay *disp)
-          tpl_object_unreference((tpl_object_t *) dri2_dpy->tpl_dpy);
+@@ -1348,11 +1349,17 @@ dri2_display_destroy(_EGLDisplay *disp)
+    case _EGL_PLATFORM_WAYLAND:
+       dri2_teardown_wayland(dri2_dpy);
        break;
- #endif
 +   case _EGL_PLATFORM_NULL:
 +      dri2_teardown_null(dri2_dpy);
 +      break;
@@ -128,12 +113,12 @@ index d511d73f2ed..2f8414e0c60 100644
      * the ones from the gbm device. As such the gbm itself is responsible
      * for the cleanup.
 diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
-index f41f32cd234..eb2127e3fe6 100644
+index 35f66ad5453..5de5f0f9a16 100644
 --- a/src/egl/drivers/dri2/egl_dri2.h
 +++ b/src/egl/drivers/dri2/egl_dri2.h
-@@ -81,6 +81,10 @@ struct zwp_linux_dmabuf_v1;
- #include <tbm_surface_internal.h>
- #endif
+@@ -77,6 +77,10 @@ struct zwp_linux_dmabuf_feedback_v1;
+ 
+ #endif /* HAVE_ANDROID_PLATFORM */
  
 +#ifdef HAVE_NULL_PLATFORM
 +#include <xf86drmMode.h>
@@ -142,7 +127,7 @@ index f41f32cd234..eb2127e3fe6 100644
  #include "eglconfig.h"
  #include "eglcontext.h"
  #include "egldevice.h"
-@@ -99,6 +103,22 @@ struct zwp_linux_dmabuf_v1;
+@@ -94,6 +98,22 @@ struct zwp_linux_dmabuf_feedback_v1;
  
  struct wl_buffer;
  
@@ -165,8 +150,8 @@ index f41f32cd234..eb2127e3fe6 100644
  struct dri2_egl_display_vtbl {
     /* mandatory on Wayland, unused otherwise */
     int (*authenticate)(_EGLDisplay *disp, uint32_t id);
-@@ -257,6 +277,11 @@ struct dri2_egl_display
-    char                     *device_name;
+@@ -287,6 +307,11 @@ struct dri2_egl_display
+    char *device_name;
  #endif
  
 +#ifdef HAVE_NULL_PLATFORM
@@ -177,42 +162,51 @@ index f41f32cd234..eb2127e3fe6 100644
  #ifdef HAVE_ANDROID_PLATFORM
     const gralloc_module_t *gralloc;
     /* gralloc vendor usage bit for front rendering */
-@@ -332,7 +357,10 @@ struct dri2_egl_surface
-    struct wl_display     *wl_dpy_wrapper;
-    struct wl_drm         *wl_drm_wrapper;
-    struct wl_callback    *throttle_callback;
--   int                    format;
-+#endif
-+
-+#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_NULL_PLATFORM)
-+   int			  format;
+@@ -331,11 +356,14 @@ struct dri2_egl_surface
+    struct zwp_linux_dmabuf_feedback_v1 *wl_dmabuf_feedback;
+    struct dmabuf_feedback dmabuf_feedback, pending_dmabuf_feedback;
+    bool compositor_using_another_device;
+-   int format;
+    bool resized;
+    bool received_dmabuf_feedback;
  #endif
  
++#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_NULL_PLATFORM)
++   int format;
++#endif
++
  #ifdef HAVE_DRM_PLATFORM
-@@ -358,9 +386,10 @@ struct dri2_egl_surface
-    __DRIbuffer           *local_buffers[__DRI_BUFFER_COUNT];
+    struct gbm_dri_surface *gbm_surf;
+ #endif
+@@ -343,12 +371,15 @@ struct dri2_egl_surface
+    /* EGL-owned buffers */
+    __DRIbuffer *local_buffers[__DRI_BUFFER_COUNT];
  
- #if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM) || \
--    defined(HAVE_TIZEN_PLATFORM)
-+   defined(HAVE_TIZEN_PLATFORM) || defined(HAVE_NULL_PLATFORM)
+-#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM)
++#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM) || \
++    defined(HAVE_NULL_PLATFORM)
     struct {
--#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_TIZEN_PLATFORM)
-+#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_TIZEN_PLATFORM) || \
-+   defined(HAVE_NULL_PLATFORM)
-       __DRIimage         *dri_image;
- #endif
++#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_NULL_PLATFORM)
++      __DRIimage *dri_image;
++#endif
  #ifdef HAVE_WAYLAND_PLATFORM
-@@ -377,6 +406,9 @@ struct dri2_egl_surface
+       struct wl_buffer *wl_buffer;
+       bool wl_release;
+-      __DRIimage *dri_image;
+       /* for is_different_gpu case. NULL else */
+       __DRIimage *linear_copy;
+       /* for swrast */
+@@ -357,6 +388,9 @@ struct dri2_egl_surface
  #endif
- #ifdef HAVE_TIZEN_PLATFORM
-       tbm_surface_h       tbm_surf;
+ #ifdef HAVE_DRM_PLATFORM
+       struct gbm_bo *bo;
 +#endif
 +#ifdef HAVE_NULL_PLATFORM
-+      uint32_t            fb_id;
++      uint32_t fb_id;
  #endif
-       bool                locked;
-       int                 age;
-@@ -409,6 +441,10 @@ struct dri2_egl_surface
+       bool locked;
+       int age;
+@@ -393,6 +427,10 @@ struct dri2_egl_surface
     void                 *swrast_front;
  #endif
  
@@ -223,9 +217,9 @@ index f41f32cd234..eb2127e3fe6 100644
     int out_fence_fd;
     EGLBoolean enable_out_fence;
  
-@@ -589,6 +625,21 @@ EGLBoolean
- dri2_initialize_tizen(_EGLDisplay *disp);
- #endif
+@@ -571,6 +609,21 @@ dri2_initialize_android(_EGLDisplay *disp)
+ EGLBoolean
+ dri2_initialize_surfaceless(_EGLDisplay *disp);
  
 +#ifdef HAVE_NULL_PLATFORM
 +EGLBoolean
@@ -1431,10 +1425,10 @@ index 00000000000..fb03ecc36fd
 +   }
 +}
 diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
-index 6d7f62c6851..e4f2c43b4ef 100644
+index b7e0d0f53a5..b3d6f3599e5 100644
 --- a/src/egl/main/eglapi.c
 +++ b/src/egl/main/eglapi.c
-@@ -989,7 +989,10 @@ _eglCreateWindowSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
+@@ -982,7 +982,10 @@ _eglCreateWindowSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
  
  
     if (native_window == NULL)
@@ -1447,36 +1441,36 @@ index 6d7f62c6851..e4f2c43b4ef 100644
     if (disp && (disp->Platform == _EGL_PLATFORM_SURFACELESS ||
                  disp->Platform == _EGL_PLATFORM_DEVICE)) {
 diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c
-index 486ac3b0557..395f38156d7 100644
+index 131fc22786f..2ce70818929 100644
 --- a/src/egl/main/egldisplay.c
 +++ b/src/egl/main/egldisplay.c
-@@ -78,6 +78,7 @@ static const struct {
+@@ -85,6 +85,7 @@ static const struct {
     { _EGL_PLATFORM_SURFACELESS, "surfaceless" },
     { _EGL_PLATFORM_DEVICE, "device" },
-    { _EGL_PLATFORM_TIZEN, "tizen" },
+    { _EGL_PLATFORM_WINDOWS, "windows" },
 +   { _EGL_PLATFORM_NULL, "null" },
  };
  
  
 diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
-index 020529c57e2..8489af9dde2 100644
+index f59d43325a6..a2d91679fd7 100644
 --- a/src/egl/main/egldisplay.h
 +++ b/src/egl/main/egldisplay.h
 @@ -53,6 +53,7 @@ enum _egl_platform_type {
     _EGL_PLATFORM_SURFACELESS,
     _EGL_PLATFORM_DEVICE,
-    _EGL_PLATFORM_TIZEN,
+    _EGL_PLATFORM_WINDOWS,
 +   _EGL_PLATFORM_NULL,
  
     _EGL_NUM_PLATFORMS,
     _EGL_INVALID_PLATFORM = -1
 diff --git a/src/egl/meson.build b/src/egl/meson.build
-index 5749ec88f89..daa6a3a04f0 100644
+index 315a95013f3..a08f1c71847 100644
 --- a/src/egl/meson.build
 +++ b/src/egl/meson.build
-@@ -146,6 +146,11 @@ if with_platform_tizen
-   incs_for_egl += [inc_loader]
-   deps_for_egl += [dep_tizen, dep_libdrm]
+@@ -150,6 +150,11 @@ elif with_platform_windows
+   incs_for_egl += [inc_wgl, inc_gallium, inc_gallium_aux]
+   link_for_egl += libgallium_wgl
  endif
 +if with_platform_null
 +  files_egl += files('drivers/dri2/platform_null.c')

+ 20 - 32
package/mesa3d/0038-egl-add-support-for-EXT_image_gl_colorspace.patch → package/mesa3d/0029-egl-add-support-for-EXT_image_gl_colorspace.patch

@@ -1,21 +1,21 @@
-From d1d64a3c11fbab083d6225857554ac1c9ad645b6 Mon Sep 17 00:00:00 2001
+From 3cebad3094a397416b78e5e41351c9c6051ab8ff Mon Sep 17 00:00:00 2001
 From: Frank Binns <frank.binns@imgtec.com>
 Date: Tue, 29 Jan 2019 14:36:25 +0000
-Subject: [PATCH 38/67] egl: add support for EXT_image_gl_colorspace
+Subject: [PATCH 29/58] egl: add support for EXT_image_gl_colorspace
 
 ---
- src/egl/drivers/dri2/egl_dri2.c | 57 +++++++++++++++++++++++++++++++--
+ src/egl/drivers/dri2/egl_dri2.c | 52 +++++++++++++++++++++++++++++++--
  src/egl/main/eglapi.c           |  1 +
  src/egl/main/egldisplay.h       |  1 +
- src/egl/main/eglimage.c         | 14 ++++++++
+ src/egl/main/eglimage.c         | 14 +++++++++
  src/egl/main/eglimage.h         |  3 ++
- 5 files changed, 74 insertions(+), 2 deletions(-)
+ 5 files changed, 69 insertions(+), 2 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index 2f8414e0c60..6b26ff979ae 100644
+index 68b8fa7346a..b25c0231dc8 100644
 --- a/src/egl/drivers/dri2/egl_dri2.c
 +++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -1084,6 +1084,9 @@ dri2_setup_screen(_EGLDisplay *disp)
+@@ -1092,6 +1092,9 @@ dri2_setup_screen(_EGLDisplay *disp)
            dri2_dpy->image->createImageFromBuffer) {
           disp->Extensions.IMG_cl_image = EGL_TRUE;
        }
@@ -25,19 +25,7 @@ index 2f8414e0c60..6b26ff979ae 100644
     }
  
     if (dri2_dpy->flush_control)
-@@ -2724,6 +2727,11 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
-       return NULL;
-    }
- 
-+   if (attrs.GLColorspace != EGL_GL_COLORSPACE_DEFAULT_EXT) {
-+      _eglError(EGL_BAD_MATCH, "unsupported colorspace");
-+      return NULL;
-+   }
-+
-    if (tbm_surface_get_info(tbm_surf, &info)) {
-       _eglError(EGL_BAD_PARAMETER, "tbm_surface_get_info");
-       return NULL;
-@@ -2799,6 +2807,11 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
+@@ -2450,6 +2453,11 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
     if (!_eglParseImageAttribList(&attrs, disp, attr_list))
        return NULL;
  
@@ -49,7 +37,7 @@ index 2f8414e0c60..6b26ff979ae 100644
     plane = attrs.PlaneWL;
     f = buffer->driver_format;
     if (plane < 0 || plane >= f->nplanes) {
-@@ -2862,6 +2875,11 @@ dri2_create_image_khr_texture(_EGLDisplay *disp, _EGLContext *ctx,
+@@ -2513,6 +2521,11 @@ dri2_create_image_khr_texture(_EGLDisplay *disp, _EGLContext *ctx,
     if (!_eglParseImageAttribList(&attrs, disp, attr_list))
        return EGL_NO_IMAGE_KHR;
  
@@ -61,7 +49,7 @@ index 2f8414e0c60..6b26ff979ae 100644
     switch (target) {
     case EGL_GL_TEXTURE_2D_KHR:
        if (!disp->Extensions.KHR_gl_texture_2D_image) {
-@@ -3007,6 +3025,11 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
+@@ -2658,6 +2671,11 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
        return NULL;
     }
  
@@ -73,7 +61,7 @@ index 2f8414e0c60..6b26ff979ae 100644
     switch (attrs.DRMBufferFormatMESA) {
     case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA:
        format = __DRI_IMAGE_FORMAT_ARGB8888;
-@@ -3189,6 +3212,23 @@ dri2_num_fourcc_format_planes(EGLint format)
+@@ -2840,6 +2858,23 @@ dri2_num_fourcc_format_planes(EGLint format)
     }
  }
  
@@ -97,7 +85,7 @@ index 2f8414e0c60..6b26ff979ae 100644
  /* Returns the total number of file descriptors. Zero indicates an error. */
  static unsigned
  dri2_check_dma_buf_format(const _EGLImageAttribs *attrs)
-@@ -3334,6 +3374,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
+@@ -2985,6 +3020,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
     int fds[DMA_BUF_MAX_PLANES];
     int pitches[DMA_BUF_MAX_PLANES];
     int offsets[DMA_BUF_MAX_PLANES];
@@ -105,7 +93,7 @@ index 2f8414e0c60..6b26ff979ae 100644
     uint64_t modifier;
     bool has_modifier = false;
     unsigned error;
-@@ -3359,6 +3400,18 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
+@@ -3010,6 +3046,18 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
     if (!num_fds)
        return NULL;
  
@@ -124,7 +112,7 @@ index 2f8414e0c60..6b26ff979ae 100644
     for (unsigned i = 0; i < num_fds; ++i) {
        fds[i] = attrs.DMABufPlaneFds[i].Value;
        pitches[i] = attrs.DMABufPlanePitches[i].Value;
-@@ -3403,7 +3456,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
+@@ -3054,7 +3102,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
        }
        dri_image =
           dri2_dpy->image->createImageFromDmaBufs2(dri2_dpy->dri_screen,
@@ -133,7 +121,7 @@ index 2f8414e0c60..6b26ff979ae 100644
              modifier, fds, num_fds, pitches, offsets,
              attrs.DMABufYuvColorSpaceHint.Value,
              attrs.DMABufSampleRangeHint.Value,
-@@ -3415,7 +3468,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
+@@ -3066,7 +3114,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
     else {
        dri_image =
           dri2_dpy->image->createImageFromDmaBufs(dri2_dpy->dri_screen,
@@ -143,19 +131,19 @@ index 2f8414e0c60..6b26ff979ae 100644
              attrs.DMABufYuvColorSpaceHint.Value,
              attrs.DMABufSampleRangeHint.Value,
 diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
-index e4f2c43b4ef..2d3931dfd26 100644
+index b3d6f3599e5..d9fbb7a11fb 100644
 --- a/src/egl/main/eglapi.c
 +++ b/src/egl/main/eglapi.c
-@@ -508,6 +508,7 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
+@@ -501,6 +501,7 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
     _EGL_CHECK_EXTENSION(EXT_create_context_robustness);
     _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import);
     _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import_modifiers);
 +   _EGL_CHECK_EXTENSION(EXT_image_gl_colorspace);
     _EGL_CHECK_EXTENSION(EXT_protected_surface);
+    _EGL_CHECK_EXTENSION(EXT_present_opaque);
     _EGL_CHECK_EXTENSION(EXT_surface_CTA861_3_metadata);
-    _EGL_CHECK_EXTENSION(EXT_surface_SMPTE2086_metadata);
 diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
-index 8489af9dde2..6e5b29fe1ac 100644
+index a2d91679fd7..53f191ae75f 100644
 --- a/src/egl/main/egldisplay.h
 +++ b/src/egl/main/egldisplay.h
 @@ -108,6 +108,7 @@ struct _egl_extensions
@@ -165,7 +153,7 @@ index 8489af9dde2..6e5b29fe1ac 100644
 +   EGLBoolean EXT_image_gl_colorspace;
     EGLBoolean EXT_pixel_format_float;
     EGLBoolean EXT_protected_surface;
-    EGLBoolean EXT_surface_CTA861_3_metadata;
+    EGLBoolean EXT_present_opaque;
 diff --git a/src/egl/main/eglimage.c b/src/egl/main/eglimage.c
 index 64bf7f2bfe9..73d4e85b82e 100644
 --- a/src/egl/main/eglimage.c

+ 4 - 4
package/mesa3d/0039-meson-force-C-2011-for-thread_local.patch → package/mesa3d/0030-meson-force-C-2011-for-thread_local.patch

@@ -1,7 +1,7 @@
-From c8a6405eaf4c9693f32381fa7aa6d292e7f95716 Mon Sep 17 00:00:00 2001
+From 7cfdab7b8a2e122821ec3086e6a5e1d35a0c88a0 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Mon, 24 Jun 2019 09:35:39 +0100
-Subject: [PATCH 39/67] meson: force C++ 2011 for "thread_local"
+Subject: [PATCH 30/58] meson: force C++ 2011 for "thread_local"
 
 For some combinations of Meson and the GNU C++ compiler, Meson does
 not add '-std=c++11' to the command line arguments, resulting in
@@ -14,10 +14,10 @@ command line arguments.
  1 file changed, 6 insertions(+)
 
 diff --git a/meson.build b/meson.build
-index 2018562a1ec..21d93d372c2 100644
+index ce81c7d0f9e..b4d5b849f8b 100644
 --- a/meson.build
 +++ b/meson.build
-@@ -32,6 +32,12 @@ project(
+@@ -41,6 +41,12 @@ endif
  cc = meson.get_compiler('c')
  cpp = meson.get_compiler('cpp')
  

+ 31 - 29
package/mesa3d/0040-dri2-add-support-for-swap-intervals-other-than-1.patch → package/mesa3d/0031-dri2-add-support-for-swap-intervals-other-than-1.patch

@@ -1,7 +1,7 @@
-From dbb0d023abb9e4bfed70144514595f0477840f3e Mon Sep 17 00:00:00 2001
+From e8172c9aea79b5cf05523a606a53a0fe63d7f397 Mon Sep 17 00:00:00 2001
 From: Luigi Santivetti <luigi.santivetti@imgtec.com>
 Date: Wed, 19 Jun 2019 16:36:06 +0100
-Subject: [PATCH 40/67] dri2: add support for swap intervals other than 1
+Subject: [PATCH 31/58] dri2: add support for swap intervals other than 1
 
 Before this change, the swap interval was fixed at 1, with page flips
 scheduled on the next vblank. This change allows any swap interval
@@ -17,18 +17,20 @@ regardless of the timing of subsequent calls to swap buffers.
 Change-Id: If7c0495df7ddfaa08583a14f820c46e1b97da788
 Signed-off-by: Luigi Santivetti <luigi.santivetti@imgtec.com>
 ---
- src/egl/drivers/dri2/egl_dri2.h      |  34 +-
+ src/egl/drivers/dri2/egl_dri2.h      |  42 ++-
  src/egl/drivers/dri2/platform_null.c | 541 +++++++++++++++++++++++----
- 2 files changed, 497 insertions(+), 78 deletions(-)
+ 2 files changed, 506 insertions(+), 77 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
-index eb2127e3fe6..64d60ed66e4 100644
+index 5de5f0f9a16..f74ee282645 100644
 --- a/src/egl/drivers/dri2/egl_dri2.h
 +++ b/src/egl/drivers/dri2/egl_dri2.h
-@@ -332,6 +332,23 @@ struct tpl_swap_queue_elem
+@@ -328,6 +328,25 @@ struct dri2_egl_context
+    __DRIcontext *dri_context;
  };
- #endif
  
++#define DRI2_SURFACE_NUM_COLOR_BUFFERS 4
++
 +#ifdef HAVE_NULL_PLATFORM
 +struct swap_queue_elem
 +{
@@ -48,37 +50,37 @@ index eb2127e3fe6..64d60ed66e4 100644
 +
  struct dri2_egl_surface
  {
-    _EGLSurface          base;
-@@ -370,13 +387,18 @@ struct dri2_egl_surface
- #ifdef HAVE_TIZEN_PLATFORM
-    tpl_surface_t         *tpl_surf;
-    bool                   reset;
-+   struct tpl_swap_queue_elem swap_queue[DRI2_SURFACE_NUM_COLOR_BUFFERS];
-+#endif
-+#if defined(HAVE_TIZEN_PLATFORM) || defined(HAVE_NULL_PLATFORM)
-    /*
-     * Protects swap_queue_idx_head, swap_queue_idx_tail and
-     * color_buffers.locked.
-     */
-    pthread_mutex_t        mutex;
-    pthread_cond_t         swap_queue_cond;
--   struct tpl_swap_queue_elem swap_queue[DRI2_SURFACE_NUM_COLOR_BUFFERS];
+    _EGLSurface base;
+@@ -368,6 +387,19 @@ struct dri2_egl_surface
+    struct gbm_dri_surface *gbm_surf;
+ #endif
+ 
 +#if defined(HAVE_NULL_PLATFORM)
++   /*
++    * Protects swap_queue_idx_head, swap_queue_idx_tail and
++    * color_buffers.locked.
++    */
++   pthread_mutex_t        mutex;
++   pthread_cond_t         swap_queue_cond;
 +   pthread_cond_t         swap_unlock_buffer_cond;
++   int                    swap_queue_idx_head;
++   int                    swap_queue_idx_tail;
++   pthread_t              swap_queue_processor;
 +#endif
-    int                    swap_queue_idx_head;
-    int                    swap_queue_idx_tail;
-    pthread_t              swap_queue_processor;
-@@ -412,7 +434,7 @@ struct dri2_egl_surface
++
+    /* EGL-owned buffers */
+    __DRIbuffer *local_buffers[__DRI_BUFFER_COUNT];
+ 
+@@ -394,7 +426,7 @@ struct dri2_egl_surface
  #endif
-       bool                locked;
-       int                 age;
+       bool locked;
+       int age;
 -   } color_buffers[4], *back, *current;
 +   } color_buffers[DRI2_SURFACE_NUM_COLOR_BUFFERS], *back, *current;
  #endif
  
  #ifdef HAVE_ANDROID_PLATFORM
-@@ -442,7 +464,13 @@ struct dri2_egl_surface
+@@ -428,7 +460,13 @@ struct dri2_egl_surface
  #endif
  
  #ifdef HAVE_NULL_PLATFORM

+ 5 - 5
package/mesa3d/0041-null_platform-add-support-for-explicit-synchronisati.patch → package/mesa3d/0032-null_platform-add-support-for-explicit-synchronisati.patch

@@ -1,7 +1,7 @@
-From d286d05d0d84c913c8bfcbe8f693083caf3bcc77 Mon Sep 17 00:00:00 2001
+From 34f6a09841f2119096676692103251b2d87ac9da Mon Sep 17 00:00:00 2001
 From: Silvestrs Timofejevs <silvestrs.timofejevs@imgtec.com>
 Date: Mon, 2 Sep 2019 09:32:01 +0100
-Subject: [PATCH 41/67] null_platform: add support for explicit synchronisation
+Subject: [PATCH 32/58] null_platform: add support for explicit synchronisation
 
 This change adds support for the 'in' fence, the 'out' fence will
 potentially be added in subsequent optimisation changes.
@@ -42,10 +42,10 @@ Change-Id: Ib9c4a0bc3ea1b21192ee37909d7580d6b7b366ec
  2 files changed, 77 insertions(+), 2 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
-index 64d60ed66e4..eb6e4551087 100644
+index f74ee282645..e2348443dc9 100644
 --- a/src/egl/drivers/dri2/egl_dri2.h
 +++ b/src/egl/drivers/dri2/egl_dri2.h
-@@ -106,6 +106,7 @@ struct wl_buffer;
+@@ -101,6 +101,7 @@ struct wl_buffer;
  #ifdef HAVE_NULL_PLATFORM
  struct display_output {
     bool                   in_use;
@@ -53,7 +53,7 @@ index 64d60ed66e4..eb6e4551087 100644
     uint32_t               connector_id;
     drmModePropertyRes   **connector_prop_res;
     uint32_t               crtc_id;
-@@ -338,6 +339,7 @@ struct swap_queue_elem
+@@ -336,6 +337,7 @@ struct swap_queue_elem
     uint32_t             swap_interval;
     uint32_t             back_id;
     uint32_t             fb_id;

+ 6 - 23
package/mesa3d/0042-egl-null-add-support-for-DRM-image-format-modifiers.patch → package/mesa3d/0033-egl-null-add-support-for-DRM-image-format-modifiers.patch

@@ -1,7 +1,7 @@
-From 4f9ca104c16a6eb1af770e2447adb4413fb41cb7 Mon Sep 17 00:00:00 2001
+From 681768aaf01927af5337088079a70db7cec7dbb0 Mon Sep 17 00:00:00 2001
 From: Luigi Santivetti <luigi.santivetti@imgtec.com>
 Date: Thu, 26 Sep 2019 13:32:15 +0100
-Subject: [PATCH 42/68] egl/null: add support for DRM image format modifiers
+Subject: [PATCH 33/58] egl/null: add support for DRM image format modifiers
 
 This change introduces support for image modifiers to platform_null. In
 order for it to create an image with modifiers, it relies on libdrm to
@@ -26,32 +26,15 @@ Internal notes:
 Change-Id: I0f7b030f6e1943690692674bf18daabfc153208a
 Signed-off-by: Luigi Santivetti <luigi.santivetti@imgtec.com>
 ---
- meson.build                          |   5 +
  src/egl/drivers/dri2/egl_dri2.h      |   3 +
  src/egl/drivers/dri2/platform_null.c | 221 +++++++++++++++++++++++----
- 3 files changed, 203 insertions(+), 26 deletions(-)
+ 2 files changed, 198 insertions(+), 26 deletions(-)
 
-diff --git a/meson.build b/meson.build
-index 21d93d372c2..ca89b8ac20d 100644
---- a/meson.build
-+++ b/meson.build
-@@ -1581,6 +1581,11 @@ if with_gallium_etnaviv
-   _drm_ver = '2.4.89'
- endif
- 
-+# platform_null relies on DRM format-modifier iterators available since 2.4.108
-+if with_platform_null
-+  _drm_ver = '2.4.108'
-+endif
-+
- # Loop over the enables versions and get the highest libdrm requirement for all
- # active drivers.
- _drm_blame = ''
 diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
-index eb6e4551087..32ad720b343 100644
+index e2348443dc9..5b382685d38 100644
 --- a/src/egl/drivers/dri2/egl_dri2.h
 +++ b/src/egl/drivers/dri2/egl_dri2.h
-@@ -117,6 +117,8 @@ struct display_output {
+@@ -112,6 +112,8 @@ struct display_output {
     uint32_t               mode_blob_id;
     unsigned               formats;
     drmModeAtomicReq      *atomic_state;
@@ -60,7 +43,7 @@ index eb6e4551087..32ad720b343 100644
  };
  #endif
  
-@@ -280,6 +282,7 @@ struct dri2_egl_display
+@@ -310,6 +312,7 @@ struct dri2_egl_display
  
  #ifdef HAVE_NULL_PLATFORM
     bool                      atomic_enabled;

+ 11 - 11
package/mesa3d/0043-egl-query-the-supported-ES2-context-version.patch → package/mesa3d/0034-egl-query-the-supported-ES2-context-version.patch

@@ -1,7 +1,7 @@
-From 1e6466e541e1fc67198be3eeb090e3af22bd6d19 Mon Sep 17 00:00:00 2001
+From 9e01160294f65f1330cacc671be97b548452bc69 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Mon, 10 Feb 2020 09:23:03 +0000
-Subject: [PATCH 43/67] egl: query the supported ES2 context version
+Subject: [PATCH 34/58] egl: query the supported ES2 context version
 
 For OpenGL ES contexts, the EGL specification states that querying
 EGL_CONTEXT_CLIENT_VERSION with eglQueryContext may return a version
@@ -39,12 +39,12 @@ large value it currently has.
  7 files changed, 50 insertions(+), 4 deletions(-)
 
 diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
-index 6490f6e80e2..9c7bcac4cae 100644
+index 80acaf3a7b1..acd58ccb559 100644
 --- a/include/GL/internal/dri_interface.h
 +++ b/include/GL/internal/dri_interface.h
-@@ -2052,6 +2052,8 @@ typedef struct __DRIDriverVtableExtensionRec {
- 
- #define __DRI2_RENDERER_HAS_PROTECTED_CONTENT                 0x000e
+@@ -1958,6 +1958,8 @@ typedef struct __DRIDriverVtableExtensionRec {
+ #define __DRI2_RENDERER_PREFER_BACK_BUFFER_REUSE              0x000f
+ #define __DRI2_RENDERER_HAS_NO_ERROR_CONTEXT                  0x0010
  
 +#define __DRI2_RENDERER_OPENGL_ES2_CONTEXT_CLIENT_VERSION_IMG 0x7001
 +
@@ -52,10 +52,10 @@ index 6490f6e80e2..9c7bcac4cae 100644
  struct __DRI2rendererQueryExtensionRec {
     __DRIextension base;
 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index 6b26ff979ae..c4a49cae592 100644
+index b25c0231dc8..3ae5cddbc20 100644
 --- a/src/egl/drivers/dri2/egl_dri2.c
 +++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -2055,6 +2055,26 @@ dri2_make_current(_EGLDisplay *disp, _EGLSurface *dsurf,
+@@ -2006,6 +2006,26 @@ dri2_make_current(_EGLDisplay *disp, _EGLSurface *dsurf,
     return EGL_TRUE;
  }
  
@@ -82,7 +82,7 @@ index 6b26ff979ae..c4a49cae592 100644
  __DRIdrawable *
  dri2_surface_get_dri_drawable(_EGLSurface *surf)
  {
-@@ -4336,6 +4356,7 @@ const _EGLDriver _eglDriver = {
+@@ -3885,6 +3905,7 @@ const _EGLDriver _eglDriver = {
     .CreateContext = dri2_create_context,
     .DestroyContext = dri2_destroy_context,
     .MakeCurrent = dri2_make_current,
@@ -118,10 +118,10 @@ index 18c73c9cd8b..2690a82eb75 100644
  	.CreatePixmapSurface = haiku_create_pixmap_surface,
  	.CreatePbufferSurface = haiku_create_pbuffer_surface,
 diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
-index 2d3931dfd26..1cbff9656e4 100644
+index d9fbb7a11fb..69ac50ff8e8 100644
 --- a/src/egl/main/eglapi.c
 +++ b/src/egl/main/eglapi.c
-@@ -948,7 +948,7 @@ eglQueryContext(EGLDisplay dpy, EGLContext ctx,
+@@ -941,7 +941,7 @@ eglQueryContext(EGLDisplay dpy, EGLContext ctx,
  
     _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE);
  

+ 0 - 357
package/mesa3d/0034-egl-tizen-expose-EXT_yuv_surface-support.patch

@@ -1,357 +0,0 @@
-From 40c0d03cfb2751279b24890d0f752fade968862e Mon Sep 17 00:00:00 2001
-From: Frank Binns <frank.binns@imgtec.com>
-Date: Tue, 13 Feb 2018 14:47:48 +0000
-Subject: [PATCH 34/67] egl/tizen: expose EXT_yuv_surface support
-
-This adds support for NV12 and NV21 configs.
----
- src/egl/drivers/dri2/platform_tizen.c | 278 ++++++++++++++++++--------
- 1 file changed, 200 insertions(+), 78 deletions(-)
-
-diff --git a/src/egl/drivers/dri2/platform_tizen.c b/src/egl/drivers/dri2/platform_tizen.c
-index 2bc9b3e7c64..b6478a1875b 100644
---- a/src/egl/drivers/dri2/platform_tizen.c
-+++ b/src/egl/drivers/dri2/platform_tizen.c
-@@ -100,37 +100,93 @@ create_image_from_native(struct dri2_egl_surface *dri2_surf,
- {
-    _EGLSurface *surf = &dri2_surf->base;
-    struct dri2_egl_display *dri2_dpy = dri2_egl_display(surf->Resource.Display);
-+   struct dri2_egl_config *dri2_conf = dri2_egl_config(surf->Config);
-+   const __DRIconfig *config =
-+      dri2_get_dri_config(dri2_conf, surf->Type, surf->GLColorspace);
-    tbm_bo tbm_buf;
-    tbm_surface_info_s info;
--   int fd, fourcc, offset, pitch;
-+   int fd[TBM_SURF_PLANE_MAX];
-+   int offset[TBM_SURF_PLANE_MAX];
-+   int pitch[TBM_SURF_PLANE_MAX];
-+   int fourcc;
-    __DRIimage *dri_image;
--
--   tbm_buf = tbm_surface_internal_get_bo(tbm_surf, 0);
--   if (!tbm_buf) {
--      _eglLog(_EGL_DEBUG, "%s: failed to get bo for tbm surface", __func__);
--      return NULL;
--   }
-+   enum __DRIYUVColorSpace color_space;
-+   enum __DRISampleRange sample_range;
-+   unsigned csc_standard;
-+   unsigned depth_range;
-+   unsigned create_error;
- 
-    if (tbm_surface_get_info(tbm_surf, &info)) {
-       _eglLog(_EGL_DEBUG, "%s: failed to get tbm surface info", __func__);
-       return NULL;
-    }
- 
--   fd = tbm_bo_export_fd(tbm_buf);
-    fourcc = dri2_fourcc_from_tbm_format(info.format);
--   offset = info.planes[0].offset;
--   pitch = info.planes[0].stride;
--
--   dri_image = dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
--                                                   info.width,
--                                                   info.height,
--                                                   fourcc,
--                                                   &fd,
--                                                   1,
--                                                   &pitch,
--                                                   &offset,
--                                                   loaderPrivate);
--   close(fd);
-+
-+   for (unsigned i = 0; i < info.num_planes; i++) {
-+      int index = tbm_surface_internal_get_plane_bo_idx(tbm_surf, i);
-+
-+      tbm_buf = tbm_surface_internal_get_bo(tbm_surf, index);
-+      if (!tbm_buf) {
-+         while (i--)
-+            close(fd[i]);
-+         _eglLog(_EGL_DEBUG, "%s: failed to get bo %d for tbm surface",
-+                 __func__, i);
-+         return NULL;
-+      }
-+
-+      fd[i] = tbm_bo_export_fd(tbm_buf);
-+      offset[i] = info.planes[i].offset;
-+      pitch[i] = info.planes[i].stride;
-+   }
-+
-+   dri2_dpy->core->getConfigAttrib(config,
-+                                   __DRI_ATTRIB_YUV_CSC_STANDARD, &csc_standard);
-+   switch (csc_standard) {
-+   case __DRI_ATTRIB_YUV_CSC_STANDARD_601_BIT:
-+      color_space = __DRI_YUV_COLOR_SPACE_ITU_REC601;
-+      break;
-+   case __DRI_ATTRIB_YUV_CSC_STANDARD_709_BIT:
-+      color_space = __DRI_YUV_COLOR_SPACE_ITU_REC709;
-+      break;
-+   case __DRI_ATTRIB_YUV_CSC_STANDARD_2020_BIT:
-+      color_space = __DRI_YUV_COLOR_SPACE_ITU_REC2020;
-+      break;
-+   default:
-+      color_space = __DRI_YUV_COLOR_SPACE_UNDEFINED;
-+      break;
-+   }
-+
-+   dri2_dpy->core->getConfigAttrib(config,
-+                                   __DRI_ATTRIB_YUV_DEPTH_RANGE, &depth_range);
-+   switch (depth_range) {
-+   case __DRI_ATTRIB_YUV_DEPTH_RANGE_LIMITED_BIT:
-+      sample_range = __DRI_YUV_NARROW_RANGE;
-+      break;
-+   case __DRI_ATTRIB_YUV_DEPTH_RANGE_FULL_BIT:
-+      sample_range = __DRI_YUV_FULL_RANGE;
-+      break;
-+   default:
-+      sample_range = __DRI_YUV_RANGE_UNDEFINED;
-+      break;
-+   }
-+
-+   dri_image = dri2_dpy->image->createImageFromDmaBufs(dri2_dpy->dri_screen,
-+                                                       info.width,
-+                                                       info.height,
-+                                                       fourcc,
-+                                                       fd,
-+                                                       info.num_planes,
-+                                                       pitch,
-+                                                       offset,
-+                                                       color_space,
-+                                                       sample_range,
-+                                                       __DRI_YUV_CHROMA_SITING_UNDEFINED,
-+                                                       __DRI_YUV_CHROMA_SITING_UNDEFINED,
-+                                                       &create_error,
-+                                                       loaderPrivate);
-+   for (unsigned i = 0; i < info.num_planes; i++)
-+      close(fd[i]);
- 
-    if (!dri_image) {
-       _eglLog(_EGL_DEBUG, "%s: failed to create dri image from tbm bo", __func__);
-@@ -792,10 +848,22 @@ dri2_tizen_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
- {
- }
- 
-+static unsigned
-+dri2_tizen_get_capability(void *loaderPrivate, enum dri_loader_cap cap)
-+{
-+   switch (cap) {
-+   case DRI_LOADER_CAP_YUV_SURFACE_IMG:
-+      return 1;
-+   default:
-+      return 0;
-+   }
-+}
-+
- static const __DRIimageLoaderExtension tizen_image_loader_extension = {
--   .base             = { __DRI_IMAGE_LOADER, 1 },
-+   .base             = { __DRI_IMAGE_LOADER, 2 },
-    .getBuffers       = dri2_tizen_get_buffers,
-    .flushFrontBuffer = dri2_tizen_flush_front_buffer,
-+   .getCapability    = dri2_tizen_get_capability,
- };
- 
- static const __DRIextension *image_loader_extensions[] = {
-@@ -804,6 +872,41 @@ static const __DRIextension *image_loader_extensions[] = {
-    NULL,
- };
- 
-+static EGLBoolean
-+derive_yuv_native_visual_from_config(struct dri2_egl_display *dri2_dpy,
-+                                     const __DRIconfig *dri_config,
-+                                     int *native_visual)
-+{
-+   unsigned order, subsample, num_planes, plane_bpp;
-+
-+   dri2_dpy->core->getConfigAttrib(dri_config, __DRI_ATTRIB_YUV_ORDER,
-+                                   &order);
-+   dri2_dpy->core->getConfigAttrib(dri_config, __DRI_ATTRIB_YUV_SUBSAMPLE,
-+                                   &subsample);
-+   dri2_dpy->core->getConfigAttrib(dri_config, __DRI_ATTRIB_YUV_NUMBER_OF_PLANES,
-+                                   &num_planes);
-+   dri2_dpy->core->getConfigAttrib(dri_config, __DRI_ATTRIB_YUV_PLANE_BPP,
-+                                   &plane_bpp);
-+
-+   if ((plane_bpp & __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT) == 0)
-+      return EGL_FALSE;
-+
-+   if (num_planes != 2)
-+      return EGL_FALSE;
-+
-+   if (subsample & __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT) {
-+      if (order & __DRI_ATTRIB_YUV_ORDER_YUV_BIT) {
-+         *native_visual = TBM_FORMAT_NV12;
-+         return EGL_TRUE;
-+      } else if (order & __DRI_ATTRIB_YUV_ORDER_YVU_BIT) {
-+         *native_visual = TBM_FORMAT_NV21;
-+         return EGL_TRUE;
-+      }
-+   }
-+
-+   return EGL_FALSE;
-+}
-+
- static EGLBoolean
- dri2_tizen_add_configs(_EGLDisplay *dpy)
- {
-@@ -811,83 +914,102 @@ dri2_tizen_add_configs(_EGLDisplay *dpy)
-    int count = 0;
- 
-    for (unsigned i = 0; dri2_dpy->driver_configs[i]; i++) {
--      static const struct rgba_shifts_and_sizes pbuffer_sasa[] = {
--         {
--            /* ARGB8888 */
--            { 16, 8, 0, 24 },
--            { 8, 8, 8, 8 },
--         },
--         {
--            /* RGB888 */
--            { 16, 8, 0, -1 },
--            { 8, 8, 8, 0 },
--         },
--         {
--            /* RGB565 */
--            { 11, 5, 0, -1 },
--            { 5, 6, 5, 0 },
--         },
--      };
-       struct dri2_egl_config *dri2_cfg;
--      int shifts[4];
--      unsigned int sizes[4];
-+      unsigned int render_type;
-       unsigned int caveat = 0;
-       int surface_type = 0;
--      tpl_bool_t is_slow;
-       EGLint attr_list[] = {
-          EGL_NATIVE_VISUAL_ID, 0,
-          EGL_CONFIG_CAVEAT, EGL_NONE,
-          EGL_NONE,
-       };
--      tpl_result_t res;
--
--      dri2_get_shifts_and_sizes(dri2_dpy->core, dri2_dpy->driver_configs[i],
--                                shifts, sizes);
- 
-       dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
--                                      __DRI_ATTRIB_BUFFER_SIZE, &depth);
-+                                      __DRI_ATTRIB_CONFIG_CAVEAT, &caveat);
- 
-       dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
--                                      __DRI_ATTRIB_CONFIG_CAVEAT, &caveat);
-+                                      __DRI_ATTRIB_RENDER_TYPE, &render_type);
-+
-+      if (render_type & __DRI_ATTRIB_RGBA_BIT) {
-+         static const struct rgba_shifts_and_sizes pbuffer_sasa[] = {
-+            {
-+               /* ARGB8888 */
-+               { 16, 8, 0, 24 },
-+               { 8, 8, 8, 8 },
-+            },
-+            {
-+               /* RGB888 */
-+               { 16, 8, 0, -1 },
-+               { 8, 8, 8, 0 },
-+            },
-+            {
-+               /* RGB565 */
-+               { 11, 5, 0, -1 },
-+               { 5, 6, 5, 0 },
-+            },
-+         };
-+         int shifts[4];
-+         unsigned int sizes[4];
-+         unsigned int depth;
-+         tpl_bool_t is_slow;
-+         tpl_result_t res;
- 
--      res = tpl_display_query_config(dri2_dpy->tpl_dpy, TPL_SURFACE_TYPE_WINDOW,
--                                     sizes[0], sizes[1], sizes[2], sizes[3],
--                                     depth, &attr_list[1], &is_slow);
--      if (res != TPL_ERROR_NONE)
--         continue;
--      surface_type |= EGL_WINDOW_BIT;
-+         dri2_get_shifts_and_sizes(dri2_dpy->core, dri2_dpy->driver_configs[i],
-+                                   shifts, sizes);
- 
--      if (is_slow)
--         caveat |= __DRI_ATTRIB_SLOW_BIT;
-+         dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
-+                                         __DRI_ATTRIB_BUFFER_SIZE, &depth);
-+
-+         res = tpl_display_query_config(dri2_dpy->tpl_dpy,
-+                                        TPL_SURFACE_TYPE_WINDOW,
-+                                        sizes[0], sizes[1], sizes[2], sizes[3],
-+                                        depth, &attr_list[1], &is_slow);
-+         if (res != TPL_ERROR_NONE)
-+            continue;
- 
--      res = tpl_display_query_config(dri2_dpy->tpl_dpy, TPL_SURFACE_TYPE_PIXMAP,
--                                     sizes[0], sizes[1], sizes[2], sizes[3],
--                                     depth, NULL, &is_slow);
--      if (res == TPL_ERROR_NONE) {
--         surface_type |= EGL_PIXMAP_BIT;
-+         surface_type |= EGL_WINDOW_BIT;
- 
-          if (is_slow)
-             caveat |= __DRI_ATTRIB_SLOW_BIT;
--      }
- 
--      for (unsigned j = 0; j < ARRAY_SIZE(pbuffer_sasa); j++) {
--         const struct rgba_shifts_and_sizes *pbuffer_sas = &pbuffer_sasa[j];
--
--         if (shifts[0] == pbuffer_sas->shifts[0] &&
--             shifts[1] == pbuffer_sas->shifts[1] &&
--             shifts[2] == pbuffer_sas->shifts[2] &&
--             shifts[3] == pbuffer_sas->shifts[3] &&
--             sizes[0] == pbuffer_sas->sizes[0] &&
--             sizes[1] == pbuffer_sas->sizes[1] &&
--             sizes[2] == pbuffer_sas->sizes[2] &&
--             sizes[3] == pbuffer_sas->sizes[3]) {
--            surface_type |= EGL_PBUFFER_BIT;
--            break;
-+         res = tpl_display_query_config(dri2_dpy->tpl_dpy,
-+                                        TPL_SURFACE_TYPE_PIXMAP,
-+                                        sizes[0], sizes[1], sizes[2], sizes[3],
-+                                        depth, NULL, &is_slow);
-+         if (res == TPL_ERROR_NONE) {
-+            surface_type |= EGL_PIXMAP_BIT;
-+
-+            if (is_slow)
-+               caveat |= __DRI_ATTRIB_SLOW_BIT;
-          }
--      }
- 
--      if (dri2_dpy->image->base.version >= 9 && dri2_dpy->image->blitImage)
--         surface_type |= EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
-+         for (unsigned j = 0; j < ARRAY_SIZE(pbuffer_sasa); j++) {
-+            const struct rgba_shifts_and_sizes *pbuffer_sas = &pbuffer_sasa[j];
-+
-+            if (shifts[0] == pbuffer_sas->shifts[0] &&
-+                shifts[1] == pbuffer_sas->shifts[1] &&
-+                shifts[2] == pbuffer_sas->shifts[2] &&
-+                shifts[3] == pbuffer_sas->shifts[3] &&
-+                sizes[0] == pbuffer_sas->sizes[0] &&
-+                sizes[1] == pbuffer_sas->sizes[1] &&
-+                sizes[2] == pbuffer_sas->sizes[2] &&
-+                sizes[3] == pbuffer_sas->sizes[3]) {
-+               surface_type |= EGL_PBUFFER_BIT;
-+               break;
-+            }
-+
-+         }
-+
-+         if (dri2_dpy->image->base.version >= 9 && dri2_dpy->image->blitImage)
-+            surface_type |= EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
-+      } else if (render_type & __DRI_ATTRIB_YUV_BIT) {
-+         if (!derive_yuv_native_visual_from_config(dri2_dpy,
-+                                                   dri2_dpy->driver_configs[i],
-+                                                   &attr_list[1]))
-+            continue;
-+         surface_type = EGL_WINDOW_BIT;
-+         caveat = 0;
-+      }
- 
-       if (caveat & __DRI_ATTRIB_NON_CONFORMANT_CONFIG)
-          attr_list[3] = EGL_NON_CONFORMANT_CONFIG;
--- 
-2.25.1
-

+ 37 - 28
package/mesa3d/0044-meson-allow-libGL-to-be-built-without-GLX.patch → package/mesa3d/0035-meson-allow-libGL-to-be-built-without-GLX.patch

@@ -1,7 +1,7 @@
-From 64e6997ded5825f10125313ea15e3164bdad769b Mon Sep 17 00:00:00 2001
+From d798e80cc8262955ea57d516249c0969e298a395 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Thu, 11 Jun 2020 12:29:51 +0100
-Subject: [PATCH 44/67] meson: allow libGL to be built without GLX
+Subject: [PATCH 35/58] meson: allow libGL to be built without GLX
 
 If Meson is run with option "glx" set to "null", build the
 OpenGL library without GLX.
@@ -9,21 +9,30 @@ OpenGL library without GLX.
 The "eglBindAPI workaround for dEQP bug" change to eglcurrent.h
 (commit 2d46c91040aeb8ebad486214159c34417fbc87db) has been
 modified to use a new EGL_WITH_OPENGL define, which indicates
-whether OpneGL is present or not. This allows EGL to be used
+whether OpenGL is present or not. This allows EGL to be used
 with OpenGL on platforms other than X11.
 ---
- meson.build               |  8 ++++++--
+ meson.build               | 10 +++++++---
  meson_options.txt         |  2 +-
  src/egl/main/eglcurrent.h |  7 +++----
  src/glx/meson.build       | 20 ++++++++++++++++----
  src/meson.build           |  2 +-
- 5 files changed, 27 insertions(+), 12 deletions(-)
+ 5 files changed, 28 insertions(+), 13 deletions(-)
 
 diff --git a/meson.build b/meson.build
-index 21d93d372c2..8db1699729a 100644
+index b4d5b849f8b..e021a896a0a 100644
 --- a/meson.build
 +++ b/meson.build
-@@ -485,6 +485,10 @@ if with_egl and not _platforms.contains(egl_native_platform)
+@@ -484,7 +484,7 @@ elif _egl == 'enabled'
+     error('EGL requires dri, haiku, or windows')
+   elif not with_shared_glapi
+     error('EGL requires shared-glapi')
+-  elif not ['disabled', 'dri'].contains(with_glx)
++  elif not ['disabled', 'dri', 'null'].contains(with_glx)
+     error('EGL requires dri, but a GLX is being built without dri')
+   elif host_machine.system() == 'darwin'
+     error('EGL is not available on MacOS')
+@@ -510,6 +510,10 @@ if with_egl and not _platforms.contains(egl_native_platform)
    error('-Degl-native-platform does not specify an enabled platform')
  endif
  
@@ -31,19 +40,19 @@ index 21d93d372c2..8db1699729a 100644
 +   pre_args += '-DEGL_WITH_OPENGL'
 +endif
 +
- # Android uses emutls for versions <= P/28. For USE_ELF_TLS we need ELF TLS.
- use_elf_tls = false
- if (not ['freebsd', 'openbsd', 'haiku'].contains(host_machine.system()) and
-@@ -502,7 +506,7 @@ if (not ['freebsd', 'openbsd', 'haiku'].contains(host_machine.system()) and
-   endif
+ if 'x11' in _platforms
+   _platforms += 'xcb'
+ endif
+@@ -572,7 +576,7 @@ if with_platform_windows and with_shared_glapi
+   pre_args += '-DUSE_TLS_BEHIND_FUNCTIONS'
  endif
  
 -if with_glx != 'disabled'
 +if with_glx != 'disabled' and with_glx != 'null'
    if not (with_platform_x11 and with_any_opengl)
      error('Cannot build GLX support without X11 platform support and at least one OpenGL API')
-   elif with_glx == 'gallium-xlib'
-@@ -564,7 +568,7 @@ if with_any_vk and (with_platform_x11 and not with_dri3)
+   elif with_glx == 'xlib'
+@@ -630,7 +634,7 @@ if with_any_vk and (with_platform_x11 and not with_dri3)
    error('Vulkan drivers require dri3 for X11 support')
  endif
  if with_dri
@@ -53,15 +62,15 @@ index 21d93d372c2..8db1699729a 100644
    endif
  endif
 diff --git a/meson_options.txt b/meson_options.txt
-index d90a25f97ff..d36e714ea4c 100644
+index d76cc4b0405..65f32547267 100644
 --- a/meson_options.txt
 +++ b/meson_options.txt
-@@ -290,7 +290,7 @@ option(
+@@ -306,7 +306,7 @@ option(
    'glx',
    type : 'combo',
    value : 'auto',
--  choices : ['auto', 'disabled', 'dri', 'xlib', 'gallium-xlib'],
-+  choices : ['auto', 'disabled', 'dri', 'xlib', 'gallium-xlib', 'null'],
+-  choices : ['auto', 'disabled', 'dri', 'xlib'],
++  choices : ['auto', 'disabled', 'dri', 'xlib', 'null'],
    description : 'Build support for GLX platform'
  )
  option(
@@ -127,18 +136,18 @@ index 8f642d5e14b..605a9717e37 100644
    dependencies : [
      dep_libdrm, dep_dl, dep_m, dep_thread, dep_x11, dep_xcb_glx, dep_xcb,
 diff --git a/src/meson.build b/src/meson.build
-index c3bab27718d..f6eede56648 100644
+index 91aca307c87..0846a6035c9 100644
 --- a/src/meson.build
 +++ b/src/meson.build
-@@ -110,7 +110,7 @@ subdir('loader')
- if with_platform_haiku
-   subdir('hgl')
- endif
--if with_glx == 'dri'
-+if with_glx == 'dri' or with_glx == 'null'
-   subdir('glx')
- endif
- if with_gbm
+@@ -127,7 +127,7 @@ endif
+ if with_gallium
+   subdir('mesa')
+   subdir('gallium')
+-  if with_glx == 'dri'
++  if with_glx == 'dri' or with_glx == 'null'
+      subdir('glx')
+   endif
+   # This has to be here since it requires libgallium, and subdir cannot
 -- 
 2.25.1
 

+ 6 - 6
package/mesa3d/0045-egl-wayland-process-non-resized-window-movement.patch → package/mesa3d/0036-egl-wayland-process-non-resized-window-movement.patch

@@ -1,7 +1,7 @@
-From 394d340dda351452571ec8861d6768c52d338251 Mon Sep 17 00:00:00 2001
+From e8236d271ec5a7ef383c1e3ea9049ef27cdd0ed1 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Tue, 25 Aug 2020 14:12:32 +0100
-Subject: [PATCH 45/67] egl/wayland: process non-resized window movement
+Subject: [PATCH 36/58] egl/wayland: process non-resized window movement
 
 The dx and dy parameters to the wl_egl_window_resize function were
 not being processed unless the window width or height were being
@@ -11,10 +11,10 @@ changed.
  1 file changed, 3 insertions(+), 2 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
-index 72456d5d748..06272d4081e 100644
+index 10a90ff963f..be10fc6474a 100644
 --- a/src/egl/drivers/dri2/platform_wayland.c
 +++ b/src/egl/drivers/dri2/platform_wayland.c
-@@ -266,6 +266,9 @@ resize_callback(struct wl_egl_window *wl_win, void *data)
+@@ -392,6 +392,9 @@ resize_callback(struct wl_egl_window *wl_win, void *data)
     struct dri2_egl_display *dri2_dpy =
        dri2_egl_display(dri2_surf->base.Resource.Display);
  
@@ -24,7 +24,7 @@ index 72456d5d748..06272d4081e 100644
     if (dri2_surf->base.Width == wl_win->width &&
         dri2_surf->base.Height == wl_win->height)
        return;
-@@ -786,8 +789,6 @@ update_buffers(struct dri2_egl_display *dri2_dpy,
+@@ -1255,8 +1258,6 @@ update_buffers(struct dri2_egl_display *dri2_dpy,
  
        dri2_surf->base.Width  = dri2_surf->wl_win->width;
        dri2_surf->base.Height = dri2_surf->wl_win->height;
@@ -32,7 +32,7 @@ index 72456d5d748..06272d4081e 100644
 -      dri2_surf->dy = dri2_surf->wl_win->dy;
     }
  
-    if (dri2_surf->wl_win &&
+    if (dri2_surf->resized || dri2_surf->received_dmabuf_feedback) {
 -- 
 2.25.1
 

+ 41 - 208
package/mesa3d/0046-Separate-EXT_framebuffer_object-from-ARB-version.patch → package/mesa3d/0037-Separate-EXT_framebuffer_object-from-ARB-version.patch

@@ -1,7 +1,7 @@
-From ed4671544a6add01e87e94c04df59a600403dd21 Mon Sep 17 00:00:00 2001
+From 5987d8ad515e94a36eb54aead8ab89f0ad3f427f Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Mon, 10 Mar 2014 13:43:45 +0000
-Subject: [PATCH 46/67] Separate EXT_framebuffer_object from ARB version
+Subject: [PATCH 37/58] Separate EXT_framebuffer_object from ARB version
 
 This patch separates the EXT_framebuffer_object entry points from the ARB
 equivalents.
@@ -20,10 +20,8 @@ We may need to implement the EXT restrictions if we want to upstream.
  src/mapi/glapi/gen/EXT_framebuffer_object.xml | 30 +++----
  src/mapi/glapi/gen/static_data.py             | 15 ++++
  src/mesa/main/fbobject.c                      | 83 +++++++++++++++++++
- src/mesa/main/fbobject.h                      | 54 ++++++++++++
  src/mesa/main/genmipmap.c                     |  6 ++
- src/mesa/main/genmipmap.h                     |  3 +
- 6 files changed, 176 insertions(+), 15 deletions(-)
+ 4 files changed, 119 insertions(+), 15 deletions(-)
 
 diff --git a/src/mapi/glapi/gen/EXT_framebuffer_object.xml b/src/mapi/glapi/gen/EXT_framebuffer_object.xml
 index 6c0e54af1c9..957b6a3a632 100644
@@ -145,36 +143,36 @@ index 6c0e54af1c9..957b6a3a632 100644
      </function>
  </category>
 diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
-index e231c176264..974f366d7b4 100644
+index 53f381e9297..b5b3ed9e9b8 100644
 --- a/src/mapi/glapi/gen/static_data.py
 +++ b/src/mapi/glapi/gen/static_data.py
-@@ -1706,6 +1706,21 @@ offsets = {
-     "FramebufferTextureMultisampleMultiviewOVR" : 1670,
-     "MultiDrawArraysIndirectEXT" : 1671,
-     "MultiDrawElementsIndirectEXT" : 1672,
-+    "IsRenderbufferEXT" : 1673,
-+    "DeleteRenderbuffersEXT" : 1674,
-+    "GenRenderbuffersEXT" : 1675,
-+    "RenderbufferStorageEXT" : 1676,
-+    "GetRenderbufferParameterivEXT" : 1677,
-+    "IsFramebufferEXT" : 1678,
-+    "DeleteFramebuffersEXT" : 1679,
-+    "GenFramebuffersEXT" : 1680,
-+    "CheckFramebufferStatusEXT" : 1681,
-+    "FramebufferTexture1DEXT" : 1682,
-+    "FramebufferTexture2DEXT" : 1683,
-+    "FramebufferTexture3DEXT" : 1684,
-+    "FramebufferRenderbufferEXT" : 1685,
-+    "GetFramebufferAttachmentParameterivEXT" : 1686,
-+    "GenerateMipmapEXT" : 1687,
+@@ -1707,6 +1707,21 @@ offsets = {
+     "FramebufferTextureMultisampleMultiviewOVR" : 1671,
+     "MultiDrawArraysIndirectEXT" : 1672,
+     "MultiDrawElementsIndirectEXT" : 1673,
++    "IsRenderbufferEXT" : 1674,
++    "DeleteRenderbuffersEXT" : 1675,
++    "GenRenderbuffersEXT" : 1676,
++    "RenderbufferStorageEXT" : 1677,
++    "GetRenderbufferParameterivEXT" : 1678,
++    "IsFramebufferEXT" : 1679,
++    "DeleteFramebuffersEXT" : 1680,
++    "GenFramebuffersEXT" : 1681,
++    "CheckFramebufferStatusEXT" : 1682,
++    "FramebufferTexture1DEXT" : 1683,
++    "FramebufferTexture2DEXT" : 1684,
++    "FramebufferTexture3DEXT" : 1685,
++    "FramebufferRenderbufferEXT" : 1686,
++    "GetFramebufferAttachmentParameterivEXT" : 1687,
++    "GenerateMipmapEXT" : 1688,
  }
  
  functions = [
 diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
-index 49893165250..885aa442911 100644
+index 48df6d7c4de..be56c71be97 100644
 --- a/src/mesa/main/fbobject.c
 +++ b/src/mesa/main/fbobject.c
-@@ -1995,6 +1995,11 @@ _mesa_detach_renderbuffer(struct gl_context *ctx,
+@@ -2165,6 +2165,11 @@ _mesa_detach_renderbuffer(struct gl_context *ctx,
     return progress;
  }
  
@@ -186,7 +184,7 @@ index 49893165250..885aa442911 100644
  
  void GLAPIENTRY
  _mesa_DeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-@@ -2722,6 +2727,12 @@ renderbuffer_storage_target(GLenum target, GLenum internalFormat,
+@@ -2892,6 +2897,12 @@ renderbuffer_storage_target(GLenum target, GLenum internalFormat,
  }
  
  
@@ -199,8 +197,8 @@ index 49893165250..885aa442911 100644
  void GLAPIENTRY
  _mesa_EGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
  {
-@@ -2752,6 +2763,11 @@ _mesa_EGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
-    ctx->Driver.EGLImageTargetRenderbufferStorage(ctx, rb, image);
+@@ -2929,6 +2940,11 @@ _mesa_EGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
+    st_egl_image_target_renderbuffer_storage(ctx, rb, image);
  }
  
 +void GLAPIENTRY
@@ -211,7 +209,7 @@ index 49893165250..885aa442911 100644
  
  /**
   * Helper function for _mesa_GetRenderbufferParameteriv() and
-@@ -2784,6 +2800,12 @@ _mesa_RenderbufferStorage(GLenum target, GLenum internalFormat,
+@@ -2961,6 +2977,12 @@ _mesa_RenderbufferStorage(GLenum target, GLenum internalFormat,
                                 NO_SAMPLES, 0, "glRenderbufferStorage");
  }
  
@@ -224,7 +222,7 @@ index 49893165250..885aa442911 100644
  
  void GLAPIENTRY
  _mesa_RenderbufferStorageMultisample(GLenum target, GLsizei samples,
-@@ -2985,6 +3007,11 @@ _mesa_GetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname,
+@@ -3141,6 +3163,11 @@ _mesa_GetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname,
                                   "glGetNamedRenderbufferParameteriv");
  }
  
@@ -236,7 +234,7 @@ index 49893165250..885aa442911 100644
  
  void GLAPIENTRY
  _mesa_GetNamedRenderbufferParameterivEXT(GLuint renderbuffer, GLenum pname,
-@@ -3018,6 +3045,11 @@ _mesa_IsFramebuffer(GLuint framebuffer)
+@@ -3174,6 +3201,11 @@ _mesa_IsFramebuffer(GLuint framebuffer)
     return GL_FALSE;
  }
  
@@ -248,7 +246,7 @@ index 49893165250..885aa442911 100644
  
  /**
   * Check if any of the attachments of the given framebuffer are textures
-@@ -3253,6 +3285,11 @@ _mesa_DeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+@@ -3396,6 +3428,11 @@ _mesa_DeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
     }
  }
  
@@ -260,7 +258,7 @@ index 49893165250..885aa442911 100644
  
  /**
   * This is the implementation for glGenFramebuffers and glCreateFramebuffers.
-@@ -3299,6 +3336,11 @@ create_framebuffers(GLsizei n, GLuint *framebuffers, bool dsa)
+@@ -3442,6 +3479,11 @@ create_framebuffers(GLsizei n, GLuint *framebuffers, bool dsa)
     _mesa_HashUnlockMutex(ctx->Shared->FrameBuffers);
  }
  
@@ -272,7 +270,7 @@ index 49893165250..885aa442911 100644
  
  void GLAPIENTRY
  _mesa_GenFramebuffers(GLsizei n, GLuint *framebuffers)
-@@ -3338,6 +3380,11 @@ _mesa_check_framebuffer_status(struct gl_context *ctx,
+@@ -3481,6 +3523,11 @@ _mesa_check_framebuffer_status(struct gl_context *ctx,
     return buffer->_Status;
  }
  
@@ -284,7 +282,7 @@ index 49893165250..885aa442911 100644
  
  GLenum GLAPIENTRY
  _mesa_CheckFramebufferStatus_no_error(GLenum target)
-@@ -3950,6 +3997,12 @@ _mesa_FramebufferTexture1D_no_error(GLenum target, GLenum attachment,
+@@ -4093,6 +4140,12 @@ _mesa_FramebufferTexture1D_no_error(GLenum target, GLenum attachment,
                                            texture, level, 0);
  }
  
@@ -297,7 +295,7 @@ index 49893165250..885aa442911 100644
  
  void GLAPIENTRY
  _mesa_FramebufferTexture1D(GLenum target, GLenum attachment,
-@@ -3990,6 +4043,12 @@ _mesa_FramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
+@@ -4133,6 +4186,12 @@ _mesa_FramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
                                   false);
  }
  
@@ -310,7 +308,7 @@ index 49893165250..885aa442911 100644
  
  void GLAPIENTRY
  _mesa_FramebufferTexture3D_no_error(GLenum target, GLenum attachment,
-@@ -4100,6 +4159,15 @@ frame_buffer_texture(GLuint framebuffer, GLenum target,
+@@ -4243,6 +4302,15 @@ frame_buffer_texture(GLuint framebuffer, GLenum target,
                               level, 0, layer, layered);
  }
  
@@ -326,7 +324,7 @@ index 49893165250..885aa442911 100644
  void GLAPIENTRY
  _mesa_FramebufferTextureLayer_no_error(GLenum target, GLenum attachment,
                                         GLuint texture, GLint level,
-@@ -4353,6 +4421,15 @@ _mesa_FramebufferRenderbuffer(GLenum target, GLenum attachment,
+@@ -4495,6 +4563,15 @@ _mesa_FramebufferRenderbuffer(GLenum target, GLenum attachment,
                                    renderbuffer, "glFramebufferRenderbuffer");
  }
  
@@ -342,7 +340,7 @@ index 49893165250..885aa442911 100644
  void GLAPIENTRY
  _mesa_NamedFramebufferRenderbuffer_no_error(GLuint framebuffer,
                                              GLenum attachment,
-@@ -4754,6 +4831,12 @@ invalid_pname_enum:
+@@ -4896,6 +4973,12 @@ invalid_pname_enum:
     return;
  }
  
@@ -355,162 +353,11 @@ index 49893165250..885aa442911 100644
  
  void GLAPIENTRY
  _mesa_GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment,
-diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
-index 2a32c158e68..98271d76f50 100644
---- a/src/mesa/main/fbobject.h
-+++ b/src/mesa/main/fbobject.h
-@@ -145,6 +145,9 @@ _mesa_bind_framebuffers(struct gl_context *ctx,
- extern GLboolean GLAPIENTRY
- _mesa_IsRenderbuffer(GLuint renderbuffer);
- 
-+extern GLboolean GLAPIENTRY
-+_mesa_IsRenderbufferEXT(GLuint renderbuffer);
-+
- extern void GLAPIENTRY
- _mesa_BindRenderbuffer(GLenum target, GLuint renderbuffer);
- 
-@@ -157,12 +160,18 @@ _mesa_DeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void GLAPIENTRY
- _mesa_GenRenderbuffers_no_error(GLsizei n, GLuint *renderbuffers);
- 
-+extern void GLAPIENTRY
-+_mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers);
-+
- extern void GLAPIENTRY
- _mesa_GenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- 
- void GLAPIENTRY
- _mesa_CreateRenderbuffers_no_error(GLsizei n, GLuint *renderbuffers);
- 
-+extern void GLAPIENTRY
-+_mesa_GenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers);
-+
- extern void GLAPIENTRY
- _mesa_CreateRenderbuffers(GLsizei n, GLuint *renderbuffers);
- 
-@@ -170,6 +179,10 @@ extern void GLAPIENTRY
- _mesa_RenderbufferStorage(GLenum target, GLenum internalformat,
-                              GLsizei width, GLsizei height);
- 
-+extern void GLAPIENTRY
-+_mesa_RenderbufferStorageEXT(GLenum target, GLenum internalformat,
-+                             GLsizei width, GLsizei height);
-+
- extern void GLAPIENTRY
- _mesa_RenderbufferStorageMultisample(GLenum target, GLsizei samples,
-                                      GLenum internalformat,
-@@ -213,6 +226,10 @@ extern void GLAPIENTRY
- _mesa_GetRenderbufferParameteriv(GLenum target, GLenum pname,
-                                     GLint *params);
- 
-+extern void GLAPIENTRY
-+_mesa_GetRenderbufferParameterivEXT(GLenum target, GLenum pname,
-+                                    GLint *params);
-+
- void GLAPIENTRY
- _mesa_GetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname,
-                                       GLint *params);
-@@ -220,6 +237,9 @@ _mesa_GetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname,
- extern GLboolean GLAPIENTRY
- _mesa_IsFramebuffer(GLuint framebuffer);
- 
-+extern GLboolean GLAPIENTRY
-+_mesa_IsFramebufferEXT(GLuint framebuffer);
-+
- extern void GLAPIENTRY
- _mesa_BindFramebuffer(GLenum target, GLuint framebuffer);
- 
-@@ -229,9 +249,15 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer);
- extern void GLAPIENTRY
- _mesa_DeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- 
-+extern void GLAPIENTRY
-+_mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers);
-+
- extern void GLAPIENTRY
- _mesa_GenFramebuffers(GLsizei n, GLuint *framebuffers);
- 
-+extern void GLAPIENTRY
-+_mesa_GenFramebuffersEXT(GLsizei n, GLuint *framebuffers);
-+
- extern void GLAPIENTRY
- _mesa_CreateFramebuffers(GLsizei n, GLuint *framebuffers);
- 
-@@ -241,6 +267,9 @@ _mesa_CheckFramebufferStatus_no_error(GLenum target);
- extern GLenum GLAPIENTRY
- _mesa_CheckFramebufferStatus(GLenum target);
- 
-+extern GLenum GLAPIENTRY
-+_mesa_CheckFramebufferStatusEXT(GLenum target);
-+
- extern GLenum GLAPIENTRY
- _mesa_CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target);
- 
-@@ -259,6 +288,11 @@ extern void GLAPIENTRY
- _mesa_FramebufferTexture2D_no_error(GLenum target, GLenum attachment,
-                                     GLenum textarget, GLuint texture,
-                                     GLint level);
-+
-+extern void GLAPIENTRY
-+_mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment,
-+                              GLenum textarget, GLuint texture, GLint level);
-+
- extern void GLAPIENTRY
- _mesa_FramebufferTexture2D(GLenum target, GLenum attachment,
-                               GLenum textarget, GLuint texture, GLint level);
-@@ -272,6 +306,11 @@ extern void GLAPIENTRY
- _mesa_FramebufferTexture3D_no_error(GLenum target, GLenum attachment,
-                                     GLenum textarget, GLuint texture,
-                                     GLint level, GLint layer);
-+
-+extern void GLAPIENTRY
-+_mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment,
-+                              GLenum textarget, GLuint texture, GLint level);
-+
- extern void GLAPIENTRY
- _mesa_FramebufferTexture3D(GLenum target, GLenum attachment,
-                               GLenum textarget, GLuint texture,
-@@ -281,6 +320,12 @@ extern void GLAPIENTRY
- _mesa_FramebufferTextureLayer_no_error(GLenum target, GLenum attachment,
-                                        GLuint texture, GLint level,
-                                        GLint layer);
-+
-+extern void GLAPIENTRY
-+_mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment,
-+                              GLenum textarget, GLuint texture,
-+                              GLint level, GLint zoffset);
-+
- extern void GLAPIENTRY
- _mesa_FramebufferTextureLayer(GLenum target, GLenum attachment,
-                                  GLuint texture, GLint level, GLint layer);
-@@ -342,6 +387,11 @@ _mesa_NamedFramebufferRenderbuffer_no_error(GLuint framebuffer,
-                                             GLenum renderbuffertarget,
-                                             GLuint renderbuffer);
- 
-+extern void GLAPIENTRY
-+_mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment,
-+                                 GLenum renderbuffertarget,
-+                                 GLuint renderbuffer);
-+
- extern void GLAPIENTRY
- _mesa_NamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment,
-                                    GLenum renderbuffertarget,
-@@ -390,6 +440,10 @@ _mesa_InvalidateSubFramebuffer_no_error(GLenum target, GLsizei numAttachments,
-                                         const GLenum *attachments, GLint x,
-                                         GLint y, GLsizei width, GLsizei height);
- 
-+extern void GLAPIENTRY
-+_mesa_GetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment,
-+                                             GLenum pname, GLint *params);
-+
- extern void GLAPIENTRY
- _mesa_InvalidateSubFramebuffer(GLenum target, GLsizei numAttachments,
-                                const GLenum *attachments, GLint x, GLint y,
 diff --git a/src/mesa/main/genmipmap.c b/src/mesa/main/genmipmap.c
-index 36727bb7060..8d262e53852 100644
+index 97d0ab36a13..b30cf4f07c4 100644
 --- a/src/mesa/main/genmipmap.c
 +++ b/src/mesa/main/genmipmap.c
-@@ -267,3 +267,9 @@ _mesa_GenerateMultiTexMipmapEXT(GLenum texunit, GLenum target)
+@@ -286,3 +286,9 @@ _mesa_GenerateMultiTexMipmapEXT(GLenum texunit, GLenum target)
     validate_params_and_generate_mipmap(texObj,
                                         "glGenerateMultiTexMipmapEXT");
  }
@@ -520,20 +367,6 @@ index 36727bb7060..8d262e53852 100644
 +{
 +   _mesa_GenerateMipmap(target);
 +}
-diff --git a/src/mesa/main/genmipmap.h b/src/mesa/main/genmipmap.h
-index c661f2184c7..ff3b45a4417 100644
---- a/src/mesa/main/genmipmap.h
-+++ b/src/mesa/main/genmipmap.h
-@@ -44,6 +44,9 @@ _mesa_GenerateMipmap(GLenum target);
- void GLAPIENTRY
- _mesa_GenerateTextureMipmap_no_error(GLuint texture);
- 
-+extern void GLAPIENTRY
-+_mesa_GenerateMipmapEXT(GLenum target);
-+
- extern void GLAPIENTRY
- _mesa_GenerateTextureMipmap(GLuint texture);
- 
 -- 
 2.25.1
 

+ 0 - 509
package/mesa3d/0037-egl-add-config-debug-printout.patch

@@ -1,509 +0,0 @@
-From 02065d490a68d542be56c2ea23346b3fa19928cb Mon Sep 17 00:00:00 2001
-From: Silvestrs Timofejevs <silvestrs.timofejevs@imgtec.com>
-Date: Mon, 24 Sep 2018 14:14:25 +0100
-Subject: [PATCH 37/67] egl: add config debug printout
-
-Feature to print out EGL returned configs for debug purposes.
-
-'eglChooseConfig' and 'eglGetConfigs' debug information printout is
-enabled when the log level equals '_EGL_DEBUG'. The configs are
-printed, and if any of them are "chosen" they are marked with their
-index in the chosen configs array.
----
- src/egl/main/eglconfig.c      |  20 ++-
- src/egl/main/eglconfigdebug.c | 321 ++++++++++++++++++++++++++++++++++
- src/egl/main/eglconfigdebug.h |  55 ++++++
- src/egl/main/egllog.c         |   9 +
- src/egl/main/egllog.h         |   4 +
- src/egl/meson.build           |   2 +
- 6 files changed, 407 insertions(+), 4 deletions(-)
- create mode 100644 src/egl/main/eglconfigdebug.c
- create mode 100644 src/egl/main/eglconfigdebug.h
-
-diff --git a/src/egl/main/eglconfig.c b/src/egl/main/eglconfig.c
-index 5e56948ab72..ea4b3c15f3f 100644
---- a/src/egl/main/eglconfig.c
-+++ b/src/egl/main/eglconfig.c
-@@ -40,6 +40,7 @@
- #include "util/macros.h"
- 
- #include "eglconfig.h"
-+#include "eglconfigdebug.h"
- #include "egldisplay.h"
- #include "eglcurrent.h"
- #include "egllog.h"
-@@ -1039,14 +1040,21 @@ _eglChooseConfig(_EGLDisplay *disp, const EGLint *attrib_list,
-                  EGLConfig *configs, EGLint config_size, EGLint *num_configs)
- {
-    _EGLConfig criteria;
-+   EGLBoolean result;
- 
-    if (!_eglParseConfigAttribList(&criteria, disp, attrib_list))
-       return _eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig");
- 
--   return _eglFilterConfigArray(disp->Configs,
--         configs, config_size, num_configs,
--         _eglFallbackMatch, _eglFallbackCompare,
--         (void *) &criteria);
-+   result = _eglFilterConfigArray(disp->Configs,
-+                                  configs, config_size, num_configs,
-+                                  _eglFallbackMatch, _eglFallbackCompare,
-+                                  (void *) &criteria);
-+
-+   if (result && (_eglGetLogLevel() == _EGL_DEBUG))
-+      eglPrintConfigDebug(disp, configs, *num_configs,
-+                          EGL_CONFIG_DEBUG_CHOOSE);
-+
-+   return result;
- }
- 
- 
-@@ -1096,5 +1104,9 @@ _eglGetConfigs(_EGLDisplay *disp, EGLConfig *configs,
-    *num_config = _eglFlattenArray(disp->Configs, (void *) configs,
-          sizeof(configs[0]), config_size, _eglFlattenConfig);
- 
-+   if (_eglGetLogLevel() == _EGL_DEBUG)
-+      eglPrintConfigDebug(disp, configs, *num_config,
-+                          EGL_CONFIG_DEBUG_GET);
-+
-    return EGL_TRUE;
- }
-diff --git a/src/egl/main/eglconfigdebug.c b/src/egl/main/eglconfigdebug.c
-new file mode 100644
-index 00000000000..92ac41a5614
---- /dev/null
-+++ b/src/egl/main/eglconfigdebug.c
-@@ -0,0 +1,321 @@
-+/*
-+ * Copyright 2017 Imagination Technologies.
-+ * All Rights Reserved.
-+ *
-+ * Based on eglinfo, which has copyright:
-+ * Copyright (C) 2005  Brian Paul   All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included
-+ * in all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#include <stdlib.h>
-+#include <string.h>
-+#include <stdio.h>
-+#include <stdarg.h>
-+
-+#include "eglarray.h"
-+#include "eglconfig.h"
-+#include "eglconfigdebug.h"
-+#include "egldisplay.h"
-+#include "egllog.h"
-+#include "egltypedefs.h"
-+
-+/* Max debug message length */
-+#define CONFIG_DEBUG_MSG_MAX 1000
-+
-+/*
-+ * These are X visual types, so if you're running eglinfo under
-+ * something not X, they probably don't make sense.
-+ */
-+static const char *const vnames[] = { "SG", "GS", "SC", "PC", "TC", "DC" };
-+
-+struct _printAttributes {
-+   EGLint id, size, level;
-+   EGLint red, green, blue, alpha;
-+   EGLint depth, stencil;
-+   EGLint renderable, surfaces;
-+   EGLint vid, vtype, caveat, bindRgb, bindRgba;
-+   EGLint samples, sampleBuffers;
-+   char surfString[100];
-+   EGLint colorBufferType;
-+   EGLint numPlanes, subsample, order;
-+};
-+
-+static void
-+_printHeaderFormat(void)
-+{
-+   /*
-+    * EGL configuration output legend:
-+    *
-+    * chosen --------------- eglChooseConfig returned config priority,
-+    *                        only relevant when eglChooseConfig is called.
-+    * id ------------------- EGL_CONFIG_ID
-+    * bfsz ----------------- EGL_BUFFER_SIZE
-+    * lvl ------------------ EGL_LEVEL
-+    *
-+    * color size
-+    * r -------------------- EGL_RED_SIZE
-+    * g -------------------- EGL_GREEN_SIZE
-+    * b -------------------- EGL_BLUE_SIZE
-+    * a -------------------- EGL_ALPHA_SIZE
-+    * dpth ----------------- EGL_DEPTH_SIZE
-+    * stcl ----------------- EGL_STENCIL_SIZE
-+    *
-+    * multisample
-+    * ns ------------------- EGL_SAMPLES
-+    * b -------------------- EGL_SAMPLE_BUFFERS
-+    * visid ---------------- EGL_NATIVE_VISUAL_ID/EGL_NATIVE_VISUAL_TYPE
-+    * caveat --------------- EGL_CONFIG_CAVEAT
-+    * bind ----------------- EGL_BIND_TO_TEXTURE_RGB/EGL_BIND_TO_TEXTURE_RGBA
-+    *
-+    * renderable
-+    * gl, es, es2, es3, vg - EGL_RENDERABLE_TYPE
-+    *
-+    * supported
-+    * surfaces ------------- EGL_SURFACE_TYPE
-+    * colbuf --------------- EGL_COLOR_BUFFER_TYPE
-+    *
-+    * yuv
-+    * p -------------------- EGL_YUV_NUMBER_OF_PLANES_EXT
-+    * sub ------------------ EGL_YUV_SUBSAMPLE_EXT
-+    * ord ------------------ EGL_YUV_ORDER_EXT
-+    */
-+   _eglLog(_EGL_DEBUG, "---------------");
-+   _eglLog(_EGL_DEBUG, "Configurations:");
-+   _eglLog(_EGL_DEBUG, "cho       bf lv  color size  dp st  ms           vis  cav  bi     renderable           supported"
-+           " col     yuv    ");
-+   _eglLog(_EGL_DEBUG, "sen    id sz  l  r  g  b  a  th cl ns b           id  eat  nd  gl es es2 es3 vg         surfaces"
-+           " buf p sub  ord");
-+   _eglLog(_EGL_DEBUG, "---------------");
-+}
-+
-+static void
-+_snprintfStrcat(char *const msg, const int maxSize, const char *fmt, ...)
-+{
-+   int maxAllowed;
-+   va_list args;
-+
-+   maxAllowed = maxSize - strlen(msg);
-+
-+   va_start(args, fmt);
-+   (void) vsnprintf(&msg[strlen(msg)], maxAllowed, fmt, args);
-+   va_end(args);
-+}
-+
-+static inline const char *_enumToString(EGLint constant)
-+{
-+   switch (constant) {
-+   case EGL_YUV_SUBSAMPLE_4_2_0_EXT: return "420";
-+   case EGL_YUV_SUBSAMPLE_4_2_2_EXT: return "422";
-+   case EGL_YUV_SUBSAMPLE_4_4_4_EXT: return "444";
-+   case EGL_YUV_ORDER_AYUV_EXT: return "AYUV";
-+   case EGL_YUV_ORDER_UYVY_EXT: return "UYVY";
-+   case EGL_YUV_ORDER_VYUY_EXT: return "VYUY";
-+   case EGL_YUV_ORDER_YUYV_EXT: return "YUYV";
-+   case EGL_YUV_ORDER_YVYU_EXT: return "YVYU";
-+   case EGL_YUV_ORDER_YUV_EXT: return "YUV";
-+   case EGL_YUV_ORDER_YVU_EXT: return "YVU";
-+   case EGL_LUMINANCE_BUFFER: return "lum";
-+   case EGL_YUV_BUFFER_EXT: return "yuv";
-+   case EGL_RGB_BUFFER: return "rgb";
-+   default: return "?";
-+   }
-+}
-+
-+static void
-+_eglGetConfigAttrs(_EGLDisplay *const dpy, _EGLConfig *const conf,
-+                   struct _printAttributes *const attr)
-+{
-+   EGLBoolean success = EGL_TRUE;
-+
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_CONFIG_ID, &attr->id);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_BUFFER_SIZE, &attr->size);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_LEVEL, &attr->level);
-+
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_RED_SIZE, &attr->red);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_GREEN_SIZE, &attr->green);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_BLUE_SIZE, &attr->blue);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_ALPHA_SIZE, &attr->alpha);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_DEPTH_SIZE, &attr->depth);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_STENCIL_SIZE, &attr->stencil);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_NATIVE_VISUAL_ID, &attr->vid);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_NATIVE_VISUAL_TYPE, &attr->vtype);
-+
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_CONFIG_CAVEAT, &attr->caveat);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_BIND_TO_TEXTURE_RGB, &attr->bindRgb);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_BIND_TO_TEXTURE_RGBA, &attr->bindRgba);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_RENDERABLE_TYPE, &attr->renderable);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_SURFACE_TYPE, &attr->surfaces);
-+
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_SAMPLES, &attr->samples);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_SAMPLE_BUFFERS, &attr->sampleBuffers);
-+   success &= _eglGetConfigAttrib(dpy, conf, EGL_COLOR_BUFFER_TYPE, &attr->colorBufferType);
-+
-+   if (conf->Display->Extensions.EXT_yuv_surface) {
-+      success &= _eglGetConfigAttrib(dpy, conf, EGL_YUV_NUMBER_OF_PLANES_EXT,
-+                                     &attr->numPlanes);
-+      success &= _eglGetConfigAttrib(dpy, conf, EGL_YUV_SUBSAMPLE_EXT, &attr->subsample);
-+      success &= _eglGetConfigAttrib(dpy, conf, EGL_YUV_ORDER_EXT, &attr->order);
-+   }
-+
-+   if (!success)
-+      _eglLog(_EGL_DEBUG, "%s: config tainted, could not obtain all attributes",
-+              __func__);
-+}
-+
-+static void
-+_eglPrintConfig(_EGLDisplay *const dpy, _EGLConfig *const conf,
-+                char *const printMsg, const int maxMsgSize)
-+{
-+   struct _printAttributes attr = { 0 };
-+
-+   _eglGetConfigAttrs(dpy, conf, &attr);
-+
-+   if (attr.surfaces & EGL_WINDOW_BIT)
-+      strcat(attr.surfString, "win,");
-+   if (attr.surfaces & EGL_PBUFFER_BIT)
-+      strcat(attr.surfString, "pb,");
-+   if (attr.surfaces & EGL_PIXMAP_BIT)
-+      strcat(attr.surfString, "pix,");
-+   if (attr.surfaces & EGL_STREAM_BIT_KHR)
-+      strcat(attr.surfString, "str,");
-+   if (attr.surfaces & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)
-+      strcat(attr.surfString, "prsv,");
-+   if (strlen(attr.surfString) > 0)
-+      attr.surfString[strlen(attr.surfString) - 1] = 0;
-+
-+   _snprintfStrcat(printMsg, maxMsgSize,
-+                   "0x%03x %2d %2d %2d %2d %2d %2d  %2d %2d %2d%2d 0x%08x%2s     ",
-+                   attr.id, attr.size, attr.level,
-+                   attr.red, attr.green, attr.blue, attr.alpha,
-+                   attr.depth, attr.stencil,
-+                   attr.samples, attr.sampleBuffers, attr.vid,
-+                   attr.vtype < 6 ? vnames[attr.vtype] : "--");
-+
-+   _snprintfStrcat(printMsg, maxMsgSize,
-+                   "%c  %c   %c  %c   %c   %c   %c %15s",
-+                   (attr.caveat != EGL_NONE) ? 'y' : ' ',
-+                   (attr.bindRgba) ? 'a' : (attr.bindRgb) ? 'y' : ' ',
-+                   (attr.renderable & EGL_OPENGL_BIT) ? 'y' : ' ',
-+                   (attr.renderable & EGL_OPENGL_ES_BIT) ? 'y' : ' ',
-+                   (attr.renderable & EGL_OPENGL_ES2_BIT) ? 'y' : ' ',
-+                   (attr.renderable & EGL_OPENGL_ES3_BIT) ? 'y' : ' ',
-+                   (attr.renderable & EGL_OPENVG_BIT) ? 'y' : ' ',
-+                   attr.surfString);
-+
-+   _snprintfStrcat(printMsg, maxMsgSize, " %3.3s",
-+                   _enumToString(attr.colorBufferType));
-+
-+   if (attr.colorBufferType == EGL_YUV_BUFFER_EXT)
-+      _snprintfStrcat(printMsg, maxMsgSize, " %1.1d %3.3s %4.4s", attr.numPlanes,
-+                      _enumToString(attr.subsample), _enumToString(attr.order));
-+
-+   _eglLog(_EGL_DEBUG, printMsg);
-+}
-+
-+static void
-+_eglMarkChosenConfig(_EGLConfig *const config,
-+                     _EGLConfig *const *const chosenConfigs,
-+                     const EGLint numConfigs, char *const printMsg,
-+                     const int maxMsgSize)
-+{
-+   const char padding[] = "   ";
-+
-+   if (chosenConfigs == NULL) {
-+      _snprintfStrcat(printMsg, maxMsgSize, "%s ", &padding[0]);
-+      return;
-+   }
-+
-+   /* Find a match, "mark" and return */
-+   for (EGLint i = 0; i < numConfigs; i++) {
-+      if (config == chosenConfigs[i]) {
-+         _snprintfStrcat(printMsg, maxMsgSize, "%*d ", strlen(padding), i);
-+         return;
-+      }
-+   }
-+
-+   _snprintfStrcat(printMsg, maxMsgSize, "%s ", &padding[0]);
-+}
-+
-+static void
-+_eglPrintConfigs(_EGLDisplay *const dpy,
-+                 EGLConfig *const configs, const EGLint numConfigs,
-+                 const enum EGL_CONFIG_DEBUG_OPTION printOption)
-+{
-+   const int maxMsgSize = CONFIG_DEBUG_MSG_MAX;
-+   EGLint numConfigsToPrint;
-+   _EGLConfig **configsToPrint;
-+   _EGLConfig **chosenConfigs;
-+   char *printMsg;
-+
-+   printMsg = malloc(maxMsgSize);
-+   if (!printMsg) {
-+      _eglLog(_EGL_DEBUG, "%s: failed to allocate the print message", __func__);
-+      return;
-+   }
-+
-+   /*
-+    * If the printout request came from the 'eglChooseConfig', all
-+    * configs are printed, and the "chosen" configs are marked.
-+    */
-+   if (printOption == EGL_CONFIG_DEBUG_CHOOSE) {
-+      configsToPrint = (_EGLConfig **) dpy->Configs->Elements;
-+      numConfigsToPrint = dpy->Configs->Size;
-+      chosenConfigs = (_EGLConfig **) configs;
-+   } else {
-+      assert(printOption == EGL_CONFIG_DEBUG_GET);
-+      configsToPrint = (_EGLConfig **) configs;
-+      numConfigsToPrint = numConfigs;
-+      chosenConfigs = NULL;
-+   }
-+
-+   _printHeaderFormat();
-+   for (EGLint i = 0; i < numConfigsToPrint; i++) {
-+      _EGLConfig *configToPrint = configsToPrint[i];
-+
-+      /* "clear" message */
-+      printMsg[0] = '\0';
-+
-+      _eglMarkChosenConfig(configToPrint, chosenConfigs, numConfigs,
-+                           printMsg, maxMsgSize);
-+
-+      _eglPrintConfig(dpy, configToPrint, printMsg, maxMsgSize);
-+   }
-+
-+   free(printMsg);
-+}
-+
-+void eglPrintConfigDebug(_EGLDisplay *const dpy,
-+                         EGLConfig *const configs, const EGLint numConfigs,
-+                         const enum EGL_CONFIG_DEBUG_OPTION printOption)
-+{
-+   if (!numConfigs || !configs) {
-+      _eglLog(_EGL_DEBUG, "%s: nothing to print", __func__);
-+      return;
-+   }
-+
-+   switch (printOption) {
-+   case EGL_CONFIG_DEBUG_CHOOSE:
-+   case EGL_CONFIG_DEBUG_GET:
-+      _eglPrintConfigs(dpy, configs, numConfigs, printOption);
-+      break;
-+   default:
-+      _eglLog(_EGL_DEBUG, "%s: bad debug option", __func__);
-+      break;
-+   }
-+}
-diff --git a/src/egl/main/eglconfigdebug.h b/src/egl/main/eglconfigdebug.h
-new file mode 100644
-index 00000000000..562aefff9de
---- /dev/null
-+++ b/src/egl/main/eglconfigdebug.h
-@@ -0,0 +1,55 @@
-+/**************************************************************************
-+ * Copyright 2017 Imagination Technologies.
-+ * All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ **************************************************************************/
-+
-+#ifndef EGLCONFIGDEBUG_INCLUDED
-+#define EGLCONFIGDEBUG_INCLUDED
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#include "egltypedefs.h"
-+
-+/**
-+ * Config printout options.
-+ */
-+enum EGL_CONFIG_DEBUG_OPTION {
-+   EGL_CONFIG_DEBUG_CHOOSE,
-+   EGL_CONFIG_DEBUG_GET,
-+};
-+
-+/**
-+ * Print the list of configs and the associated attributes.
-+ */
-+void eglPrintConfigDebug(_EGLDisplay *const dpy,
-+                         EGLConfig *const configs, const EGLint numConfigs,
-+                         const enum EGL_CONFIG_DEBUG_OPTION printOption);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* EGLCONFIGDEBUG_INCLUDED */
-diff --git a/src/egl/main/egllog.c b/src/egl/main/egllog.c
-index 973b7600ab1..7a9032f9bbb 100644
---- a/src/egl/main/egllog.c
-+++ b/src/egl/main/egllog.c
-@@ -153,6 +153,15 @@ _eglInitLogger(void)
-    }
- }
- 
-+/**
-+ * Return the log level.
-+ */
-+EGLint
-+_eglGetLogLevel(void)
-+{
-+   return logging.level;
-+}
-+
- 
- /**
-  * Log a message with message logger.
-diff --git a/src/egl/main/egllog.h b/src/egl/main/egllog.h
-index 2a06a34684a..a1cf9770ed8 100644
---- a/src/egl/main/egllog.h
-+++ b/src/egl/main/egllog.h
-@@ -44,6 +44,10 @@ extern "C" {
- #define _EGL_DEBUG   3   /* useful info for debugging */
- 
- 
-+extern EGLint
-+_eglGetLogLevel(void);
-+
-+
- extern void
- _eglLog(EGLint level, const char *fmtStr, ...);
- 
-diff --git a/src/egl/meson.build b/src/egl/meson.build
-index daa6a3a04f0..384bb98ebb3 100644
---- a/src/egl/meson.build
-+++ b/src/egl/meson.build
-@@ -31,6 +31,8 @@ files_egl = files(
-   'main/eglapi.c',
-   'main/eglarray.c',
-   'main/eglarray.h',
-+  'main/eglconfigdebug.c',
-+  'main/eglconfigdebug.h',
-   'main/eglconfig.c',
-   'main/eglconfig.h',
-   'main/eglcontext.c',
--- 
-2.25.1
-

+ 19 - 19
package/mesa3d/0047-egl-null-add-support-for-async-flip-with-front-buffe.patch → package/mesa3d/0038-egl-null-add-support-for-async-flip-with-front-buffe.patch

@@ -1,7 +1,7 @@
-From f775167cbe3f324468f8f355be13bd6efa7d4567 Mon Sep 17 00:00:00 2001
+From 70ff151898723ed28d6afed41ba15a6d88e798a8 Mon Sep 17 00:00:00 2001
 From: Luigi Santivetti <luigi.santivetti@imgtec.com>
 Date: Mon, 21 Oct 2019 09:21:52 +0100
-Subject: [PATCH 47/67] egl/null: add support for async flip with front buffer
+Subject: [PATCH 38/58] egl/null: add support for async flip with front buffer
  rendering
 
 This change enables the application to render into the buffer being
@@ -45,10 +45,10 @@ Signed-off-by: Luigi Santivetti <luigi.santivetti@imgtec.com>
  2 files changed, 129 insertions(+), 32 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
-index 0f683d76e18..13b808bff80 100644
+index 5b382685d38..c8cc3e22a7f 100644
 --- a/src/egl/drivers/dri2/egl_dri2.h
 +++ b/src/egl/drivers/dri2/egl_dri2.h
-@@ -282,6 +282,7 @@ struct dri2_egl_display
+@@ -313,6 +313,7 @@ struct dri2_egl_display
  #ifdef HAVE_NULL_PLATFORM
     bool                      atomic_enabled;
     bool                      in_formats_enabled;
@@ -56,10 +56,10 @@ index 0f683d76e18..13b808bff80 100644
     struct display_output     output;
  #endif
  
-@@ -442,8 +443,12 @@ struct dri2_egl_surface
+@@ -431,8 +432,12 @@ struct dri2_egl_surface
  #endif
-       bool                locked;
-       int                 age;
+       bool locked;
+       int age;
 +#ifdef HAVE_NULL_PLATFORM
 +   } color_buffers[DRI2_SURFACE_NUM_COLOR_BUFFERS], *back, *current, front_buffer;
 +#else
@@ -69,7 +69,7 @@ index 0f683d76e18..13b808bff80 100644
  
  #ifdef HAVE_ANDROID_PLATFORM
     struct ANativeWindow *window;
-@@ -472,12 +477,13 @@ struct dri2_egl_surface
+@@ -465,12 +470,13 @@ struct dri2_egl_surface
  #endif
  
  #ifdef HAVE_NULL_PLATFORM
@@ -85,10 +85,10 @@ index 0f683d76e18..13b808bff80 100644
  #endif
  
 diff --git a/src/egl/drivers/dri2/platform_null.c b/src/egl/drivers/dri2/platform_null.c
-index 48a586b6f38..33cf576f147 100644
+index 2c79199da26..0ce7e60030b 100644
 --- a/src/egl/drivers/dri2/platform_null.c
 +++ b/src/egl/drivers/dri2/platform_null.c
-@@ -601,6 +601,15 @@ swap_dequeue_data_finish(struct dri2_egl_surface *dri2_surf)
+@@ -602,6 +602,15 @@ swap_dequeue_data_finish(struct dri2_egl_surface *dri2_surf)
     pthread_mutex_unlock(&dri2_surf->mutex);
  }
  
@@ -104,7 +104,7 @@ index 48a586b6f38..33cf576f147 100644
  static void
  flip_handler(int fd, unsigned int sequence, unsigned int tv_sec,
               unsigned int tv_usec, void *flip_data)
-@@ -1118,15 +1127,15 @@ get_front_bo(struct dri2_egl_surface *dri2_surf)
+@@ -1146,15 +1155,15 @@ get_front_bo(struct dri2_egl_surface *dri2_surf)
     if (dri2_surf->base.Type == EGL_WINDOW_BIT)
        use |= __DRI_IMAGE_USE_SCANOUT;
  
@@ -126,7 +126,7 @@ index 48a586b6f38..33cf576f147 100644
           return false;
        }
     }
-@@ -1330,7 +1339,7 @@ dri2_null_create_window_surface(_EGLDisplay *disp, _EGLConfig *config,
+@@ -1362,7 +1371,7 @@ dri2_null_create_window_surface(_EGLDisplay *disp, _EGLConfig *config,
     }
  
     err = display_output_modeset(dri2_dpy->fd, &dri2_dpy->output,
@@ -135,7 +135,7 @@ index 48a586b6f38..33cf576f147 100644
     if (err) {
        _eglError(EGL_BAD_NATIVE_WINDOW, "window set mode");
        goto err_destroy_surface;
-@@ -1360,6 +1369,60 @@ dri2_null_create_pbuffer_surface(_EGLDisplay *disp, _EGLConfig *config,
+@@ -1392,6 +1401,60 @@ dri2_null_create_pbuffer_surface(_EGLDisplay *disp, _EGLConfig *config,
     return create_surface(disp, config, EGL_PBUFFER_BIT, attrib_list);
  }
  
@@ -196,7 +196,7 @@ index 48a586b6f38..33cf576f147 100644
  static EGLBoolean
  dri2_null_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
  {
-@@ -1371,14 +1434,7 @@ dri2_null_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
+@@ -1403,14 +1466,7 @@ dri2_null_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
      * sure we process the flip event.
      */
     if (dri2_surf->swap_queue_processor) {
@@ -212,7 +212,7 @@ index 48a586b6f38..33cf576f147 100644
        pthread_cancel(dri2_surf->swap_queue_processor);
        pthread_join(dri2_surf->swap_queue_processor, NULL);
     }
-@@ -1392,11 +1448,11 @@ dri2_null_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
+@@ -1424,11 +1480,11 @@ dri2_null_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
     if (dri2_surf->mutex_init)
        pthread_mutex_destroy(&dri2_surf->mutex);
  
@@ -228,7 +228,7 @@ index 48a586b6f38..33cf576f147 100644
  
     for (unsigned i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
        if (dri2_surf->color_buffers[i].fb_id)
-@@ -1423,6 +1479,16 @@ dri2_null_swap_buffers(_EGLDisplay *disp, _EGLSurface *draw)
+@@ -1455,6 +1511,16 @@ dri2_null_swap_buffers(_EGLDisplay *disp, _EGLSurface *draw)
     if (dri2_surf->base.Type != EGL_WINDOW_BIT)
        return EGL_TRUE;
  
@@ -245,7 +245,7 @@ index 48a586b6f38..33cf576f147 100644
     for (unsigned i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++)
        if (dri2_surf->color_buffers[i].age > 0)
           dri2_surf->color_buffers[i].age++;
-@@ -1465,6 +1531,22 @@ dri2_null_query_buffer_age(_EGLDisplay *disp, _EGLSurface *surface)
+@@ -1497,6 +1563,22 @@ dri2_null_query_buffer_age(_EGLDisplay *disp, _EGLSurface *surface)
  static EGLBoolean
  dri2_null_swap_interval(_EGLDisplay *dpy, _EGLSurface *draw, EGLint interval)
  {
@@ -268,7 +268,7 @@ index 48a586b6f38..33cf576f147 100644
     _eglLog(_EGL_DEBUG, "DRI2: set swap interval to %d", interval);
     draw->SwapInterval = interval;
     return EGL_TRUE;
-@@ -1502,7 +1584,7 @@ dri2_null_image_get_buffers(__DRIdrawable *driDrawable, unsigned int format,
+@@ -1534,7 +1616,7 @@ dri2_null_image_get_buffers(__DRIdrawable *driDrawable, unsigned int format,
  
     if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT) {
        buffers->image_mask |= __DRI_IMAGE_BUFFER_FRONT;
@@ -277,7 +277,7 @@ index 48a586b6f38..33cf576f147 100644
     }
  
     if (buffer_mask & __DRI_IMAGE_BUFFER_BACK) {
-@@ -1640,18 +1722,27 @@ dri2_null_setup_swap_interval(_EGLDisplay *disp)
+@@ -1672,18 +1754,27 @@ dri2_null_setup_swap_interval(_EGLDisplay *disp)
     dri2_setup_swap_interval(disp, swap_max_interval);
  
     err = drmGetCap(dri2_dpy->fd, DRM_CAP_ASYNC_PAGE_FLIP, &value);

+ 8 - 8
package/mesa3d/0048-gbm-add-pbuffer-support.patch → package/mesa3d/0039-gbm-add-pbuffer-support.patch

@@ -1,7 +1,7 @@
-From 4d19dc5cc9be4f3f25ed8befbfcda70c047065d3 Mon Sep 17 00:00:00 2001
+From f72eb12cb7e96bc01f66c328f96d4453e06ea9f7 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Fri, 21 Aug 2020 12:13:28 +0100
-Subject: [PATCH 48/67] gbm: add pbuffer support
+Subject: [PATCH 39/58] gbm: add pbuffer support
 
 The EGL backend GLX provider for XWayland may get the EGL configs it
 uses to generate the GLX ones from GBM. That platform doesn't support
@@ -18,21 +18,21 @@ isn't supported.
  2 files changed, 103 insertions(+), 10 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
-index 13b808bff80..141df1b1732 100644
+index c8cc3e22a7f..e48d3d26914 100644
 --- a/src/egl/drivers/dri2/egl_dri2.h
 +++ b/src/egl/drivers/dri2/egl_dri2.h
-@@ -471,6 +471,9 @@ struct dri2_egl_surface
+@@ -464,6 +464,9 @@ struct dri2_egl_surface
     /* surfaceless and device */
-    __DRIimage           *front;
-    unsigned int         visual;
+    __DRIimage *front;
+    unsigned int visual;
 +#ifdef HAVE_DRM_PLATFORM
-+   struct gbm_bo       *front_bo;
++   struct gbm_bo *front_bo;
 +#endif
  
  #ifdef HAVE_WAYLAND_PLATFORM
     void                 *swrast_front;
 diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c
-index 2b329437f88..258e8b6593e 100644
+index 45895a88b6c..4d08851c782 100644
 --- a/src/egl/drivers/dri2/platform_drm.c
 +++ b/src/egl/drivers/dri2/platform_drm.c
 @@ -41,6 +41,38 @@

+ 86 - 57
package/mesa3d/0049-egl-null-expose-EXT_yuv_surface-support.patch → package/mesa3d/0040-egl-null-expose-EXT_yuv_surface-support.patch

@@ -1,32 +1,17 @@
-From b0ea3289c16d31d840af71876187cf30b2b32e9a Mon Sep 17 00:00:00 2001
+From ec732c0f4dc70991c670fb2995d2505a91b18a68 Mon Sep 17 00:00:00 2001
 From: Luigi Santivetti <luigi.santivetti@imgtec.com>
 Date: Thu, 2 Sep 2021 22:47:54 +0100
-Subject: [PATCH 49/68] egl/null: expose EXT_yuv_surface support
+Subject: [PATCH 40/58] egl/null: expose EXT_yuv_surface support
 
 ---
- include/GL/internal/dri_interface.h  |   2 +
- src/egl/drivers/dri2/platform_null.c | 177 ++++++++++++++++++++++++---
- src/mesa/drivers/dri/pvr/pvrutil.c   |   8 ++
- 3 files changed, 173 insertions(+), 14 deletions(-)
+ src/egl/drivers/dri2/platform_null.c | 247 +++++++++++++++++++++++++--
+ 1 file changed, 233 insertions(+), 14 deletions(-)
 
-diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
-index 9c7bcac4cae..888a117d56e 100644
---- a/include/GL/internal/dri_interface.h
-+++ b/include/GL/internal/dri_interface.h
-@@ -1411,6 +1411,8 @@ struct __DRIdri2ExtensionRec {
- #define __DRI_IMAGE_FORMAT_ARGB4444     0x1018
- #define __DRI_IMAGE_FORMAT_YVU444_PACK10_IMG 0x1019
- #define __DRI_IMAGE_FORMAT_BGR888       0x101a
-+#define __DRI_IMAGE_FORMAT_NV12         0x101b
-+#define __DRI_IMAGE_FORMAT_NV21         0x101c
- 
- #define __DRI_IMAGE_USE_SHARE		0x0001
- #define __DRI_IMAGE_USE_SCANOUT		0x0002
 diff --git a/src/egl/drivers/dri2/platform_null.c b/src/egl/drivers/dri2/platform_null.c
-index f2c481c256b..d1e576af5ce 100644
+index 0ce7e60030b..c78e1fe0880 100644
 --- a/src/egl/drivers/dri2/platform_null.c
 +++ b/src/egl/drivers/dri2/platform_null.c
-@@ -79,6 +79,35 @@ uint32_t get_back_buffer_id(struct dri2_egl_surface *dri2_surf)
+@@ -79,6 +79,70 @@ uint32_t get_back_buffer_id(struct dri2_egl_surface *dri2_surf)
        .prop_value = value,                                                  \
     }
  
@@ -57,12 +42,47 @@ index f2c481c256b..d1e576af5ce 100644
 +      .num_planes = 2,
 +      .plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT,
 +   },
++   {
++      /* __DRI_IMAGE_FORMAT_YU12 */
++      .order = __DRI_ATTRIB_YUV_ORDER_YUV_BIT,
++      .subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT,
++      .num_planes = 3,
++      .plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT,
++   },
++   {
++      /* __DRI_IMAGE_FORMAT_YV12 */
++      .order = __DRI_ATTRIB_YUV_ORDER_YVU_BIT,
++      .subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT,
++      .num_planes = 3,
++      .plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT,
++   },
++   {
++      /* __DRI_IMAGE_FORMAT_UYVY */
++      .order = __DRI_ATTRIB_YUV_ORDER_UYVY_BIT,
++      .subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_2_BIT,
++      .num_planes = 1,
++      .plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT,
++   },
++   {
++      /* __DRI_IMAGE_FORMAT_YVYU */
++      .order = __DRI_ATTRIB_YUV_ORDER_YVYU_BIT,
++      .subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_2_BIT,
++      .num_planes = 1,
++      .plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT,
++   },
++   {
++      /* __DRI_IMAGE_FORMAT_VYUY */
++      .order = __DRI_ATTRIB_YUV_ORDER_VYUY_BIT,
++      .subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_2_BIT,
++      .num_planes = 1,
++      .plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT,
++   },
 +};
 +
  /*
   * The index of entries in this table is used as a bitmask in
   * dri2_dpy->formats, which tracks the formats supported by the display.
-@@ -88,24 +117,49 @@ static const struct dri2_null_format {
+@@ -88,24 +152,84 @@ static const struct dri2_null_format {
     int dri_image_format;
     int rgba_shifts[4];
     unsigned int rgba_sizes[4];
@@ -109,10 +129,45 @@ index f2c481c256b..d1e576af5ce 100644
 +      .rgba_shifts = { -1, -1, -1, -1 },
 +      .rgba_sizes = { 0, 0, 0, 0 },
 +      .yuv = &dri2_null_yuv_attribs[2],
++   },
++   {
++      .drm_format = DRM_FORMAT_YUV420,
++      .dri_image_format = __DRI_IMAGE_FORMAT_YU12,
++      .rgba_shifts = { -1, -1, -1, -1 },
++      .rgba_sizes = { 0, 0, 0, 0 },
++      .yuv = &dri2_null_yuv_attribs[3],
++   },
++   {
++      .drm_format = DRM_FORMAT_YVU420,
++      .dri_image_format = __DRI_IMAGE_FORMAT_YV12,
++      .rgba_shifts = { -1, -1, -1, -1 },
++      .rgba_sizes = { 0, 0, 0, 0 },
++      .yuv = &dri2_null_yuv_attribs[4],
++   },
++   {
++      .drm_format = DRM_FORMAT_UYVY,
++      .dri_image_format = __DRI_IMAGE_FORMAT_UYVY,
++      .rgba_shifts = { -1, -1, -1, -1 },
++      .rgba_sizes = { 0, 0, 0, 0 },
++      .yuv = &dri2_null_yuv_attribs[5],
++   },
++   {
++      .drm_format = DRM_FORMAT_YVYU,
++      .dri_image_format = __DRI_IMAGE_FORMAT_YVYU,
++      .rgba_shifts = { -1, -1, -1, -1 },
++      .rgba_sizes = { 0, 0, 0, 0 },
++      .yuv = &dri2_null_yuv_attribs[6],
++   },
++   {
++      .drm_format = DRM_FORMAT_VYUY,
++      .dri_image_format = __DRI_IMAGE_FORMAT_VYUY,
++      .rgba_shifts = { -1, -1, -1, -1 },
++      .rgba_sizes = { 0, 0, 0, 0 },
++      .yuv = &dri2_null_yuv_attribs[7],
     },
  };
  
-@@ -137,6 +191,36 @@ format_idx_get_from_config(struct dri2_egl_display *dri2_dpy,
+@@ -137,6 +261,36 @@ format_idx_get_from_config(struct dri2_egl_display *dri2_dpy,
     return -1;
  }
  
@@ -149,7 +204,7 @@ index f2c481c256b..d1e576af5ce 100644
  static int
  format_idx_get_from_dri_image_format(uint32_t dri_image_format)
  {
-@@ -1082,23 +1166,21 @@ static bool
+@@ -1082,23 +1236,21 @@ static bool
  add_fb_for_dri_image(struct dri2_egl_display *dri2_dpy, __DRIimage *image,
                       uint32_t *fb_id_out)
  {
@@ -178,7 +233,7 @@ index f2c481c256b..d1e576af5ce 100644
     format_idx = format_idx_get_from_dri_image_format(format);
     assert(format_idx != -1);
  
-@@ -1106,10 +1188,44 @@ add_fb_for_dri_image(struct dri2_egl_display *dri2_dpy, __DRIimage *image,
+@@ -1106,10 +1258,44 @@ add_fb_for_dri_image(struct dri2_egl_display *dri2_dpy, __DRIimage *image,
        dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_MODIFIER_UPPER, &h_mod);
        dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_MODIFIER_LOWER, &l_mod);
  
@@ -224,7 +279,7 @@ index f2c481c256b..d1e576af5ce 100644
     return !drmModeAddFB2WithModifiers(dri2_dpy->fd, width, height,
                                        dri2_null_formats[format_idx].drm_format,
                                        handles, pitches, offsets, modifiers,
-@@ -1256,6 +1372,7 @@ create_surface(_EGLDisplay *disp, _EGLConfig *config, EGLint type,
+@@ -1256,6 +1442,7 @@ create_surface(_EGLDisplay *disp, _EGLConfig *config, EGLint type,
     struct dri2_egl_config *dri2_config = dri2_egl_config(config);
     struct dri2_egl_surface *dri2_surf;
     const __DRIconfig *dri_config;
@@ -232,7 +287,7 @@ index f2c481c256b..d1e576af5ce 100644
     _EGLSurface *surf;
     int format_idx;
     bool ret;
-@@ -1286,7 +1403,14 @@ create_surface(_EGLDisplay *disp, _EGLConfig *config, EGLint type,
+@@ -1286,7 +1473,14 @@ create_surface(_EGLDisplay *disp, _EGLConfig *config, EGLint type,
         goto err_free_surface;
     }
  
@@ -248,7 +303,7 @@ index f2c481c256b..d1e576af5ce 100644
     assert(format_idx != -1);
  
     dri2_surf->format = dri2_null_formats[format_idx].dri_image_format;
-@@ -1627,6 +1751,17 @@ dri2_null_image_get_buffers(__DRIdrawable *driDrawable, unsigned int format,
+@@ -1627,6 +1821,17 @@ dri2_null_image_get_buffers(__DRIdrawable *driDrawable, unsigned int format,
     return 1;
  }
  
@@ -266,7 +321,7 @@ index f2c481c256b..d1e576af5ce 100644
  static void
  dri2_null_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
  {
-@@ -1635,10 +1770,11 @@ dri2_null_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
+@@ -1635,10 +1840,11 @@ dri2_null_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
  }
  
  static const __DRIimageLoaderExtension image_loader_extension = {
@@ -279,7 +334,7 @@ index f2c481c256b..d1e576af5ce 100644
  };
  
  static const __DRIextension *image_loader_extensions[] = {
-@@ -1720,10 +1856,24 @@ dri2_null_add_configs_for_formats(_EGLDisplay *disp)
+@@ -1720,10 +1926,24 @@ dri2_null_add_configs_for_formats(_EGLDisplay *disp)
  
     for (unsigned i = 0; dri2_dpy->driver_configs[i]; i++) {
        struct dri2_egl_config *dri2_conf;
@@ -306,7 +361,7 @@ index f2c481c256b..d1e576af5ce 100644
        if (format_idx == -1)
           continue;
  
-@@ -1735,8 +1885,7 @@ dri2_null_add_configs_for_formats(_EGLDisplay *disp)
+@@ -1735,8 +1955,7 @@ dri2_null_add_configs_for_formats(_EGLDisplay *disp)
  
        dri2_conf = dri2_add_config(disp,
                                    dri2_dpy->driver_configs[i], count + 1,
@@ -316,32 +371,6 @@ index f2c481c256b..d1e576af5ce 100644
        if (dri2_conf)
           count++;
     }
-diff --git a/src/mesa/drivers/dri/pvr/pvrutil.c b/src/mesa/drivers/dri/pvr/pvrutil.c
-index 945e18cf220..d107a5dafad 100644
---- a/src/mesa/drivers/dri/pvr/pvrutil.c
-+++ b/src/mesa/drivers/dri/pvr/pvrutil.c
-@@ -174,6 +174,10 @@ PVRDRIFormatToFourCC(int dri_format)
-       return DRM_FORMAT_YVU444_PACK10_IMG;
-    case __DRI_IMAGE_FORMAT_BGR888:
-       return DRM_FORMAT_BGR888;
-+   case __DRI_IMAGE_FORMAT_NV12:
-+      return DRM_FORMAT_NV12;
-+   case __DRI_IMAGE_FORMAT_NV21:
-+      return DRM_FORMAT_NV21;
-    default:
-       __driUtilMessage("%s: Unknown format: %d", __func__, dri_format);
-       break;
-@@ -230,6 +234,10 @@ PVRDRIFourCCToDRIFormat(int iFourCC)
-       return __DRI_IMAGE_FORMAT_YVU444_PACK10_IMG;
-    case DRM_FORMAT_BGR888:
-       return __DRI_IMAGE_FORMAT_BGR888;
-+   case DRM_FORMAT_NV12:
-+      return __DRI_IMAGE_FORMAT_NV12;
-+   case DRM_FORMAT_NV21:
-+      return __DRI_IMAGE_FORMAT_NV21;
-    default:
-       __driUtilMessage("%s: Unknown format: %d", __func__, iFourCC);
-       break;
 -- 
 2.25.1
 

+ 54 - 45
package/mesa3d/0050-dri-preserve-the-original-FD-for-driver-use.patch → package/mesa3d/0041-dri-preserve-the-original-FD-for-driver-use.patch

@@ -1,7 +1,7 @@
-From db015d5fd0ded075e759677c047c581151bb1b52 Mon Sep 17 00:00:00 2001
+From 2df7eb9a5b8ff08184f0759a4d842bfef4f4ec63 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Tue, 9 Mar 2021 17:15:30 +0000
-Subject: [PATCH 50/67] dri: preserve the original FD for driver use.
+Subject: [PATCH 41/58] dri: preserve the original FD for driver use.
 
 If an application uses a different GPU from the default, allow the
 file descriptor (FD) for that original GPU/display to be preserved
@@ -24,20 +24,20 @@ The feature is currently supported by the Wayland, and DRI3 based
 X11 EGL and GLX platforms.
 ---
  include/GL/internal/dri_interface.h      | 26 +++++++++++++++++--
- src/egl/drivers/dri2/egl_dri2.c          | 10 +++++++
+ src/egl/drivers/dri2/egl_dri2.c          | 12 ++++++++-
  src/egl/drivers/dri2/egl_dri2.h          |  1 +
  src/egl/drivers/dri2/platform_wayland.c  | 31 ++++++++++++++++++++--
  src/egl/drivers/dri2/platform_x11.c      |  3 +++
  src/egl/drivers/dri2/platform_x11_dri3.c | 27 ++++++++++++++++++-
  src/glx/dri3_glx.c                       | 33 ++++++++++++++++++++++--
  src/glx/dri3_priv.h                      |  1 +
- 8 files changed, 125 insertions(+), 7 deletions(-)
+ 8 files changed, 126 insertions(+), 8 deletions(-)
 
 diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
-index 888a117d56e..2fb440feb50 100644
+index acd58ccb559..ab6a9fb125b 100644
 --- a/include/GL/internal/dri_interface.h
 +++ b/include/GL/internal/dri_interface.h
-@@ -1146,7 +1146,7 @@ struct __DRIbufferRec {
+@@ -1005,7 +1005,7 @@ struct __DRIbufferRec {
  };
  
  #define __DRI_DRI2_LOADER "DRI_DRI2Loader"
@@ -46,7 +46,7 @@ index 888a117d56e..2fb440feb50 100644
  
  enum dri_loader_cap {
     /* Whether the loader handles RGBA channel ordering correctly. If not,
-@@ -1227,6 +1227,17 @@ struct __DRIdri2LoaderExtensionRec {
+@@ -1086,6 +1086,17 @@ struct __DRIdri2LoaderExtensionRec {
       * \since 5
       */
      void (*destroyLoaderImageState)(void *loaderPrivate);
@@ -64,7 +64,7 @@ index 888a117d56e..2fb440feb50 100644
  };
  
  /**
-@@ -2131,7 +2142,7 @@ struct __DRIimageList {
+@@ -2032,7 +2043,7 @@ struct __DRIimageList {
  };
  
  #define __DRI_IMAGE_LOADER "DRI_IMAGE_LOADER"
@@ -73,7 +73,7 @@ index 888a117d56e..2fb440feb50 100644
  
  struct __DRIimageLoaderExtensionRec {
      __DRIextension base;
-@@ -2199,6 +2210,17 @@ struct __DRIimageLoaderExtensionRec {
+@@ -2100,6 +2111,17 @@ struct __DRIimageLoaderExtensionRec {
       * \since 4
       */
      void (*destroyLoaderImageState)(void *loaderPrivate);
@@ -92,10 +92,10 @@ index 888a117d56e..2fb440feb50 100644
  
  /**
 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index c4a49cae592..1df53ef011c 100644
+index 3ae5cddbc20..b0fa686581a 100644
 --- a/src/egl/drivers/dri2/egl_dri2.c
 +++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -1367,6 +1367,16 @@ dri2_display_destroy(_EGLDisplay *disp)
+@@ -1360,6 +1360,16 @@ dri2_display_destroy(_EGLDisplay *disp)
        break;
     }
  
@@ -112,20 +112,29 @@ index c4a49cae592..1df53ef011c 100644
     if (dri2_dpy->fd >= 0)
        close(dri2_dpy->fd);
  
+@@ -3471,7 +3481,7 @@ dri2_bind_wayland_display_wl(_EGLDisplay *disp, struct wl_display *wl_dpy)
+    if (dri2_dpy->wl_server_drm)
+            return EGL_FALSE;
+ 
+-   device_name = drmGetRenderDeviceNameFromFd(dri2_dpy->fd);
++   device_name = drmGetRenderDeviceNameFromFd(dri2_dpy->fd_dpy);
+    if (!device_name)
+       device_name = strdup(dri2_dpy->device_name);
+    if (!device_name)
 diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
-index 141df1b1732..af03caee623 100644
+index e48d3d26914..a5418bd3a5b 100644
 --- a/src/egl/drivers/dri2/egl_dri2.h
 +++ b/src/egl/drivers/dri2/egl_dri2.h
-@@ -230,6 +230,7 @@ struct dri2_egl_display
+@@ -260,6 +260,7 @@ struct dri2_egl_display
     const __DRIconfigOptionsExtension *configOptions;
     const __DRImutableRenderBufferDriverExtension *mutable_render_buffer;
-    int                       fd;
-+   int                       fd_dpy;
+    int fd;
++   int fd_dpy;
  
     /* dri2_initialize/dri2_terminate increment/decrement this count, so does
      * dri2_make_current (tracks if there are active contexts/surfaces). */
 diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
-index 06272d4081e..b393e058770 100644
+index be10fc6474a..d651274a85f 100644
 --- a/src/egl/drivers/dri2/platform_wayland.c
 +++ b/src/egl/drivers/dri2/platform_wayland.c
 @@ -44,6 +44,7 @@
@@ -134,9 +143,9 @@ index 06272d4081e..b393e058770 100644
  #include "util/anon_file.h"
 +#include "util/os_file.h"
  #include "eglglobals.h"
+ #include "kopper_interface.h"
  
- #include <wayland-egl-backend.h>
-@@ -973,21 +974,32 @@ dri2_wl_get_capability(void *loaderPrivate, enum dri_loader_cap cap)
+@@ -1448,21 +1449,32 @@ dri2_wl_get_capability(void *loaderPrivate, enum dri_loader_cap cap)
     }
  }
  
@@ -171,7 +180,7 @@ index 06272d4081e..b393e058770 100644
  };
  
  static void
-@@ -1640,12 +1652,14 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
+@@ -2224,12 +2236,14 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
  {
     _EGLDevice *dev;
     struct dri2_egl_display *dri2_dpy;
@@ -184,11 +193,11 @@ index 06272d4081e..b393e058770 100644
     dri2_dpy->fd = -1;
 +   dri2_dpy->fd_dpy = -1;
     disp->DriverData = (void *) dri2_dpy;
-    if (disp->PlatformDisplay == NULL) {
-       dri2_dpy->wl_dpy = wl_display_connect(NULL);
-@@ -1690,8 +1704,20 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
-        (roundtrip(dri2_dpy) < 0 || !dri2_dpy->authenticated))
-       goto cleanup;
+ 
+    if (dri2_wl_formats_init(&dri2_dpy->formats) < 0)
+@@ -2303,8 +2317,20 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
+          goto cleanup;
+    }
  
 +   fd_old = dri2_dpy->fd;
 +   dri2_dpy->fd_dpy = os_dupfd_cloexec(dri2_dpy->fd);
@@ -207,19 +216,19 @@ index 06272d4081e..b393e058770 100644
     dev = _eglAddDevice(dri2_dpy->fd, false);
     if (!dev) {
        _eglError(EGL_NOT_INITIALIZED, "DRI2: failed to find EGLDevice");
-@@ -2236,6 +2262,7 @@ dri2_initialize_wayland_swrast(_EGLDisplay *disp)
+@@ -2868,6 +2894,7 @@ dri2_initialize_wayland_swrast(_EGLDisplay *disp)
        return _eglError(EGL_BAD_ALLOC, "eglInitialize");
  
     dri2_dpy->fd = -1;
 +   dri2_dpy->fd_dpy = -1;
     disp->DriverData = (void *) dri2_dpy;
-    if (disp->PlatformDisplay == NULL) {
-       dri2_dpy->wl_dpy = wl_display_connect(NULL);
+ 
+    if (dri2_wl_formats_init(&dri2_dpy->formats) < 0)
 diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c
-index 5ffdf132184..5cf3ce2a369 100644
+index 53302981fc2..730a91d14c3 100644
 --- a/src/egl/drivers/dri2/platform_x11.c
 +++ b/src/egl/drivers/dri2/platform_x11.c
-@@ -1277,6 +1277,7 @@ dri2_initialize_x11_swrast(_EGLDisplay *disp)
+@@ -1413,6 +1413,7 @@ dri2_initialize_x11_swrast(_EGLDisplay *disp)
        return _eglError(EGL_BAD_ALLOC, "eglInitialize");
  
     dri2_dpy->fd = -1;
@@ -227,7 +236,7 @@ index 5ffdf132184..5cf3ce2a369 100644
     if (!dri2_get_xcb_connection(disp, dri2_dpy))
        goto cleanup;
  
-@@ -1364,6 +1365,7 @@ dri2_initialize_x11_dri3(_EGLDisplay *disp)
+@@ -1497,6 +1498,7 @@ dri2_initialize_x11_dri3(_EGLDisplay *disp)
        return _eglError(EGL_BAD_ALLOC, "eglInitialize");
  
     dri2_dpy->fd = -1;
@@ -235,7 +244,7 @@ index 5ffdf132184..5cf3ce2a369 100644
     if (!dri2_get_xcb_connection(disp, dri2_dpy))
        goto cleanup;
  
-@@ -1472,6 +1474,7 @@ dri2_initialize_x11_dri2(_EGLDisplay *disp)
+@@ -1605,6 +1607,7 @@ dri2_initialize_x11_dri2(_EGLDisplay *disp)
        return _eglError(EGL_BAD_ALLOC, "eglInitialize");
  
     dri2_dpy->fd = -1;
@@ -244,7 +253,7 @@ index 5ffdf132184..5cf3ce2a369 100644
        goto cleanup;
  
 diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c b/src/egl/drivers/dri2/platform_x11_dri3.c
-index e117105fcb6..0babf9f867e 100644
+index 3d7c2ae4401..860d975ba5c 100644
 --- a/src/egl/drivers/dri2/platform_x11_dri3.c
 +++ b/src/egl/drivers/dri2/platform_x11_dri3.c
 @@ -32,6 +32,7 @@
@@ -255,7 +264,7 @@ index e117105fcb6..0babf9f867e 100644
  
  #include "egl_dri2.h"
  #include "platform_x11_dri3.h"
-@@ -414,11 +415,21 @@ dri3_flush_front_buffer(__DRIdrawable *driDrawable, void *loaderPrivate)
+@@ -431,11 +432,21 @@ dri3_flush_front_buffer(__DRIdrawable *driDrawable, void *loaderPrivate)
        _eglLog(_EGL_WARNING, "FIXME: egl/x11 doesn't support front buffer rendering.");
  }
  
@@ -278,7 +287,7 @@ index e117105fcb6..0babf9f867e 100644
  };
  
  static EGLBoolean
-@@ -537,6 +548,7 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy)
+@@ -554,6 +565,7 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy)
     xcb_xfixes_query_version_cookie_t xfixes_query_cookie;
     xcb_generic_error_t *error;
     const xcb_query_extension_reply_t *extension;
@@ -286,7 +295,7 @@ index e117105fcb6..0babf9f867e 100644
  
     xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_dri3_id);
     xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_present_id);
-@@ -616,12 +628,25 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy)
+@@ -633,12 +645,25 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy)
        return EGL_FALSE;
     }
  
@@ -313,7 +322,7 @@ index e117105fcb6..0babf9f867e 100644
     }
  
 diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
-index db1b079663f..1ed6b60ffe8 100644
+index 6370ca05beb..cf7fc613c86 100644
 --- a/src/glx/dri3_glx.c
 +++ b/src/glx/dri3_glx.c
 @@ -77,6 +77,7 @@
@@ -324,7 +333,7 @@ index db1b079663f..1ed6b60ffe8 100644
  
  static struct dri3_drawable *
  loader_drawable_to_dri3_drawable(struct loader_dri3_drawable *draw) {
-@@ -529,6 +530,14 @@ dri3_flush_swap_buffers(__DRIdrawable *driDrawable, void *loaderPrivate)
+@@ -543,6 +544,14 @@ dri3_flush_swap_buffers(__DRIdrawable *driDrawable, void *loaderPrivate)
     loader_dri3_swapbuffer_barrier(draw);
  }
  
@@ -339,7 +348,7 @@ index db1b079663f..1ed6b60ffe8 100644
  static void
  dri_set_background_context(void *loaderPrivate)
  {
-@@ -548,11 +557,12 @@ dri_is_thread_safe(void *loaderPrivate)
+@@ -562,11 +571,12 @@ dri_is_thread_safe(void *loaderPrivate)
  /* The image loader extension record for DRI3
   */
  static const __DRIimageLoaderExtension imageLoaderExtension = {
@@ -353,7 +362,7 @@ index db1b079663f..1ed6b60ffe8 100644
  };
  
  const __DRIuseInvalidateExtension dri3UseInvalidate = {
-@@ -618,6 +628,10 @@ dri3_destroy_screen(struct glx_screen *base)
+@@ -632,6 +642,10 @@ dri3_destroy_screen(struct glx_screen *base)
     loader_dri3_close_screen(psc->driScreen);
     (*psc->core->destroyScreen) (psc->driScreen);
     driDestroyConfigs(psc->driver_configs);
@@ -364,7 +373,7 @@ index db1b079663f..1ed6b60ffe8 100644
     close(psc->fd);
     free(psc);
  }
-@@ -842,8 +856,9 @@ dri3_create_screen(int screen, struct glx_display * priv)
+@@ -858,8 +872,9 @@ dri3_create_screen(int screen, struct glx_display * priv)
     struct dri3_screen *psc;
     __GLXDRIscreen *psp;
     struct glx_config *configs = NULL, *visuals = NULL;
@@ -375,7 +384,7 @@ index db1b079663f..1ed6b60ffe8 100644
  
     psc = calloc(1, sizeof *psc);
     if (psc == NULL)
-@@ -851,6 +866,7 @@ dri3_create_screen(int screen, struct glx_display * priv)
+@@ -867,6 +882,7 @@ dri3_create_screen(int screen, struct glx_display * priv)
  
     psc->fd = -1;
     psc->fd_display_gpu = -1;
@@ -383,7 +392,7 @@ index db1b079663f..1ed6b60ffe8 100644
  
     if (!glx_screen_init(&psc->base, screen, priv)) {
        free(psc);
-@@ -871,12 +887,23 @@ dri3_create_screen(int screen, struct glx_display * priv)
+@@ -887,12 +903,23 @@ dri3_create_screen(int screen, struct glx_display * priv)
        return NULL;
     }
  
@@ -407,7 +416,7 @@ index db1b079663f..1ed6b60ffe8 100644
  
     driverName = loader_get_driver_for_fd(psc->fd);
     if (!driverName) {
-@@ -1049,6 +1076,8 @@ handle_error:
+@@ -1098,6 +1125,8 @@ handle_error:
     if (psc->driScreenDisplayGPU)
         psc->core->destroyScreen(psc->driScreenDisplayGPU);
     psc->driScreenDisplayGPU = NULL;
@@ -417,7 +426,7 @@ index db1b079663f..1ed6b60ffe8 100644
        close(psc->fd);
     if (psc->fd_display_gpu >= 0)
 diff --git a/src/glx/dri3_priv.h b/src/glx/dri3_priv.h
-index c0e833c16ef..b3dccf28c06 100644
+index 192238fde14..bac8a358e3b 100644
 --- a/src/glx/dri3_priv.h
 +++ b/src/glx/dri3_priv.h
 @@ -107,6 +107,7 @@ struct dri3_screen {
@@ -426,8 +435,8 @@ index c0e833c16ef..b3dccf28c06 100644
     int fd;
 +   int fd_dpy;
     bool is_different_gpu;
+    bool prefer_back_buffer_reuse;
  
-    /* fd for display GPU in case of prime */
 -- 
 2.25.1
 

+ 131 - 0
package/mesa3d/0042-egl-wayland-a-linear-buffer-is-not-needed-with-DRM-f.patch

@@ -0,0 +1,131 @@
+From 6f85acbf79443bdfe18ae68d5c023ea946c7fcd0 Mon Sep 17 00:00:00 2001
+From: Brendan King <Brendan.King@imgtec.com>
+Date: Wed, 28 Apr 2021 10:57:15 +0100
+Subject: [PATCH 42/58] egl/wayland: a linear buffer is not needed with DRM
+ format modifiers
+
+If the compositor supports DRM format modifiers, there is no
+need for an additional linear buffer, as the client can allocate
+buffers with attributes known to the compositor.
+---
+ src/egl/drivers/dri2/platform_wayland.c | 36 ++++++++++++++-----------
+ 1 file changed, 21 insertions(+), 15 deletions(-)
+
+diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
+index d651274a85f..64c7a42eaeb 100644
+--- a/src/egl/drivers/dri2/platform_wayland.c
++++ b/src/egl/drivers/dri2/platform_wayland.c
+@@ -1014,7 +1014,7 @@ create_dri_image_diff_gpu(struct dri2_egl_surface *dri2_surf,
+                               &linear_mod, 1, NULL);
+ }
+ 
+-static void
++static bool
+ create_dri_image_from_dmabuf_feedback(struct dri2_egl_surface *dri2_surf,
+                                       unsigned int dri_image_format, uint32_t use_flags)
+ {
+@@ -1027,7 +1027,7 @@ create_dri_image_from_dmabuf_feedback(struct dri2_egl_surface *dri2_surf,
+ 
+    /* We don't have valid dma-buf feedback, so return */
+    if (dri2_surf->dmabuf_feedback.main_device == 0)
+-      return;
++      return false;
+ 
+    visual_idx = dri2_wl_visual_idx_from_fourcc(dri2_surf->format);
+    assert(visual_idx != -1);
+@@ -1071,11 +1071,13 @@ create_dri_image_from_dmabuf_feedback(struct dri2_egl_surface *dri2_surf,
+                                  modifiers, num_modifiers, NULL);
+ 
+       if (dri2_surf->back->dri_image)
+-         return;
++         return num_modifiers != 0;
+    }
++
++   return false;
+ }
+ 
+-static void
++static bool
+ create_dri_image(struct dri2_egl_surface *dri2_surf,
+                  unsigned int dri_image_format, uint32_t use_flags)
+ {
+@@ -1107,6 +1109,8 @@ create_dri_image(struct dri2_egl_surface *dri2_surf,
+                               dri_image_format,
+                               dri2_dpy->is_different_gpu ? 0 : use_flags,
+                               modifiers, num_modifiers, NULL);
++
++   return num_modifiers != 0;
+ }
+ 
+ static int
+@@ -1118,6 +1122,7 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
+    int visual_idx;
+    unsigned int dri_image_format;
+    unsigned int linear_dri_image_format;
++   bool have_modifiers = false;
+ 
+    visual_idx = dri2_wl_visual_idx_from_fourcc(dri2_surf->format);
+    assert(visual_idx != -1);
+@@ -1177,23 +1182,24 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
+       use_flags |= __DRI_IMAGE_USE_PROTECTED;
+    }
+ 
+-   if (dri2_dpy->is_different_gpu && dri2_surf->back->linear_copy == NULL) {
+-      create_dri_image_diff_gpu(dri2_surf, linear_dri_image_format, use_flags);
+-      if (dri2_surf->back->linear_copy == NULL)
+-          return -1;
+-   }
+-
+    if (dri2_surf->back->dri_image == NULL) {
+       if (dri2_surf->wl_dmabuf_feedback)
+-         create_dri_image_from_dmabuf_feedback(dri2_surf, dri_image_format, use_flags);
++         have_modifiers = create_dri_image_from_dmabuf_feedback(dri2_surf, dri_image_format, use_flags);
+       if (dri2_surf->back->dri_image == NULL)
+-         create_dri_image(dri2_surf, dri_image_format, use_flags);
++         have_modifiers = create_dri_image(dri2_surf, dri_image_format, use_flags);
+       dri2_surf->back->age = 0;
+    }
+ 
+    if (dri2_surf->back->dri_image == NULL)
+       return -1;
+ 
++   if (dri2_dpy->is_different_gpu && !have_modifiers &&
++       dri2_surf->back->linear_copy == NULL) {
++      create_dri_image_diff_gpu(dri2_surf, linear_dri_image_format, use_flags);
++      if (dri2_surf->back->linear_copy == NULL)
++          return -1;
++   }
++
+    dri2_surf->back->locked = true;
+ 
+    return 0;
+@@ -1283,7 +1289,7 @@ update_buffers(struct dri2_egl_display *dri2_dpy,
+           dri2_surf->color_buffers[i].age > BUFFER_TRIM_AGE_HYSTERESIS) {
+          wl_buffer_destroy(dri2_surf->color_buffers[i].wl_buffer);
+          dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].dri_image);
+-         if (dri2_dpy->is_different_gpu)
++         if (dri2_surf->color_buffers[i].linear_copy)
+             dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].linear_copy);
+          dri2_surf->color_buffers[i].wl_buffer = NULL;
+          dri2_surf->color_buffers[i].dri_image = NULL;
+@@ -1700,7 +1706,7 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
+    if (!dri2_surf->current->wl_buffer) {
+       __DRIimage *image;
+ 
+-      if (dri2_dpy->is_different_gpu)
++      if (dri2_surf->current->linear_copy)
+          image = dri2_surf->current->linear_copy;
+       else
+          image = dri2_surf->current->dri_image;
+@@ -1734,7 +1740,7 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
+ 
+    dri2_flush_drawable_for_swapbuffers(disp, draw);
+ 
+-   if (dri2_dpy->is_different_gpu) {
++   if (dri2_surf->current->linear_copy) {
+       _EGLContext *ctx = _eglGetCurrentContext();
+       struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
+       dri2_dpy->image->blitImage(dri2_ctx->dri_context,
+-- 
+2.25.1
+

+ 25 - 25
package/mesa3d/0052-dri3-a-linear-buffer-is-not-needed-with-DRM-format-m.patch → package/mesa3d/0043-dri3-a-linear-buffer-is-not-needed-with-DRM-format-m.patch

@@ -1,7 +1,7 @@
-From e57b9a1b34a733f88af51b1395eebe647006939d Mon Sep 17 00:00:00 2001
+From bebd31516110ec781fc5f6ab5fdfc307b6866660 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Wed, 28 Apr 2021 16:33:42 +0100
-Subject: [PATCH 52/67] dri3: a linear buffer is not needed with DRM format
+Subject: [PATCH 43/58] dri3: a linear buffer is not needed with DRM format
  modifiers
 
 If the X Server supports DRM format modifiers, there is no need
@@ -15,10 +15,10 @@ with attributes known to the Server.
  4 files changed, 113 insertions(+), 50 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c b/src/egl/drivers/dri2/platform_x11_dri3.c
-index 0babf9f867e..94205a495a6 100644
+index 860d975ba5c..4d2e3049071 100644
 --- a/src/egl/drivers/dri2/platform_x11_dri3.c
 +++ b/src/egl/drivers/dri2/platform_x11_dri3.c
-@@ -143,6 +143,7 @@ dri3_create_surface(_EGLDisplay *disp, EGLint type, _EGLConfig *conf,
+@@ -158,6 +158,7 @@ dri3_create_surface(_EGLDisplay *disp, EGLint type, _EGLConfig *conf,
     struct dri3_egl_surface *dri3_surf;
     const __DRIconfig *dri_config;
     xcb_drawable_t drawable;
@@ -26,7 +26,7 @@ index 0babf9f867e..94205a495a6 100644
  
     dri3_surf = calloc(1, sizeof *dri3_surf);
     if (!dri3_surf) {
-@@ -150,6 +151,10 @@ dri3_create_surface(_EGLDisplay *disp, EGLint type, _EGLConfig *conf,
+@@ -165,6 +166,10 @@ dri3_create_surface(_EGLDisplay *disp, EGLint type, _EGLConfig *conf,
        return NULL;
     }
  
@@ -37,21 +37,21 @@ index 0babf9f867e..94205a495a6 100644
     if (!dri2_init_surface(&dri3_surf->surf.base, disp, type, conf,
                            attrib_list, false, native_surface))
        goto cleanup_surf;
-@@ -174,7 +179,7 @@ dri3_create_surface(_EGLDisplay *disp, EGLint type, _EGLConfig *conf,
- 
+@@ -190,7 +195,7 @@ dri3_create_surface(_EGLDisplay *disp, EGLint type, _EGLConfig *conf,
     if (loader_dri3_drawable_init(dri2_dpy->conn, drawable,
+                                  egl_to_loader_dri3_drawable_type(type),
                                   dri2_dpy->dri_screen,
 -                                 dri2_dpy->is_different_gpu,
 +                                 is_incompat_gpu,
                                   dri2_dpy->multibuffers_available,
+                                  true,
                                   dri_config,
-                                  &dri2_dpy->loader_dri3_ext,
 diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
-index 1ed6b60ffe8..025ad0128ec 100644
+index cf7fc613c86..81e088efc29 100644
 --- a/src/glx/dri3_glx.c
 +++ b/src/glx/dri3_glx.c
-@@ -354,6 +354,21 @@ dri3_destroy_drawable(__GLXDRIdrawable *base)
-    free(pdraw);
+@@ -364,6 +364,21 @@ glx_to_loader_dri3_drawable_type(int type)
+    }
  }
  
 +static bool
@@ -71,8 +71,8 @@ index 1ed6b60ffe8..025ad0128ec 100644
 +
  static __GLXDRIdrawable *
  dri3_create_drawable(struct glx_screen *base, XID xDrawable,
-                      GLXDrawable drawable, struct glx_config *config_base)
-@@ -361,11 +376,9 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable,
+                      GLXDrawable drawable, int type,
+@@ -372,11 +387,9 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable,
     struct dri3_drawable *pdraw;
     struct dri3_screen *psc = (struct dri3_screen *) base;
     __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base;
@@ -85,7 +85,7 @@ index 1ed6b60ffe8..025ad0128ec 100644
  
     pdraw = calloc(1, sizeof(*pdraw));
     if (!pdraw)
-@@ -376,14 +389,6 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable,
+@@ -387,14 +400,6 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable,
     pdraw->base.drawable = drawable;
     pdraw->base.psc = &psc->base;
  
@@ -100,7 +100,7 @@ index 1ed6b60ffe8..025ad0128ec 100644
     (void) __glXInitialize(psc->base.dpy);
  
     if (loader_dri3_drawable_init(XGetXCBConnection(base->dpy),
-@@ -737,13 +742,14 @@ static const struct glx_context_vtable dri3_context_vtable = {
+@@ -751,13 +756,14 @@ static const struct glx_context_vtable dri3_context_vtable = {
     .interop_export_object = dri3_interop_export_object
  };
  
@@ -119,7 +119,7 @@ index 1ed6b60ffe8..025ad0128ec 100644
  {
     const __DRIextension **extensions;
     unsigned mask;
-@@ -774,16 +780,6 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv,
+@@ -788,16 +794,6 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv,
     }
  
     for (i = 0; extensions[i]; i++) {
@@ -136,7 +136,7 @@ index 1ed6b60ffe8..025ad0128ec 100644
        if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0)) {
           psc->f = (__DRI2flushExtension *) extensions[i];
           /* internal driver extension, no GL extension exposed */
-@@ -817,6 +813,33 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv,
+@@ -833,6 +829,33 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv,
     }
  }
  
@@ -170,7 +170,7 @@ index 1ed6b60ffe8..025ad0128ec 100644
  static char *
  dri3_get_driver_name(struct glx_screen *glx_screen)
  {
-@@ -859,6 +882,8 @@ dri3_create_screen(int screen, struct glx_display * priv)
+@@ -875,6 +898,8 @@ dri3_create_screen(int screen, struct glx_display * priv)
     char *driverName = NULL, *driverNameDisplayGPU, *tmp;
     int i;
     int fd_old;
@@ -179,7 +179,7 @@ index 1ed6b60ffe8..025ad0128ec 100644
  
     psc = calloc(1, sizeof *psc);
     if (psc == NULL)
-@@ -890,8 +915,8 @@ dri3_create_screen(int screen, struct glx_display * priv)
+@@ -906,8 +931,8 @@ dri3_create_screen(int screen, struct glx_display * priv)
     fd_old = psc->fd;
     psc->fd_dpy = os_dupfd_cloexec(psc->fd);
     psc->fd_display_gpu = fcntl(psc->fd, F_DUPFD_CLOEXEC, 3);
@@ -190,7 +190,7 @@ index 1ed6b60ffe8..025ad0128ec 100644
        close(psc->fd_display_gpu);
        psc->fd_display_gpu = -1;
     }
-@@ -933,27 +958,6 @@ dri3_create_screen(int screen, struct glx_display * priv)
+@@ -949,27 +974,6 @@ dri3_create_screen(int screen, struct glx_display * priv)
        goto handle_error;
     }
  
@@ -218,7 +218,7 @@ index 1ed6b60ffe8..025ad0128ec 100644
     psc->driScreen =
        psc->image_driver->createNewScreen2(screen, psc->fd,
                                            pdp->loader_extensions,
-@@ -965,7 +969,42 @@ dri3_create_screen(int screen, struct glx_display * priv)
+@@ -981,7 +985,42 @@ dri3_create_screen(int screen, struct glx_display * priv)
        goto handle_error;
     }
  
@@ -263,10 +263,10 @@ index 1ed6b60ffe8..025ad0128ec 100644
     if (!psc->image || psc->image->base.version < 7 || !psc->image->createImageFromFds) {
        ErrorMessageF("Version 7 or imageFromFds image extension not found\n");
 diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
-index ff6d1ffc660..5c0379ab5de 100644
+index 364695d0667..d431d23cf2f 100644
 --- a/src/loader/loader_dri3_helper.c
 +++ b/src/loader/loader_dri3_helper.c
-@@ -2288,3 +2288,18 @@ dri3_find_back_alloc(struct loader_dri3_drawable *draw)
+@@ -2407,3 +2407,18 @@ dri3_find_back_alloc(struct loader_dri3_drawable *draw)
  
     return back;
  }
@@ -286,10 +286,10 @@ index ff6d1ffc660..5c0379ab5de 100644
 +#endif
 +}
 diff --git a/src/loader/loader_dri3_helper.h b/src/loader/loader_dri3_helper.h
-index 028e25dc070..5790f5444f5 100644
+index 792f7270098..3226a7250d2 100644
 --- a/src/loader/loader_dri3_helper.h
 +++ b/src/loader/loader_dri3_helper.h
-@@ -287,4 +287,8 @@ loader_dri3_swapbuffer_barrier(struct loader_dri3_drawable *draw);
+@@ -293,4 +293,8 @@ loader_dri3_swapbuffer_barrier(struct loader_dri3_drawable *draw);
  
  void
  loader_dri3_close_screen(__DRIscreen *dri_screen);

+ 20 - 20
package/mesa3d/0053-egl-drm-add-support-for-DRI_PRIME-GPU-selection.patch → package/mesa3d/0044-egl-drm-add-support-for-DRI_PRIME-GPU-selection.patch

@@ -1,7 +1,7 @@
-From 8de0535741ce8d126da4d9b0b0eb8c46dd4810b5 Mon Sep 17 00:00:00 2001
+From 43b1db77a10ff200b4732951d054b75db121cf42 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Thu, 20 May 2021 14:43:29 +0100
-Subject: [PATCH 53/67] egl/drm: add support for DRI_PRIME GPU selection
+Subject: [PATCH 44/58] egl/drm: add support for DRI_PRIME GPU selection
 
 Add support for selecting the GPU to be used for rendering using
 the DRI_PRIME environment variable. If a different GPU is selected,
@@ -26,10 +26,10 @@ via the getCapabilities function in the DRI Image extension.
  5 files changed, 66 insertions(+), 11 deletions(-)
 
 diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
-index 2fb440feb50..080d191b0a3 100644
+index ab6a9fb125b..123349acb72 100644
 --- a/include/GL/internal/dri_interface.h
 +++ b/include/GL/internal/dri_interface.h
-@@ -1548,6 +1548,8 @@ enum __DRIChromaSiting {
+@@ -1397,6 +1397,8 @@ enum __DRIChromaSiting {
   */
  /*@{*/
  #define __DRI_IMAGE_CAP_GLOBAL_NAMES 1
@@ -39,10 +39,10 @@ index 2fb440feb50..080d191b0a3 100644
  
  /**
 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index 1df53ef011c..ec4ac602a84 100644
+index b0fa686581a..d0503f614f6 100644
 --- a/src/egl/drivers/dri2/egl_dri2.c
 +++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -1368,6 +1368,7 @@ dri2_display_destroy(_EGLDisplay *disp)
+@@ -1361,6 +1361,7 @@ dri2_display_destroy(_EGLDisplay *disp)
     }
  
     switch (disp->Platform) {
@@ -50,7 +50,7 @@ index 1df53ef011c..ec4ac602a84 100644
     case _EGL_PLATFORM_WAYLAND:
     case _EGL_PLATFORM_X11:
        if (dri2_dpy->fd_dpy >= 0 && dri2_dpy->fd_dpy != dri2_dpy->fd)
-@@ -3943,6 +3944,15 @@ dri2_bind_wayland_display_wl(_EGLDisplay *disp, struct wl_display *wl_dpy)
+@@ -3492,6 +3493,15 @@ dri2_bind_wayland_display_wl(_EGLDisplay *disp, struct wl_display *wl_dpy)
         dri2_dpy->image->base.version >= 7 &&
         dri2_dpy->image->createImageFromFds != NULL)
        flags |= WAYLAND_DRM_PRIME;
@@ -67,7 +67,7 @@ index 1df53ef011c..ec4ac602a84 100644
     dri2_dpy->wl_server_drm =
             wayland_drm_init(wl_dpy, device_name,
 diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c
-index 258e8b6593e..f160ad1175e 100644
+index 4d08851c782..19c50c25128 100644
 --- a/src/egl/drivers/dri2/platform_drm.c
 +++ b/src/egl/drivers/dri2/platform_drm.c
 @@ -595,7 +595,7 @@ dri2_drm_authenticate(_EGLDisplay *disp, uint32_t id)
@@ -121,7 +121,7 @@ index 258e8b6593e..f160ad1175e 100644
     dev = _eglAddDevice(dri2_dpy->fd, dri2_dpy->gbm_dri->software);
     if (!dev) {
        err = "DRI2: failed to find EGLDevice";
-@@ -872,7 +879,7 @@ dri2_initialize_drm(_EGLDisplay *disp)
+@@ -875,7 +882,7 @@ dri2_initialize_drm(_EGLDisplay *disp)
        disp->Extensions.EXT_buffer_age = EGL_TRUE;
  
  #ifdef HAVE_WAYLAND_PLATFORM
@@ -131,10 +131,10 @@ index 258e8b6593e..f160ad1175e 100644
     dri2_set_WL_bind_wayland_display(disp);
  
 diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
-index 5acb15b516f..c1586f42e46 100644
+index 17594589f56..2b60a469559 100644
 --- a/src/gbm/backends/dri/gbm_dri.c
 +++ b/src/gbm/backends/dri/gbm_dri.c
-@@ -51,6 +51,7 @@
+@@ -52,6 +52,7 @@
  #include "loader.h"
  #include "util/debug.h"
  #include "util/macros.h"
@@ -142,7 +142,7 @@ index 5acb15b516f..c1586f42e46 100644
  
  /* For importing wl_buffer */
  #if HAVE_WAYLAND_PLATFORM
-@@ -141,6 +142,14 @@ image_get_buffers(__DRIdrawable *driDrawable,
+@@ -164,6 +165,14 @@ image_get_buffers(__DRIdrawable *driDrawable,
                                   surf->dri_private, buffer_mask, buffers);
  }
  
@@ -157,7 +157,7 @@ index 5acb15b516f..c1586f42e46 100644
  static void
  swrast_get_drawable_info(__DRIdrawable *driDrawable,
                           int           *x,
-@@ -220,20 +229,22 @@ static const __DRIimageLookupExtension image_lookup_extension = {
+@@ -245,20 +254,22 @@ static const __DRIimageLookupExtension image_lookup_extension = {
  };
  
  static const __DRIdri2LoaderExtension dri2_loader_extension = {
@@ -182,7 +182,7 @@ index 5acb15b516f..c1586f42e46 100644
  };
  
  static const __DRIswrastLoaderExtension swrast_loader_extension = {
-@@ -398,12 +409,12 @@ dri_screen_create_dri2(struct gbm_dri_device *dri, char *driver_name)
+@@ -431,12 +442,12 @@ dri_screen_create_dri2(struct gbm_dri_device *dri, char *driver_name)
        return -1;
  
     if (dri->dri2->base.version >= 4) {
@@ -197,7 +197,7 @@ index 5acb15b516f..c1586f42e46 100644
                                                 dri->loader_extensions,
                                                 &dri->driver_configs, dri);
     }
-@@ -470,8 +481,20 @@ static int
+@@ -503,8 +514,20 @@ static int
  dri_screen_create(struct gbm_dri_device *dri)
  {
     char *driver_name;
@@ -219,7 +219,7 @@ index 5acb15b516f..c1586f42e46 100644
     if (!driver_name)
        return -1;
  
-@@ -1424,6 +1447,9 @@ dri_destroy(struct gbm_device *gbm)
+@@ -1469,6 +1492,9 @@ dri_destroy(struct gbm_device *gbm)
     dlclose(dri->driver);
     free(dri->driver_name);
  
@@ -229,7 +229,7 @@ index 5acb15b516f..c1586f42e46 100644
     free(dri);
  }
  
-@@ -1445,6 +1471,8 @@ dri_device_create(int fd, uint32_t gbm_backend_version)
+@@ -1490,6 +1516,8 @@ dri_device_create(int fd, uint32_t gbm_backend_version)
     if (!dri)
        return NULL;
  
@@ -239,10 +239,10 @@ index 5acb15b516f..c1586f42e46 100644
     dri->base.v0.backend_version = gbm_backend_version;
     dri->base.v0.bo_create = gbm_dri_bo_create;
 diff --git a/src/gbm/backends/dri/gbm_driint.h b/src/gbm/backends/dri/gbm_driint.h
-index 9e77ba5887c..e33a96edb0b 100644
+index 31f6b67a40f..3f94352185f 100644
 --- a/src/gbm/backends/dri/gbm_driint.h
 +++ b/src/gbm/backends/dri/gbm_driint.h
-@@ -61,6 +61,8 @@ struct gbm_dri_visual {
+@@ -62,6 +62,8 @@ struct gbm_dri_visual {
  struct gbm_dri_device {
     struct gbm_device base;
  
@@ -251,7 +251,7 @@ index 9e77ba5887c..e33a96edb0b 100644
     void *driver;
     char *driver_name; /* Name of the DRI module, without the _dri suffix */
     bool software; /* A software driver was loaded */
-@@ -191,4 +193,10 @@ gbm_dri_bo_unmap_dumb(struct gbm_dri_bo *bo)
+@@ -195,4 +197,10 @@ gbm_dri_bo_unmap_dumb(struct gbm_dri_bo *bo)
     bo->map = NULL;
  }
  

+ 94 - 34
package/mesa3d/0054-egl-null-add-support-for-DRI_PRIME-GPU-selection.patch → package/mesa3d/0045-egl-null-add-support-for-DRI_PRIME-GPU-selection.patch

@@ -1,7 +1,7 @@
-From f1f625dbcb4e0cc062369729b1da3d7fc65969e8 Mon Sep 17 00:00:00 2001
+From 42ecc1e6f730932fe4dcb9125652fe2e96aba1e9 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Thu, 20 May 2021 20:16:18 +0100
-Subject: [PATCH 54/67] egl/null: add support for DRI_PRIME GPU selection
+Subject: [PATCH 45/58] egl/null: add support for DRI_PRIME GPU selection
 
 Add support for selecting the GPU to be used for rendering using
 the DRI_PRIME environment variable. If a different GPU is selected,
@@ -10,21 +10,56 @@ preserved, which can be obtained by calling the getDisplayFD
 function in the image loader extension.
 
 This change includes code, in function dri2_null_try_device, to
-skip display devices that are not supported by the PVR driver.
-This is to prevent failure on PC based test systems, that often
-include display hardware that is incompatible with the driver.
-This code would not be needed for systems that don't use the PVR
-driver, or on production systems that use the PVR driver.
+optionally skip display devices that are not supported by a
+particular DRI driver. This can be enabled by setting Meson build
+option null-dri-driver-name. This feature is to prevent failure
+on PC based test systems, that may have display and GPU hardware
+other than that being tested.
 ---
+ meson.build                          |   4 +
+ meson_options.txt                    |   6 ++
  src/egl/drivers/dri2/egl_dri2.c      |   1 +
- src/egl/drivers/dri2/platform_null.c | 133 +++++++++++++++++++--------
- 2 files changed, 98 insertions(+), 36 deletions(-)
+ src/egl/drivers/dri2/platform_null.c | 135 +++++++++++++++++++--------
+ src/egl/meson.build                  |   5 +
+ 5 files changed, 114 insertions(+), 37 deletions(-)
 
+diff --git a/meson.build b/meson.build
+index e021a896a0a..a37add42a6d 100644
+--- a/meson.build
++++ b/meson.build
+@@ -361,6 +361,10 @@ with_platform_haiku = _platforms.contains('haiku')
+ with_platform_windows = _platforms.contains('windows')
+ with_platform_null = _platforms.contains('null')
+ 
++if with_platform_null
++  null_dri_driver_name = get_option('null-dri-driver-name')
++endif
++
+ with_glx = get_option('glx')
+ if with_glx == 'auto'
+   if with_platform_android
+diff --git a/meson_options.txt b/meson_options.txt
+index 65f32547267..84661fb851f 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -37,6 +37,12 @@ option(
+   ],
+   description : 'the window system EGL assumes for EGL_DEFAULT_DISPLAY',
+ )
++option(
++  'null-dri-driver-name',
++  type : 'string',
++  value : '',
++  description : 'For the null platform, ignore all dri drivers apart from this one. By default, no dri drivers are ignored.'
++)
+ option(
+   'android-stub',
+   type : 'boolean',
 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index ec4ac602a84..56b5175db6e 100644
+index d0503f614f6..fce277c6874 100644
 --- a/src/egl/drivers/dri2/egl_dri2.c
 +++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -1369,6 +1369,7 @@ dri2_display_destroy(_EGLDisplay *disp)
+@@ -1362,6 +1362,7 @@ dri2_display_destroy(_EGLDisplay *disp)
  
     switch (disp->Platform) {
     case _EGL_PLATFORM_DRM:
@@ -33,10 +68,10 @@ index ec4ac602a84..56b5175db6e 100644
     case _EGL_PLATFORM_X11:
        if (dri2_dpy->fd_dpy >= 0 && dri2_dpy->fd_dpy != dri2_dpy->fd)
 diff --git a/src/egl/drivers/dri2/platform_null.c b/src/egl/drivers/dri2/platform_null.c
-index db6f1147670..af77ea4dd89 100644
+index c78e1fe0880..e2a138367f9 100644
 --- a/src/egl/drivers/dri2/platform_null.c
 +++ b/src/egl/drivers/dri2/platform_null.c
-@@ -44,6 +44,7 @@
+@@ -45,6 +45,7 @@
  
  #include "egl_dri2.h"
  #include "loader.h"
@@ -44,7 +79,7 @@ index db6f1147670..af77ea4dd89 100644
  
  #define NULL_CARD_MINOR_MAX 63U
  
-@@ -953,7 +954,7 @@ swap_idle_get_target_frame(struct dri2_egl_surface *dri2_surf,
+@@ -1045,7 +1046,7 @@ swap_idle_get_target_frame(struct dri2_egl_surface *dri2_surf,
      * current vblank by the number of intervals set at the time swapBuffer
      * is called. For intervals of 1 or 0, we don't need a target frame.
      */
@@ -53,7 +88,7 @@ index db6f1147670..af77ea4dd89 100644
     if (err)
        return err;
  
-@@ -1003,7 +1004,7 @@ swap_vblank_state_transition(struct dri2_egl_surface *dri2_surf,
+@@ -1095,7 +1096,7 @@ swap_vblank_state_transition(struct dri2_egl_surface *dri2_surf,
     uint32_t flags = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
     int err;
  
@@ -62,7 +97,7 @@ index db6f1147670..af77ea4dd89 100644
                                  flags, dri2_surf);
     if (err) {
        dri2_surf->swap_state = SWAP_ERROR;
-@@ -1029,7 +1030,7 @@ swap_flip_state_transition(struct dri2_egl_surface *dri2_surf)
+@@ -1121,7 +1122,7 @@ swap_flip_state_transition(struct dri2_egl_surface *dri2_surf)
        flags |= DRM_MODE_PAGE_FLIP_ASYNC;
     }
  
@@ -71,7 +106,7 @@ index db6f1147670..af77ea4dd89 100644
                               dri2_surf->swap_data->fb_id, flags, dri2_surf);
     if (err) {
        dri2_surf->swap_state = SWAP_ERROR;
-@@ -1049,7 +1050,7 @@ swap_poll_state_transition(struct dri2_egl_surface *dri2_surf)
+@@ -1141,7 +1142,7 @@ swap_poll_state_transition(struct dri2_egl_surface *dri2_surf)
     int err;
  
     /* dri2_surf->swap_state is being set inside the handler */
@@ -80,7 +115,7 @@ index db6f1147670..af77ea4dd89 100644
     if (err) {
        dri2_surf->swap_state = SWAP_ERROR;
        return err;
-@@ -1201,7 +1202,7 @@ add_fb_for_dri_image(struct dri2_egl_display *dri2_dpy, __DRIimage *image,
+@@ -1296,7 +1297,7 @@ add_fb_for_dri_image(struct dri2_egl_display *dri2_dpy, __DRIimage *image,
        handles[i] = (uint32_t) handle;
     }
  
@@ -89,7 +124,16 @@ index db6f1147670..af77ea4dd89 100644
                                        dri2_null_formats[format_idx].drm_format,
                                        handles, pitches, offsets, modifiers,
                                        fb_id_out, flags);
-@@ -1459,7 +1460,7 @@ dri2_null_create_window_surface(_EGLDisplay *disp, _EGLConfig *config,
+@@ -1486,7 +1487,7 @@ create_surface(_EGLDisplay *disp, _EGLConfig *config, EGLint type,
+    dri2_surf->format = dri2_null_formats[format_idx].dri_image_format;
+ 
+    if (dri2_dpy->in_formats_enabled) {
+-      ret = in_formats_get_modifiers(dri2_dpy->fd,
++      ret = in_formats_get_modifiers(dri2_dpy->fd_dpy,
+                                      dri2_dpy->output.in_formats_id,
+                                      dri2_null_formats[format_idx].drm_format,
+                                      &dri2_dpy->output.modifiers);
+@@ -1564,7 +1565,7 @@ dri2_null_create_window_surface(_EGLDisplay *disp, _EGLConfig *config,
        goto err_destroy_surface;
     }
  
@@ -98,7 +142,7 @@ index db6f1147670..af77ea4dd89 100644
                                  dri2_surf->front_buffer.fb_id);
     if (err) {
        _eglError(EGL_BAD_NATIVE_WINDOW, "window set mode");
-@@ -1573,11 +1574,11 @@ dri2_null_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
+@@ -1678,11 +1679,11 @@ dri2_null_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
        dri2_dpy->image->destroyImage(dri2_surf->front_buffer.dri_image);
  
     if (dri2_surf->front_buffer.fb_id)
@@ -112,7 +156,7 @@ index db6f1147670..af77ea4dd89 100644
        if (dri2_surf->color_buffers[i].dri_image)
           dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].dri_image);
     }
-@@ -1734,12 +1735,22 @@ dri2_null_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
+@@ -1839,12 +1840,22 @@ dri2_null_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
     (void) loaderPrivate;
  }
  
@@ -136,7 +180,7 @@ index db6f1147670..af77ea4dd89 100644
  };
  
  static const __DRIextension *image_loader_extensions[] = {
-@@ -1768,12 +1779,74 @@ dri2_null_device_is_kms(int fd)
+@@ -1873,12 +1884,74 @@ dri2_null_device_is_kms(int fd)
     return is_kms;
  }
  
@@ -148,11 +192,11 @@ index db6f1147670..af77ea4dd89 100644
 +   if (!dri2_null_device_is_kms(dri2_dpy->fd_dpy))
 +      return false;
 +
-+#if 1
-+   /* Skip devices not supported by the pvr driver */
++#if defined(NULL_DRI_DRIVER_NAME)
++   /* Skip devices not handled by NULL_DRI_DRIVER_NAME */
 +   {
 +      char *driver_name = loader_get_driver_for_fd(dri2_dpy->fd_dpy);
-+      bool skip = !driver_name || !!strcmp(driver_name, "pvr");
++      bool skip = !driver_name || !!strcmp(driver_name, NULL_DRI_DRIVER_NAME);
 +
 +      free(driver_name);
 +
@@ -211,7 +255,7 @@ index db6f1147670..af77ea4dd89 100644
  
     for (unsigned i = 0; i <= NULL_CARD_MINOR_MAX; i++) {
        char *card_path;
-@@ -1781,32 +1854,20 @@ dri2_null_probe_device(_EGLDisplay *disp)
+@@ -1886,32 +1959,20 @@ dri2_null_probe_device(_EGLDisplay *disp)
        if (asprintf(&card_path, DRM_DEV_NAME, DRM_DIR_NAME, i) < 0)
           continue;
  
@@ -254,7 +298,7 @@ index db6f1147670..af77ea4dd89 100644
        dri2_dpy->fd = -1;
     }
  
-@@ -1867,7 +1928,7 @@ dri2_null_setup_swap_interval(_EGLDisplay *disp)
+@@ -1972,7 +2033,7 @@ dri2_null_setup_swap_interval(_EGLDisplay *disp)
  
     dri2_setup_swap_interval(disp, swap_max_interval);
  
@@ -263,7 +307,7 @@ index db6f1147670..af77ea4dd89 100644
     if (err || value == 0) {
  
        /* DRM/KMS does not support async page flip. In order to support
-@@ -1914,7 +1975,7 @@ dri2_initialize_null(_EGLDisplay *disp)
+@@ -2020,7 +2081,7 @@ dri2_initialize_null(_EGLDisplay *disp)
      * modesetting if not. If this succeeds then universal planes will also have
      * been enabled.
      */
@@ -272,7 +316,7 @@ index db6f1147670..af77ea4dd89 100644
     dri2_dpy->atomic_enabled = !err;
  
     if (!dri2_dpy->atomic_enabled) {
-@@ -1922,7 +1983,7 @@ dri2_initialize_null(_EGLDisplay *disp)
+@@ -2028,7 +2089,7 @@ dri2_initialize_null(_EGLDisplay *disp)
         * Enable universal planes so that we can get the pixel formats for the
         * primary plane
         */
@@ -281,17 +325,17 @@ index db6f1147670..af77ea4dd89 100644
        if (err) {
           _eglError(EGL_NOT_INITIALIZED, "failed to enable universal planes");
           goto cleanup;
-@@ -1955,7 +2016,7 @@ dri2_initialize_null(_EGLDisplay *disp)
-    prefer_in_formats = dri2_dpy->image->base.version >= 14 &&
-       dri2_dpy->image->createImageWithModifiers;
+@@ -2064,7 +2125,7 @@ dri2_initialize_null(_EGLDisplay *disp)
+          dri2_dpy->image->createImageWithModifiers;
+    }
  
 -   if (!display_output_init(dri2_dpy->fd, &dri2_dpy->output,
 +   if (!display_output_init(dri2_dpy->fd_dpy, &dri2_dpy->output,
                              dri2_dpy->atomic_enabled,
                              prefer_in_formats,
                              &dri2_dpy->in_formats_enabled)) {
-@@ -1990,7 +2051,7 @@ dri2_teardown_null(struct dri2_egl_display *dri2_dpy)
-    drmModeFreeFormats(dri2_dpy->output.in_formats);
+@@ -2098,7 +2159,7 @@ dri2_teardown_null(struct dri2_egl_display *dri2_dpy)
+    drmModeAtomicFree(dri2_dpy->output.atomic_state);
  
     if (dri2_dpy->output.mode_blob_id)
 -      drmModeDestroyPropertyBlob(dri2_dpy->fd, dri2_dpy->output.mode_blob_id);
@@ -299,6 +343,22 @@ index db6f1147670..af77ea4dd89 100644
  
     if (dri2_dpy->output.plane_prop_res) {
        for (unsigned i = 0; dri2_dpy->output.plane_prop_res[i]; i++)
+diff --git a/src/egl/meson.build b/src/egl/meson.build
+index a08f1c71847..4aa9f5fb0de 100644
+--- a/src/egl/meson.build
++++ b/src/egl/meson.build
+@@ -151,6 +151,11 @@ elif with_platform_windows
+   link_for_egl += libgallium_wgl
+ endif
+ if with_platform_null
++  if null_dri_driver_name != ''
++    c_args_for_egl += [
++      '-DNULL_DRI_DRIVER_NAME="@0@"'.format(null_dri_driver_name),
++    ]
++  endif
+   files_egl += files('drivers/dri2/platform_null.c')
+   incs_for_egl += [inc_loader]
+   deps_for_egl += dep_libdrm
 -- 
 2.25.1
 

+ 6 - 6
package/mesa3d/0055-egl-null-introduce-NULL_DRM_DISPLAY.patch → package/mesa3d/0046-egl-null-introduce-NULL_DRM_DISPLAY.patch

@@ -1,7 +1,7 @@
-From 693fff6d87abfcae887afde7f80f402b7ff5c0ab Mon Sep 17 00:00:00 2001
+From ade2c62537be41361638aa55126c0ee9966ab726 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Mon, 28 Jun 2021 16:36:15 +0100
-Subject: [PATCH 55/67] egl/null: introduce NULL_DRM_DISPLAY
+Subject: [PATCH 46/58] egl/null: introduce NULL_DRM_DISPLAY
 
 Introduce the NULL_DRM_DISPLAY environment variable, which allows
 a particular DRM display to be selected, rather than the first
@@ -16,10 +16,10 @@ the display. For example, NULL_DRM_DISPLAY=2 will select
  1 file changed, 46 insertions(+), 19 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/platform_null.c b/src/egl/drivers/dri2/platform_null.c
-index af77ea4dd89..529cc7a2a2f 100644
+index 6ca417bf022..86bcbdf30b8 100644
 --- a/src/egl/drivers/dri2/platform_null.c
 +++ b/src/egl/drivers/dri2/platform_null.c
-@@ -1784,6 +1784,8 @@ dri2_null_try_device(_EGLDisplay *disp)
+@@ -1889,6 +1889,8 @@ dri2_null_try_device(_EGLDisplay *disp)
  {
     struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
  
@@ -28,7 +28,7 @@ index af77ea4dd89..529cc7a2a2f 100644
     if (!dri2_null_device_is_kms(dri2_dpy->fd_dpy))
        return false;
  
-@@ -1841,34 +1843,56 @@ dri2_null_try_device(_EGLDisplay *disp)
+@@ -1946,34 +1948,56 @@ dri2_null_try_device(_EGLDisplay *disp)
  }
  
  static bool
@@ -103,7 +103,7 @@ index af77ea4dd89..529cc7a2a2f 100644
     }
  
     return false;
-@@ -1965,7 +1989,10 @@ dri2_initialize_null(_EGLDisplay *disp)
+@@ -2071,7 +2095,10 @@ dri2_initialize_null(_EGLDisplay *disp)
  
     disp->DriverData = (void *) dri2_dpy;
  

+ 6 - 15
package/mesa3d/0056-vulkan-wsi-check-the-DRI3-and-Present-XCB-reply-poin.patch → package/mesa3d/0047-vulkan-wsi-check-the-DRI3-and-Present-XCB-reply-poin.patch

@@ -1,29 +1,20 @@
-From a422756b7d73b48d3d10d15066a61e9332370719 Mon Sep 17 00:00:00 2001
+From 0fa00f7164d8a7104994a38acb66735ae8eb7e06 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Mon, 21 Jun 2021 17:05:17 +0100
-Subject: [PATCH 56/67] vulkan/wsi: check the DRI3 and Present XCB reply
+Subject: [PATCH 47/58] vulkan/wsi: check the DRI3 and Present XCB reply
  pointers
 
 Check that the DRI3 and Present version replies are not NULL
 before accessing the version fields.
 ---
- src/vulkan/wsi/wsi_common_x11.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/vulkan/wsi/wsi_common_x11.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
-index 9dce78eddeb..9eb624df640 100644
+index 96e0be3d62a..b12512aad18 100644
 --- a/src/vulkan/wsi/wsi_common_x11.c
 +++ b/src/vulkan/wsi/wsi_common_x11.c
-@@ -216,7 +216,7 @@ wsi_x11_connection_create(struct wsi_device *wsi_dev,
- 
-       ver_cookie = xcb_dri3_query_version(conn, 1, 2);
-       ver_reply = xcb_dri3_query_version_reply(conn, ver_cookie, NULL);
--      has_dri3_v1_2 =
-+      has_dri3_v1_2 = ver_reply != NULL &&
-          (ver_reply->major_version > 1 || ver_reply->minor_version >= 2);
-       free(ver_reply);
-    }
-@@ -230,7 +230,7 @@ wsi_x11_connection_create(struct wsi_device *wsi_dev,
+@@ -261,7 +261,7 @@ wsi_x11_connection_create(struct wsi_device *wsi_dev,
  
        ver_cookie = xcb_present_query_version(conn, 1, 2);
        ver_reply = xcb_present_query_version_reply(conn, ver_cookie, NULL);

+ 642 - 0
package/mesa3d/0048-vulkan-wsi-make-the-display-FD-available.patch

@@ -0,0 +1,642 @@
+From 5e9022211de798b72b7bbcd5a451f38a4f667dee Mon Sep 17 00:00:00 2001
+From: Brendan King <Brendan.King@imgtec.com>
+Date: Thu, 17 Jun 2021 17:17:07 +0100
+Subject: [PATCH 48/58] vulkan/wsi: make the display FD available
+
+Pass the display FD to the Vulkan image create and memory
+allocation functions when allocating swapchain images.
+
+The wl_drm interface code has been partially restored, in order
+to obtain the display FD from the compositor.
+---
+ src/vulkan/wsi/meson.build          |   2 +
+ src/vulkan/wsi/wsi_common.c         |  24 +++++-
+ src/vulkan/wsi/wsi_common.h         |  14 ++++
+ src/vulkan/wsi/wsi_common_display.c |   3 +-
+ src/vulkan/wsi/wsi_common_drm.c     |  19 ++++-
+ src/vulkan/wsi/wsi_common_private.h |  10 ++-
+ src/vulkan/wsi/wsi_common_wayland.c | 126 ++++++++++++++++++++++++++--
+ src/vulkan/wsi/wsi_common_win32.c   |   4 +-
+ src/vulkan/wsi/wsi_common_x11.c     |  25 +++++-
+ 9 files changed, 206 insertions(+), 21 deletions(-)
+
+diff --git a/src/vulkan/wsi/meson.build b/src/vulkan/wsi/meson.build
+index e234e31d340..84ae5c5f690 100644
+--- a/src/vulkan/wsi/meson.build
++++ b/src/vulkan/wsi/meson.build
+@@ -31,6 +31,8 @@ endif
+ if with_platform_wayland
+   files_vulkan_wsi += files('wsi_common_wayland.c')
+   files_vulkan_wsi += [
++    wayland_drm_client_protocol_h,
++    wayland_drm_protocol_c,
+     linux_dmabuf_unstable_v1_client_protocol_h,
+     linux_dmabuf_unstable_v1_protocol_c,
+   ]
+diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
+index 562efdd529c..385e83803dd 100644
+--- a/src/vulkan/wsi/wsi_common.c
++++ b/src/vulkan/wsi/wsi_common.c
+@@ -360,6 +360,7 @@ VkResult
+ wsi_configure_image(const struct wsi_swapchain *chain,
+                     const VkSwapchainCreateInfoKHR *pCreateInfo,
+                     VkExternalMemoryHandleTypeFlags handle_types,
++                    int display_fd,
+                     struct wsi_image_info *info)
+ {
+    memset(info, 0, sizeof(*info));
+@@ -418,6 +419,12 @@ wsi_configure_image(const struct wsi_swapchain *chain,
+    };
+    __vk_append_struct(&info->create, &info->wsi);
+ 
++   info->wsi2 = (struct wsi_image_create_info2) {
++      .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO2_MESA,
++      .display_fd = display_fd,
++   };
++   __vk_append_struct(&info->create, &info->wsi2);
++
+    if (pCreateInfo->flags & VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR) {
+       info->create.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT |
+                             VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR;
+@@ -471,6 +478,7 @@ wsi_destroy_image_info(const struct wsi_swapchain *chain,
+ VkResult
+ wsi_create_image(const struct wsi_swapchain *chain,
+                  const struct wsi_image_info *info,
++                 int display_fd,
+                  struct wsi_image *image)
+ {
+    const struct wsi_device *wsi = chain->wsi;
+@@ -485,7 +493,7 @@ wsi_create_image(const struct wsi_swapchain *chain,
+    if (result != VK_SUCCESS)
+       goto fail;
+ 
+-   result = info->create_mem(chain, info, image);
++   result = info->create_mem(chain, info, display_fd, image);
+    if (result != VK_SUCCESS)
+       goto fail;
+ 
+@@ -1152,7 +1160,8 @@ wsi_create_buffer_image_mem(const struct wsi_swapchain *chain,
+                             const struct wsi_image_info *info,
+                             struct wsi_image *image,
+                             VkExternalMemoryHandleTypeFlags handle_types,
+-                            bool implicit_sync)
++                            bool implicit_sync,
++                            int display_fd)
+ {
+    const struct wsi_device *wsi = chain->wsi;
+    VkResult result;
+@@ -1186,9 +1195,14 @@ wsi_create_buffer_image_mem(const struct wsi_swapchain *chain,
+       .pNext = NULL,
+       .implicit_sync = implicit_sync,
+    };
++  const struct wsi_memory_allocate_info2 memory_wsi_info2 = {
++      .sType = VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO2_MESA,
++      .pNext = &memory_wsi_info,
++      .display_fd = display_fd,
++   };
+    const VkExportMemoryAllocateInfo memory_export_info = {
+       .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
+-      .pNext = &memory_wsi_info,
++      .pNext = &memory_wsi_info2,
+       .handleTypes = handle_types,
+    };
+    const VkMemoryDedicatedAllocateInfo buf_mem_dedicated_info = {
+@@ -1347,10 +1361,12 @@ wsi_finish_create_buffer_image(const struct wsi_swapchain *chain,
+ VkResult
+ wsi_configure_buffer_image(UNUSED const struct wsi_swapchain *chain,
+                            const VkSwapchainCreateInfoKHR *pCreateInfo,
++                           int display_fd,
+                            struct wsi_image_info *info)
+ {
+    VkResult result = wsi_configure_image(chain, pCreateInfo,
+-                                         0 /* handle_types */, info);
++                                         0 /* handle_types */,
++                                         display_fd, info);
+    if (result != VK_SUCCESS)
+       return result;
+ 
+diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
+index f96632308df..13502fc6507 100644
+--- a/src/vulkan/wsi/wsi_common.h
++++ b/src/vulkan/wsi/wsi_common.h
+@@ -50,6 +50,8 @@ extern const struct vk_device_entrypoint_table wsi_device_entrypoints;
+ #define VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA (VkStructureType)1000001003
+ #define VK_STRUCTURE_TYPE_WSI_SURFACE_SUPPORTED_COUNTERS_MESA (VkStructureType)1000001005
+ #define VK_STRUCTURE_TYPE_WSI_MEMORY_SIGNAL_SUBMIT_INFO_MESA (VkStructureType)1000001006
++#define VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO2_MESA (VkStructureType)1000001007
++#define VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO2_MESA (VkStructureType)1000001008
+ 
+ /* This is always chained to VkImageCreateInfo when a wsi image is created.
+  * It indicates that the image can be transitioned to/from
+@@ -86,6 +88,18 @@ struct wsi_memory_signal_submit_info {
+     VkDeviceMemory memory;
+ };
+ 
++struct wsi_image_create_info2 {
++    VkStructureType sType;
++    const void *pNext;
++    int display_fd;
++};
++
++struct wsi_memory_allocate_info2 {
++    VkStructureType sType;
++    const void *pNext;
++    int display_fd;
++};
++
+ struct wsi_interface;
+ 
+ struct driOptionCache;
+diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c
+index 3c9f3b1c32b..d237dfc092a 100644
+--- a/src/vulkan/wsi/wsi_common_display.c
++++ b/src/vulkan/wsi/wsi_common_display.c
+@@ -1097,7 +1097,7 @@ wsi_display_image_init(VkDevice device_h,
+       return VK_ERROR_DEVICE_LOST;
+ 
+    VkResult result = wsi_create_image(&chain->base, &chain->base.image_info,
+-                                      &image->base);
++                                      wsi->fd, &image->base);
+    if (result != VK_SUCCESS)
+       return result;
+ 
+@@ -1980,6 +1980,7 @@ wsi_display_surface_create_swapchain(
+    result = wsi_configure_native_image(&chain->base, create_info,
+                                        0, NULL, NULL,
+                                        NULL /* alloc_shm */,
++                                       wsi->fd,
+                                        &chain->base.image_info);
+    if (result != VK_SUCCESS) {
+       vk_free(allocator, chain);
+diff --git a/src/vulkan/wsi/wsi_common_drm.c b/src/vulkan/wsi/wsi_common_drm.c
+index 72af5b2c820..beb87d7336f 100644
+--- a/src/vulkan/wsi/wsi_common_drm.c
++++ b/src/vulkan/wsi/wsi_common_drm.c
+@@ -142,6 +142,7 @@ get_modifier_props(const struct wsi_image_info *info, uint64_t modifier)
+ static VkResult
+ wsi_create_native_image_mem(const struct wsi_swapchain *chain,
+                             const struct wsi_image_info *info,
++                            int display_fd,
+                             struct wsi_image *image);
+ 
+ VkResult
+@@ -152,6 +153,7 @@ wsi_configure_native_image(const struct wsi_swapchain *chain,
+                            const uint64_t *const *modifiers,
+                            uint8_t *(alloc_shm)(struct wsi_image *image,
+                                                 unsigned size),
++                           int display_fd,
+                            struct wsi_image_info *info)
+ {
+    const struct wsi_device *wsi = chain->wsi;
+@@ -160,7 +162,8 @@ wsi_configure_native_image(const struct wsi_swapchain *chain,
+       wsi->sw ? VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT :
+                 VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
+ 
+-   VkResult result = wsi_configure_image(chain, pCreateInfo, handle_type, info);
++   VkResult result = wsi_configure_image(chain, pCreateInfo, handle_type,
++                                         display_fd, info);
+    if (result != VK_SUCCESS)
+       return result;
+ 
+@@ -290,6 +293,7 @@ fail_oom:
+ static VkResult
+ wsi_create_native_image_mem(const struct wsi_swapchain *chain,
+                             const struct wsi_image_info *info,
++                            int display_fd,
+                             struct wsi_image *image)
+ {
+    const struct wsi_device *wsi = chain->wsi;
+@@ -316,9 +320,14 @@ wsi_create_native_image_mem(const struct wsi_swapchain *chain,
+       .pNext = NULL,
+       .implicit_sync = true,
+    };
++   const struct wsi_memory_allocate_info2 memory_wsi_info2 = {
++      .sType = VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO2_MESA,
++      .pNext = &memory_wsi_info,
++      .display_fd = display_fd,
++   };
+    const VkExportMemoryAllocateInfo memory_export_info = {
+       .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
+-      .pNext = &memory_wsi_info,
++      .pNext = &memory_wsi_info2,
+       .handleTypes = wsi->sw ? VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT :
+       VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
+    };
+@@ -427,13 +436,14 @@ wsi_create_native_image_mem(const struct wsi_swapchain *chain,
+ static VkResult
+ wsi_create_prime_image_mem(const struct wsi_swapchain *chain,
+                            const struct wsi_image_info *info,
++                           int display_fd,
+                            struct wsi_image *image)
+ {
+    const struct wsi_device *wsi = chain->wsi;
+    VkResult result =
+       wsi_create_buffer_image_mem(chain, info, image,
+                                   VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
+-                                  true);
++                                  true, display_fd);
+    if (result != VK_SUCCESS)
+       return result;
+ 
+@@ -459,10 +469,11 @@ VkResult
+ wsi_configure_prime_image(UNUSED const struct wsi_swapchain *chain,
+                           const VkSwapchainCreateInfoKHR *pCreateInfo,
+                           bool use_modifier,
++                          int display_fd,
+                           struct wsi_image_info *info)
+ {
+    VkResult result =
+-      wsi_configure_buffer_image(chain, pCreateInfo, info);
++      wsi_configure_buffer_image(chain, pCreateInfo, display_fd, info);
+    if (result != VK_SUCCESS)
+       return result;
+ 
+diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h
+index af190ce501b..b6c1fc0bb85 100644
+--- a/src/vulkan/wsi/wsi_common_private.h
++++ b/src/vulkan/wsi/wsi_common_private.h
+@@ -32,6 +32,7 @@ struct wsi_swapchain;
+ struct wsi_image_info {
+    VkImageCreateInfo create;
+    struct wsi_image_create_info wsi;
++   struct wsi_image_create_info2 wsi2;
+    VkExternalMemoryImageCreateInfo ext_mem;
+    VkImageFormatListCreateInfoKHR format_list;
+    VkImageDrmFormatModifierListCreateInfoEXT drm_mod_list;
+@@ -57,6 +58,7 @@ struct wsi_image_info {
+ 
+    VkResult (*create_mem)(const struct wsi_swapchain *chain,
+                           const struct wsi_image_info *info,
++                          int display_fd,
+                           struct wsi_image *image);
+ 
+    VkResult (*finish_create)(const struct wsi_swapchain *chain,
+@@ -145,12 +147,14 @@ wsi_configure_native_image(const struct wsi_swapchain *chain,
+                            const uint64_t *const *modifiers,
+                            uint8_t *(alloc_shm)(struct wsi_image *image,
+                                                 unsigned size),
++                           int display_fd,
+                            struct wsi_image_info *info);
+ 
+ VkResult
+ wsi_configure_prime_image(UNUSED const struct wsi_swapchain *chain,
+                           const VkSwapchainCreateInfoKHR *pCreateInfo,
+                           bool use_modifier,
++                          int display_fd,
+                           struct wsi_image_info *info);
+ 
+ VkResult
+@@ -158,7 +162,8 @@ wsi_create_buffer_image_mem(const struct wsi_swapchain *chain,
+                             const struct wsi_image_info *info,
+                             struct wsi_image *image,
+                             VkExternalMemoryHandleTypeFlags handle_types,
+-                            bool implicit_sync);
++                            bool implicit_sync,
++                            int display_fd);
+ 
+ VkResult
+ wsi_finish_create_buffer_image(const struct wsi_swapchain *chain,
+@@ -168,12 +173,14 @@ wsi_finish_create_buffer_image(const struct wsi_swapchain *chain,
+ VkResult
+ wsi_configure_buffer_image(UNUSED const struct wsi_swapchain *chain,
+                            const VkSwapchainCreateInfoKHR *pCreateInfo,
++                           int display_fd,
+                            struct wsi_image_info *info);
+ 
+ VkResult
+ wsi_configure_image(const struct wsi_swapchain *chain,
+                     const VkSwapchainCreateInfoKHR *pCreateInfo,
+                     VkExternalMemoryHandleTypeFlags handle_types,
++                    int display_fd,
+                     struct wsi_image_info *info);
+ void
+ wsi_destroy_image_info(const struct wsi_swapchain *chain,
+@@ -181,6 +188,7 @@ wsi_destroy_image_info(const struct wsi_swapchain *chain,
+ VkResult
+ wsi_create_image(const struct wsi_swapchain *chain,
+                  const struct wsi_image_info *info,
++                 int display_fd,
+                  struct wsi_image *image);
+ void
+ wsi_destroy_image(const struct wsi_swapchain *chain,
+diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
+index 0678556105e..c01c4079d61 100644
+--- a/src/vulkan/wsi/wsi_common_wayland.c
++++ b/src/vulkan/wsi/wsi_common_wayland.c
+@@ -32,6 +32,8 @@
+ #include <pthread.h>
+ #include <poll.h>
+ #include <sys/mman.h>
++#include <fcntl.h>
++#include <xf86drm.h>
+ 
+ #include "drm-uapi/drm_fourcc.h"
+ 
+@@ -64,12 +66,15 @@ struct wsi_wl_display {
+    struct wl_event_queue *                      queue;
+ 
+    struct wl_shm *                              wl_shm;
++   struct wl_drm *                              wl_drm;
+    struct zwp_linux_dmabuf_v1 *                 wl_dmabuf;
+ 
+    struct wsi_wayland *wsi_wl;
+ 
+    /* Formats populated by zwp_linux_dmabuf_v1 or wl_shm interfaces */
+    struct u_vector                              formats;
++   int                                          fd;
++   bool                                         authenticated;
+ 
+    /* Only used for displays created by wsi_wl_display_create */
+    uint32_t                                     refcount;
+@@ -444,6 +449,79 @@ wl_shm_format_for_vk_format(VkFormat vk_format, bool alpha)
+    }
+ }
+ 
++static int
++open_display_device(const char *name)
++{
++   int fd;
++
++#ifdef O_CLOEXEC
++   fd = open(name, O_RDWR | O_CLOEXEC);
++   if (fd != -1 || errno != EINVAL) {
++      return fd;
++   }
++#endif
++
++   fd = open(name, O_RDWR);
++   if (fd != -1) {
++      long flags = fcntl(fd, F_GETFD);
++
++      if (flags != -1) {
++         if (!fcntl(fd, F_SETFD, flags | FD_CLOEXEC))
++             return fd;
++      }
++      close (fd);
++   }
++
++   return -1;
++}
++
++static void
++drm_handle_device(void *data, struct wl_drm *drm, const char *name)
++{
++   struct wsi_wl_display *display = data;
++   const int fd = open_display_device(name);
++
++   if (fd != -1) {
++      if (drmGetNodeTypeFromFd(fd) != DRM_NODE_RENDER) {
++         drm_magic_t magic;
++
++         if (drmGetMagic(fd, &magic)) {
++            close(fd);
++	    return;
++         }
++	 wl_drm_authenticate(drm, magic);
++      } else {
++         display->authenticated = true;
++      }
++      display->fd = fd;
++   }
++}
++
++static void
++drm_handle_format(void *data, struct wl_drm *drm, uint32_t wl_format)
++{
++}
++
++static void
++drm_handle_authenticated(void *data, struct wl_drm *drm)
++{
++   struct wsi_wl_display *display = data;
++
++   display->authenticated = true;
++}
++
++static void
++drm_handle_capabilities(void *data, struct wl_drm *drm, uint32_t capabilities)
++{
++}
++
++static const struct wl_drm_listener drm_listener = {
++   drm_handle_device,
++   drm_handle_format,
++   drm_handle_authenticated,
++   drm_handle_capabilities,
++};
++
+ static void
+ dmabuf_handle_format(void *data, struct zwp_linux_dmabuf_v1 *dmabuf,
+                      uint32_t format)
+@@ -496,6 +574,15 @@ registry_handle_global(void *data, struct wl_registry *registry,
+       return;
+    }
+ 
++   if (strcmp(interface, "wl_drm") == 0) {
++      assert(display->wl_drm == NULL);
++      assert(version >= 2);
++
++      display->wl_drm =
++         wl_registry_bind(registry, name, &wl_drm_interface, 2);
++      wl_drm_add_listener(display->drm.wl_drm, &drm_listener, display);
++   }
++
+    if (strcmp(interface, "zwp_linux_dmabuf_v1") == 0 && version >= 3) {
+       display->wl_dmabuf =
+          wl_registry_bind(registry, name, &zwp_linux_dmabuf_v1_interface, 3);
+@@ -525,12 +612,17 @@ wsi_wl_display_finish(struct wsi_wl_display *display)
+    u_vector_finish(&display->formats);
+    if (display->wl_shm)
+       wl_shm_destroy(display->wl_shm);
++   if (display->wl_drm)
++      wl_drm_destroy(display->wl_drm);
+    if (display->wl_dmabuf)
+       zwp_linux_dmabuf_v1_destroy(display->wl_dmabuf);
+    if (display->wl_display_wrapper)
+       wl_proxy_wrapper_destroy(display->wl_display_wrapper);
+    if (display->queue)
+       wl_event_queue_destroy(display->queue);
++
++   if (display->fd != -1)
++      close(display->fd);
+ }
+ 
+ static VkResult
+@@ -548,6 +640,7 @@ wsi_wl_display_init(struct wsi_wayland *wsi_wl,
+    display->wsi_wl = wsi_wl;
+    display->wl_display = wl_display;
+    display->sw = sw;
++   display->fd = -1;
+ 
+    display->queue = wl_display_create_queue(wl_display);
+    if (!display->queue) {
+@@ -573,25 +666,45 @@ wsi_wl_display_init(struct wsi_wayland *wsi_wl,
+ 
+    wl_registry_add_listener(registry, &registry_listener, display);
+ 
+-   /* Round-trip to get wl_shm and zwp_linux_dmabuf_v1 globals */
++   /* Round-trip to get wl_shm, wl_drm and zwp_linux_dmabuf_v1 globals */
+    wl_display_roundtrip_queue(display->wl_display, display->queue);
+    if (!display->wl_dmabuf && !display->wl_shm) {
+       result = VK_ERROR_SURFACE_LOST_KHR;
+       goto fail_registry;
+    }
+ 
++   if (display->wl_dmabuf && !display->wl_drm) {
++      result = VK_ERROR_SURFACE_LOST_KHR;
++      goto fail_registry;
++   }
++
++   /* Round-trip to get display FD, formats and modifiers */
++   if (display->wl_drm || get_format_list)
++      wl_display_roundtrip_queue(display->wl_display, display->queue);
++
++   if (display->wl_drm && display->fd == -1) {
++      result = VK_ERROR_SURFACE_LOST_KHR;
++      goto fail_registry;
++   }
++
++   if (display->wl_drm) {
++      wl_display_roundtrip_queue(display->wl_display, display->queue);
++
++      if (!display->authenticated) {
++         result = VK_ERROR_SURFACE_LOST_KHR;
++         goto fail_registry;
++      }
++   }
++
+    /* Caller doesn't expect us to query formats/modifiers, so return */
+    if (!get_format_list)
+       goto out;
+ 
+-   /* Round-trip again to get formats and modifiers */
+-   wl_display_roundtrip_queue(display->wl_display, display->queue);
+-
+    if (wsi_wl->wsi->force_bgra8_unorm_first) {
+       /* Find BGRA8_UNORM in the list and swap it to the first position if we
+        * can find it.  Some apps get confused if SRGB is first in the list.
+        */
+-      struct wsi_wl_format *first_fmt = u_vector_head(&display->formats);
++      struct wsi_wl_format *first_fmt = u_vector_tail(&display->formats);
+       struct wsi_wl_format *f, tmp_fmt;
+       f = find_format(&display->formats, VK_FORMAT_B8G8R8A8_UNORM);
+       if (f) {
+@@ -1122,7 +1235,7 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
+    VkResult result;
+ 
+    result = wsi_create_image(&chain->base, &chain->base.image_info,
+-                             &image->base);
++                             display->fd, &image->base);
+    if (result != VK_SUCCESS)
+       return result;
+ 
+@@ -1323,6 +1436,7 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
+                                        &chain->num_drm_modifiers,
+                                        &chain->drm_modifiers,
+                                        NULL /* alloc_shm */,
++                                       chain->display->fd,
+                                        &chain->base.image_info);
+    if (result != VK_SUCCESS)
+       goto fail;
+diff --git a/src/vulkan/wsi/wsi_common_win32.c b/src/vulkan/wsi/wsi_common_win32.c
+index 69b331642d9..6075891a702 100644
+--- a/src/vulkan/wsi/wsi_common_win32.c
++++ b/src/vulkan/wsi/wsi_common_win32.c
+@@ -357,7 +357,7 @@ wsi_configure_win32_image(const struct wsi_swapchain *chain,
+                           struct wsi_image_info *info)
+ {
+    VkResult result =
+-      wsi_configure_buffer_image(chain, pCreateInfo, info);
++      wsi_configure_buffer_image(chain, pCreateInfo, -1, info);
+    if (result != VK_SUCCESS)
+       return result;
+ 
+@@ -383,7 +383,7 @@ wsi_win32_image_init(VkDevice device_h,
+ {
+    assert(chain->base.use_buffer_blit);
+    VkResult result = wsi_create_image(&chain->base, &chain->base.image_info,
+-                                      &image->base);
++                                      -1, &image->base);
+    if (result != VK_SUCCESS)
+       return result;
+ 
+diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
+index b12512aad18..8d9123c0494 100644
+--- a/src/vulkan/wsi/wsi_common_x11.c
++++ b/src/vulkan/wsi/wsi_common_x11.c
+@@ -1576,6 +1576,7 @@ static VkResult
+ x11_image_init(VkDevice device_h, struct x11_swapchain *chain,
+                const VkSwapchainCreateInfoKHR *pCreateInfo,
+                const VkAllocationCallbacks* pAllocator,
++               int display_fd,
+                struct x11_image *image)
+ {
+    xcb_void_cookie_t cookie;
+@@ -1584,7 +1585,7 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain,
+    int fence_fd;
+ 
+    result = wsi_create_image(&chain->base, &chain->base.image_info,
+-                             &image->base);
++                             display_fd, &image->base);
+    if (result != VK_SUCCESS)
+       return result;
+ 
+@@ -2021,16 +2022,26 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
+                                  modifiers, num_modifiers, &num_tranches,
+                                  pAllocator);
+ 
++   int display_fd = -1;
++   if (!wsi_device->sw) {
++      xcb_screen_iterator_t screen_iter =
++         xcb_setup_roots_iterator(xcb_get_setup(conn));
++      xcb_screen_t *screen = screen_iter.data;
++
++      display_fd = wsi_dri3_open(conn, screen->root, None);
++   }
++
+    if (chain->base.use_buffer_blit) {
+       bool use_modifier = num_tranches > 0;
+       result = wsi_configure_prime_image(&chain->base, pCreateInfo,
+-                                         use_modifier,
++                                         use_modifier, display_fd,
+                                          &chain->base.image_info);
+    } else {
+       result = wsi_configure_native_image(&chain->base, pCreateInfo,
+                                           num_tranches, num_modifiers,
+                                           (const uint64_t *const *)modifiers,
+                                           chain->has_mit_shm ? &alloc_shm : NULL,
++                                          display_fd,
+                                           &chain->base.image_info);
+    }
+    if (result != VK_SUCCESS)
+@@ -2039,11 +2050,16 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
+    uint32_t image = 0;
+    for (; image < chain->base.image_count; image++) {
+       result = x11_image_init(device, chain, pCreateInfo, pAllocator,
+-                              &chain->images[image]);
++                              display_fd, &chain->images[image]);
+       if (result != VK_SUCCESS)
+          goto fail_init_images;
+    }
+ 
++   if (display_fd >= 0) {
++      close(display_fd);
++      display_fd = -1;
++   }
++
+    /* Initialize queues for images in our swapchain. Possible queues are:
+     * - Present queue: for images sent to the X server but not yet presented.
+     * - Acquire queue: for images already presented but not yet released by the
+@@ -2122,6 +2138,9 @@ fail_modifiers:
+    for (int i = 0; i < ARRAY_SIZE(modifiers); i++)
+       vk_free(pAllocator, modifiers[i]);
+ 
++   if (display_fd >= 0)
++     close(display_fd);
++
+ fail_register:
+    xcb_unregister_for_special_event(chain->conn, chain->special_event);
+ 
+-- 
+2.25.1
+

+ 3114 - 0
package/mesa3d/0049-pvr-wsi-add-PowerVR-Vulkan-WSI-library.patch

@@ -0,0 +1,3114 @@
+From 0e2da64a2bfc10ec25d4e24c050f765587ea09b3 Mon Sep 17 00:00:00 2001
+From: Brendan King <Brendan.King@imgtec.com>
+Date: Thu, 18 Mar 2021 13:44:57 +0000
+Subject: [PATCH 49/58] pvr/wsi: add PowerVR Vulkan WSI library
+
+The old (pre-Mesa 22.0.0) Mesa WSI interface has been restored.
+The new interface provides API entry points, ready to be plugged
+into a Vulkan dispatch table. The new interface is not useable by
+PowerVR Vulkan, as the interface make assumptions about some Vulkan
+data structures which are not valid on the PowerVR side (e.g.
+VkPhysicalDevice being a handle to a Mesa vk_physical_device
+structure). The new and old interfaces share code. Where an old
+interface function has been reintroduced, the corresponding function
+in the new interface has become a wrapper around it.
+
+PowerVR Vulkan will load the WSI library, libpvr_mesa_wsi.so,
+and lookup the symbol pvr_mesa_wsi_sym_addr, which is a used to
+lookup all other symbols required by Vulkan from the library.
+The function is used by Vulkan to lookup the library initialisation
+function, pvr_mesa_wsi_init. That function is passed the address
+of another lookup function, pvr_vk_mesa_wsi_sym_addr, which is used
+by the WSI library to lookup symbols in Vulkan.
+
+The interface between PowerVR Vulkan and Mesa WSI is defined in
+pvr_mesa_wsi_interface.h. Most of the functions defined on the WSI
+side are wrappers around Mesa WSI functions.
+---
+ meson.build                          |   1 +
+ meson_options.txt                    |   2 +-
+ src/meson.build                      |   3 +
+ src/pvr/meson.build                  |  23 ++
+ src/pvr/wsi/meson.build              |  82 +++++
+ src/pvr/wsi/pvr_mesa_wsi_interface.h | 306 +++++++++++++++++
+ src/pvr/wsi/pvr_wsi.c                | 335 +++++++++++++++++++
+ src/pvr/wsi/pvr_wsi.h                |  78 +++++
+ src/pvr/wsi/pvr_wsi_display.c        | 293 ++++++++++++++++
+ src/pvr/wsi/pvr_wsi_wayland.c        |  45 +++
+ src/pvr/wsi/pvr_wsi_x11.c            |  62 ++++
+ src/vulkan/wsi/wsi_common.c          | 248 ++++++++++----
+ src/vulkan/wsi/wsi_common.h          |  60 ++++
+ src/vulkan/wsi/wsi_common_display.c  | 479 +++++++++++++++++++++------
+ src/vulkan/wsi/wsi_common_display.h  | 126 +++++++
+ src/vulkan/wsi/wsi_common_wayland.c  |  57 +++-
+ src/vulkan/wsi/wsi_common_wayland.h  |  35 ++
+ src/vulkan/wsi/wsi_common_x11.c      |  88 +++--
+ src/vulkan/wsi/wsi_common_x11.h      |  41 +++
+ 19 files changed, 2162 insertions(+), 202 deletions(-)
+ create mode 100644 src/pvr/meson.build
+ create mode 100644 src/pvr/wsi/meson.build
+ create mode 100644 src/pvr/wsi/pvr_mesa_wsi_interface.h
+ create mode 100644 src/pvr/wsi/pvr_wsi.c
+ create mode 100644 src/pvr/wsi/pvr_wsi.h
+ create mode 100644 src/pvr/wsi/pvr_wsi_display.c
+ create mode 100644 src/pvr/wsi/pvr_wsi_wayland.c
+ create mode 100644 src/pvr/wsi/pvr_wsi_x11.c
+ create mode 100644 src/vulkan/wsi/wsi_common_wayland.h
+ create mode 100644 src/vulkan/wsi/wsi_common_x11.h
+
+diff --git a/meson.build b/meson.build
+index a37add42a6d..31b6ffdb060 100644
+--- a/meson.build
++++ b/meson.build
+@@ -298,6 +298,7 @@ with_broadcom_vk = _vulkan_drivers.contains('broadcom')
+ with_imagination_vk = _vulkan_drivers.contains('imagination-experimental')
+ with_imagination_srv = get_option('imagination-srv')
+ with_microsoft_vk = _vulkan_drivers.contains('microsoft-experimental')
++with_pvr_vk = _vulkan_drivers.contains('pvr')
+ with_any_vk = _vulkan_drivers.length() != 0
+ 
+ with_any_broadcom = with_gallium_vc4 or with_gallium_v3d or with_broadcom_vk
+diff --git a/meson_options.txt b/meson_options.txt
+index 84661fb851f..c78b19a1380 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -204,7 +204,7 @@ option(
+   'vulkan-drivers',
+   type : 'array',
+   value : ['auto'],
+-  choices : ['auto', 'amd', 'broadcom', 'freedreno', 'imagination-experimental', 'intel', 'microsoft-experimental', 'panfrost', 'swrast', 'virtio-experimental'],
++  choices : ['auto', 'amd', 'broadcom', 'freedreno', 'imagination-experimental', 'intel', 'microsoft-experimental', 'panfrost', 'pvr', 'swrast', 'virtio-experimental'],
+   description : 'List of vulkan drivers to build. If this is set to auto all drivers applicable to the target OS/architecture will be built'
+ )
+ option(
+diff --git a/src/meson.build b/src/meson.build
+index 0846a6035c9..a70c695518e 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -103,6 +103,9 @@ endif
+ if with_gallium_panfrost or with_gallium_lima or with_panfrost_vk or with_tools.contains('panfrost')
+   subdir('panfrost')
+ endif
++if with_pvr_vk
++  subdir('pvr')
++endif
+ if with_gallium_virgl or with_virtio_vk
+   subdir('virtio')
+ endif
+diff --git a/src/pvr/meson.build b/src/pvr/meson.build
+new file mode 100644
+index 00000000000..09a6986a4c9
+--- /dev/null
++++ b/src/pvr/meson.build
+@@ -0,0 +1,23 @@
++# Copyright (c) Imagination Technologies Ltd.
++
++# Permission is hereby granted, free of charge, to any person obtaining a copy
++# of this software and associated documentation files (the "Software"), to deal
++# in the Software without restriction, including without limitation the rights
++# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++# copies of the Software, and to permit persons to whom the Software is
++# furnished to do so, subject to the following conditions:
++
++# The above copyright notice and this permission notice shall be included in
++# all copies or substantial portions of the Software.
++
++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++# SOFTWARE.
++
++if with_pvr_vk
++  subdir('wsi')
++endif
+diff --git a/src/pvr/wsi/meson.build b/src/pvr/wsi/meson.build
+new file mode 100644
+index 00000000000..ec911321400
+--- /dev/null
++++ b/src/pvr/wsi/meson.build
+@@ -0,0 +1,82 @@
++# Copyright (c) Imagination Technologies Ltd.
++
++# Permission is hereby granted, free of charge, to any person obtaining a copy
++# of this software and associated documentation files (the "Software"), to deal
++# in the Software without restriction, including without limitation the rights
++# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++# copies of the Software, and to permit persons to whom the Software is
++# furnished to do so, subject to the following conditions:
++
++# The above copyright notice and this permission notice shall be included in
++# all copies or substantial portions of the Software.
++
++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++# SOFTWARE.
++
++pvr_wsi_args = vulkan_wsi_args
++
++pvr_wsi_depends = [
++  dep_libdrm,
++  idep_vulkan_util,
++  idep_xmlconfig,
++  idep_vulkan_wsi,
++  idep_vulkan_runtime_headers,
++  idep_vulkan_runtime,
++  idep_nir
++]
++
++pvr_wsi_includes = [
++  inc_include,
++  inc_src,
++  inc_vulkan_util
++]
++
++pvr_wsi_src = [ 'pvr_wsi.c' ]
++
++if with_platform_wayland
++  pvr_wsi_args += '-DVK_USE_PLATFORM_WAYLAND_KHR'
++
++  pvr_wsi_depends += dep_wayland_client
++
++  pvr_wsi_src += 'pvr_wsi_wayland.c'
++endif
++
++if with_platform_x11
++  pvr_wsi_args += [
++    '-DVK_USE_PLATFORM_XCB_KHR',
++    '-DVK_USE_PLATFORM_XLIB_KHR',
++  ]
++
++  pvr_wsi_depends += dep_xcb_dri2
++
++  pvr_wsi_src += 'pvr_wsi_x11.c'
++endif
++
++if system_has_kms_drm and not with_platform_android
++  pvr_wsi_args += '-DVK_USE_PLATFORM_DISPLAY_KHR'
++
++  pvr_wsi_src += 'pvr_wsi_display.c'
++endif
++
++if with_xlib_lease
++  pvr_wsi_args += '-DVK_USE_PLATFORM_XLIB_XRANDR_EXT'
++
++  pvr_wsi_depends += dep_xlib_xrandr
++endif
++
++libpvr_mesa_wsi = shared_library(
++  'pvr_mesa_wsi',
++  pvr_wsi_src,
++  include_directories : pvr_wsi_includes,
++  dependencies : pvr_wsi_depends,
++  c_args : pvr_wsi_args,
++  link_with: libvulkan_wsi,
++  gnu_symbol_visibility : 'hidden',
++  build_by_default : true,
++  install : true
++)
+diff --git a/src/pvr/wsi/pvr_mesa_wsi_interface.h b/src/pvr/wsi/pvr_mesa_wsi_interface.h
+new file mode 100644
+index 00000000000..b4b1bcb0c9d
+--- /dev/null
++++ b/src/pvr/wsi/pvr_mesa_wsi_interface.h
+@@ -0,0 +1,306 @@
++/*************************************************************************/ /*!
++@File
++@Title          PVR interface to the Vulkan WSI layer in Mesa
++@Copyright      Copyright (c) Imagination Technologies Ltd. All Rights Reserved
++@License        MIT
++
++The contents of this file are subject to the MIT license as set out below.
++
++Permission is hereby granted, free of charge, to any person obtaining a copy
++of this software and associated documentation files (the "Software"), to deal
++in the Software without restriction, including without limitation the rights
++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++copies of the Software, and to permit persons to whom the Software is
++furnished to do so, subject to the following conditions:
++
++The above copyright notice and this permission notice shall be included in
++all copies or substantial portions of the Software.
++
++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++THE SOFTWARE.
++*/ /**************************************************************************/
++
++#ifndef PVR_MESA_WSI_INTERFACE_H
++#define PVR_MESA_WSI_INTERFACE_H
++
++#include <stdbool.h>
++#include <stdint.h>
++
++#include <vulkan/vulkan.h>
++
++/*
++ * The pvr_mesa_wsi structure holds the Mesa WSI state, and is opaque to
++ * the PowerVK DDK.
++ */
++struct pvr_mesa_wsi;
++
++/*
++ * Functions defined in Mesa for use by the PowerVR DDK.
++ * All functions have a "pvr_mesa_wsi" prefix.
++ */
++
++void *
++pvr_mesa_wsi_sym_addr(struct pvr_mesa_wsi *mwsi,
++                      const char *name);
++
++VkResult
++pvr_mesa_wsi_init(struct pvr_mesa_wsi **mwsi,
++                  VkPhysicalDevice physicalDevice,
++                  PFN_vkVoidFunction (VKAPI_PTR *pvr_vk_mesa_wsi_sym_addr)
++                     (VkPhysicalDevice physicalDevice, const char *),
++                  const VkAllocationCallbacks *alloc,
++                  int fd,
++                  bool sw);
++
++void
++pvr_mesa_wsi_finish(struct pvr_mesa_wsi *mwsi,
++                    const VkAllocationCallbacks *alloc);
++
++VkResult
++pvr_mesa_wsi_common_get_surface_support(struct pvr_mesa_wsi *mwsi,
++                                        uint32_t queueFamilyIndex,
++                                        VkSurfaceKHR surface,
++                                        VkBool32 *pSupported);
++
++VkResult
++pvr_mesa_wsi_common_get_surface_capabilities(struct pvr_mesa_wsi *mwsi,
++                                             VkSurfaceKHR surface,
++                                             VkSurfaceCapabilitiesKHR *pSurfaceCapabilities);
++
++VkResult
++pvr_mesa_wsi_common_get_surface_capabilities2(struct pvr_mesa_wsi *mwsi,
++                                              const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
++                                              VkSurfaceCapabilities2KHR *pSurfaceCapabilities);
++
++VkResult
++pvr_mesa_wsi_common_get_surface_capabilities2ext(struct pvr_mesa_wsi *mwsi,
++                                                 VkSurfaceKHR surface,
++                                                 VkSurfaceCapabilities2EXT *pSurfaceCapabilities);
++
++VkResult
++pvr_mesa_wsi_common_get_surface_formats(struct pvr_mesa_wsi *mwsi,
++                                        VkSurfaceKHR surface,
++                                        uint32_t *pSurfaceFormatCount,
++                                        VkSurfaceFormatKHR *pSurfaceFormats);
++
++VkResult
++pvr_mesa_wsi_common_get_surface_formats2(struct pvr_mesa_wsi *mwsi,
++                                         const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
++                                         uint32_t *pSurfaceFormatCount,
++                                         VkSurfaceFormat2KHR *pSurfaceFormats);
++
++VkResult
++pvr_mesa_wsi_common_get_surface_present_modes(struct pvr_mesa_wsi *mwsi,
++                                              VkSurfaceKHR surface,
++                                              uint32_t *pPresentModeCount,
++                                              VkPresentModeKHR *pPresentModes);
++
++VkResult
++pvr_mesa_wsi_common_create_swapchain(struct pvr_mesa_wsi *mwsi,
++                                     VkDevice device,
++                                     const VkSwapchainCreateInfoKHR *pCreateInfo,
++                                     const VkAllocationCallbacks *pAllocator,
++                                     VkSwapchainKHR *pSwapchain);
++void
++pvr_mesa_wsi_common_destroy_swapchain(struct pvr_mesa_wsi *mwsi,
++                                      VkDevice device,
++                                      VkSwapchainKHR swapchain,
++                                      const VkAllocationCallbacks *pAllocator);
++
++VkResult
++pvr_mesa_wsi_common_get_images(struct pvr_mesa_wsi *mwsi,
++                               VkSwapchainKHR swapchain,
++                               uint32_t *pSwapchainImageCount,
++                               VkImage *pSwapchainImages);
++
++VkResult
++pvr_mesa_wsi_common_acquire_next_image2(struct pvr_mesa_wsi *mwsi,
++                                        VkDevice device,
++                                        const VkAcquireNextImageInfoKHR *pAcquireInfo,
++                                        uint32_t *pImageIndex);
++
++VkResult
++pvr_mesa_wsi_common_queue_present(struct pvr_mesa_wsi *mwsi,
++                                  VkDevice device,
++                                  VkQueue queue,
++                                  int queue_family_index,
++                                  const VkPresentInfoKHR *pPresentInfo);
++
++VkResult
++pvr_mesa_wsi_common_get_present_rectangles(struct pvr_mesa_wsi *mwsi,
++                                           VkSurfaceKHR surface,
++                                           uint32_t* pRectCount,
++                                           VkRect2D* pRects);
++
++#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
++VkBool32
++pvr_mesa_wsi_get_physical_device_wayland_presentation_support(struct pvr_mesa_wsi *mwsi,
++                                                              uint32_t queueFamilyIndex,
++                                                              void *display);
++
++VkResult
++pvr_mesa_wsi_create_wayland_surface(struct pvr_mesa_wsi *mwsi,
++                                    const VkAllocationCallbacks *pAllocator,
++                                    const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
++                                    VkSurfaceKHR *pSurface);
++#endif
++
++#if defined(VK_USE_PLATFORM_XCB_KHR)
++VkBool32
++pvr_mesa_wsi_get_physical_device_xcb_presentation_support(struct pvr_mesa_wsi *mwsi,
++                                                          uint32_t queueFamilyIndex,
++                                                          void *connection,
++                                                          uint32_t visualId);
++VkResult
++pvr_mesa_wsi_create_xcb_surface(struct pvr_mesa_wsi *mwsi,
++                                const VkAllocationCallbacks *pAllocator,
++                                const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
++                                VkSurfaceKHR *pSurface);
++#endif
++
++#if defined(VK_USE_PLATFORM_XLIB_KHR)
++VkResult
++pvr_mesa_wsi_create_xlib_surface(struct pvr_mesa_wsi *mwsi,
++                                 const VkAllocationCallbacks *pAllocator,
++                                 const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
++                                 VkSurfaceKHR *pSurface);
++#endif
++
++VkResult
++pvr_mesa_wsi_display_get_physical_device_display_properties(struct pvr_mesa_wsi *mwsi,
++							    VkPhysicalDevice physicalDevice,
++							    uint32_t *pPropertyCount,
++							    VkDisplayPropertiesKHR *pProperties);
++
++VkResult
++pvr_mesa_wsi_display_get_physical_device_display_properties2(struct pvr_mesa_wsi *mwsi,
++							     VkPhysicalDevice physicalDevice,
++							     uint32_t *pPropertyCount,
++							     VkDisplayProperties2KHR *pProperties);
++
++VkResult
++pvr_mesa_wsi_display_get_physical_device_display_plane_properties(struct pvr_mesa_wsi *mwsi,
++								  VkPhysicalDevice physicalDevice,
++								  uint32_t *pPropertyCount,
++								  VkDisplayPlanePropertiesKHR *pProperties);
++
++VkResult
++pvr_mesa_wsi_display_get_physical_device_display_plane_properties2(struct pvr_mesa_wsi *mwsi,
++								   VkPhysicalDevice physicalDevice,
++								   uint32_t *pPropertyCount,
++								   VkDisplayPlaneProperties2KHR *pProperties);
++
++VkResult
++pvr_mesa_wsi_display_get_display_plane_supported_displays(struct pvr_mesa_wsi *mwsi,
++							  VkPhysicalDevice physicalDevice,
++							  uint32_t planeIndex,
++							  uint32_t *pDisplayCount,
++							  VkDisplayKHR *pDisplays);
++
++VkResult
++pvr_mesa_wsi_display_get_display_mode_properties(struct pvr_mesa_wsi *mwsi,
++						 VkPhysicalDevice physicalDevice,
++						 VkDisplayKHR display,
++						 uint32_t *pPropertyCount,
++						 VkDisplayModePropertiesKHR *pProperties);
++
++VkResult
++pvr_mesa_wsi_display_get_display_mode_properties2(struct pvr_mesa_wsi *mwsi,
++                                                  VkPhysicalDevice physicalDevice,
++                                                  VkDisplayKHR display,
++                                                  uint32_t *pPropertyCount,
++                                                  VkDisplayModeProperties2KHR *pProperties);
++
++VkResult
++pvr_mesa_wsi_display_create_display_mode(struct pvr_mesa_wsi *mwsi,
++                                         VkPhysicalDevice physicalDevice,
++                                         VkDisplayKHR display,
++                                         const VkDisplayModeCreateInfoKHR *pCreateInfo,
++                                         const VkAllocationCallbacks *pAllocator,
++                                         VkDisplayModeKHR *pMode);
++
++VkResult
++pvr_mesa_wsi_get_display_plane_capabilities(struct pvr_mesa_wsi *mwsi,
++                                            VkPhysicalDevice physicalDevice,
++                                            VkDisplayModeKHR modeKhr,
++                                            uint32_t planeIndex,
++                                            VkDisplayPlaneCapabilitiesKHR *pCapabilities);
++
++VkResult
++pvr_mesa_wsi_get_display_plane_capabilities2(struct pvr_mesa_wsi *mwsi,
++                                             VkPhysicalDevice physicalDevice,
++                                             const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo,
++                                             VkDisplayPlaneCapabilities2KHR *pCapabilities);
++
++VkResult
++pvr_mesa_wsi_create_display_surface(struct pvr_mesa_wsi *mwsi,
++                                    VkInstance instance,
++                                    const VkAllocationCallbacks *pAllocator,
++                                    const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
++                                    VkSurfaceKHR *pSurface);
++
++VkResult
++pvr_mesa_wsi_release_display(struct pvr_mesa_wsi *mwsi,
++                             VkPhysicalDevice physicalDevice,
++                             VkDisplayKHR display);
++
++#if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
++VkResult
++pvr_mesa_wsi_acquire_xlib_display(struct pvr_mesa_wsi *mwsi,
++                                  VkPhysicalDevice physicalDevice,
++                                  void *dpy,
++                                  VkDisplayKHR display);
++
++VkResult
++pvr_mesa_wsi_get_randr_output_display(struct pvr_mesa_wsi *mwsi,
++                                      VkPhysicalDevice  physicalDevice,
++                                      void *dpy,
++                                      uint32_t output,
++                                      VkDisplayKHR *pDisplay);
++
++#endif
++
++VkResult
++pvr_mesa_wsi_display_power_control(struct pvr_mesa_wsi *mwsi,
++                                   VkDevice device,
++                                   VkDisplayKHR display,
++                                   const VkDisplayPowerInfoEXT *pDisplayPowerInfo);
++
++VkResult
++pvr_mesa_wsi_register_device_event(struct pvr_mesa_wsi *mwsi,
++                                   VkDevice device,
++                                   const VkDeviceEventInfoEXT *pDeviceEventInfo,
++                                   const VkAllocationCallbacks *pAllocator,
++                                   void **pFence,
++                                   int syncFd);
++
++VkResult
++pvr_mesa_wsi_register_display_event(struct pvr_mesa_wsi *mwsi,
++                                    VkDevice device,
++                                    VkDisplayKHR display,
++                                    const VkDisplayEventInfoEXT *pDisplayEventInfo,
++                                    const VkAllocationCallbacks  *pAllocator,
++                                    void **pFence,
++                                    int syncFd);
++
++VkResult
++pvr_mesa_wsi_get_swapchain_counter(struct pvr_mesa_wsi *mwsi,
++                                   VkDevice device,
++                                   VkSwapchainKHR swapchain,
++                                   VkSurfaceCounterFlagBitsEXT flagBits,
++                                   uint64_t *pValue);
++
++/*
++ * Functions defined in the PowerVR DDK for use by Mesa.
++ * All functions have a "pvr_vk_mesa_wsi" prefix.
++ */
++VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
++pvr_vk_mesa_wsi_sym_addr(VkPhysicalDevice physicalDevice,
++                         const char *name);
++
++#endif /* PVR_MESA_WSI_INTERFACE_H */
+diff --git a/src/pvr/wsi/pvr_wsi.c b/src/pvr/wsi/pvr_wsi.c
+new file mode 100644
+index 00000000000..c8a5813fbe7
+--- /dev/null
++++ b/src/pvr/wsi/pvr_wsi.c
+@@ -0,0 +1,335 @@
++/*
++ * Copyright © Imagination Technologies Ltd.
++ *
++ * The contents of this file are subject to the MIT license as set out below.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#include <string.h>
++
++#include "pvr_wsi.h"
++#include "pvr_mesa_wsi_interface.h"
++
++VkResult
++pvr_mesa_wsi_init(struct pvr_mesa_wsi **pmwsi,
++                  VkPhysicalDevice physicalDevice,
++                  PFN_vkVoidFunction (VKAPI_PTR *pvr_vk_mesa_wsi_sym_addr)
++                     (VkPhysicalDevice physicalDevice, const char *),
++                  const VkAllocationCallbacks *alloc,
++                  int fd,
++                  bool sw)
++{
++   struct pvr_mesa_wsi *mwsi;
++   VkResult result;
++
++   mwsi = vk_zalloc(alloc, sizeof(*mwsi), 8,
++                    VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
++   if (!mwsi)
++      return VK_ERROR_OUT_OF_HOST_MEMORY;
++
++   mwsi->symtab.pvr_vk_mesa_wsi_sym_addr = pvr_vk_mesa_wsi_sym_addr;
++   mwsi->physicalDevice = physicalDevice;
++
++   result = wsi_device_init(&mwsi->wsi,
++                            physicalDevice,
++                            pvr_vk_mesa_wsi_sym_addr,
++                            alloc,
++                            fd, NULL, sw);
++   if (result != VK_SUCCESS) {
++      vk_free(alloc, mwsi);
++      return result;
++   }
++
++   mwsi->wsi.opaque_vk_handles = true;
++
++   if (!sw)
++      mwsi->wsi.supports_modifiers = true;
++
++   *pmwsi = mwsi;
++
++   return VK_SUCCESS;
++}
++
++void
++pvr_mesa_wsi_finish(struct pvr_mesa_wsi *mwsi,
++		    const VkAllocationCallbacks *alloc)
++{
++   wsi_device_finish(&mwsi->wsi, alloc);
++
++   vk_free(alloc, mwsi);
++}
++
++VkResult
++pvr_mesa_wsi_common_get_surface_support(struct pvr_mesa_wsi *mwsi,
++                                        uint32_t queueFamilyIndex,
++                                        VkSurfaceKHR surface,
++                                        VkBool32 *pSupported)
++{
++   return wsi_common_get_surface_support(&mwsi->wsi,
++                                         queueFamilyIndex,
++                                         surface,
++                                         pSupported);
++}
++
++VkResult
++pvr_mesa_wsi_common_get_surface_capabilities(struct pvr_mesa_wsi *mwsi,
++                                             VkSurfaceKHR surface,
++                                             VkSurfaceCapabilitiesKHR *pSurfaceCapabilities)
++{
++   return wsi_common_get_surface_capabilities(&mwsi->wsi,
++                                              surface,
++                                              pSurfaceCapabilities);
++}
++
++VkResult
++pvr_mesa_wsi_common_get_surface_capabilities2(struct pvr_mesa_wsi *mwsi,
++                                              const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
++                                              VkSurfaceCapabilities2KHR *pSurfaceCapabilities)
++{
++   return wsi_common_get_surface_capabilities2(&mwsi->wsi,
++                                               pSurfaceInfo,
++                                               pSurfaceCapabilities);
++}
++
++VkResult
++pvr_mesa_wsi_common_get_surface_capabilities2ext(struct pvr_mesa_wsi *mwsi,
++                                                 VkSurfaceKHR surface,
++                                                 VkSurfaceCapabilities2EXT *pSurfaceCapabilities)
++{
++   return wsi_common_get_surface_capabilities2ext(&mwsi->wsi,
++                                                  surface,
++                                                  pSurfaceCapabilities);
++}
++
++VkResult
++pvr_mesa_wsi_common_get_surface_formats(struct pvr_mesa_wsi *mwsi,
++                                        VkSurfaceKHR surface,
++                                        uint32_t *pSurfaceFormatCount,
++                                        VkSurfaceFormatKHR *pSurfaceFormats)
++{
++   return wsi_common_get_surface_formats(&mwsi->wsi,
++                                         surface,
++                                         pSurfaceFormatCount,
++                                         pSurfaceFormats);
++}
++
++VkResult
++pvr_mesa_wsi_common_get_surface_formats2(struct pvr_mesa_wsi *mwsi,
++                                         const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
++                                         uint32_t *pSurfaceFormatCount,
++                                         VkSurfaceFormat2KHR *pSurfaceFormats)
++{
++   return wsi_common_get_surface_formats2(&mwsi->wsi,
++                                          pSurfaceInfo,
++                                          pSurfaceFormatCount,
++                                          pSurfaceFormats);
++}
++
++VkResult
++pvr_mesa_wsi_common_get_surface_present_modes(struct pvr_mesa_wsi *mwsi,
++                                              VkSurfaceKHR surface,
++                                              uint32_t *pPresentModeCount,
++                                              VkPresentModeKHR *pPresentModes)
++{
++   return wsi_common_get_surface_present_modes(&mwsi->wsi,
++                                               surface,
++                                               pPresentModeCount,
++                                               pPresentModes);
++}
++
++VkResult
++pvr_mesa_wsi_common_create_swapchain(struct pvr_mesa_wsi *mwsi,
++                                     VkDevice device,
++                                     const VkSwapchainCreateInfoKHR *pCreateInfo,
++                                     const VkAllocationCallbacks *pAllocator,
++                                     VkSwapchainKHR *pSwapchain)
++{
++   return wsi_common_create_swapchain(&mwsi->wsi,
++                                      device,
++                                      pCreateInfo,
++                                      pAllocator,
++                                      pSwapchain);
++}
++
++void
++pvr_mesa_wsi_common_destroy_swapchain(UNUSED struct pvr_mesa_wsi *mwsi,
++                                      VkDevice device,
++                                      VkSwapchainKHR swapchain,
++                                      const VkAllocationCallbacks *pAllocator)
++{
++   return wsi_common_destroy_swapchain(device,
++                                       swapchain,
++                                       pAllocator);
++}
++
++VkResult
++pvr_mesa_wsi_common_get_images(UNUSED struct pvr_mesa_wsi *mwsi,
++                               VkSwapchainKHR swapchain,
++                               uint32_t *pSwapchainImageCount,
++                               VkImage *pSwapchainImages)
++{
++   return wsi_common_get_images(swapchain,
++                                pSwapchainImageCount,
++                                pSwapchainImages);
++}
++
++VkResult
++pvr_mesa_wsi_common_acquire_next_image2(struct pvr_mesa_wsi *mwsi,
++                                        VkDevice device,
++                                        const VkAcquireNextImageInfoKHR *pAcquireInfo,
++                                        uint32_t *pImageIndex)
++{
++   return wsi_common_acquire_next_image2(&mwsi->wsi,
++                                         device,
++                                         pAcquireInfo,
++                                         pImageIndex);
++}
++
++VkResult
++pvr_mesa_wsi_common_queue_present(struct pvr_mesa_wsi *mwsi,
++                                  VkDevice device,
++                                  VkQueue queue,
++                                  int queue_family_index,
++                                  const VkPresentInfoKHR *pPresentInfo)
++{
++   return wsi_common_queue_present(&mwsi->wsi,
++                                   device,
++                                   queue,
++                                   queue_family_index,
++                                   pPresentInfo);
++}
++
++VkResult
++pvr_mesa_wsi_common_get_present_rectangles(struct pvr_mesa_wsi *mwsi,
++                                           VkSurfaceKHR surface,
++                                           uint32_t* pRectCount,
++                                           VkRect2D* pRects)
++{
++   return wsi_common_get_present_rectangles(&mwsi->wsi,
++                                            surface,
++                                            pRectCount,
++                                            pRects);
++}
++
++/*
++ * The mwsi parameter is currently unused. Note that it is invalid for
++ * pvr_mesa_wsi_init, which is responsible for allocating it.
++*/
++PUBLIC void *
++pvr_mesa_wsi_sym_addr(UNUSED struct pvr_mesa_wsi *mwsi, const char *name)
++{
++   static const struct {
++      char *name;
++      void *addr;
++   } lookup[] = {
++      { "pvr_mesa_wsi_init",
++            pvr_mesa_wsi_init },
++      { "pvr_mesa_wsi_finish",
++            pvr_mesa_wsi_finish },
++      { "pvr_mesa_wsi_common_get_surface_support",
++            pvr_mesa_wsi_common_get_surface_support },
++      { "pvr_mesa_wsi_common_get_surface_capabilities",
++            pvr_mesa_wsi_common_get_surface_capabilities },
++      { "pvr_mesa_wsi_common_get_surface_capabilities2",
++            pvr_mesa_wsi_common_get_surface_capabilities2 },
++      { "pvr_mesa_wsi_common_get_surface_capabilities2ext",
++            pvr_mesa_wsi_common_get_surface_capabilities2ext },
++      { "pvr_mesa_wsi_common_get_surface_formats",
++            pvr_mesa_wsi_common_get_surface_formats },
++      { "pvr_mesa_wsi_common_get_surface_formats2",
++            pvr_mesa_wsi_common_get_surface_formats2 },
++      { "pvr_mesa_wsi_common_get_surface_present_modes",
++            pvr_mesa_wsi_common_get_surface_present_modes },
++      { "pvr_mesa_wsi_common_create_swapchain",
++            pvr_mesa_wsi_common_create_swapchain },
++      { "pvr_mesa_wsi_common_destroy_swapchain",
++            pvr_mesa_wsi_common_destroy_swapchain },
++      { "pvr_mesa_wsi_common_get_images",
++            pvr_mesa_wsi_common_get_images },
++      { "pvr_mesa_wsi_common_acquire_next_image2",
++            pvr_mesa_wsi_common_acquire_next_image2 },
++      { "pvr_mesa_wsi_common_queue_present",
++            pvr_mesa_wsi_common_queue_present },
++      { "pvr_mesa_wsi_common_get_present_rectangles",
++            pvr_mesa_wsi_common_get_present_rectangles },
++#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
++      { "pvr_mesa_wsi_get_physical_device_wayland_presentation_support",
++            pvr_mesa_wsi_get_physical_device_wayland_presentation_support },
++      { "pvr_mesa_wsi_create_wayland_surface",
++            pvr_mesa_wsi_create_wayland_surface },
++#endif
++#if defined(VK_USE_PLATFORM_XCB_KHR)
++      { "pvr_mesa_wsi_get_physical_device_xcb_presentation_support",
++            pvr_mesa_wsi_get_physical_device_xcb_presentation_support },
++      { "pvr_mesa_wsi_create_xcb_surface",
++            pvr_mesa_wsi_create_xcb_surface },
++#endif
++#if defined(VK_USE_PLATFORM_XLIB_KHR)
++      { "pvr_mesa_wsi_create_xlib_surface",
++            pvr_mesa_wsi_create_xlib_surface },
++#endif
++      { "pvr_mesa_wsi_display_get_physical_device_display_properties",
++            pvr_mesa_wsi_display_get_physical_device_display_properties },
++      { "pvr_mesa_wsi_display_get_physical_device_display_properties2",
++            pvr_mesa_wsi_display_get_physical_device_display_properties2 },
++      { "pvr_mesa_wsi_display_get_physical_device_display_plane_properties",
++            pvr_mesa_wsi_display_get_physical_device_display_plane_properties },
++      { "pvr_mesa_wsi_display_get_physical_device_display_plane_properties2",
++            pvr_mesa_wsi_display_get_physical_device_display_plane_properties2 },
++      { "pvr_mesa_wsi_display_get_display_plane_supported_displays",
++            pvr_mesa_wsi_display_get_display_plane_supported_displays },
++      { "pvr_mesa_wsi_display_get_display_mode_properties",
++            pvr_mesa_wsi_display_get_display_mode_properties },
++      { "pvr_mesa_wsi_display_get_display_mode_properties2",
++            pvr_mesa_wsi_display_get_display_mode_properties2 },
++      { "pvr_mesa_wsi_display_create_display_mode",
++            pvr_mesa_wsi_display_create_display_mode },
++      { "pvr_mesa_wsi_get_display_plane_capabilities",
++            pvr_mesa_wsi_get_display_plane_capabilities },
++      { "pvr_mesa_wsi_get_display_plane_capabilities2",
++            pvr_mesa_wsi_get_display_plane_capabilities2 },
++      { "pvr_mesa_wsi_create_display_surface",
++            pvr_mesa_wsi_create_display_surface },
++      { "pvr_mesa_wsi_release_display",
++            pvr_mesa_wsi_release_display },
++#if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
++      { "pvr_mesa_wsi_acquire_xlib_display",
++            pvr_mesa_wsi_acquire_xlib_display },
++      { "pvr_mesa_wsi_get_randr_output_display",
++            pvr_mesa_wsi_get_randr_output_display },
++#endif
++      { "pvr_mesa_wsi_display_power_control",
++            pvr_mesa_wsi_display_power_control },
++      { "pvr_mesa_wsi_register_device_event",
++            pvr_mesa_wsi_register_device_event },
++      { "pvr_mesa_wsi_register_display_event",
++            pvr_mesa_wsi_register_display_event },
++      { "pvr_mesa_wsi_get_swapchain_counter",
++            pvr_mesa_wsi_get_swapchain_counter },
++   };
++   unsigned i;
++
++   for (i = 0; i < ARRAY_SIZE(lookup); i++) {
++      if (!strcmp(name, lookup[i].name))
++         return lookup[i].addr;
++   }
++
++   return NULL;
++}
+diff --git a/src/pvr/wsi/pvr_wsi.h b/src/pvr/wsi/pvr_wsi.h
+new file mode 100644
+index 00000000000..142358db3de
+--- /dev/null
++++ b/src/pvr/wsi/pvr_wsi.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright © Imagination Technologies Ltd.
++ *
++ * The contents of this file are subject to the MIT license as set out below.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#if !defined PVR_WSI_H
++#define PVR_WSI_H
++
++#include "util/macros.h"
++#include "util/u_memory.h"
++#include "util/u_atomic.h"
++
++#include "wsi_common.h"
++
++#define  Container(p, s, m) ((s *) ((uintptr_t)(p) - Offset(s, m)))
++
++#define _MAKE_STRING(x) # x
++#define MAKE_STRING(x) _MAKE_STRING(x)
++
++#define LOOKUP_DDK(mwsi, sym) \
++   mwsi->symtab.pvr_vk_mesa_wsi_sym_addr(MAKE_STRING(sym))
++
++#define JUMP_DDK(mwsi, sym, ...)                          \
++   do {                                                   \
++      void *_entry = p_atomic_read(&mwsi->symtab.sym);    \
++                                                          \
++      if (!_entry) {                                      \
++         _entry = LOOKUP_DDK(mwsi, sym);                  \
++                                                          \
++         if (_entry)                                      \
++            p_atomic_set(&mwsi->symtab.sym, _entry);      \
++      }                                                   \
++                                                          \
++      if (_entry) {                                       \
++         __typeof__(mwsi->symtab.sym) _func = _entry;     \
++                                                          \
++         return _func(__VA_ARGS__);                       \
++      }                                                   \
++   } while(0)
++
++struct pvr_vk_mesa_wsi_sym_tab
++{
++   PFN_vkVoidFunction (VKAPI_PTR *pvr_vk_mesa_wsi_sym_addr)
++      (VkPhysicalDevice physicalDevice, const char *);
++};
++
++struct pvr_mesa_wsi
++{
++   struct wsi_device wsi;
++   struct pvr_vk_mesa_wsi_sym_tab symtab;
++   VkPhysicalDevice physicalDevice;
++};
++
++static inline struct pvr_mesa_wsi *pvr_mesa_wsi(struct wsi_device *wsi_ptr)
++{
++   return Container(wsi_ptr, struct pvr_mesa_wsi, wsi);
++}
++
++#endif
+diff --git a/src/pvr/wsi/pvr_wsi_display.c b/src/pvr/wsi/pvr_wsi_display.c
+new file mode 100644
+index 00000000000..8ee13896ee9
+--- /dev/null
++++ b/src/pvr/wsi/pvr_wsi_display.c
+@@ -0,0 +1,293 @@
++/*
++ * Copyright © Imagination Technologies Ltd.
++ *
++ * The contents of this file are subject to the MIT license as set out below.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#include "wsi_common_display.h"
++
++#if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
++#include "wsi_common_x11.h"
++#endif
++
++#include "pvr_wsi.h"
++#include "pvr_mesa_wsi_interface.h"
++
++VkResult
++pvr_mesa_wsi_display_get_physical_device_display_properties(struct pvr_mesa_wsi *mwsi,
++							    VkPhysicalDevice physicalDevice,
++							    uint32_t *pPropertyCount,
++							    VkDisplayPropertiesKHR *pProperties)
++{
++   return wsi_display_get_physical_device_display_properties(physicalDevice,
++                                                             &mwsi->wsi,
++                                                             pPropertyCount,
++                                                             pProperties);
++}
++
++VkResult
++pvr_mesa_wsi_display_get_physical_device_display_properties2(struct pvr_mesa_wsi *mwsi,
++							     VkPhysicalDevice physicalDevice,
++							     uint32_t *pPropertyCount,
++							     VkDisplayProperties2KHR *pProperties)
++{
++   return wsi_display_get_physical_device_display_properties2(physicalDevice,
++                                                              &mwsi->wsi,
++                                                              pPropertyCount,
++                                                              pProperties);
++}
++
++VkResult
++pvr_mesa_wsi_display_get_physical_device_display_plane_properties(struct pvr_mesa_wsi *mwsi,
++								  VkPhysicalDevice physicalDevice,
++								  uint32_t *pPropertyCount,
++								  VkDisplayPlanePropertiesKHR *pProperties)
++{
++   return wsi_display_get_physical_device_display_plane_properties(physicalDevice,
++                                                                   &mwsi->wsi,
++                                                                   pPropertyCount,
++                                                                   pProperties);
++}
++
++VkResult
++pvr_mesa_wsi_display_get_physical_device_display_plane_properties2(struct pvr_mesa_wsi *mwsi,
++								   VkPhysicalDevice physicalDevice,
++								   uint32_t *pPropertyCount,
++								   VkDisplayPlaneProperties2KHR *pProperties)
++{
++   return wsi_display_get_physical_device_display_plane_properties2(physicalDevice,
++                                                                    &mwsi->wsi,
++                                                                    pPropertyCount,
++                                                                    pProperties);
++}
++
++VkResult
++pvr_mesa_wsi_display_get_display_plane_supported_displays(struct pvr_mesa_wsi *mwsi,
++							  VkPhysicalDevice physicalDevice,
++							  uint32_t planeIndex,
++							  uint32_t *pDisplayCount,
++							  VkDisplayKHR *pDisplays)
++{
++   return wsi_display_get_display_plane_supported_displays(physicalDevice,
++                                                           &mwsi->wsi,
++                                                           planeIndex,
++                                                           pDisplayCount,
++                                                           pDisplays);
++
++}
++
++VkResult
++pvr_mesa_wsi_display_get_display_mode_properties(struct pvr_mesa_wsi *mwsi,
++						 VkPhysicalDevice physicalDevice,
++						 VkDisplayKHR display,
++						 uint32_t *pPropertyCount,
++						 VkDisplayModePropertiesKHR *pProperties)
++{
++   return wsi_display_get_display_mode_properties(physicalDevice,
++                                                  &mwsi->wsi,
++                                                  display,
++                                                  pPropertyCount,
++                                                  pProperties);
++}
++
++VkResult
++pvr_mesa_wsi_display_get_display_mode_properties2(struct pvr_mesa_wsi *mwsi,
++                                                  VkPhysicalDevice physicalDevice,
++                                                  VkDisplayKHR display,
++                                                  uint32_t *pPropertyCount,
++                                                  VkDisplayModeProperties2KHR *pProperties)
++{
++   return wsi_display_get_display_mode_properties2(physicalDevice,
++                                                   &mwsi->wsi,
++                                                   display,
++                                                   pPropertyCount,
++                                                   pProperties);
++}
++
++VkResult
++pvr_mesa_wsi_display_create_display_mode(struct pvr_mesa_wsi *mwsi,
++                                         VkPhysicalDevice physicalDevice,
++                                         VkDisplayKHR display,
++                                         const VkDisplayModeCreateInfoKHR *pCreateInfo,
++                                         const VkAllocationCallbacks *pAllocator,
++                                         VkDisplayModeKHR *pMode)
++{
++   return wsi_display_create_display_mode(physicalDevice,
++                                          &mwsi->wsi,
++                                          display,
++                                          pCreateInfo,
++                                          pAllocator,
++                                          pMode);
++}
++
++VkResult
++pvr_mesa_wsi_get_display_plane_capabilities(struct pvr_mesa_wsi *mwsi,
++                                            VkPhysicalDevice physicalDevice,
++                                            VkDisplayModeKHR modeKhr,
++                                            uint32_t planeIndex,
++                                            VkDisplayPlaneCapabilitiesKHR *pCapabilities)
++{
++   return wsi_get_display_plane_capabilities(physicalDevice,
++                                             &mwsi->wsi,
++                                             modeKhr,
++                                             planeIndex,
++                                             pCapabilities);
++}
++
++VkResult
++pvr_mesa_wsi_get_display_plane_capabilities2(struct pvr_mesa_wsi *mwsi,
++                                             VkPhysicalDevice physicalDevice,
++                                             const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo,
++                                             VkDisplayPlaneCapabilities2KHR *pCapabilities)
++{
++   return wsi_get_display_plane_capabilities2(physicalDevice,
++                                              &mwsi->wsi,
++                                              pDisplayPlaneInfo,
++                                              pCapabilities);
++}
++
++VkResult
++pvr_mesa_wsi_create_display_surface(UNUSED struct pvr_mesa_wsi *mwsi,
++                                    VkInstance instance,
++                                    const VkAllocationCallbacks *pAllocator,
++                                    const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
++                                    VkSurfaceKHR *pSurface)
++{
++   return wsi_create_display_surface(instance,
++                                      pAllocator,
++                                      pCreateInfo,
++                                      pSurface);
++}
++
++VkResult
++pvr_mesa_wsi_release_display(struct pvr_mesa_wsi *mwsi,
++                             VkPhysicalDevice physicalDevice,
++                             VkDisplayKHR display)
++{
++   return wsi_release_display(physicalDevice,
++                              &mwsi->wsi,
++                              display);
++}
++
++#if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
++VkResult
++pvr_mesa_wsi_acquire_xlib_display(struct pvr_mesa_wsi *mwsi,
++                                  VkPhysicalDevice physicalDevice,
++                                  void *dpy,
++                                  VkDisplayKHR display)
++{
++   return wsi_acquire_xlib_display(physicalDevice,
++                                   &mwsi->wsi,
++                                   dpy,
++                                   display);
++}
++
++VkResult
++pvr_mesa_wsi_get_randr_output_display(struct pvr_mesa_wsi *mwsi,
++                                      VkPhysicalDevice  physicalDevice,
++                                      void *dpy,
++                                      uint32_t output,
++                                      VkDisplayKHR *pDisplay)
++{
++   return wsi_get_randr_output_display(physicalDevice,
++                                       &mwsi->wsi,
++                                       dpy,
++                                       output,
++                                       pDisplay);
++}
++#endif
++
++VkResult
++pvr_mesa_wsi_display_power_control(struct pvr_mesa_wsi *mwsi,
++                                   VkDevice device,
++                                   VkDisplayKHR display,
++                                   const VkDisplayPowerInfoEXT *pDisplayPowerInfo)
++{
++   return wsi_display_power_control(device,
++                                    &mwsi->wsi,
++                                    display,
++                                    pDisplayPowerInfo);
++}
++
++VkResult
++pvr_mesa_wsi_register_device_event(struct pvr_mesa_wsi *mwsi,
++                                   VkDevice device,
++                                   const VkDeviceEventInfoEXT *pDeviceEventInfo,
++                                   const VkAllocationCallbacks *pAllocator,
++                                   void **pFence,
++                                   int syncFd)
++{
++   struct vk_sync *fence;
++   VkResult ret;
++
++   ret = wsi_register_device_event(device,
++                                   &mwsi->wsi,
++                                   pDeviceEventInfo,
++                                   pAllocator,
++                                   pFence ? &fence : NULL,
++                                   syncFd);
++
++   if (ret == VK_SUCCESS && pFence != NULL)
++	   *pFence = fence;
++
++   return ret;
++}
++
++VkResult
++pvr_mesa_wsi_register_display_event(struct pvr_mesa_wsi *mwsi,
++                                    VkDevice device,
++                                    VkDisplayKHR display,
++                                    const VkDisplayEventInfoEXT *pDisplayEventInfo,
++                                    const VkAllocationCallbacks  *pAllocator,
++                                    void **pFence,
++                                    int syncFd)
++{
++   struct vk_sync *fence;
++   VkResult ret;
++
++   ret = wsi_register_display_event(device,
++                                    &mwsi->wsi,
++                                    display,
++                                    pDisplayEventInfo,
++                                    pAllocator,
++                                    pFence ? &fence : NULL,
++                                    syncFd);
++
++   if (ret == VK_SUCCESS && pFence != NULL)
++	   *pFence = fence;
++
++   return ret;
++}
++
++VkResult
++pvr_mesa_wsi_get_swapchain_counter(struct pvr_mesa_wsi *mwsi,
++                                   VkDevice device,
++                                   VkSwapchainKHR swapchain,
++                                   VkSurfaceCounterFlagBitsEXT flagBits,
++                                   uint64_t *pValue)
++{
++   return wsi_get_swapchain_counter(device,
++                                    &mwsi->wsi,
++                                    swapchain,
++                                    flagBits,
++                                    pValue);
++}
++
+diff --git a/src/pvr/wsi/pvr_wsi_wayland.c b/src/pvr/wsi/pvr_wsi_wayland.c
+new file mode 100644
+index 00000000000..5b052667ac9
+--- /dev/null
++++ b/src/pvr/wsi/pvr_wsi_wayland.c
+@@ -0,0 +1,45 @@
++/*
++ * Copyright © Imagination Technologies Ltd.
++ *
++ * The contents of this file are subject to the MIT license as set out below.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#include "wsi_common_wayland.h"
++
++#include "pvr_wsi.h"
++#include "pvr_mesa_wsi_interface.h"
++
++VkBool32
++pvr_mesa_wsi_get_physical_device_wayland_presentation_support(struct pvr_mesa_wsi *mwsi,
++                                                              uint32_t queueFamilyIndex,
++                                                              void *display)
++{
++   return wsi_wl_get_presentation_support(&mwsi->wsi, display);
++}
++
++VkResult
++pvr_mesa_wsi_create_wayland_surface(UNUSED struct pvr_mesa_wsi *mwsi,
++                                    const VkAllocationCallbacks *pAllocator,
++                                    const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
++                                    VkSurfaceKHR *pSurface)
++{
++   return wsi_create_wl_surface(pAllocator, pCreateInfo, pSurface);
++}
+diff --git a/src/pvr/wsi/pvr_wsi_x11.c b/src/pvr/wsi/pvr_wsi_x11.c
+new file mode 100644
+index 00000000000..0a69e92ac9e
+--- /dev/null
++++ b/src/pvr/wsi/pvr_wsi_x11.c
+@@ -0,0 +1,62 @@
++/*
++ * Copyright © Imagination Technologies Ltd.
++ *
++ * The contents of this file are subject to the MIT license as set out below.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#include "wsi_common_x11.h"
++
++#include "pvr_wsi.h"
++#include "pvr_mesa_wsi_interface.h"
++
++VkBool32
++pvr_mesa_wsi_get_physical_device_xcb_presentation_support(struct pvr_mesa_wsi *mwsi,
++                                                          uint32_t queueFamilyIndex,
++                                                          void *connection,
++                                                          uint32_t visual_id)
++{
++   return wsi_get_physical_device_xcb_presentation_support(&mwsi->wsi,
++                                                           queueFamilyIndex,
++                                                           connection,
++                                                           visual_id);
++}
++
++VkResult
++pvr_mesa_wsi_create_xcb_surface(UNUSED struct pvr_mesa_wsi *mwsi,
++                                const VkAllocationCallbacks *pAllocator,
++                                const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
++                                VkSurfaceKHR *pSurface)
++{
++   return wsi_create_xcb_surface(pAllocator,
++				 pCreateInfo,
++				 pSurface);
++}
++
++VkResult
++pvr_mesa_wsi_create_xlib_surface(UNUSED struct pvr_mesa_wsi *mwsi,
++                                 const VkAllocationCallbacks *pAllocator,
++                                 const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
++                                 VkSurfaceKHR *pSurface)
++{
++   return wsi_create_xlib_surface(pAllocator,
++				  pCreateInfo,
++				  pSurface);
++}
+diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
+index 385e83803dd..6032401b37c 100644
+--- a/src/vulkan/wsi/wsi_common.c
++++ b/src/vulkan/wsi/wsi_common.c
+@@ -227,12 +227,17 @@ wsi_swapchain_init(const struct wsi_device *wsi,
+                    const VkAllocationCallbacks *pAllocator,
+                    bool use_buffer_blit)
+ {
+-   VK_FROM_HANDLE(vk_device, device, _device);
+    VkResult result;
+ 
+    memset(chain, 0, sizeof(*chain));
+ 
+-   vk_object_base_init(device, &chain->base, VK_OBJECT_TYPE_SWAPCHAIN_KHR);
++   if (wsi->opaque_vk_handles) {
++      vk_object_base_init(NULL, &chain->base, VK_OBJECT_TYPE_SWAPCHAIN_KHR);
++   } else {
++      VK_FROM_HANDLE(vk_device, device, _device);
++
++      vk_object_base_init(device, &chain->base, VK_OBJECT_TYPE_SWAPCHAIN_KHR);
++   }
+ 
+    chain->wsi = wsi;
+    chain->device = _device;
+@@ -538,6 +543,19 @@ wsi_destroy_image(const struct wsi_swapchain *chain,
+    wsi->DestroyBuffer(chain->device, image->buffer.buffer, &chain->alloc);
+ }
+ 
++VkResult
++wsi_common_get_surface_support(struct wsi_device *wsi_device,
++                               uint32_t queueFamilyIndex,
++                               VkSurfaceKHR _surface,
++                               VkBool32 *pSupported)
++{
++   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
++   struct wsi_interface *iface = wsi_device->wsi[surface->platform];
++
++   return iface->get_support(surface, wsi_device,
++                             queueFamilyIndex, pSupported);
++}
++
+ VKAPI_ATTR VkResult VKAPI_CALL
+ wsi_GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
+                                        uint32_t queueFamilyIndex,
+@@ -545,23 +563,20 @@ wsi_GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
+                                        VkBool32 *pSupported)
+ {
+    VK_FROM_HANDLE(vk_physical_device, device, physicalDevice);
+-   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
+    struct wsi_device *wsi_device = device->wsi_device;
+-   struct wsi_interface *iface = wsi_device->wsi[surface->platform];
+ 
+-   return iface->get_support(surface, wsi_device,
+-                             queueFamilyIndex, pSupported);
++   return wsi_common_get_surface_support(wsi_device,
++					 queueFamilyIndex,
++					 _surface,
++					 pSupported);
+ }
+ 
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetPhysicalDeviceSurfaceCapabilitiesKHR(
+-   VkPhysicalDevice physicalDevice,
+-   VkSurfaceKHR _surface,
+-   VkSurfaceCapabilitiesKHR *pSurfaceCapabilities)
++VkResult
++wsi_common_get_surface_capabilities(struct wsi_device *wsi_device,
++                                    VkSurfaceKHR _surface,
++                                    VkSurfaceCapabilitiesKHR *pSurfaceCapabilities)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, device, physicalDevice);
+    ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
+-   struct wsi_device *wsi_device = device->wsi_device;
+    struct wsi_interface *iface = wsi_device->wsi[surface->platform];
+ 
+    VkSurfaceCapabilities2KHR caps2 = {
+@@ -577,14 +592,26 @@ wsi_GetPhysicalDeviceSurfaceCapabilitiesKHR(
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetPhysicalDeviceSurfaceCapabilities2KHR(
++wsi_GetPhysicalDeviceSurfaceCapabilitiesKHR(
+    VkPhysicalDevice physicalDevice,
++   VkSurfaceKHR _surface,
++   VkSurfaceCapabilitiesKHR *pSurfaceCapabilities)
++{
++   VK_FROM_HANDLE(vk_physical_device, device, physicalDevice);
++   struct wsi_device *wsi_device = device->wsi_device;
++
++   return wsi_common_get_surface_capabilities(wsi_device,
++                                              _surface,
++                                              pSurfaceCapabilities);
++}
++
++VkResult
++wsi_common_get_surface_capabilities2(
++   struct wsi_device *wsi_device,
+    const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
+    VkSurfaceCapabilities2KHR *pSurfaceCapabilities)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, device, physicalDevice);
+    ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pSurfaceInfo->surface);
+-   struct wsi_device *wsi_device = device->wsi_device;
+    struct wsi_interface *iface = wsi_device->wsi[surface->platform];
+ 
+    return iface->get_capabilities2(surface, wsi_device, pSurfaceInfo->pNext,
+@@ -592,14 +619,26 @@ wsi_GetPhysicalDeviceSurfaceCapabilities2KHR(
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetPhysicalDeviceSurfaceCapabilities2EXT(
++wsi_GetPhysicalDeviceSurfaceCapabilities2KHR(
+    VkPhysicalDevice physicalDevice,
++   const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
++   VkSurfaceCapabilities2KHR *pSurfaceCapabilities)
++{
++   VK_FROM_HANDLE(vk_physical_device, device, physicalDevice);
++   struct wsi_device *wsi_device = device->wsi_device;
++
++   return wsi_common_get_surface_capabilities2(wsi_device,
++                                               pSurfaceInfo,
++                                               pSurfaceCapabilities);
++}
++
++VkResult
++wsi_common_get_surface_capabilities2ext(
++   struct wsi_device *wsi_device,
+    VkSurfaceKHR _surface,
+    VkSurfaceCapabilities2EXT *pSurfaceCapabilities)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, device, physicalDevice);
+    ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
+-   struct wsi_device *wsi_device = device->wsi_device;
+    struct wsi_interface *iface = wsi_device->wsi[surface->platform];
+ 
+    assert(pSurfaceCapabilities->sType ==
+@@ -638,6 +677,33 @@ wsi_GetPhysicalDeviceSurfaceCapabilities2EXT(
+    return result;
+ }
+ 
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_GetPhysicalDeviceSurfaceCapabilities2EXT(
++   VkPhysicalDevice physicalDevice,
++   VkSurfaceKHR _surface,
++   VkSurfaceCapabilities2EXT *pSurfaceCapabilities)
++{
++   VK_FROM_HANDLE(vk_physical_device, device, physicalDevice);
++   struct wsi_device *wsi_device = device->wsi_device;
++
++   return wsi_common_get_surface_capabilities2ext(wsi_device,
++                                                  _surface,
++                                                  pSurfaceCapabilities);
++}
++
++VkResult
++wsi_common_get_surface_formats(struct wsi_device *wsi_device,
++                               VkSurfaceKHR _surface,
++                               uint32_t *pSurfaceFormatCount,
++                               VkSurfaceFormatKHR *pSurfaceFormats)
++{
++   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
++   struct wsi_interface *iface = wsi_device->wsi[surface->platform];
++
++   return iface->get_formats(surface, wsi_device,
++                             pSurfaceFormatCount, pSurfaceFormats);
++}
++
+ VKAPI_ATTR VkResult VKAPI_CALL
+ wsi_GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice,
+                                        VkSurfaceKHR _surface,
+@@ -645,12 +711,25 @@ wsi_GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice,
+                                        VkSurfaceFormatKHR *pSurfaceFormats)
+ {
+    VK_FROM_HANDLE(vk_physical_device, device, physicalDevice);
+-   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
+    struct wsi_device *wsi_device = device->wsi_device;
++
++   return wsi_common_get_surface_formats(wsi_device,
++                                         _surface,
++                                         pSurfaceFormatCount,
++                                         pSurfaceFormats);
++}
++
++VkResult
++wsi_common_get_surface_formats2(struct wsi_device *wsi_device,
++                                const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
++                                uint32_t *pSurfaceFormatCount,
++                                VkSurfaceFormat2KHR *pSurfaceFormats)
++{
++   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pSurfaceInfo->surface);
+    struct wsi_interface *iface = wsi_device->wsi[surface->platform];
+ 
+-   return iface->get_formats(surface, wsi_device,
+-                             pSurfaceFormatCount, pSurfaceFormats);
++   return iface->get_formats2(surface, wsi_device, pSurfaceInfo->pNext,
++                              pSurfaceFormatCount, pSurfaceFormats);
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+@@ -660,12 +739,25 @@ wsi_GetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
+                                         VkSurfaceFormat2KHR *pSurfaceFormats)
+ {
+    VK_FROM_HANDLE(vk_physical_device, device, physicalDevice);
+-   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pSurfaceInfo->surface);
+    struct wsi_device *wsi_device = device->wsi_device;
++
++   return wsi_common_get_surface_formats2(wsi_device,
++                                          pSurfaceInfo,
++                                          pSurfaceFormatCount,
++                                          pSurfaceFormats);
++}
++
++VkResult
++wsi_common_get_surface_present_modes(struct wsi_device *wsi_device,
++                                     VkSurfaceKHR _surface,
++                                     uint32_t *pPresentModeCount,
++                                     VkPresentModeKHR *pPresentModes)
++{
++   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
+    struct wsi_interface *iface = wsi_device->wsi[surface->platform];
+ 
+-   return iface->get_formats2(surface, wsi_device, pSurfaceInfo->pNext,
+-                              pSurfaceFormatCount, pSurfaceFormats);
++   return iface->get_present_modes(surface, pPresentModeCount,
++                                   pPresentModes);
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+@@ -675,12 +767,25 @@ wsi_GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
+                                             VkPresentModeKHR *pPresentModes)
+ {
+    VK_FROM_HANDLE(vk_physical_device, device, physicalDevice);
+-   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
+    struct wsi_device *wsi_device = device->wsi_device;
++
++   return wsi_common_get_surface_present_modes(wsi_device,
++                                               _surface,
++                                               pPresentModeCount,
++                                               pPresentModes);
++}
++
++VkResult
++wsi_common_get_present_rectangles(struct wsi_device *wsi_device,
++                                  VkSurfaceKHR _surface,
++                                  uint32_t* pRectCount,
++                                  VkRect2D* pRects)
++{
++   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
+    struct wsi_interface *iface = wsi_device->wsi[surface->platform];
+ 
+-   return iface->get_present_modes(surface, pPresentModeCount,
+-                                   pPresentModes);
++   return iface->get_present_rectangles(surface, wsi_device,
++                                        pRectCount, pRects);
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+@@ -690,54 +795,47 @@ wsi_GetPhysicalDevicePresentRectanglesKHR(VkPhysicalDevice physicalDevice,
+                                           VkRect2D *pRects)
+ {
+    VK_FROM_HANDLE(vk_physical_device, device, physicalDevice);
+-   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
+    struct wsi_device *wsi_device = device->wsi_device;
+-   struct wsi_interface *iface = wsi_device->wsi[surface->platform];
+ 
+-   return iface->get_present_rectangles(surface, wsi_device,
+-                                        pRectCount, pRects);
++   return wsi_common_get_present_rectangles(wsi_device,
++                                            _surface,
++                                            pRectCount,
++                                            pRects);
+ }
+ 
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_CreateSwapchainKHR(VkDevice _device,
+-                       const VkSwapchainCreateInfoKHR *pCreateInfo,
+-                       const VkAllocationCallbacks *pAllocator,
+-                       VkSwapchainKHR *pSwapchain)
++VkResult
++wsi_common_create_swapchain(struct wsi_device *wsi_device,
++                            VkDevice _device,
++                            const VkSwapchainCreateInfoKHR *pCreateInfo,
++                            const VkAllocationCallbacks *allocator,
++                            VkSwapchainKHR *pSwapchain)
+ {
+-   VK_FROM_HANDLE(vk_device, device, _device);
+    ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pCreateInfo->surface);
+-   struct wsi_device *wsi_device = device->physical->wsi_device;
+    struct wsi_interface *iface = wsi_device->wsi[surface->platform];
+-   const VkAllocationCallbacks *alloc;
+    struct wsi_swapchain *swapchain;
+ 
+-   if (pAllocator)
+-     alloc = pAllocator;
+-   else
+-     alloc = &device->alloc;
+-
+    VkResult result = iface->create_swapchain(surface, _device, wsi_device,
+-                                             pCreateInfo, alloc,
++                                             pCreateInfo, allocator,
+                                              &swapchain);
+    if (result != VK_SUCCESS)
+       return result;
+ 
+-   swapchain->fences = vk_zalloc(alloc,
++   swapchain->fences = vk_zalloc(allocator,
+                                  sizeof (*swapchain->fences) * swapchain->image_count,
+                                  sizeof (*swapchain->fences),
+                                  VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+    if (!swapchain->fences) {
+-      swapchain->destroy(swapchain, alloc);
++      swapchain->destroy(swapchain, allocator);
+       return VK_ERROR_OUT_OF_HOST_MEMORY;
+    }
+ 
+    if (swapchain->buffer_blit_queue != VK_NULL_HANDLE) {
+-      swapchain->buffer_blit_semaphores = vk_zalloc(alloc,
++      swapchain->buffer_blit_semaphores = vk_zalloc(allocator,
+                                          sizeof (*swapchain->buffer_blit_semaphores) * swapchain->image_count,
+                                          sizeof (*swapchain->buffer_blit_semaphores),
+                                          VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+       if (!swapchain->buffer_blit_semaphores) {
+-         swapchain->destroy(swapchain, alloc);
++         swapchain->destroy(swapchain, allocator);
+          return VK_ERROR_OUT_OF_HOST_MEMORY;
+       }
+    }
+@@ -747,24 +845,55 @@ wsi_CreateSwapchainKHR(VkDevice _device,
+    return VK_SUCCESS;
+ }
+ 
+-VKAPI_ATTR void VKAPI_CALL
+-wsi_DestroySwapchainKHR(VkDevice _device,
+-                        VkSwapchainKHR _swapchain,
+-                        const VkAllocationCallbacks *pAllocator)
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_CreateSwapchainKHR(VkDevice _device,
++                       const VkSwapchainCreateInfoKHR *pCreateInfo,
++                       const VkAllocationCallbacks *pAllocator,
++                       VkSwapchainKHR *pSwapchain)
+ {
+    VK_FROM_HANDLE(vk_device, device, _device);
++   struct wsi_device *wsi_device = device->physical->wsi_device;
++   const VkAllocationCallbacks *allocator;
++
++   if (pAllocator)
++     allocator = pAllocator;
++   else
++     allocator = &device->alloc;
++
++   return wsi_common_create_swapchain(wsi_device,
++                                      _device,
++                                      pCreateInfo,
++                                      allocator,
++                                      pSwapchain);
++}
++
++void
++wsi_common_destroy_swapchain(VkDevice _device,
++                             VkSwapchainKHR _swapchain,
++                             const VkAllocationCallbacks *allocator)
++{
+    VK_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain);
+-   const VkAllocationCallbacks *alloc;
+ 
+    if (!swapchain)
+       return;
+ 
++   swapchain->destroy(swapchain, allocator);
++}
++
++VKAPI_ATTR void VKAPI_CALL
++wsi_DestroySwapchainKHR(VkDevice _device,
++                        VkSwapchainKHR _swapchain,
++                        const VkAllocationCallbacks *pAllocator)
++{
++   VK_FROM_HANDLE(vk_device, device, _device);
++   const VkAllocationCallbacks *allocator;
++
+    if (pAllocator)
+-     alloc = pAllocator;
++     allocator = pAllocator;
+    else
+-     alloc = &device->alloc;
++     allocator = &device->alloc;
+ 
+-   swapchain->destroy(swapchain, alloc);
++   wsi_common_destroy_swapchain(_device, _swapchain, allocator);
+ }
+ 
+ VkResult
+@@ -833,7 +962,6 @@ wsi_common_acquire_next_image2(const struct wsi_device *wsi,
+                                uint32_t *pImageIndex)
+ {
+    VK_FROM_HANDLE(wsi_swapchain, swapchain, pAcquireInfo->swapchain);
+-   VK_FROM_HANDLE(vk_device, device, _device);
+ 
+    VkResult result = swapchain->acquire_next_image(swapchain, pAcquireInfo,
+                                                    pImageIndex);
+@@ -847,6 +975,7 @@ wsi_common_acquire_next_image2(const struct wsi_device *wsi,
+ 
+    if (pAcquireInfo->semaphore != VK_NULL_HANDLE &&
+        wsi->signal_semaphore_with_memory) {
++      VK_FROM_HANDLE(vk_device, device, _device);
+       VK_FROM_HANDLE(vk_semaphore, semaphore, pAcquireInfo->semaphore);
+       struct wsi_image *image =
+          swapchain->get_wsi_image(swapchain, *pImageIndex);
+@@ -862,6 +991,7 @@ wsi_common_acquire_next_image2(const struct wsi_device *wsi,
+ 
+    if (pAcquireInfo->fence != VK_NULL_HANDLE &&
+        wsi->signal_fence_with_memory) {
++      VK_FROM_HANDLE(vk_device, device, _device);
+       VK_FROM_HANDLE(vk_fence, fence, pAcquireInfo->fence);
+       struct wsi_image *image =
+          swapchain->get_wsi_image(swapchain, *pImageIndex);
+diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
+index 13502fc6507..3ef630080f2 100644
+--- a/src/vulkan/wsi/wsi_common.h
++++ b/src/vulkan/wsi/wsi_common.h
+@@ -125,6 +125,10 @@ struct wsi_device {
+     * available. Not all window systems might support this. */
+    bool enable_adaptive_sync;
+ 
++   /* Handles, such as VKDevice, cannot be converted to Mesa data
++    * structures using VK_FROM_HANDLE. */
++   bool opaque_vk_handles;
++
+    /* List of fences to signal when hotplug event happens. */
+    struct list_head hotplug_fences;
+ 
+@@ -272,6 +276,51 @@ wsi_device_setup_syncobj_fd(struct wsi_device *wsi_device,
+ 
+ ICD_DEFINE_NONDISP_HANDLE_CASTS(VkIcdSurfaceBase, VkSurfaceKHR)
+ 
++VkResult
++wsi_common_get_surface_support(struct wsi_device *wsi_device,
++                               uint32_t queueFamilyIndex,
++                               VkSurfaceKHR surface,
++                               VkBool32 *pSupported);
++
++VkResult
++wsi_common_get_surface_capabilities(struct wsi_device *wsi_device,
++                                    VkSurfaceKHR surface,
++                                    VkSurfaceCapabilitiesKHR *pSurfaceCapabilities);
++
++VkResult
++wsi_common_get_surface_capabilities2(struct wsi_device *wsi_device,
++                                     const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
++                                     VkSurfaceCapabilities2KHR *pSurfaceCapabilities);
++
++VkResult
++wsi_common_get_surface_formats(struct wsi_device *wsi_device,
++                               VkSurfaceKHR surface,
++                               uint32_t *pSurfaceFormatCount,
++                               VkSurfaceFormatKHR *pSurfaceFormats);
++
++VkResult
++wsi_common_get_surface_formats2(struct wsi_device *wsi_device,
++                                const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
++                                uint32_t *pSurfaceFormatCount,
++                                VkSurfaceFormat2KHR *pSurfaceFormats);
++
++VkResult
++wsi_common_get_surface_present_modes(struct wsi_device *wsi_device,
++                                     VkSurfaceKHR surface,
++                                     uint32_t *pPresentModeCount,
++                                     VkPresentModeKHR *pPresentModes);
++
++VkResult
++wsi_common_get_present_rectangles(struct wsi_device *wsi_device,
++                                  VkSurfaceKHR surface,
++                                  uint32_t* pRectCount,
++                                  VkRect2D* pRects);
++
++VkResult
++wsi_common_get_surface_capabilities2ext(struct wsi_device *wsi_device,
++                                        VkSurfaceKHR surface,
++                                        VkSurfaceCapabilities2EXT *pSurfaceCapabilities);
++
+ VkResult
+ wsi_common_get_images(VkSwapchainKHR _swapchain,
+                       uint32_t *pSwapchainImageCount,
+@@ -286,6 +335,17 @@ wsi_common_acquire_next_image2(const struct wsi_device *wsi,
+                                const VkAcquireNextImageInfoKHR *pAcquireInfo,
+                                uint32_t *pImageIndex);
+ 
++VkResult
++wsi_common_create_swapchain(struct wsi_device *wsi,
++                            VkDevice device,
++                            const VkSwapchainCreateInfoKHR *pCreateInfo,
++                            const VkAllocationCallbacks *pAllocator,
++                            VkSwapchainKHR *pSwapchain);
++void
++wsi_common_destroy_swapchain(VkDevice device,
++                             VkSwapchainKHR swapchain,
++                             const VkAllocationCallbacks *pAllocator);
++
+ VkResult
+ wsi_common_queue_present(const struct wsi_device *wsi,
+                          VkDevice device_h,
+diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c
+index d237dfc092a..5b020f9fdc0 100644
+--- a/src/vulkan/wsi/wsi_common_display.c
++++ b/src/vulkan/wsi/wsi_common_display.c
+@@ -434,20 +434,19 @@ wsi_display_fill_in_display_properties(struct wsi_device *wsi_device,
+    properties->persistentContent = VK_FALSE;
+ }
+ 
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice,
+-                                          uint32_t *pPropertyCount,
+-                                          VkDisplayPropertiesKHR *pProperties)
++VkResult
++wsi_display_get_physical_device_display_properties(
++   VkPhysicalDevice physicalDevice,
++   struct wsi_device *wsi_device,
++   uint32_t *pPropertyCount,
++   VkDisplayPropertiesKHR *pProperties)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+-   struct wsi_device *wsi_device = pdevice->wsi_device;
+    struct wsi_display *wsi =
+       (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+ 
+    if (pProperties == NULL) {
+-      return wsi_GetPhysicalDeviceDisplayProperties2KHR(physicalDevice,
+-                                                        pPropertyCount,
+-                                                        NULL);
++      return wsi_display_get_physical_device_display_properties2(
++            physicalDevice, wsi_device, pPropertyCount, NULL);
+    } else {
+       /* If we're actually returning properties, allocate a temporary array of
+        * VkDisplayProperties2KHR structs, call properties2 to fill them out,
+@@ -465,9 +464,8 @@ wsi_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice,
+       for (uint32_t i = 0; i < *pPropertyCount; i++)
+          props2[i].sType = VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR;
+ 
+-      VkResult result =
+-         wsi_GetPhysicalDeviceDisplayProperties2KHR(physicalDevice,
+-                                                    pPropertyCount, props2);
++      VkResult result = wsi_display_get_physical_device_display_properties2(
++            physicalDevice, wsi_device, pPropertyCount, props2);
+ 
+       if (result == VK_SUCCESS || result == VK_INCOMPLETE) {
+          for (uint32_t i = 0; i < *pPropertyCount; i++)
+@@ -480,14 +478,23 @@ wsi_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice,
+    }
+ }
+ 
+-static VkResult
+-wsi_get_connectors(VkPhysicalDevice physicalDevice)
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice,
++                                          uint32_t *pPropertyCount,
++                                          VkDisplayPropertiesKHR *pProperties)
+ {
+    VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+    struct wsi_device *wsi_device = pdevice->wsi_device;
+-   struct wsi_display *wsi =
+-      (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+ 
++   return wsi_display_get_physical_device_display_properties(physicalDevice,
++                                                             wsi_device,
++                                                             pPropertyCount,
++                                                             pProperties);
++}
++
++static VkResult
++wsi_get_connectors(struct wsi_device *wsi_device, struct wsi_display *wsi)
++{
+    if (wsi->fd < 0)
+       return VK_SUCCESS;
+ 
+@@ -511,18 +518,18 @@ wsi_get_connectors(VkPhysicalDevice physicalDevice)
+    return VK_SUCCESS;
+ }
+ 
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetPhysicalDeviceDisplayProperties2KHR(VkPhysicalDevice physicalDevice,
+-                                           uint32_t *pPropertyCount,
+-                                           VkDisplayProperties2KHR *pProperties)
++VkResult
++wsi_display_get_physical_device_display_properties2(
++   VkPhysicalDevice physicalDevice,
++   struct wsi_device *wsi_device,
++   uint32_t *pPropertyCount,
++   VkDisplayProperties2KHR *pProperties)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+-   struct wsi_device *wsi_device = pdevice->wsi_device;
+    struct wsi_display *wsi =
+       (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+ 
+    /* Get current information */
+-   VkResult result = wsi_get_connectors(physicalDevice);
++   VkResult result = wsi_get_connectors(wsi_device, wsi);
+    if (result != VK_SUCCESS)
+       goto bail;
+ 
+@@ -546,6 +553,20 @@ bail:
+    return result;
+ }
+ 
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_GetPhysicalDeviceDisplayProperties2KHR(VkPhysicalDevice physicalDevice,
++                                           uint32_t *pPropertyCount,
++                                           VkDisplayProperties2KHR *pProperties)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_display_get_physical_device_display_properties2(physicalDevice,
++                                                              wsi_device,
++                                                              pPropertyCount,
++                                                              pProperties);
++}
++
+ /*
+  * Implement vkGetPhysicalDeviceDisplayPlanePropertiesKHR (VK_KHR_display
+  */
+@@ -567,17 +588,17 @@ wsi_display_fill_in_display_plane_properties(
+    }
+ }
+ 
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
+-                                               uint32_t *pPropertyCount,
+-                                               VkDisplayPlanePropertiesKHR *pProperties)
++VkResult
++wsi_display_get_physical_device_display_plane_properties(
++   VkPhysicalDevice physicalDevice,
++   struct wsi_device *wsi_device,
++   uint32_t *pPropertyCount,
++   VkDisplayPlanePropertiesKHR *pProperties)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+-   struct wsi_device *wsi_device = pdevice->wsi_device;
+    struct wsi_display *wsi =
+       (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+ 
+-   VkResult result = wsi_get_connectors(physicalDevice);
++   VkResult result = wsi_get_connectors(wsi_device, wsi);
+    if (result != VK_SUCCESS)
+       goto bail;
+ 
+@@ -602,17 +623,32 @@ bail:
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
+-                                                uint32_t *pPropertyCount,
+-                                                VkDisplayPlaneProperties2KHR *pProperties)
++wsi_GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
++                                               uint32_t *pPropertyCount,
++                                               VkDisplayPlanePropertiesKHR *pProperties)
+ {
+    VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+    struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_display_get_physical_device_display_plane_properties(
++            physicalDevice,
++            wsi_device,
++            pPropertyCount,
++            pProperties);
++}
++
++VkResult
++wsi_display_get_physical_device_display_plane_properties2(
++   VkPhysicalDevice physicalDevice,
++   struct wsi_device *wsi_device,
++   uint32_t *pPropertyCount,
++   VkDisplayPlaneProperties2KHR *pProperties)
++{
+    struct wsi_display *wsi =
+       (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+ 
+    /* Get current information */
+-   VkResult result = wsi_get_connectors(physicalDevice);
++   VkResult result = wsi_get_connectors(wsi_device, wsi);
+    if (result != VK_SUCCESS)
+       goto bail;
+ 
+@@ -632,18 +668,34 @@ bail:
+    return result;
+ }
+ 
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_GetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
++                                                uint32_t *pPropertyCount,
++                                                VkDisplayPlaneProperties2KHR *pProperties)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_display_get_physical_device_display_plane_properties2(
++            physicalDevice,
++            wsi_device,
++            pPropertyCount,
++            pProperties);
++}
++
++
+ /*
+  * Implement vkGetDisplayPlaneSupportedDisplaysKHR (VK_KHR_display)
+  */
+ 
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice,
+-                                        uint32_t planeIndex,
+-                                        uint32_t *pDisplayCount,
+-                                        VkDisplayKHR *pDisplays)
++VkResult
++wsi_display_get_display_plane_supported_displays(
++   VkPhysicalDevice physicalDevice,
++   struct wsi_device *wsi_device,
++   uint32_t planeIndex,
++   uint32_t *pDisplayCount,
++   VkDisplayKHR *pDisplays)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+-   struct wsi_device *wsi_device = pdevice->wsi_device;
+    struct wsi_display *wsi =
+       (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+ 
+@@ -662,6 +714,22 @@ wsi_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice,
+    return vk_outarray_status(&conn);
+ }
+ 
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice,
++                                        uint32_t planeIndex,
++                                        uint32_t *pDisplayCount,
++                                        VkDisplayKHR *pDisplays)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_display_get_display_plane_supported_displays(physicalDevice,
++                                                           wsi_device,
++                                                           planeIndex,
++                                                           pDisplayCount,
++                                                           pDisplays);
++}
++
+ /*
+  * Implement vkGetDisplayModePropertiesKHR (VK_KHR_display)
+  */
+@@ -682,14 +750,13 @@ wsi_display_fill_in_display_mode_properties(
+       (uint32_t) (wsi_display_mode_refresh(display_mode) * 1000 + 0.5);
+ }
+ 
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice,
+-                                VkDisplayKHR display,
+-                                uint32_t *pPropertyCount,
+-                                VkDisplayModePropertiesKHR *pProperties)
++VkResult
++wsi_display_get_display_mode_properties(VkPhysicalDevice physicalDevice,
++                                        struct wsi_device *wsi_device,
++                                        VkDisplayKHR display,
++                                        uint32_t *pPropertyCount,
++                                        VkDisplayModePropertiesKHR *pProperties)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+-   struct wsi_device *wsi_device = pdevice->wsi_device;
+    struct wsi_display_connector *connector =
+       wsi_display_connector_from_handle(display);
+ 
+@@ -713,13 +780,28 @@ wsi_GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice,
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetDisplayModeProperties2KHR(VkPhysicalDevice physicalDevice,
+-                                 VkDisplayKHR display,
+-                                 uint32_t *pPropertyCount,
+-                                 VkDisplayModeProperties2KHR *pProperties)
++wsi_GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice,
++                                VkDisplayKHR display,
++                                uint32_t *pPropertyCount,
++                                VkDisplayModePropertiesKHR *pProperties)
+ {
+    VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+    struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_display_get_display_mode_properties(physicalDevice,
++                                                  wsi_device,
++                                                  display,
++                                                  pPropertyCount,
++                                                  pProperties);
++}
++
++VkResult
++wsi_display_get_display_mode_properties2(VkPhysicalDevice physicalDevice,
++                                         struct wsi_device *wsi_device,
++                                         VkDisplayKHR display,
++                                         uint32_t *pPropertyCount,
++                                         VkDisplayModeProperties2KHR *pProperties)
++{
+    struct wsi_display_connector *connector =
+       wsi_display_connector_from_handle(display);
+ 
+@@ -738,6 +820,22 @@ wsi_GetDisplayModeProperties2KHR(VkPhysicalDevice physicalDevice,
+    return vk_outarray_status(&conn);
+ }
+ 
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_GetDisplayModeProperties2KHR(VkPhysicalDevice physicalDevice,
++                                 VkDisplayKHR display,
++                                 uint32_t *pPropertyCount,
++                                 VkDisplayModeProperties2KHR *pProperties)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_display_get_display_mode_properties2(physicalDevice,
++                                                   wsi_device,
++                                                   display,
++                                                   pPropertyCount,
++                                                   pProperties);
++}
++
+ static bool
+ wsi_display_mode_matches_vk(wsi_display_mode *wsi,
+                             const VkDisplayModeParametersKHR *vk)
+@@ -750,12 +848,13 @@ wsi_display_mode_matches_vk(wsi_display_mode *wsi,
+ /*
+  * Implement vkCreateDisplayModeKHR (VK_KHR_display)
+  */
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_CreateDisplayModeKHR(VkPhysicalDevice physicalDevice,
+-                         VkDisplayKHR display,
+-                         const VkDisplayModeCreateInfoKHR *pCreateInfo,
+-                         const VkAllocationCallbacks *pAllocator,
+-                         VkDisplayModeKHR *pMode)
++VkResult
++wsi_display_create_display_mode(VkPhysicalDevice physicalDevice,
++                                struct wsi_device *wsi_device,
++                                VkDisplayKHR display,
++                                const VkDisplayModeCreateInfoKHR *pCreateInfo,
++                                const VkAllocationCallbacks *pAllocator,
++                                VkDisplayModeKHR *pMode)
+ {
+    struct wsi_display_connector *connector =
+       wsi_display_connector_from_handle(display);
+@@ -779,11 +878,31 @@ wsi_CreateDisplayModeKHR(VkPhysicalDevice physicalDevice,
+    return VK_ERROR_INITIALIZATION_FAILED;
+ }
+ 
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_CreateDisplayModeKHR(VkPhysicalDevice physicalDevice,
++                         VkDisplayKHR display,
++                         const VkDisplayModeCreateInfoKHR *pCreateInfo,
++                         const VkAllocationCallbacks *pAllocator,
++                         VkDisplayModeKHR *pMode)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_display_create_display_mode(physicalDevice,
++                                          wsi_device,
++                                          display,
++                                          pCreateInfo,
++                                          pAllocator,
++                                          pMode);
++}
++
++
+ /*
+  * Implement vkGetDisplayPlaneCapabilities
+  */
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice,
++VkResult
++wsi_get_display_plane_capabilities(VkPhysicalDevice physicalDevice,
++                                   struct wsi_device *wsi_device,
+                                    VkDisplayModeKHR _mode,
+                                    uint32_t planeIndex,
+                                    VkDisplayPlaneCapabilitiesKHR *pCapabilities)
+@@ -812,15 +931,33 @@ wsi_GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice,
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetDisplayPlaneCapabilities2KHR(VkPhysicalDevice physicalDevice,
+-                                    const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo,
+-                                    VkDisplayPlaneCapabilities2KHR *pCapabilities)
++wsi_GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice,
++                                   VkDisplayModeKHR _mode,
++                                   uint32_t planeIndex,
++                                   VkDisplayPlaneCapabilitiesKHR *pCapabilities)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_get_display_plane_capabilities(physicalDevice,
++                                             wsi_device,
++                                             _mode,
++                                             planeIndex,
++                                             pCapabilities);
++}
++
++VkResult
++wsi_get_display_plane_capabilities2(
++   VkPhysicalDevice physicalDevice,
++   struct wsi_device *wsi_device,
++   const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo,
++   VkDisplayPlaneCapabilities2KHR *pCapabilities)
+ {
+    assert(pCapabilities->sType ==
+           VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR);
+ 
+    VkResult result =
+-      wsi_GetDisplayPlaneCapabilitiesKHR(physicalDevice,
++      wsi_get_display_plane_capabilities(physicalDevice, wsi_device,
+                                          pDisplayPlaneInfo->mode,
+                                          pDisplayPlaneInfo->planeIndex,
+                                          &pCapabilities->capabilities);
+@@ -843,18 +980,31 @@ wsi_GetDisplayPlaneCapabilities2KHR(VkPhysicalDevice physicalDevice,
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_CreateDisplayPlaneSurfaceKHR(VkInstance _instance,
+-                                 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
+-                                 const VkAllocationCallbacks *pAllocator,
+-                                 VkSurfaceKHR *pSurface)
++wsi_GetDisplayPlaneCapabilities2KHR(VkPhysicalDevice physicalDevice,
++                                    const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo,
++                                    VkDisplayPlaneCapabilities2KHR *pCapabilities)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_get_display_plane_capabilities2(physicalDevice,
++                                              wsi_device,
++                                              pDisplayPlaneInfo,
++                                              pCapabilities);
++}
++
++VkResult
++wsi_create_display_surface(VkInstance instance,
++                           const VkAllocationCallbacks *allocator,
++                           const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
++                           VkSurfaceKHR *pSurface)
+ {
+-   VK_FROM_HANDLE(vk_instance, instance, _instance);
+    VkIcdSurfaceDisplay *surface;
+ 
+    assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR);
+ 
+-   surface = vk_zalloc2(&instance->alloc, pAllocator, sizeof(*surface), 8,
+-                        VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
++   surface = vk_zalloc(allocator, sizeof(*surface), 8,
++                       VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+    if (surface == NULL)
+       return VK_ERROR_OUT_OF_HOST_MEMORY;
+ 
+@@ -873,6 +1023,27 @@ wsi_CreateDisplayPlaneSurfaceKHR(VkInstance _instance,
+    return VK_SUCCESS;
+ }
+ 
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_CreateDisplayPlaneSurfaceKHR(VkInstance _instance,
++                                 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
++                                 const VkAllocationCallbacks *pAllocator,
++                                 VkSurfaceKHR *pSurface)
++{
++   VK_FROM_HANDLE(vk_instance, instance, _instance);
++   const VkAllocationCallbacks *allocator;
++
++   if (pAllocator)
++     allocator = pAllocator;
++   else
++     allocator = &instance->alloc;
++
++   return wsi_create_display_surface(_instance,
++                                     allocator,
++                                     pCreateInfo,
++                                     pSurface);
++}
++
++
+ static VkResult
+ wsi_display_surface_get_support(VkIcdSurfaceBase *surface,
+                                 struct wsi_device *wsi_device,
+@@ -2236,12 +2407,11 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device,
+ /*
+  * Implement vkReleaseDisplay
+  */
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_ReleaseDisplayEXT(VkPhysicalDevice physicalDevice,
+-                      VkDisplayKHR display)
++VkResult
++wsi_release_display(VkPhysicalDevice            physicalDevice,
++                    struct wsi_device           *wsi_device,
++                    VkDisplayKHR                display)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+-   struct wsi_device *wsi_device = pdevice->wsi_device;
+    struct wsi_display *wsi =
+       (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+ 
+@@ -2656,12 +2826,23 @@ wsi_display_find_crtc_for_output(xcb_connection_t *connection,
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_AcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice,
+-                          Display *dpy,
+-                          VkDisplayKHR display)
++wsi_ReleaseDisplayEXT(VkPhysicalDevice physicalDevice,
++                      VkDisplayKHR display)
+ {
+    VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+    struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_release_display(physicalDevice,
++                              wsi_device,
++                              display);
++}
++
++VkResult
++wsi_acquire_xlib_display(VkPhysicalDevice physicalDevice,
++                         struct wsi_device *wsi_device,
++                         Display *dpy,
++                         VkDisplayKHR display)
++{
+    struct wsi_display *wsi =
+       (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+    xcb_connection_t *connection = XGetXCBConnection(dpy);
+@@ -2720,13 +2901,26 @@ wsi_AcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice,
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice,
++wsi_AcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice,
++                          Display *dpy,
++                          VkDisplayKHR display)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_acquire_xlib_display(physicalDevice,
++                                   wsi_device,
++                                   dpy,
++                                   display);
++}
++
++VkResult
++wsi_get_randr_output_display(VkPhysicalDevice physicalDevice,
++                             struct wsi_device *wsi_device,
+                              Display *dpy,
+                              RROutput rrOutput,
+                              VkDisplayKHR *pDisplay)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+-   struct wsi_device *wsi_device = pdevice->wsi_device;
+    xcb_connection_t *connection = XGetXCBConnection(dpy);
+    struct wsi_display_connector *connector =
+       wsi_display_get_output(wsi_device, connection,
+@@ -2739,16 +2933,31 @@ wsi_GetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice,
+    return VK_SUCCESS;
+ }
+ 
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_GetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice,
++                             Display *dpy,
++                             RROutput rrOutput,
++                             VkDisplayKHR *pDisplay)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_get_randr_output_display(physicalDevice,
++                                       wsi_device,
++                                       dpy,
++                                       rrOutput,
++                                       pDisplay);
++}
++
+ #endif
+ 
+ /* VK_EXT_display_control */
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_DisplayPowerControlEXT(VkDevice _device,
+-                           VkDisplayKHR display,
+-                           const VkDisplayPowerInfoEXT *pDisplayPowerInfo)
++VkResult
++wsi_display_power_control(VkDevice _device,
++                          struct wsi_device *wsi_device,
++                          VkDisplayKHR display,
++                          const VkDisplayPowerInfoEXT *pDisplayPowerInfo)
+ {
+-   VK_FROM_HANDLE(vk_device, device, _device);
+-   struct wsi_device *wsi_device = device->physical->wsi_device;
+    struct wsi_display *wsi =
+       (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+    struct wsi_display_connector *connector =
+@@ -2776,6 +2985,20 @@ wsi_DisplayPowerControlEXT(VkDevice _device,
+    return VK_SUCCESS;
+ }
+ 
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_DisplayPowerControlEXT(VkDevice _device,
++                           VkDisplayKHR display,
++                           const VkDisplayPowerInfoEXT *pDisplayPowerInfo)
++{
++   VK_FROM_HANDLE(vk_device, device, _device);
++   struct wsi_device *wsi_device = device->physical->wsi_device;
++
++   return wsi_display_power_control(_device,
++                                    wsi_device,
++                                    display,
++                                    pDisplayPowerInfo);
++}
++
+ VkResult
+ wsi_register_device_event(VkDevice _device,
+                           struct wsi_device *wsi_device,
+@@ -2784,7 +3007,6 @@ wsi_register_device_event(VkDevice _device,
+                           struct vk_sync **sync_out,
+                           int sync_fd)
+ {
+-   VK_FROM_HANDLE(vk_device, device, _device);
+    struct wsi_display *wsi =
+       (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+    VkResult ret = VK_SUCCESS;
+@@ -2818,6 +3040,8 @@ wsi_register_device_event(VkDevice _device,
+    mtx_unlock(&wsi->wait_mutex);
+ 
+    if (sync_out) {
++      VK_FROM_HANDLE(vk_device, device, _device);
++
+       ret = wsi_display_sync_create(device, fence, sync_out);
+       if (ret != VK_SUCCESS)
+          wsi_display_fence_destroy(fence);
+@@ -2866,7 +3090,6 @@ wsi_register_display_event(VkDevice _device,
+                            struct vk_sync **sync_out,
+                            int sync_fd)
+ {
+-   VK_FROM_HANDLE(vk_device, device, _device);
+    struct wsi_display *wsi =
+       (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+    struct wsi_display_fence *fence;
+@@ -2885,6 +3108,8 @@ wsi_register_display_event(VkDevice _device,
+ 
+       if (ret == VK_SUCCESS) {
+          if (sync_out) {
++            VK_FROM_HANDLE(vk_device, device, _device);
++
+             ret = wsi_display_sync_create(device, fence, sync_out);
+             if (ret != VK_SUCCESS)
+                wsi_display_fence_destroy(fence);
+@@ -2943,14 +3168,13 @@ wsi_display_setup_syncobj_fd(struct wsi_device *wsi_device,
+    wsi->syncobj_fd = fd;
+ }
+ 
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetSwapchainCounterEXT(VkDevice _device,
+-                           VkSwapchainKHR _swapchain,
+-                           VkSurfaceCounterFlagBitsEXT counter,
+-                           uint64_t *pCounterValue)
++VkResult
++wsi_get_swapchain_counter(VkDevice _device,
++                          struct wsi_device *wsi_device,
++                          VkSwapchainKHR _swapchain,
++                          VkSurfaceCounterFlagBitsEXT counter,
++                          uint64_t *pCounterValue)
+ {
+-   VK_FROM_HANDLE(vk_device, device, _device);
+-   struct wsi_device *wsi_device = device->physical->wsi_device;
+    struct wsi_display *wsi =
+       (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
+    struct wsi_display_swapchain *swapchain =
+@@ -2975,13 +3199,27 @@ wsi_GetSwapchainCounterEXT(VkDevice _device,
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_AcquireDrmDisplayEXT(VkPhysicalDevice physicalDevice,
+-                         int32_t drmFd,
+-                         VkDisplayKHR display)
++wsi_GetSwapchainCounterEXT(VkDevice _device,
++                           VkSwapchainKHR _swapchain,
++                           VkSurfaceCounterFlagBitsEXT counter,
++                           uint64_t *pCounterValue)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+-   struct wsi_device *wsi_device = pdevice->wsi_device;
++   VK_FROM_HANDLE(vk_device, device, _device);
++   struct wsi_device *wsi_device = device->physical->wsi_device;
+ 
++   return wsi_get_swapchain_counter(_device,
++                                    wsi_device,
++                                    _swapchain,
++                                    counter,
++                                    pCounterValue);
++}
++
++VkResult
++wsi_acquire_drm_display(VkPhysicalDevice     physicalDevice,
++                        struct wsi_device    *wsi_device,
++                        int                  drmFd,
++                        VkDisplayKHR         display)
++{
+    if (!wsi_device_matches_drm_fd(wsi_device, drmFd))
+       return VK_ERROR_UNKNOWN;
+ 
+@@ -3008,14 +3246,26 @@ wsi_AcquireDrmDisplayEXT(VkPhysicalDevice physicalDevice,
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_GetDrmDisplayEXT(VkPhysicalDevice physicalDevice,
+-                     int32_t drmFd,
+-                     uint32_t connectorId,
+-                     VkDisplayKHR *pDisplay)
++wsi_AcquireDrmDisplayEXT(VkPhysicalDevice physicalDevice,
++                         int32_t drmFd,
++                         VkDisplayKHR display)
+ {
+    VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+    struct wsi_device *wsi_device = pdevice->wsi_device;
+ 
++   return wsi_acquire_drm_display(physicalDevice,
++                                  wsi_device,
++                                  drmFd,
++                                  display);
++}
++
++VkResult
++wsi_get_drm_display(VkPhysicalDevice      physicalDevice,
++                    struct wsi_device     *wsi_device,
++                    int                   drmFd,
++                    int                   connectorId,
++                    VkDisplayKHR          *pDisplay)
++{
+    if (!wsi_device_matches_drm_fd(wsi_device, drmFd))
+       return VK_ERROR_UNKNOWN;
+ 
+@@ -3030,3 +3280,20 @@ wsi_GetDrmDisplayEXT(VkPhysicalDevice physicalDevice,
+    *pDisplay = wsi_display_connector_to_handle(connector);
+    return VK_SUCCESS;
+ }
++
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_GetDrmDisplayEXT(VkPhysicalDevice physicalDevice,
++                     int32_t drmFd,
++                     uint32_t connectorId,
++                     VkDisplayKHR *pDisplay)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_get_drm_display(physicalDevice,
++                              wsi_device,
++                              drmFd,
++                              connectorId,
++                              pDisplay);
++}
++
+diff --git a/src/vulkan/wsi/wsi_common_display.h b/src/vulkan/wsi/wsi_common_display.h
+index dd54b9b775f..cdfbda50107 100644
+--- a/src/vulkan/wsi/wsi_common_display.h
++++ b/src/vulkan/wsi/wsi_common_display.h
+@@ -29,7 +29,112 @@
+ 
+ struct vk_sync;
+ 
++VkResult
++wsi_display_get_physical_device_display_properties(
++   VkPhysicalDevice physical_device,
++   struct wsi_device *wsi_device,
++   uint32_t *property_count,
++   VkDisplayPropertiesKHR *properties);
++
++VkResult
++wsi_display_get_physical_device_display_properties2(
++   VkPhysicalDevice physical_device,
++   struct wsi_device *wsi_device,
++   uint32_t *pPropertyCount,
++   VkDisplayProperties2KHR *pProperties);
++
++VkResult
++wsi_display_get_physical_device_display_plane_properties(
++   VkPhysicalDevice physical_device,
++   struct wsi_device *wsi_device,
++   uint32_t *property_count,
++   VkDisplayPlanePropertiesKHR *properties);
++
++VkResult
++wsi_display_get_physical_device_display_plane_properties2(
++   VkPhysicalDevice physical_device,
++   struct wsi_device *wsi_device,
++   uint32_t *property_count,
++   VkDisplayPlaneProperties2KHR *properties);
++
++VkResult
++wsi_display_get_display_plane_supported_displays(
++   VkPhysicalDevice physical_device,
++   struct wsi_device *wsi_device,
++   uint32_t plane_index,
++   uint32_t *display_count,
++   VkDisplayKHR *displays);
++
++VkResult
++wsi_display_get_display_mode_properties(VkPhysicalDevice physical_device,
++                                        struct wsi_device *wsi_device,
++                                        VkDisplayKHR display,
++                                        uint32_t *property_count,
++                                        VkDisplayModePropertiesKHR *properties);
++
++VkResult
++wsi_display_get_display_mode_properties2(VkPhysicalDevice physical_device,
++                                         struct wsi_device *wsi_device,
++                                         VkDisplayKHR display,
++                                         uint32_t *property_count,
++                                         VkDisplayModeProperties2KHR *properties);
++
++VkResult
++wsi_display_create_display_mode(VkPhysicalDevice physical_device,
++                                struct wsi_device *wsi_device,
++                                VkDisplayKHR display,
++                                const VkDisplayModeCreateInfoKHR *create_info,
++                                const VkAllocationCallbacks *allocator,
++                                VkDisplayModeKHR *mode);
++
++VkResult
++wsi_get_display_plane_capabilities(VkPhysicalDevice physical_device,
++                                   struct wsi_device *wsi_device,
++                                   VkDisplayModeKHR mode_khr,
++                                   uint32_t plane_index,
++                                   VkDisplayPlaneCapabilitiesKHR *capabilities);
++
++VkResult
++wsi_get_display_plane_capabilities2(VkPhysicalDevice physical_device,
++                                    struct wsi_device *wsi_device,
++                                    const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo,
++                                    VkDisplayPlaneCapabilities2KHR *capabilities);
++
++VkResult
++wsi_create_display_surface(VkInstance instance,
++                           const VkAllocationCallbacks *pAllocator,
++                           const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
++                           VkSurfaceKHR *pSurface);
++
++VkResult
++wsi_release_display(VkPhysicalDevice            physical_device,
++                    struct wsi_device           *wsi_device,
++                    VkDisplayKHR                display);
++
++
++#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
++VkResult
++wsi_acquire_xlib_display(VkPhysicalDevice       physical_device,
++                         struct wsi_device      *wsi_device,
++                         Display                *dpy,
++                         VkDisplayKHR           display);
++
++VkResult
++wsi_get_randr_output_display(VkPhysicalDevice   physical_device,
++                             struct wsi_device  *wsi_device,
++                             Display            *dpy,
++                             RROutput           output,
++                             VkDisplayKHR       *display);
++
++#endif /* VK_USE_PLATFORM_XLIB_XRANDR_EXT */
++
+ /* VK_EXT_display_control */
++VkResult
++wsi_display_power_control(VkDevice                      device,
++                          struct wsi_device             *wsi_device,
++                          VkDisplayKHR                  display,
++                          const VkDisplayPowerInfoEXT   *display_power_info);
++
+ VkResult
+ wsi_register_device_event(VkDevice                      device,
+                           struct wsi_device             *wsi_device,
+@@ -47,4 +152,25 @@ wsi_register_display_event(VkDevice                     device,
+                            struct vk_sync               **sync,
+                            int sync_fd);
+ 
++VkResult
++wsi_get_swapchain_counter(VkDevice                      device,
++                          struct wsi_device             *wsi_device,
++                          VkSwapchainKHR                swapchain,
++                          VkSurfaceCounterFlagBitsEXT   flag_bits,
++                          uint64_t                      *value);
++
++/* VK_EXT_acquire_drm_display */
++VkResult
++wsi_acquire_drm_display(VkPhysicalDevice     pDevice,
++                        struct wsi_device    *wsi_device,
++                        int                  drmFd,
++                        VkDisplayKHR         display);
++
++VkResult
++wsi_get_drm_display(VkPhysicalDevice      pDevice,
++                    struct wsi_device     *wsi_device,
++                    int                   drmFd,
++                    int                   connectorId,
++                    VkDisplayKHR          *display);
++
+ #endif
+diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
+index c01c4079d61..1a364c0c478 100644
+--- a/src/vulkan/wsi/wsi_common_wayland.c
++++ b/src/vulkan/wsi/wsi_common_wayland.c
+@@ -42,6 +42,8 @@
+ #include "vk_util.h"
+ #include "wsi_common_entrypoints.h"
+ #include "wsi_common_private.h"
++#include "wsi_common_wayland.h"
++#include "wayland-drm-client-protocol.h"
+ #include "linux-dmabuf-unstable-v1-client-protocol.h"
+ 
+ #include <util/compiler.h>
+@@ -580,7 +582,7 @@ registry_handle_global(void *data, struct wl_registry *registry,
+ 
+       display->wl_drm =
+          wl_registry_bind(registry, name, &wl_drm_interface, 2);
+-      wl_drm_add_listener(display->drm.wl_drm, &drm_listener, display);
++      wl_drm_add_listener(display->wl_drm, &drm_listener, display);
+    }
+ 
+    if (strcmp(interface, "zwp_linux_dmabuf_v1") == 0 && version >= 3) {
+@@ -773,13 +775,10 @@ wsi_wl_display_unref(struct wsi_wl_display *display)
+    vk_free(wsi->alloc, display);
+ }
+ 
+-VKAPI_ATTR VkBool32 VKAPI_CALL
+-wsi_GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
+-                                                   uint32_t queueFamilyIndex,
+-                                                   struct wl_display *wl_display)
++VkBool32
++wsi_wl_get_presentation_support(struct wsi_device *wsi_device,
++                                struct wl_display *wl_display)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+-   struct wsi_device *wsi_device = pdevice->wsi_device;
+    struct wsi_wayland *wsi =
+       (struct wsi_wayland *)wsi_device->wsi[VK_ICD_WSI_PLATFORM_WAYLAND];
+ 
+@@ -792,6 +791,18 @@ wsi_GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevi
+    return ret == VK_SUCCESS;
+ }
+ 
++VKAPI_ATTR VkBool32 VKAPI_CALL
++wsi_GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
++                                                   uint32_t queueFamilyIndex,
++                                                   struct wl_display *wl_display)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_wl_get_presentation_support(wsi_device,
++                                          wl_display);
++}
++
+ static VkResult
+ wsi_wl_surface_get_support(VkIcdSurfaceBase *surface,
+                            struct wsi_device *wsi_device,
+@@ -993,19 +1004,16 @@ wsi_wl_surface_get_present_rectangles(VkIcdSurfaceBase *surface,
+    return vk_outarray_status(&out);
+ }
+ 
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_CreateWaylandSurfaceKHR(VkInstance _instance,
+-                            const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
+-                            const VkAllocationCallbacks *pAllocator,
+-                            VkSurfaceKHR *pSurface)
++VkResult wsi_create_wl_surface(const VkAllocationCallbacks *allocator,
++                               const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
++                               VkSurfaceKHR *pSurface)
+ {
+-   VK_FROM_HANDLE(vk_instance, instance, _instance);
+    VkIcdSurfaceWayland *surface;
+ 
+    assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR);
+ 
+-   surface = vk_alloc2(&instance->alloc, pAllocator, sizeof *surface, 8,
+-                       VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
++   surface = vk_alloc(allocator, sizeof *surface, 8,
++                      VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+    if (surface == NULL)
+       return VK_ERROR_OUT_OF_HOST_MEMORY;
+ 
+@@ -1018,6 +1026,25 @@ wsi_CreateWaylandSurfaceKHR(VkInstance _instance,
+    return VK_SUCCESS;
+ }
+ 
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_CreateWaylandSurfaceKHR(VkInstance _instance,
++                            const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
++                            const VkAllocationCallbacks *pAllocator,
++                            VkSurfaceKHR *pSurface)
++{
++   VK_FROM_HANDLE(vk_instance, instance, _instance);
++   const VkAllocationCallbacks *allocator;
++
++   if (pAllocator)
++     allocator = pAllocator;
++   else
++     allocator = &instance->alloc;
++
++   return wsi_create_wl_surface(allocator,
++                                pCreateInfo,
++                                pSurface);
++}
++
+ struct wsi_wl_image {
+    struct wsi_image                             base;
+    struct wl_buffer *                           buffer;
+diff --git a/src/vulkan/wsi/wsi_common_wayland.h b/src/vulkan/wsi/wsi_common_wayland.h
+new file mode 100644
+index 00000000000..effba0ebba4
+--- /dev/null
++++ b/src/vulkan/wsi/wsi_common_wayland.h
+@@ -0,0 +1,35 @@
++/*
++ * Copyright © 2015 Intel Corporation
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
++ * IN THE SOFTWARE.
++ */
++#ifndef WSI_COMMON_WAYLAND_H
++#define WSI_COMMON_WAYLAND_H
++
++#include "wsi_common.h"
++
++VkBool32
++wsi_wl_get_presentation_support(struct wsi_device *wsi_device,
++				struct wl_display *wl_display);
++
++VkResult wsi_create_wl_surface(const VkAllocationCallbacks *pAllocator,
++			       const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
++			       VkSurfaceKHR *pSurface);
++#endif
+diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
+index 8d9123c0494..f1977cf7ec1 100644
+--- a/src/vulkan/wsi/wsi_common_x11.c
++++ b/src/vulkan/wsi/wsi_common_x11.c
+@@ -51,6 +51,7 @@
+ #include "vk_enum_to_str.h"
+ #include "wsi_common_entrypoints.h"
+ #include "wsi_common_private.h"
++#include "wsi_common_x11.h"
+ #include "wsi_common_queue.h"
+ 
+ #ifdef HAVE_SYS_SHM_H
+@@ -506,14 +507,12 @@ visual_supported(xcb_visualtype_t *visual)
+    return visual->bits_per_rgb_value == 8 || visual->bits_per_rgb_value == 10;
+ }
+ 
+-VKAPI_ATTR VkBool32 VKAPI_CALL
+-wsi_GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
+-                                               uint32_t queueFamilyIndex,
+-                                               xcb_connection_t *connection,
+-                                               xcb_visualid_t visual_id)
++VkBool32 wsi_get_physical_device_xcb_presentation_support(
++    struct wsi_device *wsi_device,
++    uint32_t queueFamilyIndex,
++    xcb_connection_t *connection,
++    xcb_visualid_t visual_id)
+ {
+-   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+-   struct wsi_device *wsi_device = pdevice->wsi_device;
+    struct wsi_x11_connection *wsi_conn =
+       wsi_x11_get_connection(wsi_device, connection);
+ 
+@@ -531,6 +530,21 @@ wsi_GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
+    return true;
+ }
+ 
++VKAPI_ATTR VkBool32 VKAPI_CALL
++wsi_GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
++                                               uint32_t queueFamilyIndex,
++                                               xcb_connection_t *connection,
++                                               xcb_visualid_t visual_id)
++{
++   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
++   struct wsi_device *wsi_device = pdevice->wsi_device;
++
++   return wsi_get_physical_device_xcb_presentation_support(wsi_device,
++                                                           queueFamilyIndex,
++                                                           connection,
++                                                           visual_id);
++}
++
+ VKAPI_ATTR VkBool32 VKAPI_CALL
+ wsi_GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
+                                                 uint32_t queueFamilyIndex,
+@@ -837,19 +851,16 @@ x11_surface_get_present_rectangles(VkIcdSurfaceBase *icd_surface,
+    return vk_outarray_status(&out);
+ }
+ 
+-VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_CreateXcbSurfaceKHR(VkInstance _instance,
+-                        const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
+-                        const VkAllocationCallbacks *pAllocator,
+-                        VkSurfaceKHR *pSurface)
++VkResult wsi_create_xcb_surface(const VkAllocationCallbacks *allocator,
++				const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
++				VkSurfaceKHR *pSurface)
+ {
+-   VK_FROM_HANDLE(vk_instance, instance, _instance);
+    VkIcdSurfaceXcb *surface;
+ 
+    assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR);
+ 
+-   surface = vk_alloc2(&instance->alloc, pAllocator, sizeof *surface, 8,
+-                       VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
++   surface = vk_alloc(allocator, sizeof *surface, 8,
++                      VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+    if (surface == NULL)
+       return VK_ERROR_OUT_OF_HOST_MEMORY;
+ 
+@@ -862,18 +873,34 @@ wsi_CreateXcbSurfaceKHR(VkInstance _instance,
+ }
+ 
+ VKAPI_ATTR VkResult VKAPI_CALL
+-wsi_CreateXlibSurfaceKHR(VkInstance _instance,
+-                         const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
+-                         const VkAllocationCallbacks *pAllocator,
+-                         VkSurfaceKHR *pSurface)
++wsi_CreateXcbSurfaceKHR(VkInstance _instance,
++                        const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
++                        const VkAllocationCallbacks *pAllocator,
++                        VkSurfaceKHR *pSurface)
+ {
+    VK_FROM_HANDLE(vk_instance, instance, _instance);
++   const VkAllocationCallbacks *allocator;
++
++   if (pAllocator)
++     allocator = pAllocator;
++   else
++     allocator = &instance->alloc;
++
++   return wsi_create_xcb_surface(allocator,
++                                 pCreateInfo,
++                                 pSurface);
++}
++
++VkResult wsi_create_xlib_surface(const VkAllocationCallbacks *allocator,
++				 const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
++				 VkSurfaceKHR *pSurface)
++{
+    VkIcdSurfaceXlib *surface;
+ 
+    assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR);
+ 
+-   surface = vk_alloc2(&instance->alloc, pAllocator, sizeof *surface, 8,
+-                       VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
++   surface = vk_alloc(allocator, sizeof *surface, 8,
++                      VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+    if (surface == NULL)
+       return VK_ERROR_OUT_OF_HOST_MEMORY;
+ 
+@@ -898,6 +925,25 @@ struct x11_image {
+    uint8_t *                                 shmaddr;
+ };
+ 
++VKAPI_ATTR VkResult VKAPI_CALL
++wsi_CreateXlibSurfaceKHR(VkInstance _instance,
++                         const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
++                         const VkAllocationCallbacks *pAllocator,
++                         VkSurfaceKHR *pSurface)
++{
++   VK_FROM_HANDLE(vk_instance, instance, _instance);
++   const VkAllocationCallbacks *allocator;
++
++   if (pAllocator)
++     allocator = pAllocator;
++   else
++     allocator = &instance->alloc;
++
++   return wsi_create_xlib_surface(allocator,
++                                  pCreateInfo,
++                                  pSurface);
++}
++
+ struct x11_swapchain {
+    struct wsi_swapchain                        base;
+ 
+diff --git a/src/vulkan/wsi/wsi_common_x11.h b/src/vulkan/wsi/wsi_common_x11.h
+new file mode 100644
+index 00000000000..e4b1e94a8c8
+--- /dev/null
++++ b/src/vulkan/wsi/wsi_common_x11.h
+@@ -0,0 +1,41 @@
++/*
++ * Copyright © 2015 Intel Corporation
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
++ * IN THE SOFTWARE.
++ */
++#ifndef WSI_COMMON_X11_H
++#define WSI_COMMON_X11_H
++
++#include "wsi_common.h"
++
++VkBool32 wsi_get_physical_device_xcb_presentation_support(
++    struct wsi_device *wsi_device,
++    uint32_t                                    queueFamilyIndex,
++    xcb_connection_t*                           connection,
++    xcb_visualid_t                              visual_id);
++
++VkResult wsi_create_xcb_surface(const VkAllocationCallbacks *pAllocator,
++				const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
++				VkSurfaceKHR *pSurface);
++
++VkResult wsi_create_xlib_surface(const VkAllocationCallbacks *pAllocator,
++				 const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
++				 VkSurfaceKHR *pSurface);
++#endif
+-- 
+2.25.1
+

+ 9 - 9
package/mesa3d/0060-vulkan-wsi-Disable-use-of-VK_EXT_pci_bus_info.patch → package/mesa3d/0050-vulkan-wsi-Disable-use-of-VK_EXT_pci_bus_info.patch

@@ -1,7 +1,7 @@
-From 83953c9325e4cc9adb23ad7654a02ddabdd3fd99 Mon Sep 17 00:00:00 2001
+From cf627f39eac96553d44c8642a26354ca70286c64 Mon Sep 17 00:00:00 2001
 From: brendan King <Brendan.King@imgtec.com>
 Date: Fri, 30 Jul 2021 15:34:13 +0100
-Subject: [PATCH 60/67] vulkan/wsi: Disable use of VK_EXT_pci_bus_info
+Subject: [PATCH 50/58] vulkan/wsi: Disable use of VK_EXT_pci_bus_info
 
 The VK_EXT_pci_bus_info related code has been wrapped in
 VULKAN_WSI_USE_PCI_BUS_INFO, effectively disabling it.
@@ -16,10 +16,10 @@ to indicate that the device is a PCI one.
  3 files changed, 10 insertions(+)
 
 diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
-index b1360edb911..66d6683a7c1 100644
+index 6032401b37c..9919652e06e 100644
 --- a/src/vulkan/wsi/wsi_common.c
 +++ b/src/vulkan/wsi/wsi_common.c
-@@ -56,11 +56,15 @@ wsi_device_init(struct wsi_device *wsi,
+@@ -63,11 +63,15 @@ wsi_device_init(struct wsi_device *wsi,
     WSI_GET_CB(GetPhysicalDeviceQueueFamilyProperties);
  #undef WSI_GET_CB
  
@@ -36,10 +36,10 @@ index b1360edb911..66d6683a7c1 100644
     GetPhysicalDeviceProperties2(pdevice, &pdp2);
  
 diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
-index c2563c677e6..4a733665d2c 100644
+index 3ef630080f2..b6ea6e7b36a 100644
 --- a/src/vulkan/wsi/wsi_common.h
 +++ b/src/vulkan/wsi/wsi_common.h
-@@ -112,7 +112,9 @@ struct wsi_device {
+@@ -114,7 +114,9 @@ struct wsi_device {
     VkPhysicalDeviceMemoryProperties memory_props;
     uint32_t queue_family_count;
  
@@ -50,10 +50,10 @@ index c2563c677e6..4a733665d2c 100644
     bool supports_modifiers;
     uint32_t maxImageDimension2D;
 diff --git a/src/vulkan/wsi/wsi_common_drm.c b/src/vulkan/wsi/wsi_common_drm.c
-index 6201891ca80..49a78cf4c62 100644
+index beb87d7336f..885e4c214cf 100644
 --- a/src/vulkan/wsi/wsi_common_drm.c
 +++ b/src/vulkan/wsi/wsi_common_drm.c
-@@ -45,6 +45,7 @@ wsi_device_matches_drm_fd(const struct wsi_device *wsi, int drm_fd)
+@@ -71,6 +71,7 @@ wsi_device_matches_drm_fd(const struct wsi_device *wsi, int drm_fd)
     if (ret)
        return false;
  
@@ -61,7 +61,7 @@ index 6201891ca80..49a78cf4c62 100644
     bool match = false;
     switch (fd_device->bustype) {
     case DRM_BUS_PCI:
-@@ -57,6 +58,9 @@ wsi_device_matches_drm_fd(const struct wsi_device *wsi, int drm_fd)
+@@ -83,6 +84,9 @@ wsi_device_matches_drm_fd(const struct wsi_device *wsi, int drm_fd)
     default:
        break;
     }

+ 0 - 56
package/mesa3d/0051-egl-wayland-a-linear-buffer-is-not-needed-with-DRM-f.patch

@@ -1,56 +0,0 @@
-From 627ec429d684c57bdee45a21354009810fc03186 Mon Sep 17 00:00:00 2001
-From: Brendan King <Brendan.King@imgtec.com>
-Date: Wed, 28 Apr 2021 10:57:15 +0100
-Subject: [PATCH 51/67] egl/wayland: a linear buffer is not needed with DRM
- format modifiers
-
-If the compositor supports DRM format modifiers, there is no
-need for an additional linear buffer, as the client can allocate
-buffers with attributes known to the compositor.
----
- src/egl/drivers/dri2/platform_wayland.c | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
-index b393e058770..60683fa6c1a 100644
---- a/src/egl/drivers/dri2/platform_wayland.c
-+++ b/src/egl/drivers/dri2/platform_wayland.c
-@@ -695,7 +695,7 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
-       use_flags |= __DRI_IMAGE_USE_PROTECTED;
-    }
- 
--   if (dri2_dpy->is_different_gpu &&
-+   if (dri2_dpy->is_different_gpu && !num_modifiers &&
-        dri2_surf->back->linear_copy == NULL) {
-       /* The LINEAR modifier should be a perfect alias of the LINEAR use
-        * flag; try the new interface first before the old, then fall back. */
-@@ -811,7 +811,7 @@ update_buffers(struct dri2_egl_display *dri2_dpy,
-           dri2_surf->color_buffers[i].wl_buffer) {
-          wl_buffer_destroy(dri2_surf->color_buffers[i].wl_buffer);
-          dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].dri_image);
--         if (dri2_dpy->is_different_gpu)
-+         if (dri2_surf->color_buffers[i].linear_copy)
-             dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].linear_copy);
-          dri2_surf->color_buffers[i].wl_buffer = NULL;
-          dri2_surf->color_buffers[i].dri_image = NULL;
-@@ -1247,7 +1247,7 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
-    if (!dri2_surf->current->wl_buffer) {
-       __DRIimage *image;
- 
--      if (dri2_dpy->is_different_gpu)
-+      if (dri2_surf->current->linear_copy)
-          image = dri2_surf->current->linear_copy;
-       else
-          image = dri2_surf->current->dri_image;
-@@ -1281,7 +1281,7 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
- 
-    dri2_flush_drawable_for_swapbuffers(disp, draw);
- 
--   if (dri2_dpy->is_different_gpu) {
-+   if (dri2_surf->current->linear_copy) {
-       _EGLContext *ctx = _eglGetCurrentContext();
-       struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
-       dri2_dpy->image->blitImage(dri2_ctx->dri_context,
--- 
-2.25.1
-

+ 4 - 4
package/mesa3d/0061-vulkan-wsi-default-to-force_bgra8_unorm_first-true.patch → package/mesa3d/0051-vulkan-wsi-default-to-force_bgra8_unorm_first-true.patch

@@ -1,7 +1,7 @@
-From 10a0d4ec4f9d468c792f5e675d924fa7a8f97373 Mon Sep 17 00:00:00 2001
+From 06c6ca320bf9e632a7a410f3921e81bf9fc7c3b8 Mon Sep 17 00:00:00 2001
 From: brendan King <Brendan.King@imgtec.com>
 Date: Mon, 2 Aug 2021 16:29:36 +0100
-Subject: [PATCH 61/67] vulkan/wsi: default to force_bgra8_unorm_first true
+Subject: [PATCH 51/58] vulkan/wsi: default to force_bgra8_unorm_first true
 
 If VULKAN_WSI_BGRA8_SNORM_FIRST is not defined, default to
 force_bgra8_unorm_first true.
@@ -15,10 +15,10 @@ to VK_FORMAT_B8G8R8A8_UNORM rather than VK_FORMAT_B8G8R8A8_SRGB.
  1 file changed, 4 insertions(+)
 
 diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
-index 66d6683a7c1..1ffca6fecfb 100644
+index 9919652e06e..96cd263556c 100644
 --- a/src/vulkan/wsi/wsi_common.c
 +++ b/src/vulkan/wsi/wsi_common.c
-@@ -158,6 +158,10 @@ wsi_device_init(struct wsi_device *wsi,
+@@ -170,6 +170,10 @@ wsi_device_init(struct wsi_device *wsi,
              driQueryOptionb(dri_options, "vk_wsi_force_bgra8_unorm_first");
        }
     }

+ 4 - 4
package/mesa3d/0063-vulkan-wsi-enable-additional-formats-for-Display.patch → package/mesa3d/0052-vulkan-wsi-enable-additional-formats-for-Display.patch

@@ -1,7 +1,7 @@
-From c2b91fcb7c88bfec23077ae31c0035684249ea1b Mon Sep 17 00:00:00 2001
+From b0f528f9a74f15c509654f3a76707da99b00a8be Mon Sep 17 00:00:00 2001
 From: brendan King <Brendan.King@imgtec.com>
 Date: Tue, 3 Aug 2021 15:44:57 +0100
-Subject: [PATCH 63/67] vulkan/wsi: enable additional formats for Display
+Subject: [PATCH 52/58] vulkan/wsi: enable additional formats for Display
 
 Add VK_FORMAT_R5G6B5_UNORM_PACK16.
 
@@ -11,10 +11,10 @@ This is for compatibility with IMG WSI.
  1 file changed, 1 insertion(+)
 
 diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c
-index f135b4e38de..298c78809c3 100644
+index 5b020f9fdc0..66052b7dcee 100644
 --- a/src/vulkan/wsi/wsi_common_display.c
 +++ b/src/vulkan/wsi/wsi_common_display.c
-@@ -900,6 +900,7 @@ static const struct {
+@@ -1134,6 +1134,7 @@ static const struct {
  } available_surface_formats[] = {
     { .format = VK_FORMAT_B8G8R8A8_SRGB, .drm_format = DRM_FORMAT_XRGB8888 },
     { .format = VK_FORMAT_B8G8R8A8_UNORM, .drm_format = DRM_FORMAT_XRGB8888 },

+ 15 - 15
package/mesa3d/0066-mesa-partially-revert-pbuffer-attribute-removal.patch → package/mesa3d/0053-mesa-partially-revert-pbuffer-attribute-removal.patch

@@ -1,7 +1,7 @@
-From 28e4349702566ba34dad4c214c64bfd702177c8a Mon Sep 17 00:00:00 2001
+From 8c5f7a9cffeae4b2516f286e78a8a1d35ab16e4e Mon Sep 17 00:00:00 2001
 From: brendan King <Brendan.King@imgtec.com>
 Date: Thu, 16 Sep 2021 17:46:28 +0100
-Subject: [PATCH 66/67] mesa: partially revert pbuffer attribute removal
+Subject: [PATCH 53/58] mesa: partially revert pbuffer attribute removal
 
 This partially reverts commit 5ffd1ebe6b3c8c7dd316dd47fac088044222e6ef
 ("mesa: Remove misc pbuffer attributes from struct gl_config").
@@ -9,15 +9,15 @@ This partially reverts commit 5ffd1ebe6b3c8c7dd316dd47fac088044222e6ef
 The IMG PowerVR driver sets meaningful values for the maximum
 pbuffer width, height and pixels.
 ---
- src/mesa/drivers/dri/common/utils.c | 7 ++++---
- src/mesa/main/mtypes.h              | 5 +++++
+ src/gallium/frontends/dri/utils.c | 7 ++++---
+ src/mesa/main/glconfig.h          | 5 +++++
  2 files changed, 9 insertions(+), 3 deletions(-)
 
-diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c
-index df5f8cbfdc0..28debe4e013 100644
---- a/src/mesa/drivers/dri/common/utils.c
-+++ b/src/mesa/drivers/dri/common/utils.c
-@@ -480,6 +480,7 @@ __DRIconfig **driConcatConfigs(__DRIconfig **a,
+diff --git a/src/gallium/frontends/dri/utils.c b/src/gallium/frontends/dri/utils.c
+index c27d150d7e5..20f2b519350 100644
+--- a/src/gallium/frontends/dri/utils.c
++++ b/src/gallium/frontends/dri/utils.c
+@@ -452,6 +452,7 @@ __DRIconfig **driConcatConfigs(__DRIconfig **a,
      return all;
  }
  
@@ -25,7 +25,7 @@ index df5f8cbfdc0..28debe4e013 100644
  #define __ATTRIB(attrib, field) case attrib: *value = config->modes.field; break
  
  /**
-@@ -555,9 +556,9 @@ driGetConfigAttribIndex(const __DRIconfig *config,
+@@ -527,9 +528,9 @@ driGetConfigAttribIndex(const __DRIconfig *config,
      __ATTRIB(__DRI_ATTRIB_GREEN_MASK,			greenMask);
      __ATTRIB(__DRI_ATTRIB_BLUE_MASK,			blueMask);
      __ATTRIB(__DRI_ATTRIB_ALPHA_MASK,			alphaMask);
@@ -38,11 +38,11 @@ index df5f8cbfdc0..28debe4e013 100644
      case __DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH:
      case __DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT:
      case __DRI_ATTRIB_VISUAL_SELECT_GROUP:
-diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
-index 8f77d4c58dd..e37c61d23d0 100644
---- a/src/mesa/main/mtypes.h
-+++ b/src/mesa/main/mtypes.h
-@@ -175,6 +175,11 @@ struct gl_config
+diff --git a/src/mesa/main/glconfig.h b/src/mesa/main/glconfig.h
+index d54a4f75cfd..f9aa5a06940 100644
+--- a/src/mesa/main/glconfig.h
++++ b/src/mesa/main/glconfig.h
+@@ -27,6 +27,11 @@ struct gl_config
     /* ARB_multisample / SGIS_multisample */
     GLuint samples;
  

+ 6 - 6
package/mesa3d/0067-egl_dri2-set-pbuffer-config-attribs-to-0-for-non-pbu.patch → package/mesa3d/0054-egl_dri2-set-pbuffer-config-attribs-to-0-for-non-pbu.patch

@@ -1,7 +1,7 @@
-From 9bb8868ebab2d041c24c76487b6419a8039a5ce7 Mon Sep 17 00:00:00 2001
+From 035839e9ee7778b46fe643056df35c3879e20d4a Mon Sep 17 00:00:00 2001
 From: Frank Binns <frank.binns@imgtec.com>
 Date: Wed, 4 Jun 2014 13:43:03 +0100
-Subject: [PATCH 67/67] egl_dri2: set pbuffer config attribs to 0 for
+Subject: [PATCH 54/58] egl_dri2: set pbuffer config attribs to 0 for
  non-pbuffer configs
 
 If the EGL_PBUFFER_BIT isn't set in the surface type, don't set the
@@ -14,10 +14,10 @@ values from the DRI config.
  1 file changed, 18 insertions(+), 2 deletions(-)
 
 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index 56b5175db6e..1b10c2e7362 100644
+index fce277c6874..152da09881e 100644
 --- a/src/egl/drivers/dri2/egl_dri2.c
 +++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -407,6 +407,7 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
+@@ -403,6 +403,7 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
     struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
     _EGLConfig base;
     unsigned int attrib, value, double_buffer;
@@ -25,7 +25,7 @@ index 56b5175db6e..1b10c2e7362 100644
     bool srgb = false;
     EGLint key, bind_to_texture_rgb, bind_to_texture_rgba;
     int dri_shifts[4] = { -1, -1, -1, -1 };
-@@ -530,11 +531,17 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
+@@ -526,11 +527,17 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
           break;
  
        case __DRI_ATTRIB_MAX_PBUFFER_WIDTH:
@@ -45,7 +45,7 @@ index 56b5175db6e..1b10c2e7362 100644
        case __DRI_ATTRIB_MUTABLE_RENDER_BUFFER:
           if (disp->Extensions.KHR_mutable_render_buffer)
              surface_type |= EGL_MUTABLE_RENDER_BUFFER_BIT_KHR;
-@@ -614,6 +621,15 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
+@@ -610,6 +617,15 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
        }
     }
  

+ 13 - 13
package/mesa3d/0068-GL_ARB_geometry_shader4-entry-points.patch → package/mesa3d/0055-GL_ARB_geometry_shader4-entry-points.patch

@@ -1,7 +1,7 @@
-From f9c028d508bac22d7c78b0232c625e27d13340a7 Mon Sep 17 00:00:00 2001
+From 33fe8986dacdf7968e6a0583e0a491c8f519b919 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Thu, 11 Nov 2021 12:09:38 +0000
-Subject: [PATCH 68/68] GL_ARB_geometry_shader4 entry points.
+Subject: [PATCH 55/58] GL_ARB_geometry_shader4 entry points.
 
 ---
  src/mapi/glapi/gen/ARB_geometry_shader4.xml | 97 +++++++++++++++++++++
@@ -114,10 +114,10 @@ index 00000000000..d92dc577b17
 +
 +</OpenGLAPI>
 diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
-index 4e35de0f4ea..d5a5e7f5386 100644
+index f6657e6ffeb..a6c2889a6e1 100644
 --- a/src/mapi/glapi/gen/gl_API.xml
 +++ b/src/mapi/glapi/gen/gl_API.xml
-@@ -8064,7 +8064,7 @@
+@@ -8066,7 +8066,7 @@
  
  <!-- 46. GL_ARB_framebuffer_sRGB -->
  
@@ -127,17 +127,17 @@ index 4e35de0f4ea..d5a5e7f5386 100644
  <!-- 48. GL_ARB_half_float_vertex -->
  
 diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
-index 974f366d7b4..833ad73dd6a 100644
+index b5b3ed9e9b8..6dca8614354 100644
 --- a/src/mapi/glapi/gen/static_data.py
 +++ b/src/mapi/glapi/gen/static_data.py
-@@ -1721,6 +1721,10 @@ offsets = {
-     "FramebufferRenderbufferEXT" : 1685,
-     "GetFramebufferAttachmentParameterivEXT" : 1686,
-     "GenerateMipmapEXT" : 1687,
-+    "ProgramParameteriARB" : 1688,
-+    "FramebufferTextureARB" : 1689,
-+    "FramebufferTextureLayerARB" : 1690,
-+    "FramebufferTextureFaceARB" : 1691,
+@@ -1722,6 +1722,10 @@ offsets = {
+     "FramebufferRenderbufferEXT" : 1686,
+     "GetFramebufferAttachmentParameterivEXT" : 1687,
+     "GenerateMipmapEXT" : 1688,
++    "ProgramParameteriARB" : 1689,
++    "FramebufferTextureARB" : 1690,
++    "FramebufferTextureLayerARB" : 1691,
++    "FramebufferTextureFaceARB" : 1692,
  }
  
  functions = [

+ 285 - 0
package/mesa3d/0056-egl-wayland-add-EGL_BUFFER_PRESERVED-support.patch

@@ -0,0 +1,285 @@
+From fa1e5e1225aecbf5228dbc5092d7a02141cd98f7 Mon Sep 17 00:00:00 2001
+From: brendan King <Brendan.King@imgtec.com>
+Date: Thu, 9 Sep 2021 17:55:13 +0100
+Subject: [PATCH 56/58] egl/wayland: add EGL_BUFFER_PRESERVED support
+
+When the next back buffer is obtained, and the swap method is
+EGL_BUFFER_PRESERVED, the current buffer contents are preserved with
+a blit, unless the DRI driver is using the image loader extension,
+and the DRI driver requests the current buffer contents
+(__DRI_IMAGE_BUFFER_PREV) as well as the back buffer. This allows the
+blit to be avoided for GPUs that can support EGL_BUFFER_PRESERVED
+directly.
+
+Querying the age of a back buffer may force a blit, but outside of EGL
+conformance testing, this would be an odd thing to do, as the buffer
+age can always be assumed to be 1 with EGL_BUFFER_PRESERVED.
+
+Any received dmabuf feedback may also force a blit.
+
+The IMG PVR driver does not support the DRI2 loader extension, which
+is why the buffer preserved support for the extension is less optimal,
+with the current buffer always being preserved with a blit.
+
+EGL_BUFFER_PRESERVED support has not been added for the Mesa software
+rasteriser.
+---
+ include/GL/internal/dri_interface.h     |  4 ++
+ src/egl/drivers/dri2/platform_wayland.c | 94 +++++++++++++++++++++----
+ 2 files changed, 83 insertions(+), 15 deletions(-)
+
+diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
+index 123349acb72..618eba9eaeb 100644
+--- a/include/GL/internal/dri_interface.h
++++ b/include/GL/internal/dri_interface.h
+@@ -2036,12 +2036,16 @@ enum __DRIimageBufferMask {
+     * OpenGL ES API and little change to the SurfaceFlinger API.
+     */
+    __DRI_IMAGE_BUFFER_SHARED = (1 << 2),
++#define DRI_IMAGE_HAS_BUFFER_PREV
++   __DRI_IMAGE_BUFFER_PREV = (1 << 31),
++
+ };
+ 
+ struct __DRIimageList {
+    uint32_t image_mask;
+    __DRIimage *back;
+    __DRIimage *front;
++   __DRIimage *prev;
+ };
+ 
+ #define __DRI_IMAGE_LOADER "DRI_IMAGE_LOADER"
+diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
+index 64c7a42eaeb..156a4524a54 100644
+--- a/src/egl/drivers/dri2/platform_wayland.c
++++ b/src/egl/drivers/dri2/platform_wayland.c
+@@ -962,12 +962,22 @@ dri2_wl_swap_interval(_EGLDisplay *disp, _EGLSurface *surf, EGLint interval)
+ }
+ 
+ static void
+-dri2_wl_release_buffers(struct dri2_egl_surface *dri2_surf)
++dri2_wl_release_buffers(struct dri2_egl_surface *dri2_surf,
++                        bool release_non_current,
++                        bool release_current)
+ {
+    struct dri2_egl_display *dri2_dpy =
+       dri2_egl_display(dri2_surf->base.Resource.Display);
+ 
+    for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
++      if (dri2_surf->current == &dri2_surf->color_buffers[i]) {
++         if (!release_current)
++            continue;
++      } else {
++         if (!release_non_current)
++            continue;
++      }
++
+       if (dri2_surf->color_buffers[i].wl_buffer) {
+          if (dri2_surf->color_buffers[i].locked) {
+             dri2_surf->color_buffers[i].wl_release = true;
+@@ -992,6 +1002,9 @@ dri2_wl_release_buffers(struct dri2_egl_surface *dri2_surf)
+ 
+    if (dri2_dpy->dri2)
+       dri2_egl_surface_free_local_buffers(dri2_surf);
++
++   if (release_current)
++      dri2_surf->current = NULL;
+ }
+ 
+ static void
+@@ -1114,7 +1127,8 @@ create_dri_image(struct dri2_egl_surface *dri2_surf,
+ }
+ 
+ static int
+-get_back_bo(struct dri2_egl_surface *dri2_surf)
++get_back_bo(struct dri2_egl_surface *dri2_surf, bool allow_preserve,
++            bool preserve_current)
+ {
+    struct dri2_egl_display *dri2_dpy =
+       dri2_egl_display(dri2_surf->base.Resource.Display);
+@@ -1200,6 +1214,28 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
+           return -1;
+    }
+ 
++   if ((allow_preserve || preserve_current) &&
++       dri2_surf->base.SwapBehavior == EGL_BUFFER_PRESERVED &&
++       dri2_surf->current && dri2_surf->back->age != 1) {
++         _EGLContext *ctx = _eglGetCurrentContext();
++         struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
++
++         if (dri2_ctx) {
++            dri2_dpy->image->blitImage(dri2_ctx->dri_context,
++                                       dri2_surf->back->dri_image,
++                                       dri2_surf->current->dri_image,
++                                       0, 0, dri2_surf->base.Width,
++                                       dri2_surf->base.Height,
++                                       0, 0, dri2_surf->base.Width,
++                                       dri2_surf->base.Height,
++                                       __BLIT_FLAG_FLUSH);
++            dri2_surf->back->age = 1;
++
++	    if (!preserve_current)
++               dri2_surf->current = NULL;
++	 }
++   }
++
+    dri2_surf->back->locked = true;
+ 
+    return 0;
+@@ -1257,8 +1293,12 @@ front_bo_to_dri_buffer(struct dri2_egl_display *dri2_dpy,
+ 
+ static int
+ update_buffers(struct dri2_egl_display *dri2_dpy,
+-               struct dri2_egl_surface *dri2_surf)
++               struct dri2_egl_surface *dri2_surf,
++               bool allow_preserve)
+ {
++   bool preserve_current = false;
++   int res;
++
+    if (dri2_surf->wl_win &&
+        (dri2_surf->base.Width != dri2_surf->wl_win->width ||
+         dri2_surf->base.Height != dri2_surf->wl_win->height)) {
+@@ -1268,12 +1308,20 @@ update_buffers(struct dri2_egl_display *dri2_dpy,
+    }
+ 
+    if (dri2_surf->resized || dri2_surf->received_dmabuf_feedback) {
+-      dri2_wl_release_buffers(dri2_surf);
++      preserve_current = !dri2_surf->resized &&
++         dri2_surf->base.SwapBehavior == EGL_BUFFER_PRESERVED;
++
++      dri2_wl_release_buffers(dri2_surf, true, !preserve_current);
+       dri2_surf->resized = false;
+       dri2_surf->received_dmabuf_feedback = false;
+    }
+ 
+-   if (get_back_bo(dri2_surf) < 0) {
++   res = get_back_bo(dri2_surf, allow_preserve, preserve_current);
++
++   if (preserve_current)
++         dri2_wl_release_buffers(dri2_surf, false, true);
++
++   if (res < 0) {
+       _eglError(EGL_BAD_ALLOC, "failed to allocate color buffer");
+       return -1;
+    }
+@@ -1303,12 +1351,13 @@ update_buffers(struct dri2_egl_display *dri2_dpy,
+ 
+ static int
+ update_buffers_if_needed(struct dri2_egl_display *dri2_dpy,
+-                         struct dri2_egl_surface *dri2_surf)
++                         struct dri2_egl_surface *dri2_surf,
++                         bool allow_preserve)
+ {
+    if (dri2_surf->back != NULL)
+       return 0;
+ 
+-   return update_buffers(dri2_dpy, dri2_surf);
++   return update_buffers(dri2_dpy, dri2_surf, allow_preserve);
+ }
+ 
+ static __DRIbuffer *
+@@ -1327,7 +1376,7 @@ dri2_wl_get_buffers_with_format(__DRIdrawable * driDrawable,
+ 
+       switch (attachments[i]) {
+       case __DRI_BUFFER_BACK_LEFT:
+-         if (update_buffers_if_needed(dri2_dpy, dri2_surf) < 0)
++         if (update_buffers_if_needed(dri2_dpy, dri2_surf, true) < 0)
+             return NULL;
+ 
+          back_bo_to_dri_buffer(dri2_dpy, dri2_surf, &dri2_surf->buffers[j]);
+@@ -1412,14 +1461,25 @@ image_get_buffers(__DRIdrawable *driDrawable,
+    buffers->image_mask = 0;
+    buffers->front = NULL;
+    buffers->back = NULL;
++   buffers->prev = NULL;
+ 
+    if (buffer_mask & __DRI_IMAGE_BUFFER_BACK)
+    {
+-      if (update_buffers_if_needed(dri2_dpy, dri2_surf) < 0)
++      bool buffer_prev = buffer_mask & __DRI_IMAGE_BUFFER_PREV;
++
++      if (update_buffers_if_needed(dri2_dpy, dri2_surf, !buffer_prev) < 0)
+          return 0;
+ 
+       buffers->image_mask |= __DRI_IMAGE_BUFFER_BACK;
+       buffers->back = dri2_surf->back->dri_image;
++
++      if (buffer_prev && dri2_surf->current &&
++          dri2_surf->base.SwapBehavior == EGL_BUFFER_PRESERVED)
++      {
++         buffers->image_mask |= __DRI_IMAGE_BUFFER_PREV;
++         buffers->prev = dri2_surf->current->dri_image;
++         dri2_surf->back->age = 1;
++      }
+    }
+ 
+    if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT)
+@@ -1689,7 +1749,7 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
+ 
+    /* Make sure we have a back buffer in case we're swapping without ever
+     * rendering. */
+-   if (update_buffers_if_needed(dri2_dpy, dri2_surf) < 0)
++   if (update_buffers_if_needed(dri2_dpy, dri2_surf, true) < 0)
+       return _eglError(EGL_BAD_ALLOC, "dri2_swap_buffers");
+ 
+    if (draw->SwapInterval > 0) {
+@@ -1780,7 +1840,7 @@ dri2_wl_query_buffer_age(_EGLDisplay *disp, _EGLSurface *surface)
+    if (surface->Type != EGL_WINDOW_BIT)
+       return 0;
+ 
+-   if (update_buffers_if_needed(dri2_dpy, dri2_surf) < 0) {
++   if (update_buffers_if_needed(dri2_dpy, dri2_surf, true) < 0) {
+       _eglError(EGL_BAD_ALLOC, "dri2_query_buffer_age");
+       return -1;
+    }
+@@ -2157,7 +2217,7 @@ static const __DRIextension *image_loader_extensions[] = {
+ };
+ 
+ static EGLBoolean
+-dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
++dri2_wl_add_configs_for_visuals(_EGLDisplay *disp, bool allow_preserve)
+ {
+    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+    unsigned int format_count[ARRAY_SIZE(dri2_wl_visuals)] = { 0 };
+@@ -2178,6 +2238,10 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
+          if (dri2_wl_visuals[j].wl_drm_format != WL_DRM_FORMAT_YUYV)
+             surface_type |= EGL_PBUFFER_BIT;
+ 
++         if (allow_preserve &&
++             dri2_dpy->image->base.version >= 9 && dri2_dpy->image->blitImage)
++            surface_type |= EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
++
+          dri2_conf = dri2_add_config(disp, dri2_dpy->driver_configs[i],
+                count + 1, surface_type, NULL, dri2_wl_visuals[j].rgba_shifts, dri2_wl_visuals[j].rgba_sizes);
+          if (dri2_conf) {
+@@ -2403,7 +2467,7 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
+       goto cleanup;
+    }
+ 
+-   if (!dri2_wl_add_configs_for_visuals(disp)) {
++   if (!dri2_wl_add_configs_for_visuals(disp, true)) {
+       _eglError(EGL_NOT_INITIALIZED, "DRI2: failed to add configs");
+       goto cleanup;
+    }
+@@ -2515,7 +2579,7 @@ swrast_update_buffers(struct dri2_egl_surface *dri2_surf)
+         dri2_surf->base.Height != dri2_surf->wl_win->height)) {
+ 
+       if (!zink)
+-         dri2_wl_release_buffers(dri2_surf);
++         dri2_wl_release_buffers(dri2_surf, true, true);
+ 
+       dri2_surf->base.Width  = dri2_surf->wl_win->width;
+       dri2_surf->base.Height = dri2_surf->wl_win->height;
+@@ -2962,7 +3026,7 @@ dri2_initialize_wayland_swrast(_EGLDisplay *disp)
+ 
+    dri2_wl_setup_swap_interval(disp);
+ 
+-   if (!dri2_wl_add_configs_for_visuals(disp)) {
++   if (!dri2_wl_add_configs_for_visuals(disp, false)) {
+       _eglError(EGL_NOT_INITIALIZED, "DRI2: failed to add configs");
+       goto cleanup;
+    }
+-- 
+2.25.1
+

+ 28 - 0
package/mesa3d/0057-glapi-restore-exec-dynamic.patch

@@ -0,0 +1,28 @@
+From 521c05973fe7e4433d89872cb2127b2e4c47941f Mon Sep 17 00:00:00 2001
+From: Brendan King <Brendan.King@imgtec.com>
+Date: Wed, 23 Mar 2022 12:57:01 +0000
+Subject: [PATCH 57/58] glapi: restore exec="dynamic"
+
+This is needed for the dispatch table entry points used by the IMG
+Rogue DDK driver, which have no implementation in Mesa. Using
+exec="dynamic" avoids the need to create stubs in Mesa for the
+unimplemented functions.
+---
+ src/mapi/glapi/gen/api_exec_init.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/mapi/glapi/gen/api_exec_init.py b/src/mapi/glapi/gen/api_exec_init.py
+index ec1c2ea6b88..e10097f921f 100644
+--- a/src/mapi/glapi/gen/api_exec_init.py
++++ b/src/mapi/glapi/gen/api_exec_init.py
+@@ -33,6 +33,7 @@ import apiexec
+ 
+ 
+ exec_flavor_map = {
++    'dynamic': None,
+     'vtxfmt': None,
+     'dlist': '_mesa_',
+     'mesa': '_mesa_',
+-- 
+2.25.1
+

+ 0 - 143
package/mesa3d/0057-vulkan-wsi-Allow-host-visible-memory-to-be-requested.patch

@@ -1,143 +0,0 @@
-From b900d4998b95a8bdfb01600f81635ff76810cfe6 Mon Sep 17 00:00:00 2001
-From: Brendan King <Brendan.King@imgtec.com>
-Date: Tue, 16 Feb 2021 20:17:32 +0000
-Subject: [PATCH 57/67] vulkan/wsi: Allow host visible memory to be requested
-
-Allow host visible memory to be explicitly requested when allocating
-native images.
-
-For a software driver on X11, we need to be able to map the memory on
-the host, in order to present the contents to the X Server.
----
- src/vulkan/wsi/wsi_common_display.c |  2 +-
- src/vulkan/wsi/wsi_common_drm.c     | 17 +++++++++++++----
- src/vulkan/wsi/wsi_common_private.h |  1 +
- src/vulkan/wsi/wsi_common_wayland.c |  3 ++-
- src/vulkan/wsi/wsi_common_x11.c     |  1 +
- 5 files changed, 18 insertions(+), 6 deletions(-)
-
-diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c
-index aa07cada107..71a84e54079 100644
---- a/src/vulkan/wsi/wsi_common_display.c
-+++ b/src/vulkan/wsi/wsi_common_display.c
-@@ -1031,7 +1031,7 @@ wsi_display_image_init(VkDevice device_h,
-       return VK_ERROR_DEVICE_LOST;
- 
-    VkResult result = wsi_create_native_image(&chain->base, create_info,
--                                             0, NULL, NULL,
-+                                             0, NULL, NULL, false,
-                                              &image->base);
-    if (result != VK_SUCCESS)
-       return result;
-diff --git a/src/vulkan/wsi/wsi_common_drm.c b/src/vulkan/wsi/wsi_common_drm.c
-index 70d934aef13..aabb761908c 100644
---- a/src/vulkan/wsi/wsi_common_drm.c
-+++ b/src/vulkan/wsi/wsi_common_drm.c
-@@ -66,6 +66,7 @@ wsi_device_matches_drm_fd(const struct wsi_device *wsi, int drm_fd)
- static uint32_t
- select_memory_type(const struct wsi_device *wsi,
-                    bool want_device_local,
-+                   bool want_host_visible,
-                    uint32_t type_bits)
- {
-    assert(type_bits);
-@@ -74,8 +75,10 @@ select_memory_type(const struct wsi_device *wsi,
-    for (uint32_t i = 0; i < wsi->memory_props.memoryTypeCount; i++) {
-        const VkMemoryType type = wsi->memory_props.memoryTypes[i];
-        bool local = type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
-+       bool host = type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
- 
--       if ((type_bits & (1 << i)) && local == want_device_local)
-+       if ((type_bits & (1 << i)) && local == want_device_local &&
-+            (!want_host_visible || host))
-          return i;
-        all_local &= local;
-    }
-@@ -83,6 +86,8 @@ select_memory_type(const struct wsi_device *wsi,
-    /* ignore want_device_local when all memory types are device-local */
-    if (all_local) {
-       assert(!want_device_local);
-+      /* currently, host visibility is only needed with device local */
-+      assert(!want_host_visible);
-       return ffs(type_bits) - 1;
-    }
- 
-@@ -107,6 +112,7 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
-                         uint32_t num_modifier_lists,
-                         const uint32_t *num_modifiers,
-                         const uint64_t *const *modifiers,
-+                        bool host_visible,
-                         struct wsi_image *image)
- {
-    const struct wsi_device *wsi = chain->wsi;
-@@ -317,7 +323,8 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
-       .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
-       .pNext = &memory_dedicated_info,
-       .allocationSize = reqs.size,
--      .memoryTypeIndex = select_memory_type(wsi, true, reqs.memoryTypeBits),
-+      .memoryTypeIndex = select_memory_type(wsi, true, host_visible,
-+                                            reqs.memoryTypeBits),
-    };
-    result = wsi->AllocateMemory(chain->device, &memory_info,
-                                 &chain->alloc, &image->memory);
-@@ -488,7 +495,8 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
-       .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
-       .pNext = &prime_memory_dedicated_info,
-       .allocationSize = linear_size,
--      .memoryTypeIndex = select_memory_type(wsi, false, reqs.memoryTypeBits),
-+      .memoryTypeIndex = select_memory_type(wsi, false, false,
-+                                            reqs.memoryTypeBits),
-    };
-    result = wsi->AllocateMemory(chain->device, &prime_memory_info,
-                                 &chain->alloc, &image->prime.memory);
-@@ -542,7 +550,8 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
-       .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
-       .pNext = &memory_dedicated_info,
-       .allocationSize = reqs.size,
--      .memoryTypeIndex = select_memory_type(wsi, true, reqs.memoryTypeBits),
-+      .memoryTypeIndex = select_memory_type(wsi, true, false,
-+                                            reqs.memoryTypeBits),
-    };
-    result = wsi->AllocateMemory(chain->device, &memory_info,
-                                 &chain->alloc, &image->memory);
-diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h
-index 1fe8211f9cb..5ad087b32e0 100644
---- a/src/vulkan/wsi/wsi_common_private.h
-+++ b/src/vulkan/wsi/wsi_common_private.h
-@@ -94,6 +94,7 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
-                         uint32_t num_modifier_lists,
-                         const uint32_t *num_modifiers,
-                         const uint64_t *const *modifiers,
-+                        bool host_visible,
-                         struct wsi_image *image);
- 
- VkResult
-diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
-index 40f5338314f..983833e880b 100644
---- a/src/vulkan/wsi/wsi_common_wayland.c
-+++ b/src/vulkan/wsi/wsi_common_wayland.c
-@@ -1074,7 +1074,8 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
-    result = wsi_create_native_image(&chain->base, pCreateInfo,
-                                     chain->num_drm_modifiers > 0 ? 1 : 0,
-                                     &chain->num_drm_modifiers,
--                                    &chain->drm_modifiers, &image->base);
-+                                    &chain->drm_modifiers, false,
-+                                    &image->base);
- 
-    if (result != VK_SUCCESS)
-       return result;
-diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
-index 9eb624df640..eb639d6c265 100644
---- a/src/vulkan/wsi/wsi_common_x11.c
-+++ b/src/vulkan/wsi/wsi_common_x11.c
-@@ -1315,6 +1315,7 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain,
-    } else {
-       result = wsi_create_native_image(&chain->base, pCreateInfo,
-                                        num_tranches, num_modifiers, modifiers,
-+                                       chain->base.wsi->sw,
-                                        &image->base);
-    }
-    if (result < 0)
--- 
-2.25.1
-

+ 42 - 0
package/mesa3d/0058-Revert-meson-check-mtls-if-has_exe_wrapper.patch

@@ -0,0 +1,42 @@
+From cd53160de9ca913e68a1d826b701e5569fa0ef42 Mon Sep 17 00:00:00 2001
+From: Brendan King <Brendan.King@imgtec.com>
+Date: Fri, 29 Apr 2022 14:48:06 +0100
+Subject: [PATCH 58/58] Revert "meson: check -mtls if has_exe_wrapper"
+
+This reverts commit 558bc2227ed00fc6a29c2a10c0b99719cd445c6c.
+
+The change breaks 32 bit x86 cross compilation on x86_64 systems, as
+meson.has_exe_wrapper returns true, but Meson fails with:
+
+    Build machine cpu family: x86_64
+    Build machine cpu: x86_64
+    Host machine cpu family: x86
+    Host machine cpu: i686
+    Target machine cpu family: x86
+    Target machine cpu: i686
+    Checking if "thread_local" compiles: YES
+
+    meson.build:555:4: ERROR: Can not run test applications in this
+    cross environment.
+
+See also https://github.com/mesonbuild/meson/issues/9845
+---
+ meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/meson.build b/meson.build
+index 31b6ffdb060..63d487ae7b1 100644
+--- a/meson.build
++++ b/meson.build
+@@ -550,7 +550,7 @@ endforeach
+ if not have_mtls_dialect
+   # need .run to check libc support. meson aborts when calling .run when
+   # cross-compiling, but because this is just an optimization we can skip it
+-  if meson.is_cross_build() and not meson.has_exe_wrapper()
++  if meson.is_cross_build()
+     warning('cannot auto-detect -mtls-dialect when cross-compiling, using compiler default')
+   else
+     # -fpic to force dynamic tls, otherwise TLS relaxation defeats check
+-- 
+2.25.1
+

+ 0 - 419
package/mesa3d/0058-vulkan-wsi-make-the-display-FD-available.patch

@@ -1,419 +0,0 @@
-From afcfb076e89365ff1f33c658a6a615d2108d97f5 Mon Sep 17 00:00:00 2001
-From: Brendan King <Brendan.King@imgtec.com>
-Date: Thu, 17 Jun 2021 17:17:07 +0100
-Subject: [PATCH 58/67] vulkan/wsi: make the display FD available
-
-Pass the display FD to the Vulkan image create and memory
-allocation functions when allocating swapchain images.
----
- src/vulkan/wsi/wsi_common.h         |  14 +++
- src/vulkan/wsi/wsi_common_display.c |   2 +-
- src/vulkan/wsi/wsi_common_drm.c     |  22 ++++-
- src/vulkan/wsi/wsi_common_private.h |   2 +
- src/vulkan/wsi/wsi_common_wayland.c | 127 ++++++++++++++++++++++------
- src/vulkan/wsi/wsi_common_x11.c     |  42 ++++++---
- 6 files changed, 169 insertions(+), 40 deletions(-)
-
-diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
-index d5367db3a94..c2563c677e6 100644
---- a/src/vulkan/wsi/wsi_common.h
-+++ b/src/vulkan/wsi/wsi_common.h
-@@ -37,6 +37,8 @@
- #define VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA (VkStructureType)1000001003
- #define VK_STRUCTURE_TYPE_WSI_SURFACE_SUPPORTED_COUNTERS_MESA (VkStructureType)1000001005
- #define VK_STRUCTURE_TYPE_WSI_MEMORY_SIGNAL_SUBMIT_INFO_MESA (VkStructureType)1000001006
-+#define VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO2_MESA (VkStructureType)1000001007
-+#define VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO2_MESA (VkStructureType)1000001008
- 
- /* This is always chained to VkImageCreateInfo when a wsi image is created.
-  * It indicates that the image can be transitioned to/from
-@@ -75,6 +77,18 @@ struct wsi_memory_signal_submit_info {
-     VkDeviceMemory memory;
- };
- 
-+struct wsi_image_create_info2 {
-+    VkStructureType sType;
-+    const void *pNext;
-+    int display_fd;
-+};
-+
-+struct wsi_memory_allocate_info2 {
-+    VkStructureType sType;
-+    const void *pNext;
-+    int display_fd;
-+};
-+
- struct wsi_fence {
-    VkDevice                     device;
-    const struct wsi_device      *wsi_device;
-diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c
-index 71a84e54079..f135b4e38de 100644
---- a/src/vulkan/wsi/wsi_common_display.c
-+++ b/src/vulkan/wsi/wsi_common_display.c
-@@ -1032,7 +1032,7 @@ wsi_display_image_init(VkDevice device_h,
- 
-    VkResult result = wsi_create_native_image(&chain->base, create_info,
-                                              0, NULL, NULL, false,
--                                             &image->base);
-+                                             wsi->fd, &image->base);
-    if (result != VK_SUCCESS)
-       return result;
- 
-diff --git a/src/vulkan/wsi/wsi_common_drm.c b/src/vulkan/wsi/wsi_common_drm.c
-index aabb761908c..6201891ca80 100644
---- a/src/vulkan/wsi/wsi_common_drm.c
-+++ b/src/vulkan/wsi/wsi_common_drm.c
-@@ -113,6 +113,7 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
-                         const uint32_t *num_modifiers,
-                         const uint64_t *const *modifiers,
-                         bool host_visible,
-+                        int display_fd,
-                         struct wsi_image *image)
- {
-    const struct wsi_device *wsi = chain->wsi;
-@@ -170,6 +171,12 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
-       __vk_append_struct(&image_info, &image_format_list);
-    }
- 
-+   struct wsi_image_create_info2 image_wsi_info2 = {
-+      .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO2_MESA,
-+      .display_fd = display_fd,
-+   };
-+   __vk_append_struct(&image_info, &image_wsi_info2);
-+
-    VkImageDrmFormatModifierListCreateInfoEXT image_modifier_list;
- 
-    uint32_t image_modifier_count = 0, modifier_prop_count = 0;
-@@ -308,9 +315,14 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
-       .pNext = NULL,
-       .implicit_sync = true,
-    };
-+   const struct wsi_memory_allocate_info2 memory_wsi_info2 = {
-+      .sType = VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO2_MESA,
-+      .pNext = &memory_wsi_info,
-+      .display_fd = display_fd,
-+   };
-    const VkExportMemoryAllocateInfo memory_export_info = {
-       .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
--      .pNext = &memory_wsi_info,
-+      .pNext = &memory_wsi_info2,
-       .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
-    };
-    const VkMemoryDedicatedAllocateInfo memory_dedicated_info = {
-@@ -440,6 +452,7 @@ VkResult
- wsi_create_prime_image(const struct wsi_swapchain *chain,
-                        const VkSwapchainCreateInfoKHR *pCreateInfo,
-                        bool use_modifier,
-+                       int display_fd,
-                        struct wsi_image *image)
- {
-    const struct wsi_device *wsi = chain->wsi;
-@@ -480,9 +493,14 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
-       .pNext = NULL,
-       .implicit_sync = true,
-    };
-+   const struct wsi_memory_allocate_info2 memory_wsi_info2 = {
-+      .sType = VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO2_MESA,
-+      .pNext = &memory_wsi_info,
-+      .display_fd = display_fd,
-+   };
-    const VkExportMemoryAllocateInfo prime_memory_export_info = {
-       .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
--      .pNext = &memory_wsi_info,
-+      .pNext = &memory_wsi_info2,
-       .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
-    };
-    const VkMemoryDedicatedAllocateInfo prime_memory_dedicated_info = {
-diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h
-index 5ad087b32e0..e46328156dc 100644
---- a/src/vulkan/wsi/wsi_common_private.h
-+++ b/src/vulkan/wsi/wsi_common_private.h
-@@ -95,12 +95,14 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
-                         const uint32_t *num_modifiers,
-                         const uint64_t *const *modifiers,
-                         bool host_visible,
-+                        int display_fd,
-                         struct wsi_image *image);
- 
- VkResult
- wsi_create_prime_image(const struct wsi_swapchain *chain,
-                        const VkSwapchainCreateInfoKHR *pCreateInfo,
-                        bool use_modifier,
-+                       int display_fd,
-                        struct wsi_image *image);
- 
- void
-diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
-index 983833e880b..1109d3f07b6 100644
---- a/src/vulkan/wsi/wsi_common_wayland.c
-+++ b/src/vulkan/wsi/wsi_common_wayland.c
-@@ -32,6 +32,8 @@
- #include <pthread.h>
- #include <poll.h>
- #include <sys/mman.h>
-+#include <fcntl.h>
-+#include <xf86drm.h>
- 
- #include "drm-uapi/drm_fourcc.h"
- 
-@@ -82,6 +84,9 @@ struct wsi_wl_display {
- 
-    struct wsi_wayland *wsi_wl;
- 
-+   int                                          fd;
-+   bool                                         authenticated;
-+
-    /* Points to formats in wsi_wl_display_drm or wsi_wl_display_dmabuf */
-    struct u_vector *                            formats;
- 
-@@ -261,10 +266,52 @@ wsi_wl_display_add_wl_shm_format(struct wsi_wl_display *display,
-    }
- }
- 
-+static int
-+open_display_device(const char *name)
-+{
-+   int fd;
-+
-+#ifdef O_CLOEXEC
-+   fd = open(name, O_RDWR | O_CLOEXEC);
-+   if (fd != -1 || errno != EINVAL) {
-+      return fd;
-+   }
-+#endif
-+
-+   fd = open(name, O_RDWR);
-+   if (fd != -1) {
-+      long flags = fcntl(fd, F_GETFD);
-+
-+      if (flags != -1) {
-+         if (!fcntl(fd, F_SETFD, flags | FD_CLOEXEC))
-+             return fd;
-+      }
-+      close (fd);
-+   }
-+
-+   return -1;
-+}
- 
- static void
- drm_handle_device(void *data, struct wl_drm *drm, const char *name)
- {
-+   struct wsi_wl_display *display = data;
-+   const int fd = open_display_device(name);
-+
-+   if (fd != -1) {
-+      if (drmGetNodeTypeFromFd(fd) != DRM_NODE_RENDER) {
-+         drm_magic_t magic;
-+
-+         if (drmGetMagic(fd, &magic)) {
-+            close(fd);
-+	    return;
-+         }
-+	 wl_drm_authenticate(drm, magic);
-+      } else {
-+         display->authenticated = true;
-+      }
-+      display->fd = fd;
-+   }
- }
- 
- static uint32_t
-@@ -346,6 +393,9 @@ drm_handle_format(void *data, struct wl_drm *drm, uint32_t wl_format)
- static void
- drm_handle_authenticated(void *data, struct wl_drm *drm)
- {
-+   struct wsi_wl_display *display = data;
-+
-+   display->authenticated = true;
- }
- 
- static void
-@@ -487,6 +537,9 @@ wsi_wl_display_finish(struct wsi_wl_display *display)
-       wl_proxy_wrapper_destroy(display->wl_display_wrapper);
-    if (display->queue)
-       wl_event_queue_destroy(display->queue);
-+
-+   if (display->fd != -1)
-+      close(display->fd);
- }
- 
- static VkResult
-@@ -501,6 +554,7 @@ wsi_wl_display_init(struct wsi_wayland *wsi_wl,
-    display->wsi_wl = wsi_wl;
-    display->wl_display = wl_display;
-    display->sw = sw;
-+   display->fd = -1;
- 
-    if (get_format_list) {
-       if (!u_vector_init(&display->swrast.formats, sizeof(VkFormat), 8) ||
-@@ -542,41 +596,60 @@ wsi_wl_display_init(struct wsi_wayland *wsi_wl,
-    /* Round-trip to get wl_drms and zwp_linux_dmabuf_v1 globals */
-    wl_display_roundtrip_queue(display->wl_display, display->queue);
- 
-+   if (!display->drm.wl_drm && !display->dmabuf.wl_dmabuf && !display->swrast.wl_shm) {
-+      result = VK_ERROR_SURFACE_LOST_KHR;
-+      goto fail_registry;
-+   }
-+
-    /* Round-trip again to get formats, modifiers and capabilities */
--   if (display->drm.wl_drm || display->dmabuf.wl_dmabuf || display->swrast.wl_shm)
--      wl_display_roundtrip_queue(display->wl_display, display->queue);
-+   wl_display_roundtrip_queue(display->wl_display, display->queue);
- 
--   if (wsi_wl->wsi->force_bgra8_unorm_first) {
--      /* Find BGRA8_UNORM in the list and swap it to the first position if we
--       * can find it.  Some apps get confused if SRGB is first in the list.
--       */
--      VkFormat *first_fmt = u_vector_head(display->formats);
--      VkFormat *iter_fmt;
--      u_vector_foreach(iter_fmt, display->formats) {
--         if (*iter_fmt == VK_FORMAT_B8G8R8A8_UNORM) {
--            *iter_fmt = *first_fmt;
--            *first_fmt = VK_FORMAT_B8G8R8A8_UNORM;
--            break;
--         }
--      }
-+   if (display->fd == -1) {
-+      result = VK_ERROR_SURFACE_LOST_KHR;
-+      goto fail_registry;
-    }
- 
--   /* Prefer the linux-dmabuf protocol if available */
--   if (display->sw)
--      display->formats = &display->swrast.formats;
--   else if (display->dmabuf.wl_dmabuf) {
--      display->formats = &display->dmabuf.formats;
--   } else if (display->drm.wl_drm &&
--       (display->drm.capabilities & WL_DRM_CAPABILITY_PRIME)) {
--      /* We need prime support for wl_drm */
--      display->formats = &display->drm.formats;
--   }
-+   wl_display_roundtrip_queue(display->wl_display, display->queue);
- 
--   if (!display->formats) {
-+   if (!display->authenticated) {
-       result = VK_ERROR_SURFACE_LOST_KHR;
-       goto fail_registry;
-    }
- 
-+   if (get_format_list) {
-+      /* Prefer the linux-dmabuf protocol if available */
-+      if (display->sw)
-+         display->formats = &display->swrast.formats;
-+      else if(display->dmabuf.wl_dmabuf &&
-+          u_vector_length(&display->dmabuf.formats)) {
-+         display->formats = &display->dmabuf.formats;
-+      } else if (display->drm.wl_drm &&
-+                 display->drm.capabilities & WL_DRM_CAPABILITY_PRIME) {
-+         display->formats = &display->drm.formats;
-+      }
-+
-+      if (!display->formats) {
-+         result = VK_ERROR_SURFACE_LOST_KHR;
-+         goto fail_registry;
-+      }
-+
-+      if (wsi_wl->wsi->force_bgra8_unorm_first) {
-+         /* Find BGRA8_UNORM in the list and swap it to the first position if
-+          * we can find it.  Some apps get confused if SRGB is first in the
-+          * list.
-+          */
-+         VkFormat *first_fmt = u_vector_tail(display->formats);
-+         VkFormat *iter_fmt;
-+         u_vector_foreach(iter_fmt, display->formats) {
-+            if (*iter_fmt == VK_FORMAT_B8G8R8A8_UNORM) {
-+               *iter_fmt = *first_fmt;
-+               *first_fmt = VK_FORMAT_B8G8R8A8_UNORM;
-+               break;
-+            }
-+         }
-+      }
-+   }
-+
-    /* We don't need this anymore */
-    wl_registry_destroy(registry);
- 
-@@ -1075,7 +1148,7 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
-                                     chain->num_drm_modifiers > 0 ? 1 : 0,
-                                     &chain->num_drm_modifiers,
-                                     &chain->drm_modifiers, false,
--                                    &image->base);
-+                                    display->fd, &image->base);
- 
-    if (result != VK_SUCCESS)
-       return result;
-diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
-index eb639d6c265..ba64e260932 100644
---- a/src/vulkan/wsi/wsi_common_x11.c
-+++ b/src/vulkan/wsi/wsi_common_x11.c
-@@ -1303,7 +1303,8 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain,
-                const VkAllocationCallbacks* pAllocator,
-                const uint64_t *const *modifiers,
-                const uint32_t *num_modifiers,
--               int num_tranches, struct x11_image *image)
-+               int num_tranches, int display_fd,
-+               struct x11_image *image)
- {
-    xcb_void_cookie_t cookie;
-    VkResult result;
-@@ -1311,11 +1312,12 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain,
- 
-    if (chain->base.use_prime_blit) {
-       bool use_modifier = num_tranches > 0;
--      result = wsi_create_prime_image(&chain->base, pCreateInfo, use_modifier, &image->base);
-+      result = wsi_create_prime_image(&chain->base, pCreateInfo, use_modifier,
-+                                      display_fd, &image->base);
-    } else {
-       result = wsi_create_native_image(&chain->base, pCreateInfo,
-                                        num_tranches, num_modifiers, modifiers,
--                                       chain->base.wsi->sw,
-+                                       chain->base.wsi->sw, display_fd,
-                                        &image->base);
-    }
-    if (result < 0)
-@@ -1687,14 +1689,34 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
-                                  modifiers, num_modifiers, &num_tranches,
-                                  pAllocator);
- 
-+
-    uint32_t image = 0;
--   for (; image < chain->base.image_count; image++) {
--      result = x11_image_init(device, chain, pCreateInfo, pAllocator,
--                              (const uint64_t *const *)modifiers,
--                              num_modifiers, num_tranches,
--                              &chain->images[image]);
--      if (result != VK_SUCCESS)
--         goto fail_init_images;
-+   {
-+      int display_fd = -1;
-+
-+      if (!wsi_device->sw) {
-+         xcb_screen_iterator_t screen_iter =
-+            xcb_setup_roots_iterator(xcb_get_setup(conn));
-+         xcb_screen_t *screen = screen_iter.data;
-+
-+         display_fd = wsi_dri3_open(conn, screen->root, None);
-+      }
-+
-+      for (; image < chain->base.image_count; image++) {
-+         result = x11_image_init(device, chain, pCreateInfo, pAllocator,
-+                                 (const uint64_t *const *)modifiers,
-+                                 num_modifiers, num_tranches,
-+                                 display_fd, &chain->images[image]);
-+         if (result != VK_SUCCESS) {
-+            if (display_fd >= 0)
-+               close(display_fd);
-+
-+            goto fail_init_images;
-+         }
-+      }
-+
-+      if (display_fd >= 0)
-+         close(display_fd);
-    }
- 
-    if ((chain->base.present_mode == VK_PRESENT_MODE_FIFO_KHR ||
--- 
-2.25.1
-

+ 85 - 0
package/mesa3d/0059-gbm-add-GBM_FORMAT_AXBXGXRX106106106106.patch

@@ -0,0 +1,85 @@
+From 81f126f4dde3fd866b480a56ae5a2c105656534c Mon Sep 17 00:00:00 2001
+From: Brendan King <Brendan.King@imgtec.com>
+Date: Mon, 18 Jul 2022 13:00:31 +0100
+Subject: [PATCH 59/60] gbm: add GBM_FORMAT_AXBXGXRX106106106106
+
+---
+ include/GL/internal/dri_interface.h | 1 +
+ src/egl/drivers/dri2/egl_dri2.c     | 1 +
+ src/gbm/backends/dri/gbm_dri.c      | 5 +++++
+ src/gbm/main/gbm.c                  | 1 +
+ src/gbm/main/gbm.h                  | 6 ++++++
+ 5 files changed, 14 insertions(+)
+
+diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
+index 618eba9eaeb..d04f6018e79 100644
+--- a/include/GL/internal/dri_interface.h
++++ b/include/GL/internal/dri_interface.h
+@@ -1272,6 +1272,7 @@ struct __DRIdri2ExtensionRec {
+ #define __DRI_IMAGE_FORMAT_YV12         0x101e
+ #define __DRI_IMAGE_FORMAT_YVYU         0x101f
+ #define __DRI_IMAGE_FORMAT_VYUY         0x1020
++#define __DRI_IMAGE_FORMAT_AXBXGXRX106106106106 0x1021
+ 
+ #define __DRI_IMAGE_USE_SHARE		0x0001
+ #define __DRI_IMAGE_USE_SCANOUT		0x0002
+diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
+index 152da09881e..d803142044c 100644
+--- a/src/egl/drivers/dri2/egl_dri2.c
++++ b/src/egl/drivers/dri2/egl_dri2.c
+@@ -2865,6 +2865,7 @@ dri2_num_fourcc_format_planes(EGLint format)
+    case DRM_FORMAT_BGRA1010102:
+    case DRM_FORMAT_XBGR16161616F:
+    case DRM_FORMAT_ABGR16161616F:
++   case DRM_FORMAT_AXBXGXRX106106106106:
+    case DRM_FORMAT_YUYV:
+    case DRM_FORMAT_YVYU:
+    case DRM_FORMAT_UYVY:
+diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
+index 2b60a469559..824495f6f85 100644
+--- a/src/gbm/backends/dri/gbm_dri.c
++++ b/src/gbm/backends/dri/gbm_dri.c
+@@ -642,6 +642,11 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = {
+      { 0, 10, 20, 30 },
+      { 10, 10, 10, 2 },
+    },
++   {
++     GBM_FORMAT_AXBXGXRX106106106106, __DRI_IMAGE_FORMAT_AXBXGXRX106106106106,
++     { 6, 22, 38, 54 },
++     { 10, 10, 10, 10 },
++   },
+    {
+      GBM_FORMAT_XBGR16161616F, __DRI_IMAGE_FORMAT_XBGR16161616F,
+      { 0, 16, 32, -1 },
+diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c
+index 3ce816f5169..e39d0656e68 100644
+--- a/src/gbm/main/gbm.c
++++ b/src/gbm/main/gbm.c
+@@ -275,6 +275,7 @@ gbm_bo_get_bpp(struct gbm_bo *bo)
+          return 32;
+       case GBM_FORMAT_XBGR16161616F:
+       case GBM_FORMAT_ABGR16161616F:
++      case GBM_FORMAT_AXBXGXRX106106106106:
+          return 64;
+    }
+ }
+diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
+index bd4185b723f..f3ab7999b58 100644
+--- a/src/gbm/main/gbm.h
++++ b/src/gbm/main/gbm.h
+@@ -166,6 +166,12 @@ enum gbm_bo_format {
+ 
+ #define GBM_FORMAT_ABGR16161616F __gbm_fourcc_code('A', 'B', '4', 'H') /* [63:0] A:B:G:R 16:16:16:16 little endian */
+ 
++/*
++ * RGBA format with 10-bit components packed in 64-bit per pixel, with 6 bits
++ * of unused padding per component:
++ */
++#define GBM_FORMAT_AXBXGXRX106106106106 __gbm_fourcc_code('A', 'B', '1', '0') /* [63:0] A:x:B:x:G:x:R:x 10:6:10:6:10:6:10:6 little endian */
++
+ /* packed YCbCr */
+ #define GBM_FORMAT_YUYV		__gbm_fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */
+ #define GBM_FORMAT_YVYU		__gbm_fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */
+-- 
+2.25.1
+

+ 0 - 1343
package/mesa3d/0059-pvr-wsi-add-PowerVR-Vulkan-WSI-library.patch

@@ -1,1343 +0,0 @@
-From 650cbfe1007a3f9dd4ef8a3bbe829bbfed4ab1cc Mon Sep 17 00:00:00 2001
-From: Brendan King <Brendan.King@imgtec.com>
-Date: Thu, 18 Mar 2021 13:44:57 +0000
-Subject: [PATCH 59/67] pvr/wsi: add PowerVR Vulkan WSI library
-
-PowerVR Vulkan will load the WSI library, libpvr_mesa_wsi.so,
-and lookup the symbol pvr_mesa_wsi_sym_addr, which is a used to
-lookup all other symbols required by Vulkan from the library.
-The function is used by Vulkan to lookup the library initialisation
-function, pvr_mesa_wsi_init. That function is passed the address
-of another lookup function, pvr_vk_mesa_wsi_sym_addr, which is used
-by the WSI library to lookup symbols in Vulkan.
-
-The interface between PVR Vulkan and the WSI library is defined in
-pvr_mesa_wsi_interface.h. Most of the functions defined on the WSI
-side are wrappers around Mesa WSI functions.
----
- meson.build                          |   1 +
- meson_options.txt                    |   2 +-
- src/meson.build                      |   3 +
- src/pvr/meson.build                  |  23 ++
- src/pvr/wsi/meson.build              |  75 ++++++
- src/pvr/wsi/pvr_mesa_wsi_interface.h | 306 ++++++++++++++++++++++++
- src/pvr/wsi/pvr_wsi.c                | 333 +++++++++++++++++++++++++++
- src/pvr/wsi/pvr_wsi.h                |  78 +++++++
- src/pvr/wsi/pvr_wsi_display.c        | 293 +++++++++++++++++++++++
- src/pvr/wsi/pvr_wsi_wayland.c        |  45 ++++
- src/pvr/wsi/pvr_wsi_x11.c            |  62 +++++
- 11 files changed, 1220 insertions(+), 1 deletion(-)
- create mode 100644 src/pvr/meson.build
- create mode 100644 src/pvr/wsi/meson.build
- create mode 100644 src/pvr/wsi/pvr_mesa_wsi_interface.h
- create mode 100644 src/pvr/wsi/pvr_wsi.c
- create mode 100644 src/pvr/wsi/pvr_wsi.h
- create mode 100644 src/pvr/wsi/pvr_wsi_display.c
- create mode 100644 src/pvr/wsi/pvr_wsi_wayland.c
- create mode 100644 src/pvr/wsi/pvr_wsi_x11.c
-
-diff --git a/meson.build b/meson.build
-index 8db1699729a..9341e5500fc 100644
---- a/meson.build
-+++ b/meson.build
-@@ -296,6 +296,7 @@ with_swrast_vk = _vulkan_drivers.contains('swrast')
- with_virtio_vk = _vulkan_drivers.contains('virtio-experimental')
- with_freedreno_kgsl = get_option('freedreno-kgsl')
- with_broadcom_vk = _vulkan_drivers.contains('broadcom')
-+with_pvr_vk = _vulkan_drivers.contains('pvr')
- with_any_vk = _vulkan_drivers.length() != 0
- 
- with_any_broadcom = with_gallium_vc4 or with_gallium_v3d or with_broadcom_vk
-diff --git a/meson_options.txt b/meson_options.txt
-index d36e714ea4c..e0c25a5b15b 100644
---- a/meson_options.txt
-+++ b/meson_options.txt
-@@ -194,7 +194,7 @@ option(
-   'vulkan-drivers',
-   type : 'array',
-   value : ['auto'],
--  choices : ['auto', 'amd', 'broadcom', 'freedreno', 'intel', 'panfrost', 'swrast', 'virtio-experimental'],
-+  choices : ['auto', 'amd', 'broadcom', 'freedreno', 'intel', 'panfrost', 'swrast', 'virtio-experimental', 'pvr'],
-   description : 'List of vulkan drivers to build. If this is set to auto all drivers applicable to the target OS/architecture will be built'
- )
- option(
-diff --git a/src/meson.build b/src/meson.build
-index f6eede56648..36fec262020 100644
---- a/src/meson.build
-+++ b/src/meson.build
-@@ -90,6 +90,9 @@ endif
- if with_gallium_panfrost or with_gallium_lima or with_panfrost_vk
-   subdir('panfrost')
- endif
-+if with_pvr_vk
-+  subdir('pvr')
-+endif
- if with_gallium_virgl or with_virtio_vk
-   subdir('virtio')
- endif
-diff --git a/src/pvr/meson.build b/src/pvr/meson.build
-new file mode 100644
-index 00000000000..09a6986a4c9
---- /dev/null
-+++ b/src/pvr/meson.build
-@@ -0,0 +1,23 @@
-+# Copyright (c) Imagination Technologies Ltd.
-+
-+# Permission is hereby granted, free of charge, to any person obtaining a copy
-+# of this software and associated documentation files (the "Software"), to deal
-+# in the Software without restriction, including without limitation the rights
-+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-+# copies of the Software, and to permit persons to whom the Software is
-+# furnished to do so, subject to the following conditions:
-+
-+# The above copyright notice and this permission notice shall be included in
-+# all copies or substantial portions of the Software.
-+
-+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+# SOFTWARE.
-+
-+if with_pvr_vk
-+  subdir('wsi')
-+endif
-diff --git a/src/pvr/wsi/meson.build b/src/pvr/wsi/meson.build
-new file mode 100644
-index 00000000000..57c7623c4bb
---- /dev/null
-+++ b/src/pvr/wsi/meson.build
-@@ -0,0 +1,75 @@
-+# Copyright (c) Imagination Technologies Ltd.
-+
-+# Permission is hereby granted, free of charge, to any person obtaining a copy
-+# of this software and associated documentation files (the "Software"), to deal
-+# in the Software without restriction, including without limitation the rights
-+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-+# copies of the Software, and to permit persons to whom the Software is
-+# furnished to do so, subject to the following conditions:
-+
-+# The above copyright notice and this permission notice shall be included in
-+# all copies or substantial portions of the Software.
-+
-+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+# SOFTWARE.
-+
-+pvr_wsi_args = vulkan_wsi_args
-+
-+pvr_wsi_depends = [ dep_libdrm, idep_vulkan_util, idep_xmlconfig ]
-+
-+pvr_wsi_includes = [
-+  inc_include,
-+  inc_src,
-+  inc_vulkan_util,
-+  inc_vulkan_wsi
-+]
-+
-+pvr_wsi_src = [ 'pvr_wsi.c' ]
-+
-+if with_platform_wayland
-+  pvr_wsi_args += '-DVK_USE_PLATFORM_WAYLAND_KHR'
-+
-+  pvr_wsi_depends += dep_wayland_client
-+
-+  pvr_wsi_src += 'pvr_wsi_wayland.c'
-+endif
-+
-+if with_platform_x11
-+  pvr_wsi_args += [
-+    '-DVK_USE_PLATFORM_XCB_KHR',
-+    '-DVK_USE_PLATFORM_XLIB_KHR',
-+  ]
-+
-+  pvr_wsi_depends += dep_xcb_dri2
-+
-+  pvr_wsi_src += 'pvr_wsi_x11.c'
-+endif
-+
-+if system_has_kms_drm and not with_platform_android
-+  pvr_wsi_args += '-DVK_USE_PLATFORM_DISPLAY_KHR'
-+
-+  pvr_wsi_src += 'pvr_wsi_display.c'
-+endif
-+
-+if with_xlib_lease
-+  pvr_wsi_args += '-DVK_USE_PLATFORM_XLIB_XRANDR_EXT'
-+
-+  pvr_wsi_depends += dep_xlib_xrandr
-+endif
-+
-+libvulkan_wsi = shared_library(
-+  'pvr_mesa_wsi',
-+  pvr_wsi_src,
-+  include_directories : pvr_wsi_includes,
-+  dependencies : pvr_wsi_depends,
-+  c_args : pvr_wsi_args,
-+  link_with: libvulkan_wsi,
-+  gnu_symbol_visibility : 'hidden',
-+  build_by_default : true,
-+  install : true
-+)
-diff --git a/src/pvr/wsi/pvr_mesa_wsi_interface.h b/src/pvr/wsi/pvr_mesa_wsi_interface.h
-new file mode 100644
-index 00000000000..b4b1bcb0c9d
---- /dev/null
-+++ b/src/pvr/wsi/pvr_mesa_wsi_interface.h
-@@ -0,0 +1,306 @@
-+/*************************************************************************/ /*!
-+@File
-+@Title          PVR interface to the Vulkan WSI layer in Mesa
-+@Copyright      Copyright (c) Imagination Technologies Ltd. All Rights Reserved
-+@License        MIT
-+
-+The contents of this file are subject to the MIT license as set out below.
-+
-+Permission is hereby granted, free of charge, to any person obtaining a copy
-+of this software and associated documentation files (the "Software"), to deal
-+in the Software without restriction, including without limitation the rights
-+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-+copies of the Software, and to permit persons to whom the Software is
-+furnished to do so, subject to the following conditions:
-+
-+The above copyright notice and this permission notice shall be included in
-+all copies or substantial portions of the Software.
-+
-+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-+THE SOFTWARE.
-+*/ /**************************************************************************/
-+
-+#ifndef PVR_MESA_WSI_INTERFACE_H
-+#define PVR_MESA_WSI_INTERFACE_H
-+
-+#include <stdbool.h>
-+#include <stdint.h>
-+
-+#include <vulkan/vulkan.h>
-+
-+/*
-+ * The pvr_mesa_wsi structure holds the Mesa WSI state, and is opaque to
-+ * the PowerVK DDK.
-+ */
-+struct pvr_mesa_wsi;
-+
-+/*
-+ * Functions defined in Mesa for use by the PowerVR DDK.
-+ * All functions have a "pvr_mesa_wsi" prefix.
-+ */
-+
-+void *
-+pvr_mesa_wsi_sym_addr(struct pvr_mesa_wsi *mwsi,
-+                      const char *name);
-+
-+VkResult
-+pvr_mesa_wsi_init(struct pvr_mesa_wsi **mwsi,
-+                  VkPhysicalDevice physicalDevice,
-+                  PFN_vkVoidFunction (VKAPI_PTR *pvr_vk_mesa_wsi_sym_addr)
-+                     (VkPhysicalDevice physicalDevice, const char *),
-+                  const VkAllocationCallbacks *alloc,
-+                  int fd,
-+                  bool sw);
-+
-+void
-+pvr_mesa_wsi_finish(struct pvr_mesa_wsi *mwsi,
-+                    const VkAllocationCallbacks *alloc);
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_support(struct pvr_mesa_wsi *mwsi,
-+                                        uint32_t queueFamilyIndex,
-+                                        VkSurfaceKHR surface,
-+                                        VkBool32 *pSupported);
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_capabilities(struct pvr_mesa_wsi *mwsi,
-+                                             VkSurfaceKHR surface,
-+                                             VkSurfaceCapabilitiesKHR *pSurfaceCapabilities);
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_capabilities2(struct pvr_mesa_wsi *mwsi,
-+                                              const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
-+                                              VkSurfaceCapabilities2KHR *pSurfaceCapabilities);
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_capabilities2ext(struct pvr_mesa_wsi *mwsi,
-+                                                 VkSurfaceKHR surface,
-+                                                 VkSurfaceCapabilities2EXT *pSurfaceCapabilities);
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_formats(struct pvr_mesa_wsi *mwsi,
-+                                        VkSurfaceKHR surface,
-+                                        uint32_t *pSurfaceFormatCount,
-+                                        VkSurfaceFormatKHR *pSurfaceFormats);
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_formats2(struct pvr_mesa_wsi *mwsi,
-+                                         const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
-+                                         uint32_t *pSurfaceFormatCount,
-+                                         VkSurfaceFormat2KHR *pSurfaceFormats);
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_present_modes(struct pvr_mesa_wsi *mwsi,
-+                                              VkSurfaceKHR surface,
-+                                              uint32_t *pPresentModeCount,
-+                                              VkPresentModeKHR *pPresentModes);
-+
-+VkResult
-+pvr_mesa_wsi_common_create_swapchain(struct pvr_mesa_wsi *mwsi,
-+                                     VkDevice device,
-+                                     const VkSwapchainCreateInfoKHR *pCreateInfo,
-+                                     const VkAllocationCallbacks *pAllocator,
-+                                     VkSwapchainKHR *pSwapchain);
-+void
-+pvr_mesa_wsi_common_destroy_swapchain(struct pvr_mesa_wsi *mwsi,
-+                                      VkDevice device,
-+                                      VkSwapchainKHR swapchain,
-+                                      const VkAllocationCallbacks *pAllocator);
-+
-+VkResult
-+pvr_mesa_wsi_common_get_images(struct pvr_mesa_wsi *mwsi,
-+                               VkSwapchainKHR swapchain,
-+                               uint32_t *pSwapchainImageCount,
-+                               VkImage *pSwapchainImages);
-+
-+VkResult
-+pvr_mesa_wsi_common_acquire_next_image2(struct pvr_mesa_wsi *mwsi,
-+                                        VkDevice device,
-+                                        const VkAcquireNextImageInfoKHR *pAcquireInfo,
-+                                        uint32_t *pImageIndex);
-+
-+VkResult
-+pvr_mesa_wsi_common_queue_present(struct pvr_mesa_wsi *mwsi,
-+                                  VkDevice device,
-+                                  VkQueue queue,
-+                                  int queue_family_index,
-+                                  const VkPresentInfoKHR *pPresentInfo);
-+
-+VkResult
-+pvr_mesa_wsi_common_get_present_rectangles(struct pvr_mesa_wsi *mwsi,
-+                                           VkSurfaceKHR surface,
-+                                           uint32_t* pRectCount,
-+                                           VkRect2D* pRects);
-+
-+#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
-+VkBool32
-+pvr_mesa_wsi_get_physical_device_wayland_presentation_support(struct pvr_mesa_wsi *mwsi,
-+                                                              uint32_t queueFamilyIndex,
-+                                                              void *display);
-+
-+VkResult
-+pvr_mesa_wsi_create_wayland_surface(struct pvr_mesa_wsi *mwsi,
-+                                    const VkAllocationCallbacks *pAllocator,
-+                                    const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
-+                                    VkSurfaceKHR *pSurface);
-+#endif
-+
-+#if defined(VK_USE_PLATFORM_XCB_KHR)
-+VkBool32
-+pvr_mesa_wsi_get_physical_device_xcb_presentation_support(struct pvr_mesa_wsi *mwsi,
-+                                                          uint32_t queueFamilyIndex,
-+                                                          void *connection,
-+                                                          uint32_t visualId);
-+VkResult
-+pvr_mesa_wsi_create_xcb_surface(struct pvr_mesa_wsi *mwsi,
-+                                const VkAllocationCallbacks *pAllocator,
-+                                const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
-+                                VkSurfaceKHR *pSurface);
-+#endif
-+
-+#if defined(VK_USE_PLATFORM_XLIB_KHR)
-+VkResult
-+pvr_mesa_wsi_create_xlib_surface(struct pvr_mesa_wsi *mwsi,
-+                                 const VkAllocationCallbacks *pAllocator,
-+                                 const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
-+                                 VkSurfaceKHR *pSurface);
-+#endif
-+
-+VkResult
-+pvr_mesa_wsi_display_get_physical_device_display_properties(struct pvr_mesa_wsi *mwsi,
-+							    VkPhysicalDevice physicalDevice,
-+							    uint32_t *pPropertyCount,
-+							    VkDisplayPropertiesKHR *pProperties);
-+
-+VkResult
-+pvr_mesa_wsi_display_get_physical_device_display_properties2(struct pvr_mesa_wsi *mwsi,
-+							     VkPhysicalDevice physicalDevice,
-+							     uint32_t *pPropertyCount,
-+							     VkDisplayProperties2KHR *pProperties);
-+
-+VkResult
-+pvr_mesa_wsi_display_get_physical_device_display_plane_properties(struct pvr_mesa_wsi *mwsi,
-+								  VkPhysicalDevice physicalDevice,
-+								  uint32_t *pPropertyCount,
-+								  VkDisplayPlanePropertiesKHR *pProperties);
-+
-+VkResult
-+pvr_mesa_wsi_display_get_physical_device_display_plane_properties2(struct pvr_mesa_wsi *mwsi,
-+								   VkPhysicalDevice physicalDevice,
-+								   uint32_t *pPropertyCount,
-+								   VkDisplayPlaneProperties2KHR *pProperties);
-+
-+VkResult
-+pvr_mesa_wsi_display_get_display_plane_supported_displays(struct pvr_mesa_wsi *mwsi,
-+							  VkPhysicalDevice physicalDevice,
-+							  uint32_t planeIndex,
-+							  uint32_t *pDisplayCount,
-+							  VkDisplayKHR *pDisplays);
-+
-+VkResult
-+pvr_mesa_wsi_display_get_display_mode_properties(struct pvr_mesa_wsi *mwsi,
-+						 VkPhysicalDevice physicalDevice,
-+						 VkDisplayKHR display,
-+						 uint32_t *pPropertyCount,
-+						 VkDisplayModePropertiesKHR *pProperties);
-+
-+VkResult
-+pvr_mesa_wsi_display_get_display_mode_properties2(struct pvr_mesa_wsi *mwsi,
-+                                                  VkPhysicalDevice physicalDevice,
-+                                                  VkDisplayKHR display,
-+                                                  uint32_t *pPropertyCount,
-+                                                  VkDisplayModeProperties2KHR *pProperties);
-+
-+VkResult
-+pvr_mesa_wsi_display_create_display_mode(struct pvr_mesa_wsi *mwsi,
-+                                         VkPhysicalDevice physicalDevice,
-+                                         VkDisplayKHR display,
-+                                         const VkDisplayModeCreateInfoKHR *pCreateInfo,
-+                                         const VkAllocationCallbacks *pAllocator,
-+                                         VkDisplayModeKHR *pMode);
-+
-+VkResult
-+pvr_mesa_wsi_get_display_plane_capabilities(struct pvr_mesa_wsi *mwsi,
-+                                            VkPhysicalDevice physicalDevice,
-+                                            VkDisplayModeKHR modeKhr,
-+                                            uint32_t planeIndex,
-+                                            VkDisplayPlaneCapabilitiesKHR *pCapabilities);
-+
-+VkResult
-+pvr_mesa_wsi_get_display_plane_capabilities2(struct pvr_mesa_wsi *mwsi,
-+                                             VkPhysicalDevice physicalDevice,
-+                                             const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo,
-+                                             VkDisplayPlaneCapabilities2KHR *pCapabilities);
-+
-+VkResult
-+pvr_mesa_wsi_create_display_surface(struct pvr_mesa_wsi *mwsi,
-+                                    VkInstance instance,
-+                                    const VkAllocationCallbacks *pAllocator,
-+                                    const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
-+                                    VkSurfaceKHR *pSurface);
-+
-+VkResult
-+pvr_mesa_wsi_release_display(struct pvr_mesa_wsi *mwsi,
-+                             VkPhysicalDevice physicalDevice,
-+                             VkDisplayKHR display);
-+
-+#if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
-+VkResult
-+pvr_mesa_wsi_acquire_xlib_display(struct pvr_mesa_wsi *mwsi,
-+                                  VkPhysicalDevice physicalDevice,
-+                                  void *dpy,
-+                                  VkDisplayKHR display);
-+
-+VkResult
-+pvr_mesa_wsi_get_randr_output_display(struct pvr_mesa_wsi *mwsi,
-+                                      VkPhysicalDevice  physicalDevice,
-+                                      void *dpy,
-+                                      uint32_t output,
-+                                      VkDisplayKHR *pDisplay);
-+
-+#endif
-+
-+VkResult
-+pvr_mesa_wsi_display_power_control(struct pvr_mesa_wsi *mwsi,
-+                                   VkDevice device,
-+                                   VkDisplayKHR display,
-+                                   const VkDisplayPowerInfoEXT *pDisplayPowerInfo);
-+
-+VkResult
-+pvr_mesa_wsi_register_device_event(struct pvr_mesa_wsi *mwsi,
-+                                   VkDevice device,
-+                                   const VkDeviceEventInfoEXT *pDeviceEventInfo,
-+                                   const VkAllocationCallbacks *pAllocator,
-+                                   void **pFence,
-+                                   int syncFd);
-+
-+VkResult
-+pvr_mesa_wsi_register_display_event(struct pvr_mesa_wsi *mwsi,
-+                                    VkDevice device,
-+                                    VkDisplayKHR display,
-+                                    const VkDisplayEventInfoEXT *pDisplayEventInfo,
-+                                    const VkAllocationCallbacks  *pAllocator,
-+                                    void **pFence,
-+                                    int syncFd);
-+
-+VkResult
-+pvr_mesa_wsi_get_swapchain_counter(struct pvr_mesa_wsi *mwsi,
-+                                   VkDevice device,
-+                                   VkSwapchainKHR swapchain,
-+                                   VkSurfaceCounterFlagBitsEXT flagBits,
-+                                   uint64_t *pValue);
-+
-+/*
-+ * Functions defined in the PowerVR DDK for use by Mesa.
-+ * All functions have a "pvr_vk_mesa_wsi" prefix.
-+ */
-+VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
-+pvr_vk_mesa_wsi_sym_addr(VkPhysicalDevice physicalDevice,
-+                         const char *name);
-+
-+#endif /* PVR_MESA_WSI_INTERFACE_H */
-diff --git a/src/pvr/wsi/pvr_wsi.c b/src/pvr/wsi/pvr_wsi.c
-new file mode 100644
-index 00000000000..a1fcdfd6164
---- /dev/null
-+++ b/src/pvr/wsi/pvr_wsi.c
-@@ -0,0 +1,333 @@
-+/*
-+ * Copyright © Imagination Technologies Ltd.
-+ *
-+ * The contents of this file are subject to the MIT license as set out below.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to deal
-+ * in the Software without restriction, including without limitation the rights
-+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-+ * copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-+ * THE SOFTWARE.
-+ */
-+
-+#include <string.h>
-+
-+#include "pvr_wsi.h"
-+#include "pvr_mesa_wsi_interface.h"
-+
-+VkResult
-+pvr_mesa_wsi_init(struct pvr_mesa_wsi **pmwsi,
-+                  VkPhysicalDevice physicalDevice,
-+                  PFN_vkVoidFunction (VKAPI_PTR *pvr_vk_mesa_wsi_sym_addr)
-+                     (VkPhysicalDevice physicalDevice, const char *),
-+                  const VkAllocationCallbacks *alloc,
-+                  int fd,
-+                  bool sw)
-+{
-+   struct pvr_mesa_wsi *mwsi;
-+   VkResult result;
-+
-+   mwsi = vk_zalloc(alloc, sizeof(*mwsi), 8,
-+                    VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
-+   if (!mwsi)
-+      return VK_ERROR_OUT_OF_HOST_MEMORY;
-+
-+   mwsi->symtab.pvr_vk_mesa_wsi_sym_addr = pvr_vk_mesa_wsi_sym_addr;
-+   mwsi->physicalDevice = physicalDevice;
-+
-+   result = wsi_device_init(&mwsi->wsi,
-+                            physicalDevice,
-+                            pvr_vk_mesa_wsi_sym_addr,
-+                            alloc,
-+                            fd, NULL, sw);
-+   if (result != VK_SUCCESS) {
-+      vk_free(alloc, mwsi);
-+      return result;
-+   }
-+
-+   if (!sw)
-+      mwsi->wsi.supports_modifiers = true;
-+
-+   *pmwsi = mwsi;
-+
-+   return VK_SUCCESS;
-+}
-+
-+void
-+pvr_mesa_wsi_finish(struct pvr_mesa_wsi *mwsi,
-+		    const VkAllocationCallbacks *alloc)
-+{
-+   wsi_device_finish(&mwsi->wsi, alloc);
-+
-+   vk_free(alloc, mwsi);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_support(struct pvr_mesa_wsi *mwsi,
-+                                        uint32_t queueFamilyIndex,
-+                                        VkSurfaceKHR surface,
-+                                        VkBool32 *pSupported)
-+{
-+   return wsi_common_get_surface_support(&mwsi->wsi,
-+                                         queueFamilyIndex,
-+                                         surface,
-+                                         pSupported);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_capabilities(struct pvr_mesa_wsi *mwsi,
-+                                             VkSurfaceKHR surface,
-+                                             VkSurfaceCapabilitiesKHR *pSurfaceCapabilities)
-+{
-+   return wsi_common_get_surface_capabilities(&mwsi->wsi,
-+                                              surface,
-+                                              pSurfaceCapabilities);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_capabilities2(struct pvr_mesa_wsi *mwsi,
-+                                              const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
-+                                              VkSurfaceCapabilities2KHR *pSurfaceCapabilities)
-+{
-+   return wsi_common_get_surface_capabilities2(&mwsi->wsi,
-+                                               pSurfaceInfo,
-+                                               pSurfaceCapabilities);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_capabilities2ext(struct pvr_mesa_wsi *mwsi,
-+                                                 VkSurfaceKHR surface,
-+                                                 VkSurfaceCapabilities2EXT *pSurfaceCapabilities)
-+{
-+   return wsi_common_get_surface_capabilities2ext(&mwsi->wsi,
-+                                                  surface,
-+                                                  pSurfaceCapabilities);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_formats(struct pvr_mesa_wsi *mwsi,
-+                                        VkSurfaceKHR surface,
-+                                        uint32_t *pSurfaceFormatCount,
-+                                        VkSurfaceFormatKHR *pSurfaceFormats)
-+{
-+   return wsi_common_get_surface_formats(&mwsi->wsi,
-+                                         surface,
-+                                         pSurfaceFormatCount,
-+                                         pSurfaceFormats);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_formats2(struct pvr_mesa_wsi *mwsi,
-+                                         const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
-+                                         uint32_t *pSurfaceFormatCount,
-+                                         VkSurfaceFormat2KHR *pSurfaceFormats)
-+{
-+   return wsi_common_get_surface_formats2(&mwsi->wsi,
-+                                          pSurfaceInfo,
-+                                          pSurfaceFormatCount,
-+                                          pSurfaceFormats);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_get_surface_present_modes(struct pvr_mesa_wsi *mwsi,
-+                                              VkSurfaceKHR surface,
-+                                              uint32_t *pPresentModeCount,
-+                                              VkPresentModeKHR *pPresentModes)
-+{
-+   return wsi_common_get_surface_present_modes(&mwsi->wsi,
-+                                               surface,
-+                                               pPresentModeCount,
-+                                               pPresentModes);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_create_swapchain(struct pvr_mesa_wsi *mwsi,
-+                                     VkDevice device,
-+                                     const VkSwapchainCreateInfoKHR *pCreateInfo,
-+                                     const VkAllocationCallbacks *pAllocator,
-+                                     VkSwapchainKHR *pSwapchain)
-+{
-+   return wsi_common_create_swapchain(&mwsi->wsi,
-+                                      device,
-+                                      pCreateInfo,
-+                                      pAllocator,
-+                                      pSwapchain);
-+}
-+
-+void
-+pvr_mesa_wsi_common_destroy_swapchain(UNUSED struct pvr_mesa_wsi *mwsi,
-+                                      VkDevice device,
-+                                      VkSwapchainKHR swapchain,
-+                                      const VkAllocationCallbacks *pAllocator)
-+{
-+   return wsi_common_destroy_swapchain(device,
-+                                       swapchain,
-+                                       pAllocator);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_get_images(UNUSED struct pvr_mesa_wsi *mwsi,
-+                               VkSwapchainKHR swapchain,
-+                               uint32_t *pSwapchainImageCount,
-+                               VkImage *pSwapchainImages)
-+{
-+   return wsi_common_get_images(swapchain,
-+                                pSwapchainImageCount,
-+                                pSwapchainImages);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_acquire_next_image2(struct pvr_mesa_wsi *mwsi,
-+                                        VkDevice device,
-+                                        const VkAcquireNextImageInfoKHR *pAcquireInfo,
-+                                        uint32_t *pImageIndex)
-+{
-+   return wsi_common_acquire_next_image2(&mwsi->wsi,
-+                                         device,
-+                                         pAcquireInfo,
-+                                         pImageIndex);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_queue_present(struct pvr_mesa_wsi *mwsi,
-+                                  VkDevice device,
-+                                  VkQueue queue,
-+                                  int queue_family_index,
-+                                  const VkPresentInfoKHR *pPresentInfo)
-+{
-+   return wsi_common_queue_present(&mwsi->wsi,
-+                                   device,
-+                                   queue,
-+                                   queue_family_index,
-+                                   pPresentInfo);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_common_get_present_rectangles(struct pvr_mesa_wsi *mwsi,
-+                                           VkSurfaceKHR surface,
-+                                           uint32_t* pRectCount,
-+                                           VkRect2D* pRects)
-+{
-+   return wsi_common_get_present_rectangles(&mwsi->wsi,
-+                                            surface,
-+                                            pRectCount,
-+                                            pRects);
-+}
-+
-+/*
-+ * The mwsi parameter is currently unused. Note that it is invalid for
-+ * pvr_mesa_wsi_init, which is responsible for allocating it.
-+*/
-+PUBLIC void *
-+pvr_mesa_wsi_sym_addr(UNUSED struct pvr_mesa_wsi *mwsi, const char *name)
-+{
-+   static const struct {
-+      char *name;
-+      void *addr;
-+   } lookup[] = {
-+      { "pvr_mesa_wsi_init",
-+            pvr_mesa_wsi_init },
-+      { "pvr_mesa_wsi_finish",
-+            pvr_mesa_wsi_finish },
-+      { "pvr_mesa_wsi_common_get_surface_support",
-+            pvr_mesa_wsi_common_get_surface_support },
-+      { "pvr_mesa_wsi_common_get_surface_capabilities",
-+            pvr_mesa_wsi_common_get_surface_capabilities },
-+      { "pvr_mesa_wsi_common_get_surface_capabilities2",
-+            pvr_mesa_wsi_common_get_surface_capabilities2 },
-+      { "pvr_mesa_wsi_common_get_surface_capabilities2ext",
-+            pvr_mesa_wsi_common_get_surface_capabilities2ext },
-+      { "pvr_mesa_wsi_common_get_surface_formats",
-+            pvr_mesa_wsi_common_get_surface_formats },
-+      { "pvr_mesa_wsi_common_get_surface_formats2",
-+            pvr_mesa_wsi_common_get_surface_formats2 },
-+      { "pvr_mesa_wsi_common_get_surface_present_modes",
-+            pvr_mesa_wsi_common_get_surface_present_modes },
-+      { "pvr_mesa_wsi_common_create_swapchain",
-+            pvr_mesa_wsi_common_create_swapchain },
-+      { "pvr_mesa_wsi_common_destroy_swapchain",
-+            pvr_mesa_wsi_common_destroy_swapchain },
-+      { "pvr_mesa_wsi_common_get_images",
-+            pvr_mesa_wsi_common_get_images },
-+      { "pvr_mesa_wsi_common_acquire_next_image2",
-+            pvr_mesa_wsi_common_acquire_next_image2 },
-+      { "pvr_mesa_wsi_common_queue_present",
-+            pvr_mesa_wsi_common_queue_present },
-+      { "pvr_mesa_wsi_common_get_present_rectangles",
-+            pvr_mesa_wsi_common_get_present_rectangles },
-+#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
-+      { "pvr_mesa_wsi_get_physical_device_wayland_presentation_support",
-+            pvr_mesa_wsi_get_physical_device_wayland_presentation_support },
-+      { "pvr_mesa_wsi_create_wayland_surface",
-+            pvr_mesa_wsi_create_wayland_surface },
-+#endif
-+#if defined(VK_USE_PLATFORM_XCB_KHR)
-+      { "pvr_mesa_wsi_get_physical_device_xcb_presentation_support",
-+            pvr_mesa_wsi_get_physical_device_xcb_presentation_support },
-+      { "pvr_mesa_wsi_create_xcb_surface",
-+            pvr_mesa_wsi_create_xcb_surface },
-+#endif
-+#if defined(VK_USE_PLATFORM_XLIB_KHR)
-+      { "pvr_mesa_wsi_create_xlib_surface",
-+            pvr_mesa_wsi_create_xlib_surface },
-+#endif
-+      { "pvr_mesa_wsi_display_get_physical_device_display_properties",
-+            pvr_mesa_wsi_display_get_physical_device_display_properties },
-+      { "pvr_mesa_wsi_display_get_physical_device_display_properties2",
-+            pvr_mesa_wsi_display_get_physical_device_display_properties2 },
-+      { "pvr_mesa_wsi_display_get_physical_device_display_plane_properties",
-+            pvr_mesa_wsi_display_get_physical_device_display_plane_properties },
-+      { "pvr_mesa_wsi_display_get_physical_device_display_plane_properties2",
-+            pvr_mesa_wsi_display_get_physical_device_display_plane_properties2 },
-+      { "pvr_mesa_wsi_display_get_display_plane_supported_displays",
-+            pvr_mesa_wsi_display_get_display_plane_supported_displays },
-+      { "pvr_mesa_wsi_display_get_display_mode_properties",
-+            pvr_mesa_wsi_display_get_display_mode_properties },
-+      { "pvr_mesa_wsi_display_get_display_mode_properties2",
-+            pvr_mesa_wsi_display_get_display_mode_properties2 },
-+      { "pvr_mesa_wsi_display_create_display_mode",
-+            pvr_mesa_wsi_display_create_display_mode },
-+      { "pvr_mesa_wsi_get_display_plane_capabilities",
-+            pvr_mesa_wsi_get_display_plane_capabilities },
-+      { "pvr_mesa_wsi_get_display_plane_capabilities2",
-+            pvr_mesa_wsi_get_display_plane_capabilities2 },
-+      { "pvr_mesa_wsi_create_display_surface",
-+            pvr_mesa_wsi_create_display_surface },
-+      { "pvr_mesa_wsi_release_display",
-+            pvr_mesa_wsi_release_display },
-+#if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
-+      { "pvr_mesa_wsi_acquire_xlib_display",
-+            pvr_mesa_wsi_acquire_xlib_display },
-+      { "pvr_mesa_wsi_get_randr_output_display",
-+            pvr_mesa_wsi_get_randr_output_display },
-+#endif
-+      { "pvr_mesa_wsi_display_power_control",
-+            pvr_mesa_wsi_display_power_control },
-+      { "pvr_mesa_wsi_register_device_event",
-+            pvr_mesa_wsi_register_device_event },
-+      { "pvr_mesa_wsi_register_display_event",
-+            pvr_mesa_wsi_register_display_event },
-+      { "pvr_mesa_wsi_get_swapchain_counter",
-+            pvr_mesa_wsi_get_swapchain_counter },
-+   };
-+   unsigned i;
-+
-+   for (i = 0; i < ARRAY_SIZE(lookup); i++) {
-+      if (!strcmp(name, lookup[i].name))
-+         return lookup[i].addr;
-+   }
-+
-+   return NULL;
-+}
-diff --git a/src/pvr/wsi/pvr_wsi.h b/src/pvr/wsi/pvr_wsi.h
-new file mode 100644
-index 00000000000..142358db3de
---- /dev/null
-+++ b/src/pvr/wsi/pvr_wsi.h
-@@ -0,0 +1,78 @@
-+/*
-+ * Copyright © Imagination Technologies Ltd.
-+ *
-+ * The contents of this file are subject to the MIT license as set out below.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to deal
-+ * in the Software without restriction, including without limitation the rights
-+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-+ * copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-+ * THE SOFTWARE.
-+ */
-+
-+#if !defined PVR_WSI_H
-+#define PVR_WSI_H
-+
-+#include "util/macros.h"
-+#include "util/u_memory.h"
-+#include "util/u_atomic.h"
-+
-+#include "wsi_common.h"
-+
-+#define  Container(p, s, m) ((s *) ((uintptr_t)(p) - Offset(s, m)))
-+
-+#define _MAKE_STRING(x) # x
-+#define MAKE_STRING(x) _MAKE_STRING(x)
-+
-+#define LOOKUP_DDK(mwsi, sym) \
-+   mwsi->symtab.pvr_vk_mesa_wsi_sym_addr(MAKE_STRING(sym))
-+
-+#define JUMP_DDK(mwsi, sym, ...)                          \
-+   do {                                                   \
-+      void *_entry = p_atomic_read(&mwsi->symtab.sym);    \
-+                                                          \
-+      if (!_entry) {                                      \
-+         _entry = LOOKUP_DDK(mwsi, sym);                  \
-+                                                          \
-+         if (_entry)                                      \
-+            p_atomic_set(&mwsi->symtab.sym, _entry);      \
-+      }                                                   \
-+                                                          \
-+      if (_entry) {                                       \
-+         __typeof__(mwsi->symtab.sym) _func = _entry;     \
-+                                                          \
-+         return _func(__VA_ARGS__);                       \
-+      }                                                   \
-+   } while(0)
-+
-+struct pvr_vk_mesa_wsi_sym_tab
-+{
-+   PFN_vkVoidFunction (VKAPI_PTR *pvr_vk_mesa_wsi_sym_addr)
-+      (VkPhysicalDevice physicalDevice, const char *);
-+};
-+
-+struct pvr_mesa_wsi
-+{
-+   struct wsi_device wsi;
-+   struct pvr_vk_mesa_wsi_sym_tab symtab;
-+   VkPhysicalDevice physicalDevice;
-+};
-+
-+static inline struct pvr_mesa_wsi *pvr_mesa_wsi(struct wsi_device *wsi_ptr)
-+{
-+   return Container(wsi_ptr, struct pvr_mesa_wsi, wsi);
-+}
-+
-+#endif
-diff --git a/src/pvr/wsi/pvr_wsi_display.c b/src/pvr/wsi/pvr_wsi_display.c
-new file mode 100644
-index 00000000000..65a1c99507c
---- /dev/null
-+++ b/src/pvr/wsi/pvr_wsi_display.c
-@@ -0,0 +1,293 @@
-+/*
-+ * Copyright © Imagination Technologies Ltd.
-+ *
-+ * The contents of this file are subject to the MIT license as set out below.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to deal
-+ * in the Software without restriction, including without limitation the rights
-+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-+ * copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-+ * THE SOFTWARE.
-+ */
-+
-+#include "wsi_common_display.h"
-+
-+#if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
-+#include "wsi_common_x11.h"
-+#endif
-+
-+#include "pvr_wsi.h"
-+#include "pvr_mesa_wsi_interface.h"
-+
-+VkResult
-+pvr_mesa_wsi_display_get_physical_device_display_properties(struct pvr_mesa_wsi *mwsi,
-+							    VkPhysicalDevice physicalDevice,
-+							    uint32_t *pPropertyCount,
-+							    VkDisplayPropertiesKHR *pProperties)
-+{
-+   return wsi_display_get_physical_device_display_properties(physicalDevice,
-+                                                             &mwsi->wsi,
-+                                                             pPropertyCount,
-+                                                             pProperties);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_display_get_physical_device_display_properties2(struct pvr_mesa_wsi *mwsi,
-+							     VkPhysicalDevice physicalDevice,
-+							     uint32_t *pPropertyCount,
-+							     VkDisplayProperties2KHR *pProperties)
-+{
-+   return wsi_display_get_physical_device_display_properties2(physicalDevice,
-+                                                              &mwsi->wsi,
-+                                                              pPropertyCount,
-+                                                              pProperties);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_display_get_physical_device_display_plane_properties(struct pvr_mesa_wsi *mwsi,
-+								  VkPhysicalDevice physicalDevice,
-+								  uint32_t *pPropertyCount,
-+								  VkDisplayPlanePropertiesKHR *pProperties)
-+{
-+   return wsi_display_get_physical_device_display_plane_properties(physicalDevice,
-+                                                                   &mwsi->wsi,
-+                                                                   pPropertyCount,
-+                                                                   pProperties);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_display_get_physical_device_display_plane_properties2(struct pvr_mesa_wsi *mwsi,
-+								   VkPhysicalDevice physicalDevice,
-+								   uint32_t *pPropertyCount,
-+								   VkDisplayPlaneProperties2KHR *pProperties)
-+{
-+   return wsi_display_get_physical_device_display_plane_properties2(physicalDevice,
-+                                                                    &mwsi->wsi,
-+                                                                    pPropertyCount,
-+                                                                    pProperties);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_display_get_display_plane_supported_displays(struct pvr_mesa_wsi *mwsi,
-+							  VkPhysicalDevice physicalDevice,
-+							  uint32_t planeIndex,
-+							  uint32_t *pDisplayCount,
-+							  VkDisplayKHR *pDisplays)
-+{
-+   return wsi_display_get_display_plane_supported_displays(physicalDevice,
-+                                                           &mwsi->wsi,
-+                                                           planeIndex,
-+                                                           pDisplayCount,
-+                                                           pDisplays);
-+
-+}
-+
-+VkResult
-+pvr_mesa_wsi_display_get_display_mode_properties(struct pvr_mesa_wsi *mwsi,
-+						 VkPhysicalDevice physicalDevice,
-+						 VkDisplayKHR display,
-+						 uint32_t *pPropertyCount,
-+						 VkDisplayModePropertiesKHR *pProperties)
-+{
-+   return wsi_display_get_display_mode_properties(physicalDevice,
-+                                                  &mwsi->wsi,
-+                                                  display,
-+                                                  pPropertyCount,
-+                                                  pProperties);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_display_get_display_mode_properties2(struct pvr_mesa_wsi *mwsi,
-+                                                  VkPhysicalDevice physicalDevice,
-+                                                  VkDisplayKHR display,
-+                                                  uint32_t *pPropertyCount,
-+                                                  VkDisplayModeProperties2KHR *pProperties)
-+{
-+   return wsi_display_get_display_mode_properties2(physicalDevice,
-+                                                   &mwsi->wsi,
-+                                                   display,
-+                                                   pPropertyCount,
-+                                                   pProperties);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_display_create_display_mode(struct pvr_mesa_wsi *mwsi,
-+                                         VkPhysicalDevice physicalDevice,
-+                                         VkDisplayKHR display,
-+                                         const VkDisplayModeCreateInfoKHR *pCreateInfo,
-+                                         const VkAllocationCallbacks *pAllocator,
-+                                         VkDisplayModeKHR *pMode)
-+{
-+   return wsi_display_create_display_mode(physicalDevice,
-+                                          &mwsi->wsi,
-+                                          display,
-+                                          pCreateInfo,
-+                                          pAllocator,
-+                                          pMode);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_get_display_plane_capabilities(struct pvr_mesa_wsi *mwsi,
-+                                            VkPhysicalDevice physicalDevice,
-+                                            VkDisplayModeKHR modeKhr,
-+                                            uint32_t planeIndex,
-+                                            VkDisplayPlaneCapabilitiesKHR *pCapabilities)
-+{
-+   return wsi_get_display_plane_capabilities(physicalDevice,
-+                                             &mwsi->wsi,
-+                                             modeKhr,
-+                                             planeIndex,
-+                                             pCapabilities);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_get_display_plane_capabilities2(struct pvr_mesa_wsi *mwsi,
-+                                             VkPhysicalDevice physicalDevice,
-+                                             const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo,
-+                                             VkDisplayPlaneCapabilities2KHR *pCapabilities)
-+{
-+   return wsi_get_display_plane_capabilities2(physicalDevice,
-+                                              &mwsi->wsi,
-+                                              pDisplayPlaneInfo,
-+                                              pCapabilities);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_create_display_surface(UNUSED struct pvr_mesa_wsi *mwsi,
-+                                    VkInstance instance,
-+                                    const VkAllocationCallbacks *pAllocator,
-+                                    const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
-+                                    VkSurfaceKHR *pSurface)
-+{
-+   return wsi_create_display_surface(instance,
-+                                      pAllocator,
-+                                      pCreateInfo,
-+                                      pSurface);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_release_display(struct pvr_mesa_wsi *mwsi,
-+                             VkPhysicalDevice physicalDevice,
-+                             VkDisplayKHR display)
-+{
-+   return wsi_release_display(physicalDevice,
-+                              &mwsi->wsi,
-+                              display);
-+}
-+
-+#if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
-+VkResult
-+pvr_mesa_wsi_acquire_xlib_display(struct pvr_mesa_wsi *mwsi,
-+                                  VkPhysicalDevice physicalDevice,
-+                                  void *dpy,
-+                                  VkDisplayKHR display)
-+{
-+   return wsi_acquire_xlib_display(physicalDevice,
-+                                   &mwsi->wsi,
-+                                   dpy,
-+                                   display);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_get_randr_output_display(struct pvr_mesa_wsi *mwsi,
-+                                      VkPhysicalDevice  physicalDevice,
-+                                      void *dpy,
-+                                      uint32_t output,
-+                                      VkDisplayKHR *pDisplay)
-+{
-+   return wsi_get_randr_output_display(physicalDevice,
-+                                       &mwsi->wsi,
-+                                       dpy,
-+                                       output,
-+                                       pDisplay);
-+}
-+#endif
-+
-+VkResult
-+pvr_mesa_wsi_display_power_control(struct pvr_mesa_wsi *mwsi,
-+                                   VkDevice device,
-+                                   VkDisplayKHR display,
-+                                   const VkDisplayPowerInfoEXT *pDisplayPowerInfo)
-+{
-+   return wsi_display_power_control(device,
-+                                    &mwsi->wsi,
-+                                    display,
-+                                    pDisplayPowerInfo);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_register_device_event(struct pvr_mesa_wsi *mwsi,
-+                                   VkDevice device,
-+                                   const VkDeviceEventInfoEXT *pDeviceEventInfo,
-+                                   const VkAllocationCallbacks *pAllocator,
-+                                   void **pFence,
-+                                   int syncFd)
-+{
-+   struct wsi_fence *fence;
-+   VkResult ret;
-+
-+   ret = wsi_register_device_event(device,
-+                                   &mwsi->wsi,
-+                                   pDeviceEventInfo,
-+                                   pAllocator,
-+                                   pFence ? &fence : NULL,
-+                                   syncFd);
-+
-+   if (ret == VK_SUCCESS && pFence != NULL)
-+	   *pFence = fence;
-+
-+   return ret;
-+}
-+
-+VkResult
-+pvr_mesa_wsi_register_display_event(struct pvr_mesa_wsi *mwsi,
-+                                    VkDevice device,
-+                                    VkDisplayKHR display,
-+                                    const VkDisplayEventInfoEXT *pDisplayEventInfo,
-+                                    const VkAllocationCallbacks  *pAllocator,
-+                                    void **pFence,
-+                                    int syncFd)
-+{
-+   struct wsi_fence *fence;
-+   VkResult ret;
-+
-+   ret = wsi_register_display_event(device,
-+                                    &mwsi->wsi,
-+                                    display,
-+                                    pDisplayEventInfo,
-+                                    pAllocator,
-+                                    pFence ? &fence : NULL,
-+                                    syncFd);
-+
-+   if (ret == VK_SUCCESS && pFence != NULL)
-+	   *pFence = fence;
-+
-+   return ret;
-+}
-+
-+VkResult
-+pvr_mesa_wsi_get_swapchain_counter(struct pvr_mesa_wsi *mwsi,
-+                                   VkDevice device,
-+                                   VkSwapchainKHR swapchain,
-+                                   VkSurfaceCounterFlagBitsEXT flagBits,
-+                                   uint64_t *pValue)
-+{
-+   return wsi_get_swapchain_counter(device,
-+                                    &mwsi->wsi,
-+                                    swapchain,
-+                                    flagBits,
-+                                    pValue);
-+}
-+
-diff --git a/src/pvr/wsi/pvr_wsi_wayland.c b/src/pvr/wsi/pvr_wsi_wayland.c
-new file mode 100644
-index 00000000000..5b052667ac9
---- /dev/null
-+++ b/src/pvr/wsi/pvr_wsi_wayland.c
-@@ -0,0 +1,45 @@
-+/*
-+ * Copyright © Imagination Technologies Ltd.
-+ *
-+ * The contents of this file are subject to the MIT license as set out below.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to deal
-+ * in the Software without restriction, including without limitation the rights
-+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-+ * copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-+ * THE SOFTWARE.
-+ */
-+
-+#include "wsi_common_wayland.h"
-+
-+#include "pvr_wsi.h"
-+#include "pvr_mesa_wsi_interface.h"
-+
-+VkBool32
-+pvr_mesa_wsi_get_physical_device_wayland_presentation_support(struct pvr_mesa_wsi *mwsi,
-+                                                              uint32_t queueFamilyIndex,
-+                                                              void *display)
-+{
-+   return wsi_wl_get_presentation_support(&mwsi->wsi, display);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_create_wayland_surface(UNUSED struct pvr_mesa_wsi *mwsi,
-+                                    const VkAllocationCallbacks *pAllocator,
-+                                    const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
-+                                    VkSurfaceKHR *pSurface)
-+{
-+   return wsi_create_wl_surface(pAllocator, pCreateInfo, pSurface);
-+}
-diff --git a/src/pvr/wsi/pvr_wsi_x11.c b/src/pvr/wsi/pvr_wsi_x11.c
-new file mode 100644
-index 00000000000..0a69e92ac9e
---- /dev/null
-+++ b/src/pvr/wsi/pvr_wsi_x11.c
-@@ -0,0 +1,62 @@
-+/*
-+ * Copyright © Imagination Technologies Ltd.
-+ *
-+ * The contents of this file are subject to the MIT license as set out below.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to deal
-+ * in the Software without restriction, including without limitation the rights
-+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-+ * copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-+ * THE SOFTWARE.
-+ */
-+
-+#include "wsi_common_x11.h"
-+
-+#include "pvr_wsi.h"
-+#include "pvr_mesa_wsi_interface.h"
-+
-+VkBool32
-+pvr_mesa_wsi_get_physical_device_xcb_presentation_support(struct pvr_mesa_wsi *mwsi,
-+                                                          uint32_t queueFamilyIndex,
-+                                                          void *connection,
-+                                                          uint32_t visual_id)
-+{
-+   return wsi_get_physical_device_xcb_presentation_support(&mwsi->wsi,
-+                                                           queueFamilyIndex,
-+                                                           connection,
-+                                                           visual_id);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_create_xcb_surface(UNUSED struct pvr_mesa_wsi *mwsi,
-+                                const VkAllocationCallbacks *pAllocator,
-+                                const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
-+                                VkSurfaceKHR *pSurface)
-+{
-+   return wsi_create_xcb_surface(pAllocator,
-+				 pCreateInfo,
-+				 pSurface);
-+}
-+
-+VkResult
-+pvr_mesa_wsi_create_xlib_surface(UNUSED struct pvr_mesa_wsi *mwsi,
-+                                 const VkAllocationCallbacks *pAllocator,
-+                                 const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
-+                                 VkSurfaceKHR *pSurface)
-+{
-+   return wsi_create_xlib_surface(pAllocator,
-+				  pCreateInfo,
-+				  pSurface);
-+}
--- 
-2.25.1
-

+ 37 - 0
package/mesa3d/0060-gallium-pvr-Add-DRM_FORMAT_AXBXGXRX106106106106.patch

@@ -0,0 +1,37 @@
+From e426d71154302c9f9dd5f728a309b4323fbc509b Mon Sep 17 00:00:00 2001
+From: Brendan King <Brendan.King@imgtec.com>
+Date: Mon, 18 Jul 2022 13:08:17 +0100
+Subject: [PATCH 60/60] gallium/pvr: Add DRM_FORMAT_AXBXGXRX106106106106
+
+IMG NOTE: This patch should be merged into the "Add PVR Gallium
+driver" patch the next time the Mesa version is upgraded in the
+IMG DDK.
+---
+ src/gallium/frontends/pvr/pvrutil.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/src/gallium/frontends/pvr/pvrutil.c b/src/gallium/frontends/pvr/pvrutil.c
+index 2706b02d7bc..b3bcd13bba4 100644
+--- a/src/gallium/frontends/pvr/pvrutil.c
++++ b/src/gallium/frontends/pvr/pvrutil.c
+@@ -192,6 +192,8 @@ PVRDRIFormatToFourCC(int dri_format)
+       return DRM_FORMAT_YVYU;
+    case __DRI_IMAGE_FORMAT_VYUY:
+       return DRM_FORMAT_VYUY;
++   case __DRI_IMAGE_FORMAT_AXBXGXRX106106106106:
++      return DRM_FORMAT_AXBXGXRX106106106106;
+    default:
+       __driUtilMessage("%s: Unknown format: %d", __func__, dri_format);
+       break;
+@@ -260,6 +262,8 @@ PVRDRIFourCCToDRIFormat(int iFourCC)
+       return __DRI_IMAGE_FORMAT_YVYU;
+    case DRM_FORMAT_VYUY:
+       return __DRI_IMAGE_FORMAT_VYUY;
++   case DRM_FORMAT_AXBXGXRX106106106106:
++      return __DRI_IMAGE_FORMAT_AXBXGXRX106106106106;
+    default:
+       __driUtilMessage("%s: Unknown format: %d", __func__, iFourCC);
+       break;
+-- 
+2.25.1
+

+ 73 - 0
package/mesa3d/0061-gallium-pvr-add-the-DRIconfigOptions-extension.patch

@@ -0,0 +1,73 @@
+From 7f8aed6fcc4cd6cf02c031e510d55c2081feeec8 Mon Sep 17 00:00:00 2001
+From: Brendan King <Brendan.King@imgtec.com>
+Date: Mon, 8 Aug 2022 13:04:39 +0100
+Subject: [PATCH 61/61] gallium/pvr: add the DRIconfigOptions extension
+
+Add the DRIconfigOptions DRI extension, which is needed by the EGL
+MESA_query_driver extension. The PVR driver does not support the DRI
+configuration mechanism, and returns a minimal XML string for use
+by eglGetDisplayDriverConfig.
+
+IMG NOTE: This patch should be merged into the "Add PVR Gallium
+driver" patch the next time the Mesa version is upgraded in the
+IMG DDK.
+---
+ src/gallium/frontends/pvr/pvrdri.c | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+diff --git a/src/gallium/frontends/pvr/pvrdri.c b/src/gallium/frontends/pvr/pvrdri.c
+index d7d620cc6d2..0b8c4cfe282 100644
+--- a/src/gallium/frontends/pvr/pvrdri.c
++++ b/src/gallium/frontends/pvr/pvrdri.c
+@@ -27,6 +27,8 @@
+ 
+ #include "util/u_atomic.h"
+ #include "utils.h"
++#include <util/xmlconfig.h>
++#include <util/driconf.h>
+ 
+ #include "dri_screen.h"
+ 
+@@ -577,6 +579,22 @@ PVRDRIReleaseBuffer(__DRIscreen *psDRIScreen, __DRIbuffer *psDRIBuffer)
+    free(psPVRBuffer);
+ }
+ 
++static char *
++PVRDRIGetXMLConfigOptions(const char *pszDriverName)
++{
++   const driOptionDescription asConfigOptions[] =
++   {
++      DRI_CONF_SECTION_MISCELLANEOUS
++      DRI_CONF_OPT_B("pvr_driconf_not_used", true,
++                     "The PowerVR driver does not use DRIConf")
++      DRI_CONF_SECTION_END
++   };
++
++   (void) pszDriverName;
++
++   return driGetOptionsXml(&asConfigOptions[0], ARRAY_SIZE(asConfigOptions));
++}
++
+ const struct __DriverAPIRec pvr_driver_api = {
+    .InitScreen = PVRDRIInitScreen,
+    .DestroyScreen = PVRDRIDestroyScreen,
+@@ -596,10 +614,16 @@ static const struct __DRIDriverVtableExtensionRec pvr_vtable = {
+    .vtable = &pvr_driver_api,
+ };
+ 
++const __DRIconfigOptionsExtension pvr_config_options = {
++   .base = { __DRI_CONFIG_OPTIONS, 2 },
++   .getXml = PVRDRIGetXMLConfigOptions,
++};
++
+ const __DRIextension *pvr_driver_extensions[] = {
+    &driCoreExtension.base,
+    &driImageDriverExtension.base,
+    &pvrDRI2Extension.base,
+    &pvr_vtable.base,
++   &pvr_config_options.base,
+    NULL
+ };
+-- 
+2.25.1
+

+ 347 - 0
package/mesa3d/0062-gallium-pvr-support-DRI-Image-extension-v21.patch

@@ -0,0 +1,347 @@
+From b50d678b86c1102a84c2b5fb55dd46f6e466974b Mon Sep 17 00:00:00 2001
+From: Brendan King <Brendan.King@imgtec.com>
+Date: Thu, 18 Aug 2022 19:14:29 +0100
+Subject: [PATCH 62/62] gallium/pvr: support DRI Image extension v21
+
+IMG NOTE: This patch should be merged into the "Add PVR Gallium
+driver" patch the next time the Mesa version is upgraded in the
+IMG DDK.
+---
+ src/gallium/frontends/pvr/dri_support.h    | 46 +++++++++++
+ src/gallium/frontends/pvr/pvrcompat.c      | 74 +++++++++++++++++
+ src/gallium/frontends/pvr/pvrdri_support.h | 27 +++++++
+ src/gallium/frontends/pvr/pvrext.c         | 94 +++++++++++++++++++++-
+ 4 files changed, 240 insertions(+), 1 deletion(-)
+
+diff --git a/src/gallium/frontends/pvr/dri_support.h b/src/gallium/frontends/pvr/dri_support.h
+index b0b31060dcb..3cc8f290d4d 100644
+--- a/src/gallium/frontends/pvr/dri_support.h
++++ b/src/gallium/frontends/pvr/dri_support.h
+@@ -489,6 +489,52 @@ struct  PVRDRISupportInterfaceV2
+ 	struct {
+ 		bool (*HaveGetFenceFromCLEvent)(void);
+ 	} v4;
++	/* The v5 interface is an extension of v4, so v4 is required as well */
++	struct {
++		__DRIimage *(*CreateImageFromDMABufs3)
++			(struct DRISUPScreen *psDRISUPScreen,
++			 int iWidth,
++			 int iHeight,
++			 int iFourCC,
++			 uint64_t uModifier,
++			 int *piFDs,
++			 int iNumFDs,
++			 int *piStrides,
++			 int *piOffsets,
++			 unsigned int uColorSpace,
++			 unsigned int uSampleRange,
++			 unsigned int uHorizSiting,
++			 unsigned int uVertSiting,
++			 uint32_t uFlags,
++			 unsigned int *puError,
++			 void *pvLoaderPrivate);
++
++		__DRIimage *(*CreateImageWithModifiers2)
++			(struct DRISUPScreen *psDRISUPScreen,
++			 int iWidth,
++			 int iHeight,
++			 int iFourCC,
++			 const uint64_t *puModifiers,
++			 const unsigned int uModifierCount,
++			 unsigned int uUsage,
++			 void *pvLoaderPrivate);
++
++		__DRIimage *(*CreateImageFromFDs2)
++			(struct DRISUPScreen *psDRISUPcreen,
++			 int iWidth,
++			 int iHeight,
++			 int iFourCC,
++			 int *piFDs,
++			 int iNumFDs,
++			 uint32_t uFlags,
++			 int *piStrides,
++			 int *piOffsets,
++			 void *pvLoaderPrivate);
++
++		void (*SetInFenceFD)
++			(__DRIimage *psImage,
++			 int iFD);
++	} v5;
+ };
+ 
+ struct PVRDRIImageList {
+diff --git a/src/gallium/frontends/pvr/pvrcompat.c b/src/gallium/frontends/pvr/pvrcompat.c
+index 23a57dde682..782c900101c 100644
+--- a/src/gallium/frontends/pvr/pvrcompat.c
++++ b/src/gallium/frontends/pvr/pvrcompat.c
+@@ -55,6 +55,10 @@ static pthread_mutex_t gsCompatLock = PTHREAD_MUTEX_INITIALIZER;
+       ptr = dlsym(gpvSupLib, MAKESTRING(func)); \
+    } while(0)
+ 
++/* Check if a function exists in the DRI Support interface structure */
++#define HaveFuncV2(field)                       \
++      ((gsSupV2.field) != NULL)                 \
++
+ /* Call a function via the DRI Support interface structure */
+ #define CallFuncV2(field, ...)                  \
+    do {                                         \
+@@ -238,6 +242,7 @@ MODSUPRegisterSupportInterfaceV2(const void *pvInterface,
+    case 2:
+    case 3:
+    case 4:
++   case 5:
+       /* These versions require version 0 */
+       return false;
+    default:
+@@ -247,6 +252,13 @@ MODSUPRegisterSupportInterfaceV2(const void *pvInterface,
+    /* The "default" case should be associated with the latest version */
+    switch (uVersion) {
+    default:
++   case 5:
++      /* This version is an extension of versions 0 to 4 */
++      if (uMinVersion > 0)
++         return false;
++
++      uEnd = PVRDRIInterfaceV2End(v5);
++      break;
+    case 4:
+       /* This version is an extension of versions 0 to 3 */
+       if (uMinVersion > 0)
+@@ -836,3 +848,65 @@ DRISUPHaveGetFenceFromCLEvent(void)
+ 
+    return true;
+ }
++
++__DRIimage *
++DRISUPCreateImageFromDMABufs3(struct DRISUPScreen *psDRISUPScreen,
++                              int iWidth, int iHeight, int iFourCC,
++                              uint64_t uModifier, int *piFDs, int iNumFDs,
++                              int *piStrides, int *piOffsets,
++                              unsigned int uColorSpace,
++                              unsigned int uSampleRange,
++                              unsigned int uHorizSiting,
++                              unsigned int uVertSiting,
++                              uint32_t uFlags,
++                              unsigned int *puError, void *pvLoaderPrivate)
++{
++   CallFuncV2(v5.CreateImageFromDMABufs3,
++              psDRISUPScreen, iWidth, iHeight, iFourCC, uModifier,
++              piFDs, iNumFDs, piStrides, piOffsets, uColorSpace, uSampleRange,
++              uHorizSiting, uVertSiting, uFlags, puError, pvLoaderPrivate);
++
++   return NULL;
++}
++
++__DRIimage *
++DRISUPCreateImageWithModifiers2(struct DRISUPScreen *psDRISUPScreen,
++                                int iWidth, int iHeight, int iFourCC,
++                                const uint64_t *puModifiers,
++                                const unsigned int uModifierCount,
++                                unsigned int uUse,
++                                void *pvLoaderPrivate)
++{
++   CallFuncV2(v5.CreateImageWithModifiers2,
++              psDRISUPScreen, iWidth, iHeight, iFourCC, puModifiers,
++              uModifierCount, uUse, pvLoaderPrivate);
++
++   return NULL;
++}
++
++__DRIimage *
++DRISUPCreateImageFromFDs2(struct DRISUPScreen *psDRISUPcreen,
++                          int iWidth, int iHeight, int iFourCC,
++                          int *piFDs, int iNumFDs, uint32_t uFlags,
++                          int *piStrides, int *piOffsets,
++                          void *pvLoaderPrivate)
++{
++   CallFuncV2(v5.CreateImageFromFDs2,
++              psDRISUPcreen, iWidth, iHeight, iFourCC, piFDs, iNumFDs,
++              uFlags, piStrides, piOffsets, pvLoaderPrivate);
++
++   return NULL;
++}
++
++bool
++DRISUPHaveSetInFenceFd(void)
++{
++	return HaveFuncV2(v5.SetInFenceFD);
++}
++
++void
++DRISUPSetInFenceFd(__DRIimage *psImage, int iFd)
++{
++   CallFuncV2(v5.SetInFenceFD,
++              psImage, iFd);
++}
+diff --git a/src/gallium/frontends/pvr/pvrdri_support.h b/src/gallium/frontends/pvr/pvrdri_support.h
+index 58ea3505a4d..f735354440c 100644
+--- a/src/gallium/frontends/pvr/pvrdri_support.h
++++ b/src/gallium/frontends/pvr/pvrdri_support.h
+@@ -203,4 +203,31 @@ void DRISUPSetDamageRegion(struct DRISUPDrawable *psDRISUPDrawable,
+ 
+ bool DRISUPHaveGetFenceFromCLEvent(void);
+ 
++__DRIimage *DRISUPCreateImageFromDMABufs3(struct DRISUPScreen *psDRISUPScreen,
++                                          int iWidth, int iHeight,
++                                          int iFourCC, uint64_t uModifier,
++                                          int *piFDs, int iNumFDs,
++                                          int *piStrides, int *piOffsets,
++                                          unsigned int uColorSpace,
++                                          unsigned int uSampleRange,
++                                          unsigned int uHorizSiting,
++                                          unsigned int uVertSiting,
++                                          uint32_t uFlags,
++                                          unsigned int *puError,
++                                          void *pvLoaderPrivate);
++__DRIimage *DRISUPCreateImageWithModifiers2(struct DRISUPScreen *psDRISUPScreen,
++                                            int iWidth, int iHeight,
++                                            int iFourCC,
++                                            const uint64_t *puModifiers,
++                                            const unsigned int uModifierCount,
++                                            unsigned int uUse,
++                                            void *pvLoaderPrivate);
++__DRIimage *DRISUPCreateImageFromFDs2(struct DRISUPScreen *psDRISUPcreen,
++                                      int iWidth, int iHeight, int iFourCC,
++                                      int *piFDs, int iNumFDs, uint32_t uFlags,
++                                      int *piStrides, int *piOffsets,
++                                      void *pvLoaderPrivate);
++
++bool DRISUPHaveSetInFenceFd(void);
++void DRISUPSetInFenceFd(__DRIimage *psImage, int iFd);
+ #endif /* defined(__PVRDRI_SUPPORT_H__) */
+diff --git a/src/gallium/frontends/pvr/pvrext.c b/src/gallium/frontends/pvr/pvrext.c
+index 478399618df..826e84f502f 100644
+--- a/src/gallium/frontends/pvr/pvrext.c
++++ b/src/gallium/frontends/pvr/pvrext.c
+@@ -71,7 +71,7 @@
+ /* Maximum version numbers for each supported extension */
+ #define PVR_DRI_TEX_BUFFER_VERSION      3
+ #define PVR_DRI2_FLUSH_VERSION          4
+-#define PVR_DRI_IMAGE_VERSION           17
++#define PVR_DRI_IMAGE_VERSION           21
+ #define PVR_DRI2_ROBUSTNESS_VERSION     1
+ #define PVR_DRI2_FENCE_VERSION          2
+ #define PVR_DRI2_RENDERER_QUERY_VERSION 1
+@@ -445,6 +445,68 @@ PVRDRICreateImageFromRenderbuffer2(__DRIcontext *psDRIContext,
+                                              pvLoaderPrivate, puError);
+ }
+ 
++static __DRIimage *
++PVRDRICreateImageFromDmaBufs3(__DRIscreen *psDRIScreen,
++                              int iWidth, int iHeight,
++                              int iFourCC, uint64_t uModifier,
++                              int *piFDs, int iNumFDs,
++                              int *piStrides, int *piOffsets,
++                              enum __DRIYUVColorSpace eColorSpace,
++                              enum __DRISampleRange eSampleRange,
++                              enum __DRIChromaSiting eHorizSiting,
++                              enum __DRIChromaSiting eVertSiting,
++                              uint32_t uFlags, unsigned int *puError,
++                              void *pvLoaderPrivate)
++{
++   PVRDRIScreen *psPVRScreen = psDRIScreen->driverPrivate;
++
++   return DRISUPCreateImageFromDMABufs3(psPVRScreen->psDRISUPScreen,
++                                        iWidth, iHeight, iFourCC, uModifier,
++                                        piFDs, iNumFDs, piStrides, piOffsets,
++                                        (unsigned int) eColorSpace,
++                                        (unsigned int) eSampleRange,
++                                        (unsigned int) eHorizSiting,
++                                        (unsigned int) eVertSiting,
++                                        uFlags, puError, pvLoaderPrivate);
++}
++
++static __DRIimage *
++PVRDRICreateImageWithModifiers2(__DRIscreen *psDRIScreen,
++                                int iWidth, int iHeight, int iFormat,
++                                const uint64_t *puModifiers,
++                                const unsigned int uModifierCount,
++                                unsigned int uUse,
++                                void *pvLoaderPrivate)
++{
++   PVRDRIScreen *psPVRScreen = psDRIScreen->driverPrivate;
++   int iFourCC = PVRDRIFormatToFourCC(iFormat);
++
++   return DRISUPCreateImageWithModifiers2(psPVRScreen->psDRISUPScreen,
++                                          iWidth, iHeight, iFourCC,
++                                          puModifiers, uModifierCount,
++                                          uUse, pvLoaderPrivate);
++}
++
++static __DRIimage *
++PVRDRICreateImageFromFds2(__DRIscreen *psDRIScreen, int iWidth, int iHeight,
++                          int iFourCC, int *piFDs, int iNumFDs,
++                          uint32_t uFlags, int *piStrides, int *piOffsets,
++                          void *pvLoaderPrivate)
++{
++   PVRDRIScreen *psPVRScreen = psDRIScreen->driverPrivate;
++
++   return DRISUPCreateImageFromFDs2(psPVRScreen->psDRISUPScreen,
++                                    iWidth, iHeight, iFourCC, piFDs, iNumFDs,
++                                    uFlags, piStrides, piOffsets,
++                                    pvLoaderPrivate);
++}
++
++static void
++PVRDRISetInFenceFd(__DRIimage *psImage, int iFd)
++{
++   return DRISUPSetInFenceFd(psImage, iFd);
++}
++
+ #if defined(EGL_IMG_cl_image)
+ static __DRIimage *
+ PVRDRICreateImageFromBuffer(__DRIcontext *psDRIContext, int iTarget,
+@@ -486,6 +548,10 @@ static __DRIimageExtension pvrDRIImage = {
+    .queryDmaBufFormatModifierAttribs =
+    PVRDRIQueryDmaBufFormatModifierAttribs,
+    .createImageFromRenderbuffer2 = PVRDRICreateImageFromRenderbuffer2,
++   .createImageFromDmaBufs3 = PVRDRICreateImageFromDmaBufs3,
++   .createImageWithModifiers2 = PVRDRICreateImageWithModifiers2,
++   .createImageFromFds2 = PVRDRICreateImageFromFds2,
++   .setInFenceFd = PVRDRISetInFenceFd,
+ #if defined(EGL_IMG_cl_image)
+    .createImageFromBuffer = PVRDRICreateImageFromBuffer,
+ #endif
+@@ -684,8 +750,10 @@ PVRDRIScreenExtensionVersionInfo(void)
+ void
+ PVRDRIAdjustExtensions(unsigned int uVersion, unsigned int uMinVersion)
+ {
++   /* __DRI2fenceExtension adjustment */
+    switch (uVersion) {
+    default:
++   case 5:
+    case 4:
+       /* Is the KHR_cl_event2 EGL extension supported? */
+       if (!DRISUPHaveGetFenceFromCLEvent())
+@@ -701,4 +769,28 @@ PVRDRIAdjustExtensions(unsigned int uVersion, unsigned int uMinVersion)
+       pvrDRIFenceExtension.get_fence_from_cl_event = NULL;
+       break;
+    }
++
++   /* __DRIimageExtension adjustment */
++   switch (uVersion) {
++   default:
++   case 5:
++      if (!DRISUPHaveSetInFenceFd())
++         pvrDRIImage.setInFenceFd = NULL;
++
++      break;
++   case 4:
++   case 3:
++   case 2:
++   case 1:
++   case 0:
++      /*
++       * The following are not supported:
++       *    createImageFromDmaBufs3
++       *    createImageWithModifiers2
++       *    createImageFromFds2
++       *    setInFenceFd
++       */
++      pvrDRIImage.base.version = 17;
++      break;
++   }
+ }
+-- 
+2.34.1
+

+ 0 - 64
package/mesa3d/0062-vulkan-wsi-enable-additional-formats-for-Wayland.patch

@@ -1,64 +0,0 @@
-From 7e8bb12d48651796da6d8f3df1b388551d3b5510 Mon Sep 17 00:00:00 2001
-From: brendan King <Brendan.King@imgtec.com>
-Date: Mon, 2 Aug 2021 11:21:16 +0100
-Subject: [PATCH 62/67] vulkan/wsi: enable additional formats for Wayland
-
-Add VK_FORMAT_R5G6B5_UNORM_PACK16.
-
-This is for compatibility with IMG WSI.
----
- src/vulkan/wsi/wsi_common_wayland.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
-index 1109d3f07b6..e520aa9af00 100644
---- a/src/vulkan/wsi/wsi_common_wayland.c
-+++ b/src/vulkan/wsi/wsi_common_wayland.c
-@@ -68,6 +68,7 @@ struct wsi_wl_display_dmabuf {
-    struct {
-       struct u_vector                           argb8888;
-       struct u_vector                           xrgb8888;
-+      struct u_vector                           rgb565;
-    } modifiers;
- };
- 
-@@ -441,6 +442,9 @@ dmabuf_handle_modifier(void *data, struct zwp_linux_dmabuf_v1 *dmabuf,
-    case WL_DRM_FORMAT_XRGB8888:
-       modifiers = &display->dmabuf.modifiers.xrgb8888;
-       break;
-+   case WL_DRM_FORMAT_RGB565:
-+      modifiers = &display->dmabuf.modifiers.rgb565;
-+      break;
-    default:
-       return; /* Unsupported format */
-    }
-@@ -527,6 +531,7 @@ wsi_wl_display_finish(struct wsi_wl_display *display)
-    u_vector_finish(&display->dmabuf.formats);
-    u_vector_finish(&display->dmabuf.modifiers.argb8888);
-    u_vector_finish(&display->dmabuf.modifiers.xrgb8888);
-+   u_vector_finish(&display->dmabuf.modifiers.rgb565);
-    if (display->swrast.wl_shm)
-       wl_shm_destroy(display->swrast.wl_shm);
-    if (display->drm.wl_drm)
-@@ -563,6 +568,8 @@ wsi_wl_display_init(struct wsi_wayland *wsi_wl,
-           !u_vector_init(&display->dmabuf.modifiers.argb8888,
-                          sizeof(uint64_t), 32) ||
-           !u_vector_init(&display->dmabuf.modifiers.xrgb8888,
-+                         sizeof(uint64_t), 32) ||
-+          !u_vector_init(&display->dmabuf.modifiers.rgb565,
-                          sizeof(uint64_t), 32)) {
-          result = VK_ERROR_OUT_OF_HOST_MEMORY;
-          goto fail;
-@@ -1356,6 +1363,9 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
-       case WL_DRM_FORMAT_XRGB8888:
-          modifiers = &chain->display->dmabuf.modifiers.xrgb8888;
-          break;
-+      case WL_DRM_FORMAT_RGB565:
-+         modifiers = &chain->display->dmabuf.modifiers.rgb565;
-+         break;
-       default:
-          modifiers = NULL;
-          break;
--- 
-2.25.1
-

+ 0 - 183
package/mesa3d/0064-mesa-main-dri-add-YUV420_3PLANE-and-YVU420_3PLANE.patch

@@ -1,183 +0,0 @@
-From 85762f3538a21a99bf1b71d87345ebe51f9de453 Mon Sep 17 00:00:00 2001
-From: Luigi Santivetti <luigi.santivetti@imgtec.com>
-Date: Thu, 12 Aug 2021 00:55:46 +0100
-Subject: [PATCH 64/67] mesa/main: dri: add YUV420_3PLANE and YVU420_3PLANE
-
----
- include/GL/internal/dri_interface.h    |  2 ++
- src/gallium/include/pipe/p_format.h    |  3 +++
- src/mesa/drivers/dri/common/utils.c    | 18 ++++++++++++++++++
- src/mesa/drivers/dri/pvr/dri_support.h |  2 ++
- src/mesa/drivers/dri/pvr/pvrutil.c     | 13 +++++++++++++
- src/mesa/main/format_info.py           |  2 +-
- src/mesa/main/formats.c                |  2 ++
- src/mesa/main/formats.csv              |  2 ++
- src/mesa/main/formats.h                |  6 ++++++
- 9 files changed, 49 insertions(+), 1 deletion(-)
-
-diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
-index 080d191b0a3..7d9a1bd9ba6 100644
---- a/include/GL/internal/dri_interface.h
-+++ b/include/GL/internal/dri_interface.h
-@@ -1424,6 +1424,8 @@ struct __DRIdri2ExtensionRec {
- #define __DRI_IMAGE_FORMAT_BGR888       0x101a
- #define __DRI_IMAGE_FORMAT_NV12         0x101b
- #define __DRI_IMAGE_FORMAT_NV21         0x101c
-+#define __DRI_IMAGE_FORMAT_YU12         0x101d
-+#define __DRI_IMAGE_FORMAT_YV12         0x101e
- 
- #define __DRI_IMAGE_USE_SHARE		0x0001
- #define __DRI_IMAGE_USE_SCANOUT		0x0002
-diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h
-index fd653379b7a..970f07598d5 100644
---- a/src/gallium/include/pipe/p_format.h
-+++ b/src/gallium/include/pipe/p_format.h
-@@ -516,6 +516,9 @@ enum pipe_format {
-    PIPE_FORMAT_YUV420_2PLANE,
-    PIPE_FORMAT_YVU420_2PLANE,
- 
-+   PIPE_FORMAT_YUV420_3PLANE,
-+   PIPE_FORMAT_YVU420_3PLANE,
-+
-    PIPE_FORMAT_COUNT
- };
- 
-diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c
-index d268dc41fbb..df5f8cbfdc0 100644
---- a/src/mesa/drivers/dri/common/utils.c
-+++ b/src/mesa/drivers/dri/common/utils.c
-@@ -330,6 +330,24 @@ driCreateConfigs(mesa_format format,
-       yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT;
-       yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
-       break;
-+   case MESA_FORMAT_YUV420_3PLANE:
-+      masks = format_table[11].masks;
-+      shifts = format_table[11].shifts;
-+      is_yuv = true; /* FIXME: This should come from formats_info.py */
-+      yuv_order = __DRI_ATTRIB_YUV_ORDER_YUV_BIT;
-+      yuv_num_planes = 3;
-+      yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT;
-+      yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
-+      break;
-+   case MESA_FORMAT_YVU420_3PLANE:
-+      masks = format_table[11].masks;
-+      shifts = format_table[11].shifts;
-+      is_yuv = true; /* FIXME: This should come from formats_info.py */
-+      yuv_order = __DRI_ATTRIB_YUV_ORDER_YVU_BIT;
-+      yuv_num_planes = 3;
-+      yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT;
-+      yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
-+      break;
-    default:
-       fprintf(stderr, "[%s:%u] Unknown framebuffer type %s (%d).\n",
-               __func__, __LINE__,
-diff --git a/src/mesa/drivers/dri/pvr/dri_support.h b/src/mesa/drivers/dri/pvr/dri_support.h
-index ab0b9dd9a23..a4999dc36bf 100644
---- a/src/mesa/drivers/dri/pvr/dri_support.h
-+++ b/src/mesa/drivers/dri/pvr/dri_support.h
-@@ -189,6 +189,8 @@ typedef enum
- #define PVRDRI_MESA_FORMAT_YVU420_2PLANE	8
- #define PVRDRI_MESA_FORMAT_B8G8R8A8_SRGB	9
- #define PVRDRI_MESA_FORMAT_R8G8B8A8_SRGB	10
-+#define PVRDRI_MESA_FORMAT_YUV420_3PLANE	11
-+#define PVRDRI_MESA_FORMAT_YVU420_3PLANE	12
- 
- /* The blit flags match their DRI counterparts */
- #define PVRDRI_BLIT_FLAG_FLUSH		0x0001
-diff --git a/src/mesa/drivers/dri/pvr/pvrutil.c b/src/mesa/drivers/dri/pvr/pvrutil.c
-index d107a5dafad..ee11ac55914 100644
---- a/src/mesa/drivers/dri/pvr/pvrutil.c
-+++ b/src/mesa/drivers/dri/pvr/pvrutil.c
-@@ -118,6 +118,10 @@ PVRDRIMesaFormatToMesaFormat(int pvrdri_mesa_format)
-       return MESA_FORMAT_B8G8R8A8_SRGB;
-    case PVRDRI_MESA_FORMAT_R8G8B8A8_SRGB:
-       return MESA_FORMAT_R8G8B8A8_SRGB;
-+   case PVRDRI_MESA_FORMAT_YUV420_3PLANE:
-+         return MESA_FORMAT_YUV420_3PLANE;
-+   case PVRDRI_MESA_FORMAT_YVU420_3PLANE:
-+         return MESA_FORMAT_YVU420_3PLANE;
-    default:
-       __driUtilMessage("%s: Unknown format: %d", __func__, pvrdri_mesa_format);
-       break;
-@@ -178,6 +182,11 @@ PVRDRIFormatToFourCC(int dri_format)
-       return DRM_FORMAT_NV12;
-    case __DRI_IMAGE_FORMAT_NV21:
-       return DRM_FORMAT_NV21;
-+   case __DRI_IMAGE_FORMAT_YU12:
-+      return DRM_FORMAT_YUV420;
-+   case __DRI_IMAGE_FORMAT_YV12:
-+      return DRM_FORMAT_YVU420;
-+
-    default:
-       __driUtilMessage("%s: Unknown format: %d", __func__, dri_format);
-       break;
-@@ -238,6 +247,10 @@ PVRDRIFourCCToDRIFormat(int iFourCC)
-       return __DRI_IMAGE_FORMAT_NV12;
-    case DRM_FORMAT_NV21:
-       return __DRI_IMAGE_FORMAT_NV21;
-+   case DRM_FORMAT_YUV420:
-+      return __DRI_IMAGE_FORMAT_YU12;
-+   case DRM_FORMAT_YVU420:
-+      return __DRI_IMAGE_FORMAT_YV12;
-    default:
-       __driUtilMessage("%s: Unknown format: %d", __func__, iFourCC);
-       break;
-diff --git a/src/mesa/main/format_info.py b/src/mesa/main/format_info.py
-index d58403ea85e..bc18db74f17 100644
---- a/src/mesa/main/format_info.py
-+++ b/src/mesa/main/format_info.py
-@@ -29,7 +29,7 @@ import sys
- def get_gl_base_format(fmat):
-    if fmat.name == 'MESA_FORMAT_NONE':
-       return 'GL_NONE'
--   elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV', 'MESA_FORMAT_YUV420_2PLANE', 'MESA_FORMAT_YVU420_2PLANE']:
-+   elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV', 'MESA_FORMAT_YUV420_2PLANE', 'MESA_FORMAT_YVU420_2PLANE', 'MESA_FORMAT_YUV420_3PLANE', 'MESA_FORMAT_YVU420_3PLANE']:
-       return 'GL_YCBCR_MESA'
-    elif fmat.has_channel('r'):
-       if fmat.has_channel('g'):
-diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
-index f81caeceff4..d7b0d0a07c9 100644
---- a/src/mesa/main/formats.c
-+++ b/src/mesa/main/formats.c
-@@ -1455,6 +1455,8 @@ _mesa_format_matches_format_and_type(mesa_format mformat,
-    switch (mformat) {
-    case MESA_FORMAT_YUV420_2PLANE:
-    case MESA_FORMAT_YVU420_2PLANE:
-+   case MESA_FORMAT_YUV420_3PLANE:
-+   case MESA_FORMAT_YVU420_3PLANE:
-       return false;
- 
-    default:
-diff --git a/src/mesa/main/formats.csv b/src/mesa/main/formats.csv
-index b2d476577e0..825443b10ce 100644
---- a/src/mesa/main/formats.csv
-+++ b/src/mesa/main/formats.csv
-@@ -94,6 +94,8 @@ MESA_FORMAT_YCBCR                         , other , 1, 1, 1, x16 ,     ,     ,
- MESA_FORMAT_YCBCR_REV                     , other , 1, 1, 1, x16 ,     ,     ,     , xyzw, yuv
- MESA_FORMAT_YUV420_2PLANE                 , other , 1, 1, 1, x8  ,     ,     ,     , y___, yuv
- MESA_FORMAT_YVU420_2PLANE                 , other , 1, 1, 1, x8  ,     ,     ,     , y___, yuv
-+MESA_FORMAT_YUV420_3PLANE                 , other , 1, 1, 1, x8  ,     ,     ,     , y___, yuv
-+MESA_FORMAT_YVU420_3PLANE                 , other , 1, 1, 1, x8  ,     ,     ,     , y___, yuv
- 
- MESA_FORMAT_RG_RB_UNORM8                  , other , 2, 1, 1, x16 ,     ,     ,     , xyz1, rgb
- MESA_FORMAT_GR_BR_UNORM8                  , other , 2, 1, 1, x16 ,     ,     ,     , xyz1, rgb
-diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
-index 0e778d64467..1ab03d2be7e 100644
---- a/src/mesa/main/formats.h
-+++ b/src/mesa/main/formats.h
-@@ -624,6 +624,12 @@ typedef enum pipe_format mesa_format;
- #define HAVE_MESA_FORMAT_YVU420_2PLANE
- #define MESA_FORMAT_YVU420_2PLANE                PIPE_FORMAT_YVU420_2PLANE
- 
-+#define HAVE_MESA_FORMAT_YUV420_3PLANE
-+#define MESA_FORMAT_YUV420_3PLANE                PIPE_FORMAT_YUV420_3PLANE
-+
-+#define HAVE_MESA_FORMAT_YVU420_3PLANE
-+#define MESA_FORMAT_YVU420_3PLANE                PIPE_FORMAT_YVU420_3PLANE
-+
- #define MESA_FORMAT_COUNT                        PIPE_FORMAT_COUNT
- 
- /* Packed to array format adapters */
--- 
-2.25.1
-

+ 0 - 58
package/mesa3d/0065-egl-null-add-support-for-YU12-and-YV12.patch

@@ -1,58 +0,0 @@
-From 89f34a04c15c8657cb77bbbc94fb9b9d0ac76980 Mon Sep 17 00:00:00 2001
-From: Luigi Santivetti <luigi.santivetti@imgtec.com>
-Date: Mon, 23 Aug 2021 09:18:37 +0100
-Subject: [PATCH 65/67] egl/null: add support for YU12 and YV12
-
----
- src/egl/drivers/dri2/platform_null.c | 28 ++++++++++++++++++++++++++++
- 1 file changed, 28 insertions(+)
-
-diff --git a/src/egl/drivers/dri2/platform_null.c b/src/egl/drivers/dri2/platform_null.c
-index 529cc7a2a2f..2e86d6533de 100644
---- a/src/egl/drivers/dri2/platform_null.c
-+++ b/src/egl/drivers/dri2/platform_null.c
-@@ -106,6 +106,20 @@ static const struct dri2_null_yuv_attrib {
-       .num_planes = 2,
-       .plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT,
-    },
-+   {
-+      /* __DRI_IMAGE_FORMAT_YU12 */
-+      .order = __DRI_ATTRIB_YUV_ORDER_YUV_BIT,
-+      .subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT,
-+      .num_planes = 3,
-+      .plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT,
-+   },
-+   {
-+      /* __DRI_IMAGE_FORMAT_YV12 */
-+      .order = __DRI_ATTRIB_YUV_ORDER_YVU_BIT,
-+      .subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT,
-+      .num_planes = 3,
-+      .plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT,
-+   },
- };
- 
- /*
-@@ -161,6 +175,20 @@ static const struct dri2_null_format {
-       .rgba_sizes = { 0, 0, 0, 0 },
-       .yuv = &dri2_null_yuv_attribs[2],
-    },
-+   {
-+      .drm_format = DRM_FORMAT_YUV420,
-+      .dri_image_format = __DRI_IMAGE_FORMAT_YU12,
-+      .rgba_shifts = { -1, -1, -1, -1 },
-+      .rgba_sizes = { 0, 0, 0, 0 },
-+      .yuv = &dri2_null_yuv_attribs[3],
-+   },
-+   {
-+      .drm_format = DRM_FORMAT_YVU420,
-+      .dri_image_format = __DRI_IMAGE_FORMAT_YV12,
-+      .rgba_shifts = { -1, -1, -1, -1 },
-+      .rgba_sizes = { 0, 0, 0, 0 },
-+      .yuv = &dri2_null_yuv_attribs[4],
-+   },
- };
- 
- 
--- 
-2.25.1
-

+ 57 - 89
package/mesa3d/Config.in

@@ -24,19 +24,21 @@ config BR2_PACKAGE_MESA3D_NEEDS_ELFUTILS
 config BR2_PACKAGE_MESA3D_LLVM
 	bool "llvm support"
 	depends on BR2_PACKAGE_LLVM_ARCH_SUPPORTS
-	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_4_8
+	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_5
 	depends on BR2_TOOLCHAIN_HAS_THREADS
 	depends on BR2_INSTALL_LIBSTDCPP
 	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735 # std::shared_future
 	depends on !BR2_STATIC_LIBS
 	depends on BR2_USE_WCHAR # std::wstring
+	depends on BR2_HOST_GCC_AT_LEAST_5 # host-llvm
 	select BR2_PACKAGE_LLVM
 
-comment "llvm support needs a toolchain w/ wchar, threads, C++, gcc >= 4.8, dynamic library"
+comment "llvm support needs a toolchain w/ wchar, threads, C++, gcc >= 5, dynamic library, host gcc >= 5"
 	depends on BR2_PACKAGE_LLVM_ARCH_SUPPORTS
 	depends on !BR2_TOOLCHAIN_HAS_THREADS || !BR2_INSTALL_LIBSTDCPP || \
-		!BR2_TOOLCHAIN_GCC_AT_LEAST_4_8 \
-		|| BR2_STATIC_LIBS || !BR2_USE_WCHAR
+		!BR2_TOOLCHAIN_GCC_AT_LEAST_5 \
+		|| BR2_STATIC_LIBS || !BR2_USE_WCHAR \
+		|| !BR2_HOST_GCC_AT_LEAST_5
 
 comment "llvm support needs a toolchain not affected by GCC bug 64735"
 	depends on BR2_PACKAGE_LLVM_ARCH_SUPPORTS
@@ -54,20 +56,14 @@ config BR2_PACKAGE_MESA3D_OPENCL
 	select BR2_PACKAGE_LIBCLC
 	select BR2_PACKAGE_HAS_LIBOPENCL
 
-# inform the .mk file of gallium, dri or vulkan driver selection
-config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
+# inform the .mk file of gallium, dri, dri3 or vulkan driver selection
+config BR2_PACKAGE_MESA3D_DRI3
 	bool
-	select BR2_PACKAGE_MESA3D_DRIVER
+	select BR2_PACKAGE_XLIB_LIBXSHMFENCE
 
-config BR2_PACKAGE_MESA3D_DRI_DRIVER
+config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
 	bool
 	select BR2_PACKAGE_MESA3D_DRIVER
-	select BR2_PACKAGE_MESA3D_GBM if \
-		!BR2_PACKAGE_MESA3D_OPENGL_GLX && \
-		!BR2_PACKAGE_MESA3D_OPENGL_EGL
-	select BR2_PACKAGE_XLIB_LIBXSHMFENCE if \
-		(BR2_PACKAGE_XORG7 && BR2_TOOLCHAIN_HAS_SYNC_4 && \
-			!BR2_RISCV_32)
 
 config BR2_PACKAGE_MESA3D_VULKAN_DRIVER
 	bool
@@ -97,8 +93,17 @@ config BR2_PACKAGE_MESA3D_NEEDS_X11
 
 comment "Gallium drivers"
 
+config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_CROCUS
+	bool "Gallium crocus driver"
+	depends on BR2_i386 || BR2_x86_64
+	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
+	help
+	  Mesa driver for gen4-7 Intel GPUs.
+
 config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV
 	bool "Gallium Etnaviv driver"
+	depends on (BR2_TOOLCHAIN_HAS_SYNC_4 && !BR2_RISCV_32) || !BR2_PACKAGE_XORG7 # libxshmfence
+	select BR2_PACKAGE_MESA3D_DRI3 if BR2_PACKAGE_XORG7
 	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
 	select BR2_PACKAGE_LIBDRM_ETNAVIV
 	help
@@ -112,6 +117,7 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_FREEDRENO
 	# can't see is just spurious. However, that dependency is about
 	# the toolchain having sync4 primitives, which is always a given
 	# for arm/aarch64.
+	select BR2_PACKAGE_MESA3D_DRI3 if BR2_PACKAGE_XORG7
 	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
 	select BR2_PACKAGE_LIBDRM_FREEDRENO
 	help
@@ -120,16 +126,11 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_FREEDRENO
 config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915
 	bool "Gallium i915 driver"
 	depends on BR2_i386 || BR2_x86_64
-	depends on !BR2_PACKAGE_MESA3D_DRI_DRIVER_I915
 	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
 	select BR2_PACKAGE_LIBDRM_INTEL
 	help
 	  Support for i915-based Intel GPUs.
 
-comment "Gallium i915: Only one i915 provider can be built"
-	depends on BR2_i386 || BR2_x86_64
-	depends on BR2_PACKAGE_MESA3D_DRI_DRIVER_I915
-
 config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS
 	bool "Gallium iris driver"
 	depends on BR2_i386 || BR2_x86_64
@@ -139,6 +140,8 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS
 
 config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LIMA
 	bool "Gallium lima driver"
+	depends on (BR2_TOOLCHAIN_HAS_SYNC_4 && !BR2_RISCV_32) || !BR2_PACKAGE_XORG7 # libxshmfence
+	select BR2_PACKAGE_MESA3D_DRI3 if BR2_PACKAGE_XORG7
 	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
 	help
 	  Mesa driver for ARM Mali Utgard GPUs.
@@ -154,6 +157,8 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_NOUVEAU
 
 config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST
 	bool "Gallium panfrost driver"
+	depends on (BR2_TOOLCHAIN_HAS_SYNC_4 && !BR2_RISCV_32) || !BR2_PACKAGE_XORG7 # libxshmfence
+	select BR2_PACKAGE_MESA3D_DRI3 if BR2_PACKAGE_XORG7
 	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
 	help
 	  Mesa driver for ARM Mali Midgard and Bifrost GPUs.
@@ -241,8 +246,10 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA
 config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_V3D
 	bool "Gallium v3d driver"
 	depends on (BR2_arm && BR2_ARM_CPU_HAS_NEON) || BR2_aarch64
+	depends on BR2_TOOLCHAIN_HAS_SYNC_4 || !BR2_PACKAGE_XORG7 # libxshmfence
+	select BR2_PACKAGE_MESA3D_DRI3 if BR2_PACKAGE_XORG7
 	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
-	select BR2_PACKAGE_LIBDRM_VC4
+	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VC4 # runtime
 	select BR2_PACKAGE_MESA3D_OPENGL_EGL
 	help
 	  Driver for Broadcom VC6 (rpi4) GPUs (needs vc4).
@@ -254,7 +261,9 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_V3D
 
 config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VC4
 	bool "Gallium vc4 driver"
-	depends on BR2_arm || BR2_aarch64
+	depends on (BR2_arm && BR2_ARM_CPU_HAS_NEON) || BR2_aarch64
+	depends on BR2_TOOLCHAIN_HAS_SYNC_4 || !BR2_PACKAGE_XORG7 # libxshmfence
+	select BR2_PACKAGE_MESA3D_DRI3 if BR2_PACKAGE_XORG7
 	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
 	select BR2_PACKAGE_LIBDRM_VC4
 	select BR2_PACKAGE_MESA3D_OPENGL_EGL
@@ -270,6 +279,14 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL
 	  virgl is the 3D acceleration backend for the virtio-gpu
 	  shipping with qemu.
 
+config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PVR
+	bool "Gallium pvr driver"
+	depends on BR2_PACKAGE_IMG_GPU_POWERVR
+	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
+	select BR2_PACKAGE_MESA3D_OPENGL_EGL
+	help
+	  pvr is the 3D acceleration backend for Imagination PowerVR GPUs
+
 config BR2_PACKAGE_MESA3D_VDPAU
 	bool "Gallium VDPAU state tracker"
 	depends on BR2_PACKAGE_XORG7
@@ -308,76 +325,24 @@ comment "Gallium XvMC state tracker needs X.org and gallium drivers r600 or nouv
 		!(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_NOUVEAU \
 		|| BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600)
 
-comment "DRI drivers"
-
-config BR2_PACKAGE_MESA3D_DRI_DRIVER_I915
-	bool "DRI i915 driver"
-	depends on BR2_i386 || BR2_x86_64
-	select BR2_PACKAGE_MESA3D_DRI_DRIVER
-	select BR2_PACKAGE_LIBDRM_INTEL
-	help
-	  Support for i915-based Intel GPUs.
-
-config BR2_PACKAGE_MESA3D_DRI_DRIVER_I965
-	bool "DRI i965 driver"
-	depends on BR2_i386 || BR2_x86_64
-	depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17 # memfd.h
-	select BR2_PACKAGE_MESA3D_DRI_DRIVER
-	select BR2_PACKAGE_LIBDRM_INTEL
-	help
-	  Support for i965-based Intel GPUs.
-
-comment "DRI i965 driver needs a toolchain w/ headers >= 3.17"
-	depends on BR2_i386 || BR2_x86_64
-	depends on !BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17
-
-config BR2_PACKAGE_MESA3D_DRI_DRIVER_NOUVEAU
-	bool "DRI nouveau driver"
-	select BR2_PACKAGE_MESA3D_DRI_DRIVER
-	select BR2_PACKAGE_LIBDRM_NOUVEAU
-	help
-	  Support for Nvidia-based GPUs.
-
-config BR2_PACKAGE_MESA3D_DRI_DRIVER_RADEON
-	bool "DRI radeon r100 driver"
-	depends on BR2_i386 || BR2_x86_64
-	# libdrm's radeon option depends on LIBDRM_HAS_ATOMIC. Propagating
-	# that dependency here causes a circular dependency that Kconfig
-	# can't see is just spurious. However, that dependency is about
-	# the toolchain having sync4 primitives, which is always a given
-	# for i386 and x86_64.
-	select BR2_PACKAGE_MESA3D_DRI_DRIVER
-	select BR2_PACKAGE_LIBDRM_RADEON
-	help
-	  Legacy Radeon driver for R100 series GPUs.
-
-config BR2_PACKAGE_MESA3D_DRI_DRIVER_PVR
-        bool "DRI pvr driver"
-	depends on BR2_PACKAGE_IMG_GPU_POWERVR
-        select BR2_PACKAGE_MESA3D_DRI_DRIVER
-        help
-          Support for Imagination PowerVR GPUs.
-
 comment "Vulkan drivers"
 
 config BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL
 	bool "Vulkan Intel driver"
 	depends on BR2_i386 || BR2_x86_64
-	depends on BR2_TOOLCHAIN_HAS_SYNC_4 # libxshmfence
+	depends on BR2_TOOLCHAIN_HAS_SYNC_4 || !BR2_PACKAGE_XORG7 # libxshmfence
 	depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17 # memfd.h
 	depends on BR2_TOOLCHAIN_USES_GLIBC # ifunc, static_assert
-	depends on BR2_PACKAGE_XORG7 # xorgproto
+	select BR2_PACKAGE_MESA3D_DRI3 if BR2_PACKAGE_XORG7
 	select BR2_PACKAGE_MESA3D_VULKAN_DRIVER
-	select BR2_PACKAGE_XORGPROTO
-	select BR2_PACKAGE_XLIB_LIBXSHMFENCE
 	help
 	  Vulkan driver for Intel hardware from Ivy Bridge onward.
 
-comment "intel vulkan depends on X.org and needs a glibc toolchain w/ headers >= 3.17"
+comment "intel vulkan needs a glibc toolchain w/ headers >= 3.17"
 	depends on BR2_i386 || BR2_x86_64
-	depends on BR2_TOOLCHAIN_HAS_SYNC_4
+	depends on BR2_TOOLCHAIN_HAS_SYNC_4 || !BR2_PACKAGE_XORG7
 	depends on !BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17 || \
-		!BR2_TOOLCHAIN_USES_GLIBC || !BR2_PACKAGE_XORG7
+		!BR2_TOOLCHAIN_USES_GLIBC
 
 comment "Off-screen Rendering"
 
@@ -393,22 +358,22 @@ comment "OpenGL API Support"
 
 config BR2_PACKAGE_MESA3D_GBM
 	bool "gbm"
-	depends on BR2_PACKAGE_MESA3D_DRI_DRIVER \
-		|| (BR2_PACKAGE_MESA3D_GALLIUM_DRIVER && BR2_PACKAGE_MESA3D_OPENGL_EGL)
+	depends on BR2_PACKAGE_MESA3D_GALLIUM_DRIVER && \
+		BR2_PACKAGE_MESA3D_OPENGL_EGL
 	select BR2_PACKAGE_HAS_LIBGBM
 	select BR2_PACKAGE_LIBGBM_HAS_FEATURE_FORMAT_MODIFIER_PLANE_COUNT
 	select BR2_PACKAGE_LIBGBM_HAS_FEATURE_DMA_BUF
 	help
 	  Enable Generic Buffer Management (gbm)
 
-comment "gbm support needs a dri driver or a gallium driver w/ EGL support."
-	depends on !BR2_PACKAGE_MESA3D_DRI_DRIVER \
-		&& !(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER && BR2_PACKAGE_MESA3D_OPENGL_EGL)
+comment "gbm support needs a gallium driver w/ EGL support."
+	depends on !(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER && BR2_PACKAGE_MESA3D_OPENGL_EGL)
 
 config BR2_PACKAGE_MESA3D_OPENGL_GLX
 	bool "OpenGL GLX"
 	depends on BR2_PACKAGE_XORG7
-	select BR2_PACKAGE_HAS_LIBGL
+	select BR2_PACKAGE_HAS_LIBGL if !BR2_PACKAGE_LIBGLVND
+	select BR2_PACKAGE_LIBGLVND_DISPATCH_GL if BR2_PACKAGE_LIBGLVND
 	select BR2_PACKAGE_MESA3D_NEEDS_X11
 	help
 	  Enable GLX graphic acceleration (OpenGL + X11).
@@ -418,7 +383,9 @@ comment "OpenGL GLX support needs X11"
 
 config BR2_PACKAGE_MESA3D_OPENGL_EGL
 	bool "OpenGL EGL"
-	select BR2_PACKAGE_HAS_LIBEGL
+	depends on BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
+	select BR2_PACKAGE_HAS_LIBEGL if !BR2_PACKAGE_LIBGLVND
+	select BR2_PACKAGE_LIBGLVND_DISPATCH_EGL if BR2_PACKAGE_LIBGLVND
 	select BR2_PACKAGE_HAS_LIBEGL_WAYLAND
 	select BR2_PACKAGE_MESA3D_GBM
 	help
@@ -427,7 +394,8 @@ config BR2_PACKAGE_MESA3D_OPENGL_EGL
 
 config BR2_PACKAGE_MESA3D_OPENGL_ES
 	bool "OpenGL ES"
-	select BR2_PACKAGE_HAS_LIBGLES
+	select BR2_PACKAGE_HAS_LIBGLES if !BR2_PACKAGE_LIBGLVND
+	select BR2_PACKAGE_LIBGLVND_DISPATCH_GLES if BR2_PACKAGE_LIBGLVND
 	help
 	  Use the Khronos OpenGL ES APIs. This is commonly used on
 	  embedded systems and represents a subset of the OpenGL API.
@@ -438,13 +406,13 @@ config BR2_PACKAGE_PROVIDES_LIBGBM
 	default "mesa3d" if BR2_PACKAGE_MESA3D_GBM
 
 config BR2_PACKAGE_PROVIDES_LIBGL
-	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENGL_GLX
+	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENGL_GLX && !BR2_PACKAGE_LIBGLVND
 
 config BR2_PACKAGE_PROVIDES_LIBEGL
-	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENGL_EGL
+	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENGL_EGL && !BR2_PACKAGE_LIBGLVND
 
 config BR2_PACKAGE_PROVIDES_LIBGLES
-	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENGL_ES
+	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENGL_ES && !BR2_PACKAGE_LIBGLVND
 
 config BR2_PACKAGE_PROVIDES_LIBOPENCL
 	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENCL

+ 4 - 4
package/mesa3d/mesa3d.hash

@@ -1,6 +1,6 @@
-# From https://lists.freedesktop.org/archives/mesa-announce/2021-August/000643.html
-sha256  2c65e6710b419b67456a48beefd0be827b32db416772e0e363d5f7d54dc01787  mesa-21.2.1.tar.xz
-sha512  d4056287ec86f7a95ce534a251a1ccbc3a3b08a2f7112152def2f054fc8a9424501d5883c463554ee95fe2dafb832613efd7145e989ee8281948233942730c2c  mesa-21.2.1.tar.xz
+# From https://lists.freedesktop.org/archives/mesa-announce/2022-June/000682.html
+sha256  b98f32ba7aa2a1ff5725fb36eb999c693079f0ca16f70aa2f103e2b6c3f093e3  mesa-22.1.3.tar.xz
+sha512  e7348839eb37de89c90d21277a7cbb42ee673ad6c656177853f6d35db99556dbac29867712222342d902b4fa67df5687c9d543bad99c81bcd0ecfb7f08f37480  mesa-22.1.3.tar.xz
 
 # License
-sha256  998437f3f75f0c542046f83c1cb349408122268168fb13eb4ae6967aa18b7d98  docs/license.rst
+sha256  4bc15d14dcc134b024cbdca3b5330010136ce8a427b6f8353440ce2ad7aab037  docs/license.rst

+ 52 - 30
package/mesa3d/mesa3d.mk

@@ -5,7 +5,7 @@
 ################################################################################
 
 # When updating the version, please also update mesa3d-headers
-MESA3D_VERSION = 21.2.1
+MESA3D_VERSION = 22.1.3
 MESA3D_SOURCE = mesa-$(MESA3D_VERSION).tar.xz
 MESA3D_SITE = https://archive.mesa3d.org
 MESA3D_LICENSE = MIT, SGI, Khronos
@@ -20,11 +20,23 @@ MESA3D_PROVIDES =
 MESA3D_DEPENDENCIES = \
 	host-bison \
 	host-flex \
-	host-python3-mako \
+	host-python-mako \
 	expat \
 	libdrm \
 	zlib
 
+# the src/mesa/main/formats.csv in mesa-22.1.3 offical tarball is msdos file format
+# patch the 0023-dri-add-support-for-YUV-DRI-config.patch will failed:
+#      Hunk #1 FAILED at 92 (different line endings).
+# so first change to the unix file format before patch
+define MESA3D_CHANEG_FILE_TO_UNIX_FORMAT
+	if [ -f $(@D)/src/mesa/main/formats.csv ]; then \
+		sed -i 's/\r$$//' $(@D)/src/mesa/main/formats.csv; \
+	fi
+endef
+
+MESA3D_POST_EXTRACT_HOOKS += MESA3D_CHANEG_FILE_TO_UNIX_FORMAT
+
 MESA3D_CONF_OPTS = \
 	-Dgallium-omx=disabled \
 	-Dpower8=disabled
@@ -35,6 +47,15 @@ ifeq ($(BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM),y)
 MESA3D_CONF_OPTS += -Db_asneeded=false
 endif
 
+ifeq ($(BR2_PACKAGE_MESA3D_DRI3),y)
+MESA3D_CONF_OPTS += -Ddri3=enabled
+ifeq ($(BR2_PACKAGE_XLIB_LIBXSHMFENCE),y)
+MESA3D_DEPENDENCIES += xlib_libxshmfence
+endif
+else
+MESA3D_CONF_OPTS += -Ddri3=disabled
+endif
+
 ifeq ($(BR2_PACKAGE_MESA3D_LLVM),y)
 MESA3D_DEPENDENCIES += host-llvm llvm
 MESA3D_MESON_EXTRA_BINARIES += llvm-config='$(STAGING_DIR)/usr/bin/llvm-config'
@@ -64,7 +85,10 @@ ifeq ($(BR2_PACKAGE_MESA3D_OPENGL_GLX),y)
 #  dri          : dri based GLX requires at least one DRI driver || dri based GLX requires shared-glapi
 #  xlib         : xlib conflicts with any dri driver
 #  gallium-xlib : Gallium-xlib based GLX requires at least one gallium driver || Gallium-xlib based GLX requires softpipe or llvmpipe || gallium-xlib conflicts with any dri driver.
-MESA3D_CONF_OPTS += -Dglx=dri
+# Always enable glx-direct; without it, many GLX applications don't work.
+MESA3D_CONF_OPTS += \
+	-Dglx=dri \
+	-Dglx-direct=true
 ifeq ($(BR2_PACKAGE_MESA3D_NEEDS_XA),y)
 MESA3D_CONF_OPTS += -Dgallium-xa=enabled
 else
@@ -76,9 +100,16 @@ MESA3D_CONF_OPTS += \
 	-Dgallium-xa=disabled
 endif
 
+# ifeq ($(BR2_ARM_CPU_HAS_NEON),y)
+# MESA3D_CONF_OPTS += -Dgallium-vc4-neon=auto
+# else
+# MESA3D_CONF_OPTS += -Dgallium-vc4-neon=disabled
+# endif
+
 # Drivers
 
 #Gallium Drivers
+MESA3D_GALLIUM_DRIVERS-$(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_CROCUS)   += crocus
 MESA3D_GALLIUM_DRIVERS-$(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV)  += etnaviv
 MESA3D_GALLIUM_DRIVERS-$(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_FREEDRENO) += freedreno
 MESA3D_GALLIUM_DRIVERS-$(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915)     += i915
@@ -95,12 +126,7 @@ MESA3D_GALLIUM_DRIVERS-$(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA)    += tegra
 MESA3D_GALLIUM_DRIVERS-$(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_V3D)      += v3d
 MESA3D_GALLIUM_DRIVERS-$(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VC4)      += vc4
 MESA3D_GALLIUM_DRIVERS-$(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL)    += virgl
-# DRI Drivers
-MESA3D_DRI_DRIVERS-$(BR2_PACKAGE_MESA3D_DRI_DRIVER_I915)   += i915
-MESA3D_DRI_DRIVERS-$(BR2_PACKAGE_MESA3D_DRI_DRIVER_I965)   += i965
-MESA3D_DRI_DRIVERS-$(BR2_PACKAGE_MESA3D_DRI_DRIVER_NOUVEAU) += nouveau
-MESA3D_DRI_DRIVERS-$(BR2_PACKAGE_MESA3D_DRI_DRIVER_RADEON) += r100
-MESA3D_DRI_DRIVERS-$(BR2_PACKAGE_MESA3D_DRI_DRIVER_PVR)    += pvr
+MESA3D_GALLIUM_DRIVERS-$(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PVR)      += pvr
 # Vulkan Drivers
 MESA3D_VULKAN_DRIVERS-$(BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL)   += intel
 
@@ -113,31 +139,16 @@ MESA3D_CONF_OPTS += \
 	-Dshared-glapi=enabled \
 	-Dgallium-drivers=$(subst $(space),$(comma),$(MESA3D_GALLIUM_DRIVERS-y)) \
 	-Dgallium-extra-hud=true
+ifeq ($(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PVR),y)
+MESA3D_DEPENDENCIES += img-gpu-powervr
 endif
-
-ifeq ($(BR2_PACKAGE_MESA3D_DRI_DRIVER),)
-MESA3D_CONF_OPTS += \
-	-Ddri-drivers= -Ddri3=disabled
-else
-ifeq ($(BR2_PACKAGE_XLIB_LIBXSHMFENCE),y)
-MESA3D_DEPENDENCIES += xlib_libxshmfence
-MESA3D_CONF_OPTS += -Ddri3=enabled
-else
-MESA3D_CONF_OPTS += -Ddri3=disabled
-endif
-MESA3D_CONF_OPTS += \
-	-Dshared-glapi=enabled \
-	-Dglx-direct=true \
-	-Ddri-drivers=$(subst $(space),$(comma),$(MESA3D_DRI_DRIVERS-y))
 endif
 
 ifeq ($(BR2_PACKAGE_MESA3D_VULKAN_DRIVER),)
 MESA3D_CONF_OPTS += \
 	-Dvulkan-drivers=
 else
-MESA3D_DEPENDENCIES += xlib_libxshmfence
 MESA3D_CONF_OPTS += \
-	-Ddri3=enabled \
 	-Dvulkan-drivers=$(subst $(space),$(comma),$(MESA3D_VULKAN_DRIVERS-y))
 endif
 
@@ -157,9 +168,9 @@ MESA3D_CONF_OPTS += -Dopengl=true
 # we do not need libva support in mesa3d, therefore disable this option
 MESA3D_CONF_OPTS += -Dgallium-va=disabled
 
-# libGL is only provided for a full xorg stack
+# libGL is only provided for a full xorg stack, without libglvnd
 ifeq ($(BR2_PACKAGE_MESA3D_OPENGL_GLX),y)
-MESA3D_PROVIDES += libgl
+MESA3D_PROVIDES += $(if $(BR2_PACKAGE_LIBGLVND),,libgl)
 else
 define MESA3D_REMOVE_OPENGL_HEADERS
 	rm -rf $(STAGING_DIR)/usr/include/GL/
@@ -197,7 +208,7 @@ MESA3D_CONF_OPTS += \
 endif
 
 ifeq ($(BR2_PACKAGE_MESA3D_OPENGL_EGL),y)
-MESA3D_PROVIDES += libegl
+MESA3D_PROVIDES += $(if $(BR2_PACKAGE_LIBGLVND),,libegl)
 MESA3D_CONF_OPTS += \
 	-Degl=enabled
 else
@@ -206,7 +217,7 @@ MESA3D_CONF_OPTS += \
 endif
 
 ifeq ($(BR2_PACKAGE_MESA3D_OPENGL_ES),y)
-MESA3D_PROVIDES += libgles
+MESA3D_PROVIDES += $(if $(BR2_PACKAGE_LIBGLVND),,libgles)
 MESA3D_CONF_OPTS += -Dgles1=enabled -Dgles2=enabled
 else
 MESA3D_CONF_OPTS += -Dgles1=disabled -Dgles2=disabled
@@ -261,4 +272,15 @@ ifeq ($(BR2_m68k),y)
 MESA3D_CFLAGS += -mlong-jump-table-offsets
 endif
 
+ifeq ($(BR2_PACKAGE_LIBGLVND),y)
+ifneq ($(BR2_PACKAGE_MESA3D_OPENGL_GLX)$(BR2_PACKAGE_MESA3D_OPENGL_EGL),)
+MESA3D_DEPENDENCIES += libglvnd
+MESA3D_CONF_OPTS += -Dglvnd=true
+else
+MESA3D_CONF_OPTS += -Dglvnd=false
+endif
+else
+MESA3D_CONF_OPTS += -Dglvnd=false
+endif
+
 $(eval $(meson-package))

+ 1 - 1
package/starfive/img-gpu-powervr/Config.in

@@ -17,7 +17,7 @@ config BR2_PACKAGE_IMG_GPU_POWERVR
 	select BR2_PACKAGE_HAS_LIBVULKAN
 	select BR2_PACKAGE_MESA3D
 	select BR2_PACKAGE_MESA3D_OPENGL_EGL
-	select BR2_PACKAGE_MESA3D_DRI_DRIVER_PVR
+	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PVR
 	help
 	  Userspace libraries for Imagination PowerGPU GPU on StarFive platforms
 

+ 1 - 0
package/starfive/img-gpu-powervr/img-gpu-powervr.hash

@@ -1,2 +1,3 @@
 # Locally calculated
 sha256  bb94718c965a1c6d6ee68529e4b85989b08f347ccc8b64d12d8872dd668070d1  img-gpu-powervr-bin-1.17.6210866.tar.gz
+sha256  c283ef91fbd157171e04421edbd52e2b3cbcdb9df56c09fa9de6ceba68e663f2  img-gpu-powervr-bin-1.19.6345021.tar.gz

+ 1 - 1
package/starfive/img-gpu-powervr/img-gpu-powervr.mk

@@ -5,7 +5,7 @@
 # Description: Add support for Imagination PowerVR GPU
 #
 
-IMG_GPU_POWERVR_VERSION:=1.17.6210866
+IMG_GPU_POWERVR_VERSION:=1.19.6345021
 IMG_GPU_POWERVR_SITE=$(TOPDIR)/../soft_3rdpart/IMG_GPU/out
 IMG_GPU_POWERVR_SITE_METHOD=file
 IMG_GPU_POWERVR_SOURCE=img-gpu-powervr-bin-$(IMG_GPU_POWERVR_VERSION).tar.gz

+ 0 - 42
package/wayland-protocols/0001-meson.build-wayland-scanner-is-only-needed-for-tests.patch

@@ -1,42 +0,0 @@
-From 80e97bd00bf6263845aa98b411507baba28be67e Mon Sep 17 00:00:00 2001
-From: Fabrice Fontaine <fontaine.fabrice@gmail.com>
-Date: Sun, 19 Sep 2021 11:01:00 +0200
-Subject: [PATCH] meson.build: wayland-scanner is only needed for tests
-
-wayland-scanner is only needed for tests so don't require it if tests
-are disabled
-
-Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
-[Retrieved from:
-https://gitlab.freedesktop.org/wayland/wayland-protocols/-/commit/80e97bd00bf6263845aa98b411507baba28be67e]
----
- meson.build       | 2 --
- tests/meson.build | 1 +
- 2 files changed, 1 insertion(+), 2 deletions(-)
-
-diff --git a/meson.build b/meson.build
-index 94b49e7..15dbc37 100644
---- a/meson.build
-+++ b/meson.build
-@@ -8,8 +8,6 @@ wayland_protocols_version = meson.project_version()
- 
- fs = import('fs')
- 
--dep_scanner = dependency('wayland-scanner', native: true)
--
- stable_protocols = [
- 	'presentation-time',
- 	'viewporter',
-diff --git a/tests/meson.build b/tests/meson.build
-index 66337e7..74824ae 100644
---- a/tests/meson.build
-+++ b/tests/meson.build
-@@ -1,4 +1,5 @@
- prog_scan_sh = find_program('scan.sh')
-+dep_scanner = dependency('wayland-scanner', native: true)
- prog_scanner = find_program(dep_scanner.get_pkgconfig_variable('wayland_scanner'))
- 
- libwayland = [
--- 
-GitLab
-

+ 3 - 4
package/wayland-protocols/wayland-protocols.hash

@@ -1,5 +1,4 @@
-# From https://lists.freedesktop.org/archives/wayland-devel/2021-September/041979.html
-md5  31a6c469718db37d2688109e548506e4  wayland-protocols-1.23.tar.xz
-sha1  8c4ebdce35953b1e2af458c139a432a308af6f50  wayland-protocols-1.23.tar.xz
-sha256  6c0af1915f96f615927a6270d025bd973ff1c58e521e4ca1fc9abfc914633f76  wayland-protocols-1.23.tar.xz
+# From https://lists.freedesktop.org/archives/wayland-devel/2022-October/042466.html
+sha256  9046f10a425d4e2a00965a03acfb6b3fb575a56503ac72c2b86821c69653375c  wayland-protocols-1.27.tar.xz
+sha512  c0a49bc46c663c9f602998dfe2e184c09756790fbcc7acbc2bf9d9cf8f7d6dcdd00259b768222a30e5d134e6f97f7f4faf252947b544e8b32f53278b70da0390  wayland-protocols-1.27.tar.xz
 sha256  f1a2b233e8a9a71c40f4aa885be08a0842ac85bb8588703c1dd7e6e6502e3124  COPYING

+ 2 - 2
package/wayland-protocols/wayland-protocols.mk

@@ -4,8 +4,8 @@
 #
 ################################################################################
 
-WAYLAND_PROTOCOLS_VERSION = 1.23
-WAYLAND_PROTOCOLS_SITE = https://wayland.freedesktop.org/releases
+WAYLAND_PROTOCOLS_VERSION = 1.27
+WAYLAND_PROTOCOLS_SITE = https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/$(WAYLAND_PROTOCOLS_VERSION)/downloads
 WAYLAND_PROTOCOLS_SOURCE = wayland-protocols-$(WAYLAND_PROTOCOLS_VERSION).tar.xz
 WAYLAND_PROTOCOLS_LICENSE = MIT
 WAYLAND_PROTOCOLS_LICENSE_FILES = COPYING

+ 46 - 0
package/wayland-utils/0001-wayland-info-Fix-build-without-libdrm.patch

@@ -0,0 +1,46 @@
+From 3657a11d45f133776b50c716d99f37965eb07ed1 Mon Sep 17 00:00:00 2001
+From: Olivier Fourdan <ofourdan@redhat.com>
+Date: Wed, 14 Sep 2022 09:07:10 +0200
+Subject: [PATCH] wayland-info: Fix build without libdrm
+
+wayland-info can optionally use libdrm to provide a description of the
+dmabuf format modifiers.
+
+When not using libdrm however, the build fails because "dev_t" is not
+defined.
+
+The definition of "dev_t" comes from <sys/types.h> which is included
+from <libdrm.h>, which is not included without libdrm support, hence the
+build failure.
+
+Simply include <sys/types.h> unconditionally to make sure "dev_t" is
+defined regardless of libdrm support, to fix the build failure.
+
+Closes: https://gitlab.freedesktop.org/wayland/wayland-utils/-/issues/6
+Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
+Fixes: 240cb739 - "Add support for linux_dmabuf version 4"
+Reviewed-by: Simon Ser <contact@emersion.fr>
+Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.com>
+(cherry picked from commit baa65ba9f62e6a05c32b9202b524158a21f24245)
+Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
+[james.hilliard1@gmail.com: backport from upstream commit
+3657a11d45f133776b50c716d99f37965eb07ed1]
+---
+ wayland-info/wayland-info.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/wayland-info/wayland-info.c b/wayland-info/wayland-info.c
+index 53cd04b..98ff205 100644
+--- a/wayland-info/wayland-info.c
++++ b/wayland-info/wayland-info.c
+@@ -34,6 +34,7 @@
+ #include <ctype.h>
+ #include <unistd.h>
+ #include <sys/mman.h>
++#include <sys/types.h>
+ 
+ #include <wayland-client.h>
+ #if HAVE_HUMAN_FORMAT_MODIFIER
+-- 
+2.34.1
+

+ 5 - 5
package/wayland-utils/wayland-utils.hash

@@ -1,6 +1,6 @@
-# From https://lists.freedesktop.org/archives/wayland-devel/2020-July/041565.html
-md5  714875aefb10e7f683cde24e58d033ad  wayland-utils-1.0.0.tar.xz
-sha1  b5b8d498a892866d56ffbe862039d7c97acbe7bc  wayland-utils-1.0.0.tar.xz
-sha256  64fecc4c58e87ae9b302901abe10c2e8af69c7503c221a96ecd0700e0aa268c0  wayland-utils-1.0.0.tar.xz
-sha512  4c6f1822435b36b3acd361c0c54e56150e8a2697a9c4b2c20a149fcfaafe237e45807df3471884ddf594d89558001099e2d938e3f48988ba6950a0f1e3538db2  wayland-utils-1.0.0.tar.xz
+# From https://lists.freedesktop.org/archives/wayland-devel/2022-September/042399.html
+md5  1a398cbb75c3ac1ac231b2a8f84bd6d6  wayland-utils-1.1.0.tar.xz
+sha1  38e5c37f5b35b86a84289659b4b0796811eb66cd  wayland-utils-1.1.0.tar.xz
+sha256  9e685863025b4feade36d53bbc8e31b43e26498be743dea84c7a84912959410a  wayland-utils-1.1.0.tar.xz
+sha512  5b841ecb9b534a9b353e104dda9410961495495380fa65e32ef40855750609b03942a87c2fd66339aab57c05b3b8699e2bee055cfd44151f9609a5f6c53349df  wayland-utils-1.1.0.tar.xz
 sha256  1eba39c11640014a5841dd3017e5245fc31f47e1cf43a3287a286dd6a8de8a1a  COPYING

+ 9 - 2
package/wayland-utils/wayland-utils.mk

@@ -4,11 +4,18 @@
 #
 ################################################################################
 
-WAYLAND_UTILS_VERSION = 1.0.0
-WAYLAND_UTILS_SITE = https://wayland.freedesktop.org/releases
+WAYLAND_UTILS_VERSION = 1.1.0
+WAYLAND_UTILS_SITE = https://gitlab.freedesktop.org/wayland/wayland-utils/-/releases/$(WAYLAND_UTILS_VERSION)/downloads
 WAYLAND_UTILS_SOURCE = wayland-utils-$(WAYLAND_UTILS_VERSION).tar.xz
 WAYLAND_UTILS_LICENSE = MIT
 WAYLAND_UTILS_LICENSE_FILES = COPYING
 WAYLAND_UTILS_DEPENDENCIES = host-pkgconf wayland wayland-protocols
 
+ifeq ($(BR2_PACKAGE_LIBDRM),y)
+WAYLAND_UTILS_DEPENDENCIES += libdrm
+WAYLAND_UTILS_CONF_OPTS += -Ddrm=enabled
+else
+WAYLAND_UTILS_CONF_OPTS += -Ddrm=disabled
+endif
+
 $(eval $(meson-package))

+ 0 - 58
package/wayland/0001-build-add-option-to-disable-tests.patch

@@ -1,58 +0,0 @@
-From 88f1605a826ca0c2ff02be6f4cf9ecabf68e8341 Mon Sep 17 00:00:00 2001
-From: James Hilliard <james.hilliard1@gmail.com>
-Date: Tue, 3 Mar 2020 15:27:51 -0700
-Subject: [PATCH] build: add option to disable tests
-
-When building for a product, tests are not needed.
-
-Besides, one test requires a C++ compiler, which is not always
-available.
-
-So, add an option to configure to disable building tests altogether.
-
-Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
-Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
-Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
-[Upstream status:
-https://gitlab.freedesktop.org/wayland/wayland/-/merge_requests/66]
-Signed-off-by: Adrian Perez de Castro <aperez@igalia.com>
-[yann.morin.1998@free.fr: backport from upstream]
-Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
----
- meson.build       | 4 +++-
- meson_options.txt | 4 ++++
- 2 files changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/meson.build b/meson.build
-index cdb66bc..714a86d 100644
---- a/meson.build
-+++ b/meson.build
-@@ -84,7 +84,9 @@ subdir('src')
- if get_option('libraries')
- 	subdir('cursor')
- 	subdir('egl')
--	subdir('tests')
-+	if get_option('tests')
-+		subdir('tests')
-+	endif
- 	if get_option('documentation')
- 		subdir('doc')
- 	endif
-diff --git a/meson_options.txt b/meson_options.txt
-index de588d1..4433fa0 100644
---- a/meson_options.txt
-+++ b/meson_options.txt
-@@ -6,6 +6,10 @@ option('scanner',
-   description: 'Compile wayland-scanner binary',
-   type: 'boolean',
-   value: 'true')
-+option('tests',
-+  description: 'Compile Wayland tests',
-+  type: 'boolean',
-+  value: 'true')
- option('documentation',
-   description: 'Build the documentation (requires Doxygen, dot, xmlto, xsltproc)',
-   type: 'boolean',
--- 
-2.25.1
-

+ 44 - 0
package/wayland/0001-build-the-wayland-scanner-is-not-always-required.patch

@@ -0,0 +1,44 @@
+From d58695c5a49e3279cd45037b3219c1387c91868c Mon Sep 17 00:00:00 2001
+From: Brendan King <Brendan.King@imgtec.com>
+Date: Wed, 18 May 2022 12:14:56 +0100
+Subject: [PATCH] build: the wayland scanner is not always required
+
+The Wayland Scanner is only needed if the libraries or tests are
+being built.
+
+In the IMG DDK build system, Wayland is built twice, once for the build
+machine, and once for the host. The build machine version only builds
+the Wayland Scanner which is used to build the host version. Both builds
+use a cross build definition file, and so are cross builds.
+
+Without this change, it is not possible to build Wayland Scanner for the
+build machine, unless a Wayland Scanner is already installed.
+
+The indentation within the new "if" block hasn't been altered to minimise
+the diff.
+---
+ src/meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/meson.build b/src/meson.build
+index a8a1d2b..ed35ea9 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -77,12 +77,14 @@ if get_option('scanner')
+ 	endif
+ endif
+ 
++if get_option('libraries') or get_option('tests')
+ if meson.is_cross_build() or not get_option('scanner')
+ 	scanner_dep = dependency('wayland-scanner', native: true, version: meson.project_version())
+ 	wayland_scanner_for_build = find_program(scanner_dep.get_variable(pkgconfig: 'wayland_scanner'))
+ else
+ 	wayland_scanner_for_build = wayland_scanner
+ endif
++endif
+ 
+ if get_option('libraries')
+ 	# wayland libraries
+-- 
+2.25.1
+

+ 0 - 59
package/wayland/0002-meson-only-require-cpp-for-tests.patch

@@ -1,59 +0,0 @@
-From 4c2105312379b62dc84f6eaaf26e2ab293d51b92 Mon Sep 17 00:00:00 2001
-From: James Hilliard <james.hilliard1@gmail.com>
-Date: Fri, 16 Apr 2021 02:32:38 -0600
-Subject: [PATCH] meson: only require cpp for tests
-
-Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
-[Upstream status:
-https://gitlab.freedesktop.org/wayland/wayland/-/merge_requests/130]
-Signed-off-by: Adrian Perez de Castro <aperez@igalia.com>
-[yann.morin.1998@free.fr: backport from upstream]
-Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
----
- meson.build       |  2 +-
- tests/meson.build | 16 +++++++++-------
- 2 files changed, 10 insertions(+), 8 deletions(-)
-
-diff --git a/meson.build b/meson.build
-index 12b4641..cdb66bc 100644
---- a/meson.build
-+++ b/meson.build
-@@ -1,5 +1,5 @@
- project(
--	'wayland', 'c', 'cpp',
-+	'wayland', 'c',
- 	version: '1.19.0',
- 	license: 'MIT',
- 	meson_version: '>= 0.52.1',
-diff --git a/tests/meson.build b/tests/meson.build
-index a32ac50..2e11af4 100644
---- a/tests/meson.build
-+++ b/tests/meson.build
-@@ -64,15 +64,17 @@ executable(
- 	dependencies: test_runner_dep
- )
- 
--test(
--	'cpp-compile-test',
--	executable(
-+if add_languages('cpp')
-+	test(
- 		'cpp-compile-test',
--		'cpp-compile-test.cpp',
--		wayland_server_protocol_h,
--		include_directories: src_inc
-+		executable(
-+			'cpp-compile-test',
-+			'cpp-compile-test.cpp',
-+			wayland_server_protocol_h,
-+			include_directories: src_inc
-+		)
- 	)
--)
-+endif
- 
- sed_path = find_program('sed').path()
- 
--- 
-2.31.1
-

+ 3 - 3
package/wayland/wayland.hash

@@ -1,6 +1,6 @@
-# From https://lists.freedesktop.org/archives/wayland-devel/2021-January/041692.html
-sha256  baccd902300d354581cd5ad3cc49daa4921d55fb416a5883e218750fef166d15  wayland-1.19.0.tar.xz
-sha512  d8a86f5e23e4a88e7c84b82fdb51eb350419086afe462ecb2f4d5c3ba9290ede310cbbcffd60215219ddccf5bad4adec21a5ebfbef6577200f66ac7a1b64a5ef  wayland-1.19.0.tar.xz
+# From https://lists.freedesktop.org/archives/wayland-devel/2022-June/042268.html
+sha256  6dc64d7fc16837a693a51cfdb2e568db538bfdc9f457d4656285bb9594ef11ac  wayland-1.21.0.tar.xz
+sha512  5575216d30fdf5c63caa6bcad071e15f2a4f3acb12df776806073f65db37a50b5b5b3cc7957c5497636f4ac01893e2eaab26e453ded44b287acde01762f5fdc3  wayland-1.21.0.tar.xz
 
 # Locally calculated
 sha256  6eefcb023622a463168a5c20add95fd24a38c7482622a9254a23b99b7c153061  COPYING

+ 2 - 2
package/wayland/wayland.mk

@@ -4,8 +4,8 @@
 #
 ################################################################################
 
-WAYLAND_VERSION = 1.19.0
-WAYLAND_SITE = https://wayland.freedesktop.org/releases
+WAYLAND_VERSION = 1.21.0
+WAYLAND_SITE = https://gitlab.freedesktop.org/wayland/wayland/-/releases/$(WAYLAND_VERSION)/downloads
 WAYLAND_SOURCE = wayland-$(WAYLAND_VERSION).tar.xz
 WAYLAND_LICENSE = MIT
 WAYLAND_LICENSE_FILES = COPYING

+ 5 - 5
package/weston/0005-backend-drm-disable-bo-geometry-out-of-bounds-messag.patch → package/weston/0001-backend-drm-disable-bo-geometry-out-of-bounds-messag.patch

@@ -1,7 +1,7 @@
-From 0f85e6d2e358c530dd1136d71bfd306cd64c4305 Mon Sep 17 00:00:00 2001
+From a2ea65796237b064574e5d5a509f8fc1cd41a723 Mon Sep 17 00:00:00 2001
 From: Brendan King <Brendan.King@imgtec.com>
 Date: Tue, 4 Sep 2018 14:59:09 +0100
-Subject: [PATCH 1/2] backend-drm: disable "bo geometry out of bounds" message
+Subject: [PATCH 1/5] backend-drm: disable "bo geometry out of bounds" message
 
 The message was being printed repeatedly whilst running an opaque
 windowed application, because the application wasn't within the
@@ -11,10 +11,10 @@ framebuffer dimension limits.
  1 file changed, 2 insertions(+)
 
 diff --git a/libweston/backend-drm/fb.c b/libweston/backend-drm/fb.c
-index e7349c4b..da781015 100644
+index ba0c177e..3c664779 100644
 --- a/libweston/backend-drm/fb.c
 +++ b/libweston/backend-drm/fb.c
-@@ -343,7 +343,9 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
+@@ -306,7 +306,9 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
  	    fb->width > backend->max_width ||
  	    backend->min_height > fb->height ||
  	    fb->height > backend->max_height) {
@@ -25,5 +25,5 @@ index e7349c4b..da781015 100644
  	}
  
 -- 
-2.17.1
+2.25.1
 

+ 38 - 0
package/weston/0001-tests-Add-dependency-on-screenshooter-client-protocol.patch

@@ -0,0 +1,38 @@
+From 2ac6b6b084a877adde64db7faff2ed22eb3ea97a Mon Sep 17 00:00:00 2001
+From: Daniel Stone <daniels@collabora.com>
+Date: Tue, 8 Feb 2022 22:39:42 +0000
+Subject: [PATCH] tests: Add dependency on screenshooter client protocol
+
+Given that the test-helper code relies on the screenshooter protocol,
+make sure it's available for us to build, and the dependency ensures we
+build in order.
+
+Fixes: #588
+
+Signed-off-by: Daniel Stone <daniels@collabora.com>
+
+[Retrieved from:
+https://gitlab.freedesktop.org/wayland/weston/-/commit/2ac6b6b084a877adde64db7faff2ed22eb3ea97a]
+Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+---
+ tests/meson.build | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/tests/meson.build b/tests/meson.build
+index 2d464ddcc..222091cd1 100644
+--- a/tests/meson.build
++++ b/tests/meson.build
+@@ -29,8 +29,9 @@ lib_test_client = static_library(
+ 		'weston-test-client-helper.c',
+ 		'weston-test-fixture-compositor.c',
+ 		weston_test_client_protocol_h,
+-		weston_screenshooter_protocol_c,
+ 		weston_test_protocol_c,
++		weston_screenshooter_client_protocol_h,
++		weston_screenshooter_protocol_c,
+ 		viewporter_client_protocol_h,
+ 		viewporter_protocol_c,
+ 		'color_util.h',
+-- 
+GitLab
+

Some files were not shown because too many files changed in this diff