[mesa3d] Sync all patch files with DDK 1.17.

This commit is contained in:
Windsome Zeng
2022-08-16 17:38:05 +08:00
parent 6bfcc5fdc6
commit fe38db9384
70 changed files with 5794 additions and 6452 deletions
File diff suppressed because it is too large Load Diff
@@ -1,7 +1,7 @@
From dbbfc6aadf0c6b40c47b325bf9bb35cf1d552d9c Mon Sep 17 00:00:00 2001
From 184d3da84d449bc05511cb857cc843285dde4b63 Mon Sep 17 00:00:00 2001
From: Frank Binns <frank.binns@imgtec.com>
Date: Wed, 17 Jun 2015 15:37:18 +0100
Subject: [PATCH 02/50] Force Mesa to use the PVR driver for platform devices
Subject: [PATCH 02/67] Force Mesa to use the PVR driver for platform devices
For platform devices, Mesa uses the DRM driver name to determine which DRI
driver to load. This doesn't work in the multi-DRM driver model where there
@@ -14,7 +14,7 @@ force it to use the PVR DRI driver.
1 file changed, 4 insertions(+)
diff --git a/src/loader/loader.c b/src/loader/loader.c
index d64bc7c10f2..cfadecf02b4 100644
index 08eeb61504b..c7e561ef2e4 100644
--- a/src/loader/loader.c
+++ b/src/loader/loader.c
@@ -436,7 +436,11 @@ loader_get_pci_driver(int fd)
@@ -30,5 +30,5 @@ index d64bc7c10f2..cfadecf02b4 100644
for (i = 0; i < ARRAY_SIZE(driver_map); i++) {
if (vendor_id != driver_map[i].vendor_id)
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 94cfbd20ea72aac430abf5097133b1356c0a52a1 Mon Sep 17 00:00:00 2001
From fec4f46f7cedb6b3e90bf88c3efc3cd5da0d9131 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/50] dri: Add some new DRI formats and fourccs
Subject: [PATCH 03/67] dri: Add some new DRI formats and fourccs
Add ARGB4444 DRI format and fourcc.
Add YVU444_PACK10_IMG DRI format and fourcc.
@@ -14,32 +14,32 @@ Add BGR888 DRI format and fourcc.
4 files changed, 11 insertions(+)
diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index 9b85e67ce49..e668798e87f 100644
index 66dc0927cb7..510289403d2 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -1366,6 +1366,9 @@ struct __DRIdri2ExtensionRec {
#define __DRI_IMAGE_FORMAT_XBGR16161616F 0x1014
@@ -1367,6 +1367,9 @@ struct __DRIdri2ExtensionRec {
#define __DRI_IMAGE_FORMAT_ABGR16161616F 0x1015
#define __DRI_IMAGE_FORMAT_SXRGB8 0x1016
+#define __DRI_IMAGE_FORMAT_ARGB4444 0x1017
+#define __DRI_IMAGE_FORMAT_YVU444_PACK10_IMG 0x1018
+#define __DRI_IMAGE_FORMAT_BGR888 0x1019
#define __DRI_IMAGE_FORMAT_ABGR16161616 0x1017
+#define __DRI_IMAGE_FORMAT_ARGB4444 0x1018
+#define __DRI_IMAGE_FORMAT_YVU444_PACK10_IMG 0x1019
+#define __DRI_IMAGE_FORMAT_BGR888 0x101a
#define __DRI_IMAGE_USE_SHARE 0x0001
#define __DRI_IMAGE_USE_SCANOUT 0x0002
@@ -1395,6 +1398,7 @@ struct __DRIdri2ExtensionRec {
#define __DRI_IMAGE_FOURCC_SARGB8888 0x83324258
@@ -1397,6 +1400,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' ) */
+#define __DRI_IMAGE_FOURCC_SBGR888 0xff324742
/**
* Queryable on images created by createImageFromNames.
diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm-uapi/drm_fourcc.h
index 3f9c8110355..8af9b16ff88 100644
index cd3ce8a8c60..57657592a38 100644
--- a/include/drm-uapi/drm_fourcc.h
+++ b/include/drm-uapi/drm_fourcc.h
@@ -307,6 +307,7 @@ extern "C" {
@@ -344,6 +344,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,13 +48,13 @@ index 3f9c8110355..8af9b16ff88 100644
/*
* Format Modifiers:
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 62fc7fb7783..4f52985c48e 100644
index 9e5a55a287c..eee28eb4726 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -2659,6 +2659,7 @@ dri2_num_fourcc_format_planes(EGLint format)
case DRM_FORMAT_VYUY:
case DRM_FORMAT_AYUV:
case DRM_FORMAT_XYUV8888:
@@ -2652,6 +2652,7 @@ dri2_num_fourcc_format_planes(EGLint format)
case DRM_FORMAT_Y410:
case DRM_FORMAT_Y412:
case DRM_FORMAT_Y416:
+ case DRM_FORMAT_YVU444_PACK10_IMG:
return 1;
@@ -76,5 +76,5 @@ index e2a11240dea..caed5fa6a68 100644
.image_format = __DRI_IMAGE_FORMAT_XRGB8888,
.mesa_format = MESA_FORMAT_B8G8R8X8_UNORM,
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From c9723120dbbe1d73c258d1aa119e05a24ab98b8a Mon Sep 17 00:00:00 2001
From e66cd64b65e86a23807260a9a0c73f1355715314 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/50] GL_EXT_sparse_texture entry points
Subject: [PATCH 04/67] GL_EXT_sparse_texture entry points
---
src/mapi/glapi/gen/EXT_sparse_texture.xml | 56 +++++++++++++++++++++++
@@ -73,7 +73,7 @@ index 00000000000..48d03e7b9c0
+
+</OpenGLAPI>
diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
index 4386375940f..d8a80995d92 100644
index 929b40bbd4a..962170bc58e 100644
--- a/src/mapi/glapi/gen/es_EXT.xml
+++ b/src/mapi/glapi/gen/es_EXT.xml
@@ -1433,6 +1433,9 @@
@@ -87,18 +87,18 @@ index 4386375940f..d8a80995d92 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 5b51c222d79..a151a5d5fb4 100644
index 6accff1b231..d063930bd81 100644
--- a/src/mapi/glapi/gen/static_data.py
+++ b/src/mapi/glapi/gen/static_data.py
@@ -1677,6 +1677,8 @@ offsets = {
"SecondaryColor3hNV": 1641,
"SecondaryColor3hvNV": 1642,
"InternalSetError": 1643,
+ "TexPageCommitmentEXT": 1644,
+ "TexturePageCommitmentEXT" : 1645,
@@ -1689,6 +1689,8 @@ offsets = {
"VertexAttribs2hvNV": 1653,
"VertexAttribs3hvNV": 1654,
"VertexAttribs4hvNV": 1655,
+ "TexPageCommitmentEXT": 1656,
+ "TexturePageCommitmentEXT" : 1657,
}
functions = [
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 329dd07729514a93a298e8ab6485822444ed4b28 Mon Sep 17 00:00:00 2001
From 4a1be491de2ea78be95dc4cf08af4b1da5e16d91 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/50] Add support for various GLES extensions
Subject: [PATCH 05/67] 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 d8a80995d92..42f4b2b80fb 100644
index 962170bc58e..e586b0ec19b 100644
--- a/src/mapi/glapi/gen/es_EXT.xml
+++ b/src/mapi/glapi/gen/es_EXT.xml
@@ -285,28 +285,25 @@
@@ -85,22 +85,22 @@ index d8a80995d92..42f4b2b80fb 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 a151a5d5fb4..b23ae713f6f 100644
index d063930bd81..79b8f19cb75 100644
--- a/src/mapi/glapi/gen/static_data.py
+++ b/src/mapi/glapi/gen/static_data.py
@@ -1679,6 +1679,12 @@ offsets = {
"InternalSetError": 1643,
"TexPageCommitmentEXT": 1644,
"TexturePageCommitmentEXT" : 1645,
+ "CurrentPaletteMatrixOES" : 1646,
+ "LoadPaletteFromModelViewMatrixOES" : 1647,
+ "MatrixIndexPointerOES" : 1648,
+ "WeightPointerOES" : 1649,
+ "RenderbufferStorageMultisampleIMG" : 1650,
+ "FramebufferTexture2DMultisampleIMG" : 1651,
@@ -1691,6 +1691,12 @@ offsets = {
"VertexAttribs4hvNV": 1655,
"TexPageCommitmentEXT": 1656,
"TexturePageCommitmentEXT" : 1657,
+ "CurrentPaletteMatrixOES" : 1658,
+ "LoadPaletteFromModelViewMatrixOES" : 1659,
+ "MatrixIndexPointerOES" : 1660,
+ "WeightPointerOES" : 1661,
+ "RenderbufferStorageMultisampleIMG" : 1662,
+ "FramebufferTexture2DMultisampleIMG" : 1663,
}
functions = [
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From e89ccf17b6a484d74fc1f0a45266ffc8f7fc3fec Mon Sep 17 00:00:00 2001
From 7fdeb8bf25be01f122a7cb55dbe2b0e67e4a24a2 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/50] Add EGL_IMG_cl_image extension
Subject: [PATCH 06/67] 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 e668798e87f..06eab0da5aa 100644
index 510289403d2..b197092939f 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -1807,6 +1807,19 @@ struct __DRIimageExtensionRec {
uint32_t flags,
unsigned *error,
void *loaderPrivate);
@@ -1831,6 +1831,19 @@ struct __DRIimageExtensionRec {
const unsigned int modifier_count,
unsigned int use,
void *loaderPrivate);
+
+ /**
+ * Support for experimental EGL_CL_IMAGE_IMG.
@@ -54,10 +54,10 @@ index e668798e87f..06eab0da5aa 100644
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 4f52985c48e..fb5d5617511 100644
index eee28eb4726..dea5899b3a8 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -1008,6 +1008,10 @@ dri2_setup_screen(_EGLDisplay *disp)
@@ -995,6 +995,10 @@ dri2_setup_screen(_EGLDisplay *disp)
disp->Extensions.EXT_image_dma_buf_import_modifiers = EGL_TRUE;
}
#endif
@@ -68,7 +68,7 @@ index 4f52985c48e..fb5d5617511 100644
}
if (dri2_dpy->flush_control)
@@ -2373,17 +2377,13 @@ dri2_get_sync_values_chromium(_EGLDisplay *disp, _EGLSurface *surf,
@@ -2360,17 +2364,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 4f52985c48e..fb5d5617511 100644
}
static _EGLImage *
@@ -2462,7 +2462,49 @@ dri2_create_image_khr_texture(_EGLDisplay *disp, _EGLContext *ctx,
@@ -2449,7 +2449,49 @@ dri2_create_image_khr_texture(_EGLDisplay *disp, _EGLContext *ctx,
attrs.GLTextureLevel,
&error,
NULL);
@@ -139,7 +139,7 @@ index 4f52985c48e..fb5d5617511 100644
if (!dri2_img->dri_image) {
free(dri2_img);
@@ -2923,7 +2965,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
@@ -2916,7 +2958,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
&error,
NULL);
}
@@ -148,7 +148,7 @@ index 4f52985c48e..fb5d5617511 100644
if (!dri_image)
return EGL_NO_IMAGE_KHR;
@@ -3159,6 +3201,8 @@ dri2_create_image_khr(_EGLDisplay *disp, _EGLContext *ctx, EGLenum target,
@@ -3152,6 +3194,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,7 +158,7 @@ index 4f52985c48e..fb5d5617511 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 df0a0011dbf..e08b525c319 100644
index 17e36af22e1..6ffcff8b2cc 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -549,6 +549,7 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
@@ -183,5 +183,5 @@ index 4d2afbc712e..5b05dcc1e6d 100644
struct _egl_display
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 9aab53e750f23aa9e2d8f1bfb2d9f6ff4ac3155a Mon Sep 17 00:00:00 2001
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 08/50] egl: Be stricter when making a context current without
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:
@@ -33,7 +33,7 @@ is 1.0.
1 file changed, 3 insertions(+)
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index e08b525c319..9d90f503cc5 100644
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,
@@ -47,5 +47,5 @@ index e08b525c319..9d90f503cc5 100644
/* If a native window underlying either draw or read is no longer valid,
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 0b65066319eff5c482614574d4a4192454837835 Mon Sep 17 00:00:00 2001
From f556292d5811750d119acea6c7dc0c5ebd3e1af6 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 09/50] egl: optimise eglMakeCurrent for the case where nothing
Subject: [PATCH 08/67] egl: optimise eglMakeCurrent for the case where nothing
has changed
When an application calls eglMakeCurrent with a context, draw surface and
@@ -12,7 +12,7 @@ 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 9d90f503cc5..bc7014ef8ed 100644
index 3cd69b96a0f..234449adf64 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -853,6 +853,7 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
@@ -42,5 +42,5 @@ index 9d90f503cc5..bc7014ef8ed 100644
RETURN_EGL_EVAL(disp, ret);
}
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 921ab82e655c9a3ffab6e39847a7d2d61338221e Mon Sep 17 00:00:00 2001
From 13e925af5ba3bd763eb4c9e5d0781f92981550f6 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/50] GL_EXT_shader_pixel_local_storage2 entry points
Subject: [PATCH 09/67] GL_EXT_shader_pixel_local_storage2 entry points
---
.../gen/EXT_shader_pixel_local_storage2.xml | 35 +++++++++++++++++++
@@ -52,7 +52,7 @@ index 00000000000..20e186c0f0d
+
+</OpenGLAPI>
diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
index 42f4b2b80fb..c7fde29732a 100644
index e586b0ec19b..a3bfe86a888 100644
--- a/src/mapi/glapi/gen/es_EXT.xml
+++ b/src/mapi/glapi/gen/es_EXT.xml
@@ -1459,6 +1459,9 @@
@@ -66,19 +66,19 @@ index 42f4b2b80fb..c7fde29732a 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 b23ae713f6f..1ace5e201d8 100644
index 79b8f19cb75..99729e21b7f 100644
--- a/src/mapi/glapi/gen/static_data.py
+++ b/src/mapi/glapi/gen/static_data.py
@@ -1685,6 +1685,9 @@ offsets = {
"WeightPointerOES" : 1649,
"RenderbufferStorageMultisampleIMG" : 1650,
"FramebufferTexture2DMultisampleIMG" : 1651,
+ "ClearPixelLocalStorageuiEXT" : 1652,
+ "FramebufferPixelLocalStorageSizeEXT" : 1653,
+ "GetFramebufferPixelLocalStorageSizeEXT" : 1654,
@@ -1697,6 +1697,9 @@ offsets = {
"WeightPointerOES" : 1661,
"RenderbufferStorageMultisampleIMG" : 1662,
"FramebufferTexture2DMultisampleIMG" : 1663,
+ "ClearPixelLocalStorageuiEXT" : 1664,
+ "FramebufferPixelLocalStorageSizeEXT" : 1665,
+ "GetFramebufferPixelLocalStorageSizeEXT" : 1666,
}
functions = [
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 67428e8b27839095214419dabccaeffab923a89b Mon Sep 17 00:00:00 2001
From f43a3258b8f4859ff3e0e3d3d356b319dd6a5435 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 11/50] GL_IMG_framebuffer_downsample entry points
Subject: [PATCH 10/67] GL_IMG_framebuffer_downsample entry points
---
.../glapi/gen/IMG_framebuffer_downsample.xml | 37 +++++++++++++++++++
@@ -54,7 +54,7 @@ index 00000000000..b5ce77dfb08
+
+</OpenGLAPI>
diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
index c7fde29732a..6aea8c55fac 100644
index a3bfe86a888..b3432820ba6 100644
--- a/src/mapi/glapi/gen/es_EXT.xml
+++ b/src/mapi/glapi/gen/es_EXT.xml
@@ -1462,6 +1462,9 @@
@@ -68,18 +68,18 @@ index c7fde29732a..6aea8c55fac 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 1ace5e201d8..2838a4451a2 100644
index 99729e21b7f..c723cb3fab8 100644
--- a/src/mapi/glapi/gen/static_data.py
+++ b/src/mapi/glapi/gen/static_data.py
@@ -1688,6 +1688,8 @@ offsets = {
"ClearPixelLocalStorageuiEXT" : 1652,
"FramebufferPixelLocalStorageSizeEXT" : 1653,
"GetFramebufferPixelLocalStorageSizeEXT" : 1654,
+ "FramebufferTexture2DDownsampleIMG" : 1655,
+ "FramebufferTextureLayerDownsampleIMG" : 1656,
@@ -1700,6 +1700,8 @@ offsets = {
"ClearPixelLocalStorageuiEXT" : 1664,
"FramebufferPixelLocalStorageSizeEXT" : 1665,
"GetFramebufferPixelLocalStorageSizeEXT" : 1666,
+ "FramebufferTexture2DDownsampleIMG" : 1667,
+ "FramebufferTextureLayerDownsampleIMG" : 1668,
}
functions = [
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 5aed29849109fcb20934186b9f4ffc0606b40f8e Mon Sep 17 00:00:00 2001
From cbc7a7501ea4ceffd55ca389deb55d12ff9ceb3f 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 12/50] GL_OVR_multiview entry points
Subject: [PATCH 11/67] GL_OVR_multiview entry points
---
src/mapi/glapi/gen/gl_API.xml | 17 +++++++++++++++++
@@ -9,10 +9,10 @@ Subject: [PATCH 12/50] 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 dcdbe80290c..d6fae3b1988 100644
index cf5a0f0a0c0..4e35de0f4ea 100644
--- a/src/mapi/glapi/gen/gl_API.xml
+++ b/src/mapi/glapi/gen/gl_API.xml
@@ -13101,6 +13101,23 @@
@@ -13125,6 +13125,23 @@
</function>
</category>
@@ -37,17 +37,17 @@ index dcdbe80290c..d6fae3b1988 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 2838a4451a2..015e4efed7a 100644
index c723cb3fab8..73625c7fe41 100644
--- a/src/mapi/glapi/gen/static_data.py
+++ b/src/mapi/glapi/gen/static_data.py
@@ -1690,6 +1690,7 @@ offsets = {
"GetFramebufferPixelLocalStorageSizeEXT" : 1654,
"FramebufferTexture2DDownsampleIMG" : 1655,
"FramebufferTextureLayerDownsampleIMG" : 1656,
+ "FramebufferTextureMultiviewOVR" : 1657,
@@ -1702,6 +1702,7 @@ offsets = {
"GetFramebufferPixelLocalStorageSizeEXT" : 1666,
"FramebufferTexture2DDownsampleIMG" : 1667,
"FramebufferTextureLayerDownsampleIMG" : 1668,
+ "FramebufferTextureMultiviewOVR" : 1669,
}
functions = [
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 95383627bc57aa19f0e5d40ae8c91f4d91230708 Mon Sep 17 00:00:00 2001
From 91ea37486db99fd403654ebff2a0a8401f7cd600 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 13/50] Add OVR_multiview_multisampled_render_to_texture
Subject: [PATCH 12/67] Add OVR_multiview_multisampled_render_to_texture
---
...ltiview_multisampled_render_to_texture.xml | 21 +++++++++++++++++++
@@ -38,7 +38,7 @@ index 00000000000..86bebc728e9
+
+</OpenGLAPI>
diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
index 6aea8c55fac..359cc9ca8cf 100644
index b3432820ba6..fe8f27e1e6f 100644
--- a/src/mapi/glapi/gen/es_EXT.xml
+++ b/src/mapi/glapi/gen/es_EXT.xml
@@ -1459,6 +1459,9 @@
@@ -52,17 +52,17 @@ index 6aea8c55fac..359cc9ca8cf 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 015e4efed7a..d13dc915d6f 100644
index 73625c7fe41..dc6bdc9dcce 100644
--- a/src/mapi/glapi/gen/static_data.py
+++ b/src/mapi/glapi/gen/static_data.py
@@ -1691,6 +1691,7 @@ offsets = {
"FramebufferTexture2DDownsampleIMG" : 1655,
"FramebufferTextureLayerDownsampleIMG" : 1656,
"FramebufferTextureMultiviewOVR" : 1657,
+ "FramebufferTextureMultisampleMultiviewOVR" : 1658,
@@ -1703,6 +1703,7 @@ offsets = {
"FramebufferTexture2DDownsampleIMG" : 1667,
"FramebufferTextureLayerDownsampleIMG" : 1668,
"FramebufferTextureMultiviewOVR" : 1669,
+ "FramebufferTextureMultisampleMultiviewOVR" : 1670,
}
functions = [
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 2d7c499fe386f83e6f77ddc1e9dbd437e5dbe59a Mon Sep 17 00:00:00 2001
From b38c4118c7a3a060ef1c8b8477200f5a73305397 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 14/50] wayland-drm: install wayland-drm.xml to the configured
Subject: [PATCH 13/67] 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
@@ -53,5 +53,5 @@ index 00000000000..d08ccdaf6ce
+Version: @PACKAGE_VERSION@
\ No newline at end of file
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 2cc857d6ae366e5599a7d39b975ab030ec915001 Mon Sep 17 00:00:00 2001
From b80c78b05ebb661e7f088d0a369b0f0d2990afca 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 15/50] Enable buffer sharing in the kms_swrast driver
Subject: [PATCH 14/67] 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 b0c0d7eafbe..d78e1638d1d 100644
index ebc18a73c86..09f4b02e758 100644
--- a/src/gallium/frontends/dri/dri2.c
+++ b/src/gallium/frontends/dri/dri2.c
@@ -2300,7 +2300,7 @@ dri_kms_init_screen(__DRIscreen * sPriv)
@@ -2400,7 +2400,7 @@ dri_kms_init_screen(__DRIscreen * sPriv)
if (!configs)
goto destroy_screen;
@@ -23,5 +23,5 @@ index b0c0d7eafbe..d78e1638d1d 100644
screen->broken_invalidate = !sPriv->dri2.useInvalidate;
screen->lookup_egl_image = dri2_lookup_egl_image;
--
2.17.1
2.25.1
@@ -1,17 +1,17 @@
From 39233fe0599c68e7b20e4074b0aa7c8e639f648b Mon Sep 17 00:00:00 2001
From 55a15a019dd792477e39f6225f2b4e50a1359b66 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 16/50] egl/wayland: add support for RGB565 back buffers
Subject: [PATCH 15/67] 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 f65d9e45d8f..6eb2c7cbdf6 100644
index cfff0ade90e..c18edc0de4e 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -647,18 +647,27 @@ back_bo_to_dri_buffer(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
@@ -633,18 +633,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;
@@ -42,5 +42,5 @@ index f65d9e45d8f..6eb2c7cbdf6 100644
static int
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From ef372bd8c5ee377bac81f22174b9e01a30cffe53 Mon Sep 17 00:00:00 2001
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 17/50] egl/dri3: fix segfault in eglCopyBuffers
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,
@@ -13,10 +13,10 @@ current back buffer.
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
index ccf8d1795e7..0f7cf0d186c 100644
index 6e825f9a898..ff6d1ffc660 100644
--- a/src/loader/loader_dri3_helper.c
+++ b/src/loader/loader_dri3_helper.c
@@ -858,15 +858,24 @@ loader_dri3_copy_drawable(struct loader_dri3_drawable *draw,
@@ -863,15 +863,24 @@ loader_dri3_copy_drawable(struct loader_dri3_drawable *draw,
xcb_drawable_t dest,
xcb_drawable_t src)
{
@@ -45,5 +45,5 @@ index ccf8d1795e7..0f7cf0d186c 100644
void
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From ce5d9f5a0a95658e2c9d54726bcd8986d7e2be4a Mon Sep 17 00:00:00 2001
From d98cd46b5841ecb785a801a977a1b341d98d08c4 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 18/50] egl: automatically call eglReleaseThread on thread
Subject: [PATCH 17/67] egl: automatically call eglReleaseThread on thread
termination
EGL thread cleanup conformance tests could run out of memory as the contexts
@@ -22,17 +22,17 @@ 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 29be4268025..e93793a6073 100644
index 11277d3e4c0..c87eac0d007 100644
--- a/src/egl/main/eglcurrent.c
+++ b/src/egl/main/eglcurrent.c
@@ -43,6 +43,7 @@ static mtx_t _egl_TSDMutex = _MTX_INITIALIZER_NP;
@@ -44,6 +44,7 @@ static mtx_t _egl_TSDMutex = _MTX_INITIALIZER_NP;
static EGLBoolean _egl_TSDInitialized;
static tss_t _egl_TSD;
static void _eglDestroyThreadInfo(_EGLThreadInfo *t);
+static void _eglDestroyThreadInfoCallback(_EGLThreadInfo *t);
#ifdef USE_ELF_TLS
static __thread const _EGLThreadInfo *_egl_TLS
static __THREAD_INITIAL_EXEC const _EGLThreadInfo *_egl_TLS;
@@ -86,7 +87,7 @@ static inline EGLBoolean _eglInitTSD()
/* check again after acquiring lock */
@@ -74,5 +74,5 @@ index 29be4268025..e93793a6073 100644
* Make sure TSD is initialized and return current value.
*/
--
2.17.1
2.25.1
@@ -1,12 +1,12 @@
From bbef8a8f66f7f5ac6714a2d3f77a323a2d38a493 Mon Sep 17 00:00:00 2001
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 19/50] egl: add Tizen platform support
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 | 27 +-
meson.build | 25 +-
meson_options.txt | 2 +-
src/egl/drivers/dri2/egl_dri2.c | 182 ++++-
src/egl/drivers/dri2/egl_dri2.h | 59 +-
@@ -15,15 +15,15 @@ The platform can be enabled by passing "-Dplatforms=tizen" to Meson.
src/egl/main/egldisplay.c | 32 +-
src/egl/main/egldisplay.h | 7 +
src/egl/main/egllog.c | 27 +-
src/egl/meson.build | 9 +-
10 files changed, 1316 insertions(+), 16 deletions(-)
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 15e08dfea1c..c90e44254d2 100644
index 968b4f5f499..3d9d345dbf2 100644
--- a/meson.build
+++ b/meson.build
@@ -346,6 +346,11 @@ with_platform_x11 = _platforms.contains('x11')
@@ -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')
@@ -33,18 +33,18 @@ index 15e08dfea1c..c90e44254d2 100644
+ error('tizen cannot be enabled at the same time as other platforms')
+endif
if _platforms.length() != 0
egl_native_platform = _platforms[0]
@@ -859,7 +864,7 @@ else
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
+if with_gbm and not with_platform_tizen
-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
@@ -889,6 +894,15 @@ endif
@@ -944,6 +949,15 @@ endif
if with_platform_haiku
pre_args += '-DHAVE_HAIKU_PLATFORM'
endif
@@ -60,7 +60,7 @@ index 15e08dfea1c..c90e44254d2 100644
prog_python = import('python').find_installation('python3')
has_mako = run_command(
@@ -1487,7 +1501,8 @@ with_gallium_drisw_kms = false
@@ -1568,7 +1582,8 @@ with_gallium_drisw_kms = false
dep_libdrm = dependency(
'libdrm', version : '>=' + _drm_ver,
# GNU/Hurd includes egl_dri2, without drm.
@@ -70,23 +70,21 @@ index 15e08dfea1c..c90e44254d2 100644
)
if dep_libdrm.found()
pre_args += '-DHAVE_LIBDRM'
@@ -2028,9 +2043,11 @@ if with_egl
@@ -2187,8 +2202,10 @@ if with_egl
lines += 'EGL drivers: ' + ' '.join(egl_drivers)
endif
lines += 'GBM: ' + (with_gbm ? 'yes' : 'no')
if with_egl or with_any_vk
- _platforms += 'surfaceless'
- if with_gbm
- _platforms += 'drm'
- if with_gbm and not with_platform_android
+ if not with_platform_tizen
+ _platforms += 'surfaceless'
+ if with_gbm
+ _platforms += 'drm'
+ endif
+ endif
+ if with_gbm and not with_platform_android and not with_platform_tizen
_platforms += 'drm'
endif
lines += 'EGL/Vulkan/VL platforms: ' + ' '.join(_platforms)
endif
diff --git a/meson_options.txt b/meson_options.txt
index 6f001343ae6..b2ba2d8d979 100644
index dac791099a1..8230db93c70 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -23,7 +23,7 @@ option(
@@ -99,10 +97,10 @@ index 6f001343ae6..b2ba2d8d979 100644
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 a47589d929f..e9f745e4258 100644
index dea5899b3a8..6d34395d65d 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -1208,6 +1208,11 @@ dri2_initialize(_EGLDisplay *disp)
@@ -1179,6 +1179,11 @@ dri2_initialize(_EGLDisplay *disp)
case _EGL_PLATFORM_ANDROID:
ret = dri2_initialize_android(disp);
break;
@@ -114,7 +112,7 @@ index a47589d929f..e9f745e4258 100644
default:
unreachable("Callers ensure we cannot get here.");
return EGL_FALSE;
@@ -1282,6 +1287,12 @@ dri2_display_destroy(_EGLDisplay *disp)
@@ -1253,6 +1258,12 @@ dri2_display_destroy(_EGLDisplay *disp)
case _EGL_PLATFORM_WAYLAND:
dri2_teardown_wayland(dri2_dpy);
break;
@@ -127,7 +125,7 @@ index a47589d929f..e9f745e4258 100644
default:
/* TODO: add teardown for other platforms */
break;
@@ -2322,8 +2333,96 @@ dri2_create_image_khr_renderbuffer(_EGLDisplay *disp, _EGLContext *ctx,
@@ -2293,8 +2304,96 @@ dri2_create_image_khr_renderbuffer(_EGLDisplay *disp, _EGLContext *ctx,
return dri2_create_image_from_dri(disp, dri_image);
}
@@ -225,7 +223,7 @@ index a47589d929f..e9f745e4258 100644
/* 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
@@ -3216,6 +3315,10 @@ dri2_create_image_khr(_EGLDisplay *disp, _EGLContext *ctx, EGLenum target,
@@ -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);
@@ -236,7 +234,7 @@ index a47589d929f..e9f745e4258 100644
#endif
case EGL_CL_IMAGE_IMG:
return dri2_create_image_img_buffer(disp, ctx, target, buffer, attr_list);
@@ -3237,6 +3340,78 @@ dri2_destroy_image_khr(_EGLDisplay *disp, _EGLImage *image)
@@ -3214,6 +3317,78 @@ dri2_destroy_image_khr(_EGLDisplay *disp, _EGLImage *image)
return EGL_TRUE;
}
@@ -315,7 +313,7 @@ index a47589d929f..e9f745e4258 100644
#ifdef HAVE_WAYLAND_PLATFORM
static void
@@ -3767,6 +3942,11 @@ const _EGLDriver _eglDriver = {
@@ -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,
@@ -328,10 +326,10 @@ index a47589d929f..e9f745e4258 100644
.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 d7f9696da93..4d66936da28 100644
index 6a7eedea112..a8bfe45b1f5 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -62,13 +62,19 @@ struct zwp_linux_dmabuf_v1;
@@ -62,9 +62,9 @@ struct zwp_linux_dmabuf_v1;
#include <gbm_driint.h>
#endif
@@ -339,8 +337,11 @@ index d7f9696da93..4d66936da28 100644
#define LOG_TAG "EGL-DRI2"
+#ifdef HAVE_ANDROID_PLATFORM
#include <system/window.h>
#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
@@ -352,7 +353,7 @@ index d7f9696da93..4d66936da28 100644
#include "eglconfig.h"
#include "eglcontext.h"
#include "egldevice.h"
@@ -251,6 +257,10 @@ struct dri2_egl_display
@@ -259,6 +265,10 @@ struct dri2_egl_display
bool is_render_node;
bool is_different_gpu;
@@ -363,7 +364,7 @@ index d7f9696da93..4d66936da28 100644
};
struct dri2_egl_context
@@ -268,6 +278,18 @@ enum wayland_buffer_type {
@@ -276,6 +286,18 @@ enum wayland_buffer_type {
};
#endif
@@ -382,7 +383,7 @@ index d7f9696da93..4d66936da28 100644
struct dri2_egl_surface
{
_EGLSurface base;
@@ -300,15 +322,33 @@ struct dri2_egl_surface
@@ -308,15 +330,33 @@ struct dri2_egl_surface
struct gbm_dri_surface *gbm_surf;
#endif
@@ -418,7 +419,7 @@ index d7f9696da93..4d66936da28 100644
/* for is_different_gpu case. NULL else */
__DRIimage *linear_copy;
/* for swrast */
@@ -317,6 +357,9 @@ struct dri2_egl_surface
@@ -325,6 +365,9 @@ struct dri2_egl_surface
#endif
#ifdef HAVE_DRM_PLATFORM
struct gbm_bo *bo;
@@ -428,7 +429,7 @@ index d7f9696da93..4d66936da28 100644
#endif
bool locked;
int age;
@@ -516,6 +559,11 @@ dri2_initialize_android(_EGLDisplay *disp)
@@ -525,6 +568,11 @@ dri2_initialize_android(_EGLDisplay *disp)
EGLBoolean
dri2_initialize_surfaceless(_EGLDisplay *disp);
@@ -440,7 +441,7 @@ index d7f9696da93..4d66936da28 100644
EGLBoolean
dri2_initialize_device(_EGLDisplay *disp);
static inline void
@@ -550,6 +598,11 @@ dri2_set_WL_bind_wayland_display(_EGLDisplay *disp)
@@ -559,6 +607,11 @@ dri2_set_WL_bind_wayland_display(_EGLDisplay *disp)
#endif
}
@@ -1439,7 +1440,7 @@ index 00000000000..a08bc8c07bf
+ return EGL_FALSE;
+}
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index bc7014ef8ed..4c29eedb684 100644
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,
@@ -1606,21 +1607,19 @@ index 6a91952577f..973b7600ab1 100644
diff --git a/src/egl/meson.build b/src/egl/meson.build
index 599a66706b7..17e9c690b82 100644
index ab8f4e1fdbe..5749ec88f89 100644
--- a/src/egl/meson.build
+++ b/src/egl/meson.build
@@ -106,7 +106,9 @@ if with_dri2
@@ -106,7 +106,7 @@ if with_dri2
endif
deps_for_egl += [dep_x11_xcb, dep_xcb_dri2, dep_xcb_xfixes]
endif
if with_gbm
- files_egl += files('drivers/dri2/platform_drm.c')
+ if not with_platform_tizen
+ files_egl += files('drivers/dri2/platform_drm.c')
+ 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')]
deps_for_egl += dep_libdrm
@@ -135,6 +137,11 @@ elif with_platform_haiku
@@ -141,6 +141,11 @@ elif with_platform_haiku
link_for_egl += libgl
deps_for_egl += cpp.find_library('be')
endif
@@ -1633,5 +1632,5 @@ index 599a66706b7..17e9c690b82 100644
if cc.has_function('mincore')
c_args_for_egl += '-DHAVE_MINCORE'
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 072528e4c6b37df46499a87478f535f6235ffde5 Mon Sep 17 00:00:00 2001
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 20/50] egl: add support for EGL_TIZEN_image_native_surface
Subject: [PATCH 19/67] egl: add support for EGL_TIZEN_image_native_surface
---
src/egl/drivers/dri2/egl_dri2.c | 127 ++++++++++++++++++++------
@@ -11,7 +11,7 @@ Subject: [PATCH 20/50] egl: add support for EGL_TIZEN_image_native_surface
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 e9f745e4258..04e05567acb 100644
index 6d34395d65d..eaa0baed066 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -58,6 +58,10 @@
@@ -25,7 +25,7 @@ index e9f745e4258..04e05567acb 100644
#include "egldefines.h"
#include "egl_dri2.h"
#include "GL/mesa_glinterop.h"
@@ -2340,28 +2344,115 @@ dri2_fourcc_from_tbm_format(tbm_format format)
@@ -2311,28 +2315,115 @@ dri2_fourcc_from_tbm_format(tbm_format format)
switch (format) {
case TBM_FORMAT_ARGB8888:
return DRM_FORMAT_ARGB8888;
@@ -144,7 +144,7 @@ index e9f745e4258..04e05567acb 100644
tbm_surf = tpl_display_get_buffer_from_native_pixmap(dri2_dpy->tpl_dpy,
(tpl_handle_t) _buffer);
@@ -2392,33 +2483,7 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
@@ -2363,33 +2454,7 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
return NULL;
}
@@ -179,7 +179,7 @@ index e9f745e4258..04e05567acb 100644
}
#endif
@@ -3319,6 +3384,8 @@ dri2_create_image_khr(_EGLDisplay *disp, _EGLContext *ctx, EGLenum target,
@@ -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);
@@ -201,7 +201,7 @@ index a08bc8c07bf..ad75c115d7e 100644
/*
* 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 4c29eedb684..c4dcc015941 100644
index 43c7b917909..e2a7797d73e 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -553,6 +553,8 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
@@ -227,5 +227,5 @@ index cbb098331bf..0a7366b7c07 100644
EGLBoolean WL_create_wayland_buffer_from_image;
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 66118837ec11358ea86373c343c147e9659c19b8 Mon Sep 17 00:00:00 2001
From 54d08798efca8f8929744a238e2b8b2851083317 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 21/50] egl/wayland: post maximum damage when blitting
Subject: [PATCH 20/67] 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 6eb2c7cbdf6..b76c63f1439 100644
index c18edc0de4e..c2e428769fe 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -1121,7 +1121,8 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
@@ -1112,7 +1112,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 */
@@ -29,5 +29,5 @@ index 6eb2c7cbdf6..b76c63f1439 100644
0, 0, INT32_MAX, INT32_MAX);
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From d9235705f0c6ff56712577670f9b174f02400f5f Mon Sep 17 00:00:00 2001
From a6aa5c866c25f7f334afbbcc3835467d50eb8965 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 22/50] egl/wayland: flush the drawable before blitting
Subject: [PATCH 21/67] 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 b76c63f1439..3e6456234fe 100644
index c2e428769fe..811d28bd669 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -1126,6 +1126,8 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
@@ -1117,6 +1117,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 b76c63f1439..3e6456234fe 100644
if (dri2_dpy->is_different_gpu) {
_EGLContext *ctx = _eglGetCurrentContext();
struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
@@ -1135,10 +1137,9 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
@@ -1126,10 +1128,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,
@@ -42,5 +42,5 @@ index b76c63f1439..3e6456234fe 100644
wl_surface_commit(dri2_surf->wl_surface_wrapper);
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 201283a29b24ebff36b1616809c55c71eaf549ea Mon Sep 17 00:00:00 2001
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 23/50] egl/tizen: create an internal _EGLImage for each tbm
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
@@ -16,10 +16,10 @@ then unmapped from the GPU.
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 04e05567acb..69da031fa00 100644
index eaa0baed066..db993f8f059 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -1293,6 +1293,10 @@ dri2_display_destroy(_EGLDisplay *disp)
@@ -1264,6 +1264,10 @@ dri2_display_destroy(_EGLDisplay *disp)
break;
#ifdef HAVE_TIZEN_PLATFORM
case _EGL_PLATFORM_TIZEN:
@@ -30,7 +30,7 @@ index 04e05567acb..69da031fa00 100644
if (dri2_dpy->tpl_dpy)
tpl_object_unreference((tpl_object_t *) dri2_dpy->tpl_dpy);
break;
@@ -1349,6 +1353,60 @@ dri2_egl_surface_free_local_buffers(struct dri2_egl_surface *dri2_surf)
@@ -1320,6 +1324,60 @@ dri2_egl_surface_free_local_buffers(struct dri2_egl_surface *dri2_surf)
}
}
@@ -91,7 +91,7 @@ index 04e05567acb..69da031fa00 100644
/**
* Called via eglTerminate(), drv->Terminate().
*
@@ -1361,6 +1419,8 @@ dri2_terminate(_EGLDisplay *disp)
@@ -1332,6 +1390,8 @@ dri2_terminate(_EGLDisplay *disp)
/* Release all non-current Context/Surfaces. */
_eglReleaseDisplayResources(disp);
@@ -100,7 +100,7 @@ index 04e05567acb..69da031fa00 100644
dri2_display_release(disp);
return EGL_TRUE;
@@ -2338,6 +2398,9 @@ dri2_create_image_khr_renderbuffer(_EGLDisplay *disp, _EGLContext *ctx,
@@ -2309,6 +2369,9 @@ dri2_create_image_khr_renderbuffer(_EGLDisplay *disp, _EGLContext *ctx,
}
#ifdef HAVE_TIZEN_PLATFORM
@@ -110,7 +110,7 @@ index 04e05567acb..69da031fa00 100644
int
dri2_fourcc_from_tbm_format(tbm_format format)
{
@@ -2434,14 +2497,145 @@ fail_close:
@@ -2405,14 +2468,145 @@ fail_close:
return NULL;
}
@@ -258,7 +258,7 @@ index 04e05567acb..69da031fa00 100644
}
static _EGLImage *
@@ -2453,6 +2647,9 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
@@ -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;
@@ -268,7 +268,7 @@ index 04e05567acb..69da031fa00 100644
tbm_surf = tpl_display_get_buffer_from_native_pixmap(dri2_dpy->tpl_dpy,
(tpl_handle_t) _buffer);
@@ -2483,7 +2680,21 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
@@ -2454,7 +2651,21 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
return NULL;
}
@@ -291,7 +291,7 @@ index 04e05567acb..69da031fa00 100644
}
#endif
@@ -3400,10 +3611,29 @@ dri2_destroy_image_khr(_EGLDisplay *disp, _EGLImage *image)
@@ -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);
@@ -322,10 +322,10 @@ index 04e05567acb..69da031fa00 100644
}
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index 4d66936da28..e516c54810d 100644
index a8bfe45b1f5..546bc0a0dbc 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -260,6 +260,15 @@ struct dri2_egl_display
@@ -268,6 +268,15 @@ struct dri2_egl_display
#ifdef HAVE_TIZEN_PLATFORM
tpl_display_t *tpl_dpy;
@@ -341,7 +341,7 @@ index 4d66936da28..e516c54810d 100644
#endif
};
@@ -404,6 +413,9 @@ struct dri2_egl_image
@@ -413,6 +422,9 @@ struct dri2_egl_image
{
_EGLImage base;
__DRIimage *dri_image;
@@ -376,5 +376,5 @@ index ad75c115d7e..49462152beb 100644
char *render_path;
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From b9cce4ff02e66d6db913cd10352af61d3d81d9ad Mon Sep 17 00:00:00 2001
From 1f4a1a21384b00e28b8a9dd2c29f9c261f201c6f 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 24/50] dri: use a supported API in driCreateNewContext
Subject: [PATCH 23/67] 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.
@@ -50,5 +50,5 @@ index caed5fa6a68..6c45eb007fc 100644
}
--
2.17.1
2.25.1
+100 -33
View File
@@ -1,22 +1,23 @@
From 7b733f4e2b20614d9f367186810c4fcac4aa820c Mon Sep 17 00:00:00 2001
From 0751612b949f1c90338a14453ff7fa4be8bfd016 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 25/50] gbm: add gbm_bo_blit
Subject: [PATCH 24/67] gbm: add gbm_bo_blit
For the GBM DRI backend, gbm_bo_blit is a wrapper around blitImage in
the DRI Image extension.
---
src/gbm/backends/dri/gbm_dri.c | 32 ++++++++++++++++++++++++++++++++
src/gbm/main/gbm.c | 28 ++++++++++++++++++++++++++++
src/gbm/backends/dri/gbm_dri.c | 33 +++++++++++++++++++++++++++++++++
src/gbm/main/gbm.c | 31 +++++++++++++++++++++++++++++++
src/gbm/main/gbm.h | 21 +++++++++++++++++++++
src/gbm/main/gbmint.h | 4 ++++
4 files changed, 85 insertions(+)
src/gbm/main/gbm_abi_check.c | 20 +++++++++++++++++++-
src/gbm/main/gbm_backend_abi.h | 10 +++++++++-
5 files changed, 113 insertions(+), 2 deletions(-)
diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
index b5634741554..ca865f4df9c 100644
index 96fa9217255..bd8a80cdecf 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -1334,6 +1334,37 @@ gbm_dri_surface_destroy(struct gbm_surface *_surf)
@@ -1355,6 +1355,37 @@ gbm_dri_surface_destroy(struct gbm_surface *_surf)
free(surf);
}
@@ -54,23 +55,23 @@ index b5634741554..ca865f4df9c 100644
static void
dri_destroy(struct gbm_device *gbm)
{
@@ -1383,6 +1414,7 @@ dri_device_create(int fd)
dri->base.destroy = dri_destroy;
dri->base.surface_create = gbm_dri_surface_create;
dri->base.surface_destroy = gbm_dri_surface_destroy;
+ dri->base.bo_blit = gbm_dri_bo_blit;
@@ -1416,6 +1447,8 @@ dri_device_create(int fd, uint32_t gbm_backend_version)
dri->base.name = "drm";
dri->base.v0.name = "drm";
+ dri->base.v1.bo_blit = gbm_dri_bo_blit;
+
dri->visual_table = gbm_dri_visuals_table;
dri->num_visuals = ARRAY_SIZE(gbm_dri_visuals_table);
diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c
index 954b3c35b0d..78de34286bd 100644
index d81931a7483..e2351d34ad8 100644
--- a/src/gbm/main/gbm.c
+++ b/src/gbm/main/gbm.c
@@ -741,3 +741,31 @@ gbm_format_get_name(uint32_t gbm_format, struct gbm_format_name_desc *desc)
@@ -758,6 +758,37 @@ gbm_format_get_name(uint32_t gbm_format, struct gbm_format_name_desc *desc)
return desc->name;
}
+
+/**
+ * Blit from one buffer object to another
+ *
@@ -93,13 +94,20 @@ index 954b3c35b0d..78de34286bd 100644
+ int src_x0, int src_y0, int src_width, int src_height,
+ enum gbm_blit_flags flags)
+{
+ return dst_bo->gbm->bo_blit(dst_bo, src_bo,
+ dst_x0, dst_y0, dst_width, dst_height,
+ src_x0, src_y0, src_width, src_height,
+ flags);
+ if (dst_bo->gbm->v0.backend_version >= 1)
+ return dst_bo->gbm->v1.bo_blit(dst_bo, src_bo,
+ dst_x0, dst_y0, dst_width, dst_height,
+ src_x0, src_y0, src_width, src_height,
+ flags);
+ else
+ return 0;
+}
+
/**
* 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 5801cd526a0..e754edd5654 100644
index 3a0fe73faae..7c82cd661a3 100644
--- a/src/gbm/main/gbm.h
+++ b/src/gbm/main/gbm.h
@@ -246,6 +246,21 @@ enum gbm_bo_flags {
@@ -124,7 +132,7 @@ index 5801cd526a0..e754edd5654 100644
int
gbm_device_get_fd(struct gbm_device *gbm);
@@ -422,6 +437,12 @@ gbm_surface_destroy(struct gbm_surface *surface);
@@ -425,6 +440,12 @@ gbm_surface_destroy(struct gbm_surface *surface);
char *
gbm_format_get_name(uint32_t gbm_format, struct gbm_format_name_desc *desc);
@@ -137,21 +145,80 @@ index 5801cd526a0..e754edd5654 100644
#ifdef __cplusplus
}
#endif
diff --git a/src/gbm/main/gbmint.h b/src/gbm/main/gbmint.h
index 192577431e2..fb95954ab32 100644
--- a/src/gbm/main/gbmint.h
+++ b/src/gbm/main/gbmint.h
@@ -98,6 +98,10 @@ struct gbm_device {
struct gbm_bo *bo);
int (*surface_has_free_buffers)(struct gbm_surface *surface);
void (*surface_destroy)(struct gbm_surface *surface);
diff --git a/src/gbm/main/gbm_abi_check.c b/src/gbm/main/gbm_abi_check.c
index f1137be7baf..02ce23b129e 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 {
struct gbm_device_v0_abi0 v0;
};
+#define GBM_BACKEND_ABI_VERSION_abi1 1
+struct gbm_device_v1_abi1 {
+ int (*bo_blit)(struct gbm_bo *dst_bo, struct gbm_bo *src_bo,
+ int dst_x0, int dst_y0, int dst_width, int dst_height,
+ int src_x0, int src_y0, int src_width, int src_height,
+ enum gbm_blit_flags flags);
+};
+
+struct gbm_device_abi1 {
+ /* Hack to make a gbm_device detectable by its first element. */
+ struct gbm_device *(*dummy)(int);
+ struct gbm_device_v0_abi0 v0;
+ struct gbm_device_v1_abi1 v1;
+};
+
/**
* GBM buffer object interface corresponding to GBM_BACKEND_ABI_VERSION = 0
*
@@ -359,8 +374,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);
+ CHECK_MEMBER_CURRENT(gbm_device_v1, _abi1, bo_blit);
+
/* Size of ABI-versioned substructures verified by above member checks */
- CHECK_SIZE_CURRENT (gbm_device, _abi0);
+ CHECK_SIZE (gbm_device, _abi0, _abi1);
+ CHECK_SIZE_CURRENT (gbm_device, _abi1);
/* 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
--- 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 {
void (*surface_destroy)(struct gbm_surface *surface);
};
+struct gbm_device_v1 {
+ int (*bo_blit)(struct gbm_bo *dst_bo, struct gbm_bo *src_bo,
+ int dst_x0, int dst_y0, int dst_width, int dst_height,
+ int src_x0, int src_y0, int src_width, int src_height,
+ enum gbm_blit_flags flags);
+};
+
/**
* The device used for the memory allocation.
*
@@ -161,6 +168,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;
+ struct gbm_device_v1 v1;
};
/**
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 5ed87bbc92b8034b14060d5170c3d82bfce54fb7 Mon Sep 17 00:00:00 2001
From dbe611e4cb6f0dddc05ead03f0341274a6b018c8 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 26/50] gbm: don't assert if DRI context creation fails
Subject: [PATCH 25/67] 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 ca865f4df9c..f9adbc5c001 100644
index bd8a80cdecf..2aa9c7c41ad 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -1224,8 +1224,11 @@ gbm_dri_bo_map(struct gbm_bo *_bo,
@@ -1245,8 +1245,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 ca865f4df9c..f9adbc5c001 100644
/* GBM flags and DRI flags are the same, so just pass them on */
return dri->image->mapImage(dri->context, bo->image, x, y,
@@ -1353,8 +1356,11 @@ gbm_dri_bo_blit(struct gbm_bo *_dst_bo, struct gbm_bo *_src_bo,
@@ -1374,8 +1377,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);
@@ -40,5 +40,5 @@ index ca865f4df9c..f9adbc5c001 100644
/* GBM flags and DRI flags are the same, so just pass them on */
dri->image->blitImage(dri->context, dst_bo->image, src_bo->image,
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From daf743a8fdc7171dea73c390e3255b5c6e19046c Mon Sep 17 00:00:00 2001
From f16ea577ee06375423198dced8231d04e94536af 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 27/50] egl/wayland: add pbuffer support
Subject: [PATCH 26/67] egl/wayland: add pbuffer support
The pbuffer code is based on that in the Surfaceless platform code.
---
@@ -10,10 +10,10 @@ 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 e516c54810d..a33d87b23c1 100644
index 546bc0a0dbc..f41f32cd234 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -396,6 +396,10 @@ struct dri2_egl_surface
@@ -405,6 +405,10 @@ struct dri2_egl_surface
__DRIimage *front;
unsigned int visual;
@@ -25,10 +25,10 @@ index e516c54810d..a33d87b23c1 100644
EGLBoolean enable_out_fence;
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index 3e6456234fe..43ad6420174 100644
index 811d28bd669..a096d9500c1 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -416,6 +416,99 @@ dri2_wl_create_pixmap_surface(_EGLDisplay *disp, _EGLConfig *conf,
@@ -427,6 +427,99 @@ dri2_wl_create_pixmap_surface(_EGLDisplay *disp, _EGLConfig *conf,
return NULL;
}
@@ -128,7 +128,7 @@ index 3e6456234fe..43ad6420174 100644
/**
* Called via eglDestroySurface(), drv->DestroySurface().
*/
@@ -442,6 +535,9 @@ dri2_wl_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
@@ -453,6 +546,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 3e6456234fe..43ad6420174 100644
if (dri2_surf->throttle_callback)
wl_callback_destroy(dri2_surf->throttle_callback);
@@ -451,11 +547,14 @@ dri2_wl_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
@@ -462,11 +558,14 @@ dri2_wl_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
dri2_surf->wl_win->destroy_window_callback = NULL;
}
@@ -156,7 +156,7 @@ index 3e6456234fe..43ad6420174 100644
dri2_fini_surface(surf);
free(surf);
@@ -642,20 +741,16 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
@@ -628,20 +727,16 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
static void
@@ -180,7 +180,7 @@ index 3e6456234fe..43ad6420174 100644
buffer->name = name;
buffer->pitch = pitch;
buffer->flags = 0;
@@ -670,12 +765,28 @@ back_bo_to_dri_buffer(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
@@ -656,12 +751,28 @@ back_bo_to_dri_buffer(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
}
}
@@ -196,7 +196,7 @@ index 3e6456234fe..43ad6420174 100644
+ bo_to_dri_buffer(dri2_dpy, __DRI_BUFFER_BACK_LEFT,
+ dri2_surf->back->dri_image, buffer);
+}
+
+static void
+front_bo_to_dri_buffer(struct dri2_egl_display *dri2_dpy,
+ struct dri2_egl_surface *dri2_surf,
@@ -205,15 +205,15 @@ index 3e6456234fe..43ad6420174 100644
+ bo_to_dri_buffer(dri2_dpy, __DRI_BUFFER_FRONT_LEFT,
+ dri2_surf->front, buffer);
+}
+
+static int
+update_buffers(struct dri2_egl_display *dri2_dpy,
+ struct dri2_egl_surface *dri2_surf)
+{
if (dri2_surf->base.Width != dri2_surf->wl_win->width ||
dri2_surf->base.Height != dri2_surf->wl_win->height) {
@@ -715,12 +826,13 @@ update_buffers(struct dri2_egl_surface *dri2_surf)
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)
}
static int
@@ -229,7 +229,7 @@ index 3e6456234fe..43ad6420174 100644
}
static __DRIbuffer *
@@ -730,17 +842,25 @@ dri2_wl_get_buffers_with_format(__DRIdrawable * driDrawable,
@@ -718,17 +830,25 @@ dri2_wl_get_buffers_with_format(__DRIdrawable * driDrawable,
int *out_count, void *loaderPrivate)
{
struct dri2_egl_surface *dri2_surf = loaderPrivate;
@@ -259,7 +259,7 @@ index 3e6456234fe..43ad6420174 100644
break;
default:
local = dri2_egl_surface_alloc_local_buffer(dri2_surf, attachments[i],
@@ -810,12 +930,30 @@ image_get_buffers(__DRIdrawable *driDrawable,
@@ -798,12 +918,30 @@ image_get_buffers(__DRIdrawable *driDrawable,
struct __DRIimageList *buffers)
{
struct dri2_egl_surface *dri2_surf = loaderPrivate;
@@ -276,13 +276,13 @@ index 3e6456234fe..43ad6420174 100644
+ {
+ if (update_buffers(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;
+ buffers->image_mask |= __DRI_IMAGE_BUFFER_BACK;
+ buffers->back = dri2_surf->back->dri_image;
+ }
+
+ if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT)
+ {
+ if (allocate_front_buffer(dri2_dpy, dri2_surf, EGL_FALSE) < 0)
@@ -294,17 +294,17 @@ index 3e6456234fe..43ad6420174 100644
return 1;
}
@@ -1066,6 +1204,9 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
@@ -1054,6 +1192,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);
+ if (draw->Type != EGL_WINDOW_BIT)
+ return EGL_TRUE;
+
while (dri2_surf->throttle_callback != NULL)
if (wl_display_dispatch_queue(dri2_dpy->wl_dpy,
dri2_surf->wl_queue) == -1)
@@ -1077,7 +1218,7 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
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,
/* Make sure we have a back buffer in case we're swapping without ever
* rendering. */
@@ -313,7 +313,7 @@ index 3e6456234fe..43ad6420174 100644
return _eglError(EGL_BAD_ALLOC, "dri2_swap_buffers");
if (draw->SwapInterval > 0) {
@@ -1162,9 +1303,13 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
@@ -1153,9 +1294,13 @@ dri2_wl_swap_buffers_with_damage(_EGLDisplay *disp,
static EGLint
dri2_wl_query_buffer_age(_EGLDisplay *disp, _EGLSurface *surface)
{
@@ -328,7 +328,7 @@ index 3e6456234fe..43ad6420174 100644
_eglError(EGL_BAD_ALLOC, "dri2_query_buffer_age");
return -1;
}
@@ -1385,6 +1530,7 @@ static const struct dri2_egl_display_vtbl dri2_wl_display_vtbl = {
@@ -1376,6 +1521,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,
@@ -336,7 +336,7 @@ index 3e6456234fe..43ad6420174 100644
.destroy_surface = dri2_wl_destroy_surface,
.create_image = dri2_create_image_khr,
.swap_buffers = dri2_wl_swap_buffers,
@@ -1427,7 +1573,7 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
@@ -1418,7 +1564,7 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
continue;
dri2_conf = dri2_add_config(disp, dri2_dpy->driver_configs[i],
@@ -345,7 +345,7 @@ index 3e6456234fe..43ad6420174 100644
if (dri2_conf) {
if (dri2_conf->base.ConfigID == count + 1)
count++;
@@ -1662,6 +1808,23 @@ dri2_wl_swrast_get_stride_for_format(int format, int w)
@@ -1654,6 +1800,23 @@ dri2_wl_swrast_get_stride_for_format(int format, int w)
return w * (dri2_wl_visuals[visual_idx].bpp / 8);
}
@@ -369,7 +369,7 @@ index 3e6456234fe..43ad6420174 100644
static EGLBoolean
dri2_wl_swrast_allocate_buffer(struct dri2_egl_surface *dri2_surf,
int format, int w, int h,
@@ -1782,8 +1945,24 @@ swrast_update_buffers(struct dri2_egl_surface *dri2_surf)
@@ -1775,8 +1938,24 @@ swrast_update_buffers(struct dri2_egl_surface *dri2_surf)
return 0;
}
@@ -395,7 +395,7 @@ index 3e6456234fe..43ad6420174 100644
{
/* if there has been a resize: */
if (!dri2_surf->current)
@@ -1853,7 +2032,9 @@ dri2_wl_swrast_get_drawable_info(__DRIdrawable * draw,
@@ -1846,7 +2025,9 @@ dri2_wl_swrast_get_drawable_info(__DRIdrawable * draw,
{
struct dri2_egl_surface *dri2_surf = loaderPrivate;
@@ -406,7 +406,7 @@ index 3e6456234fe..43ad6420174 100644
*x = 0;
*y = 0;
*w = dri2_surf->base.Width;
@@ -1872,7 +2053,11 @@ dri2_wl_swrast_get_image(__DRIdrawable * read,
@@ -1865,7 +2046,11 @@ dri2_wl_swrast_get_image(__DRIdrawable * read,
int dst_stride = copy_width;
char *src, *dst;
@@ -419,7 +419,7 @@ index 3e6456234fe..43ad6420174 100644
if (!src) {
memset(data, 0, copy_width * h);
return;
@@ -1910,14 +2095,20 @@ dri2_wl_swrast_put_image2(__DRIdrawable * draw, int op,
@@ -1903,14 +2088,20 @@ dri2_wl_swrast_put_image2(__DRIdrawable * draw, int op,
assert(copy_width <= stride);
@@ -447,7 +447,7 @@ index 3e6456234fe..43ad6420174 100644
dst += x_offset;
dst += y * dst_stride;
@@ -1935,7 +2126,9 @@ dri2_wl_swrast_put_image2(__DRIdrawable * draw, int op,
@@ -1928,7 +2119,9 @@ dri2_wl_swrast_put_image2(__DRIdrawable * draw, int op,
src += stride;
dst += dst_stride;
}
@@ -458,7 +458,7 @@ index 3e6456234fe..43ad6420174 100644
}
static void
@@ -2000,6 +2193,7 @@ static const struct dri2_egl_display_vtbl dri2_wl_swrast_display_vtbl = {
@@ -1996,6 +2189,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,
@@ -467,5 +467,5 @@ index 3e6456234fe..43ad6420174 100644
.create_image = dri2_create_image_khr,
.swap_buffers = dri2_wl_swrast_swap_buffers,
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From eeda62ee212dcd8fae6c138f4a3b27e3f2ffe8c0 Mon Sep 17 00:00:00 2001
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 28/50] egl/tizen: support DRI driver handling of swap preserve
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
@@ -16,10 +16,10 @@ be necessary under certain conditions, e.g. an empty swap.
2 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index 06eab0da5aa..cf1cb574c41 100644
index b197092939f..16cc095ea29 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -2049,12 +2049,15 @@ enum __DRIimageBufferMask {
@@ -2073,12 +2073,15 @@ enum __DRIimageBufferMask {
* OpenGL ES API and little change to the SurfaceFlinger API.
*/
__DRI_IMAGE_BUFFER_SHARED = (1 << 2),
@@ -117,5 +117,5 @@ index 49462152beb..2bc9b3e7c64 100644
}
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From c431639246d96adce4a8807fa62b3b53cca3adf2 Mon Sep 17 00:00:00 2001
From 90c87ad050dd7a4deda3ee1609e6cc27ea7dd616 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 29/50] egl: eglBindAPI workaround for dEQP bug
Subject: [PATCH 28/67] 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
@@ -25,5 +25,5 @@ index d9a4a90174e..32570970947 100644
return api == EGL_OPENGL_ES_API;
#else
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 651ae0156f4cec4dbf70eef95e1eceebe8941a20 Mon Sep 17 00:00:00 2001
From a763c01172ee21a26f4c9dbb6055093f78d06fb2 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 30/50] GL_EXT_multi_draw_indirect entry points
Subject: [PATCH 29/67] GL_EXT_multi_draw_indirect entry points
---
src/mapi/glapi/gen/es_EXT.xml | 19 +++++++++++++++++++
@@ -9,7 +9,7 @@ Subject: [PATCH 30/50] 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 359cc9ca8cf..de2862a71a5 100644
index fe8f27e1e6f..e0d60faa9d2 100644
--- a/src/mapi/glapi/gen/es_EXT.xml
+++ b/src/mapi/glapi/gen/es_EXT.xml
@@ -1140,6 +1140,25 @@
@@ -39,18 +39,18 @@ index 359cc9ca8cf..de2862a71a5 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 d13dc915d6f..32fb3b8f4f7 100644
index dc6bdc9dcce..e231c176264 100644
--- a/src/mapi/glapi/gen/static_data.py
+++ b/src/mapi/glapi/gen/static_data.py
@@ -1692,6 +1692,8 @@ offsets = {
"FramebufferTextureLayerDownsampleIMG" : 1656,
"FramebufferTextureMultiviewOVR" : 1657,
"FramebufferTextureMultisampleMultiviewOVR" : 1658,
+ "MultiDrawArraysIndirectEXT" : 1659,
+ "MultiDrawElementsIndirectEXT" : 1660,
@@ -1704,6 +1704,8 @@ offsets = {
"FramebufferTextureLayerDownsampleIMG" : 1668,
"FramebufferTextureMultiviewOVR" : 1669,
"FramebufferTextureMultisampleMultiviewOVR" : 1670,
+ "MultiDrawArraysIndirectEXT" : 1671,
+ "MultiDrawElementsIndirectEXT" : 1672,
}
functions = [
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From d4632fc9ce17416cd1f3019af554a320e142dc3b Mon Sep 17 00:00:00 2001
From 389e1a41360160bf56182a87cc52b5df9dc1265d 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 31/50] dri: add support for YUV DRI config
Subject: [PATCH 30/67] dri: add support for YUV DRI config
This is prerequisite for adding support for EGL_EXT_yuv_surface.
@@ -9,11 +9,11 @@ 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 | 3 +
src/mesa/drivers/dri/common/utils.c | 87 +++++++++++++++++--
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/intel_screen.c | 12 ++-
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 +-
@@ -24,7 +24,7 @@ This also adds support for NV12 and NV21 EGL configs.
14 files changed, 181 insertions(+), 19 deletions(-)
diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index cf1cb574c41..cff3d9019dd 100644
index 16cc095ea29..4d5a1874dc2 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -826,7 +826,13 @@ struct __DRIuseInvalidateExtensionRec {
@@ -91,52 +91,51 @@ index cf1cb574c41..cff3d9019dd 100644
* This extension defines the core DRI functionality.
*
diff --git a/src/gallium/frontends/dri/dri_screen.c b/src/gallium/frontends/dri/dri_screen.c
index 20ee86f52b7..09f13dd9b77 100644
index b565a1fe8ec..37a0d4add0c 100644
--- a/src/gallium/frontends/dri/dri_screen.c
+++ b/src/gallium/frontends/dri/dri_screen.c
@@ -306,7 +306,9 @@ dri_fill_in_modes(struct dri_screen *screen)
@@ -324,7 +324,9 @@ dri_fill_in_modes(struct dri_screen *screen)
depth_buffer_factor, back_buffer_modes,
ARRAY_SIZE(back_buffer_modes),
msaa_modes, 1,
- GL_TRUE, !mixed_color_depth, GL_FALSE);
+ GL_TRUE, !mixed_color_depth, GL_FALSE,
- GL_TRUE, !mixed_color_depth);
+ GL_TRUE, !mixed_color_depth,
+ __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
+ __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
configs = driConcatConfigs(configs, new_configs);
/* Multi-sample configs without an accumulation buffer. */
@@ -316,7 +318,9 @@ dri_fill_in_modes(struct dri_screen *screen)
@@ -334,7 +336,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,
- GL_FALSE, !mixed_color_depth, GL_FALSE);
+ GL_FALSE, !mixed_color_depth, GL_FALSE,
- GL_FALSE, !mixed_color_depth);
+ GL_FALSE, !mixed_color_depth,
+ __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
+ __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
configs = driConcatConfigs(configs, new_configs);
}
}
diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h
index 7c62b722e5d..a3a417ea0d8 100644
index 0c93d7df6e2..fd653379b7a 100644
--- a/src/gallium/include/pipe/p_format.h
+++ b/src/gallium/include/pipe/p_format.h
@@ -493,6 +493,9 @@ enum pipe_format {
PIPE_FORMAT_R8_G8B8_420_UNORM,
@@ -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 0fdca2d9d84..85ffe2de64d 100644
index a3f2bc57f46..d268dc41fbb 100644
--- a/src/mesa/drivers/dri/common/utils.c
+++ b/src/mesa/drivers/dri/common/utils.c
@@ -166,6 +166,21 @@ driGetRendererString( char * buffer, const char * hardware_name,
* which translates to
* EGL_MUTABLE_RENDER_BUFFER_BIT_KHR.
@@ -163,6 +163,21 @@ driGetRendererString( char * buffer, const char * hardware_name,
* This forces 32-bit color to have 24-bit depth, and
* 16-bit color to have 16-bit depth.
*
+ * \param yuv_depth_range YUV pixel depth range. For non-YUV pixel formats this
+ * should be \c __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE.
@@ -156,17 +155,17 @@ index 0fdca2d9d84..85ffe2de64d 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.
@@ -179,7 +194,8 @@ driCreateConfigs(mesa_format format,
@@ -175,7 +190,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,
GLboolean enable_accum, GLboolean color_depth_match,
- GLboolean mutable_render_buffer)
+ GLboolean mutable_render_buffer,
- GLboolean enable_accum, GLboolean color_depth_match)
+ GLboolean enable_accum, GLboolean color_depth_match,
+ GLint yuv_depth_range, GLint yuv_csc_standard)
{
static const struct {
uint32_t masks[4];
@@ -218,6 +234,9 @@ driCreateConfigs(mesa_format format,
@@ -214,6 +230,9 @@ driCreateConfigs(mesa_format format,
/* MESA_FORMAT_RGBA_FLOAT16 */
{{ 0, 0, 0, 0},
{ 0, 16, 32, 48 }},
@@ -176,7 +175,7 @@ index 0fdca2d9d84..85ffe2de64d 100644
};
const uint32_t * masks;
@@ -231,6 +250,11 @@ driCreateConfigs(mesa_format format,
@@ -227,6 +246,11 @@ driCreateConfigs(mesa_format format,
int green_bits;
int blue_bits;
int alpha_bits;
@@ -188,7 +187,7 @@ index 0fdca2d9d84..85ffe2de64d 100644
bool is_srgb;
bool is_float;
@@ -282,6 +306,33 @@ driCreateConfigs(mesa_format format,
@@ -279,6 +303,33 @@ driCreateConfigs(mesa_format format,
masks = format_table[8].masks;
shifts = format_table[8].shifts;
break;
@@ -222,7 +221,7 @@ index 0fdca2d9d84..85ffe2de64d 100644
default:
fprintf(stderr, "[%s:%u] Unknown framebuffer type %s (%d).\n",
__func__, __LINE__,
@@ -337,8 +388,12 @@ driCreateConfigs(mesa_format format,
@@ -334,8 +385,12 @@ driCreateConfigs(mesa_format format,
modes->greenShift = shifts[1];
modes->blueShift = shifts[2];
modes->alphaShift = shifts[3];
@@ -237,18 +236,19 @@ index 0fdca2d9d84..85ffe2de64d 100644
modes->accumRedBits = 16 * j;
modes->accumGreenBits = 16 * j;
@@ -355,6 +410,7 @@ driCreateConfigs(mesa_format format,
modes->transparentBlue = GLX_DONT_CARE;
modes->transparentAlpha = GLX_DONT_CARE;
modes->transparentIndex = GLX_DONT_CARE;
+ modes->rgbMode = !is_yuv;
@@ -345,6 +400,8 @@ driCreateConfigs(mesa_format format,
modes->stencilBits = stencil_bits[k];
modes->depthBits = depth_bits[k];
+ modes->rgbMode = !is_yuv;
+
if (db_modes[i] == __DRI_ATTRIB_SWAP_NONE) {
modes->doubleBufferMode = GL_FALSE;
@@ -379,6 +435,13 @@ driCreateConfigs(mesa_format format,
modes->yInverted = GL_TRUE;
modes->swapMethod = __DRI_ATTRIB_SWAP_UNDEFINED;
@@ -357,6 +414,13 @@ driCreateConfigs(mesa_format format,
modes->samples = msaa_samples[h];
modes->sRGBCapable = is_srgb;
modes->mutableRenderBuffer = mutable_render_buffer;
+
+ modes->YUVOrder = yuv_order;
+ modes->YUVNumberOfPlanes = yuv_num_planes;
@@ -259,22 +259,9 @@ index 0fdca2d9d84..85ffe2de64d 100644
}
}
}
@@ -468,6 +531,12 @@ static const struct { unsigned int attrib, offset; } attribMap[] = {
__ATTRIB(__DRI_ATTRIB_YINVERTED, yInverted),
__ATTRIB(__DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE, sRGBCapable),
__ATTRIB(__DRI_ATTRIB_MUTABLE_RENDER_BUFFER, mutableRenderBuffer),
+ __ATTRIB(__DRI_ATTRIB_YUV_ORDER, YUVOrder),
+ __ATTRIB(__DRI_ATTRIB_YUV_NUMBER_OF_PLANES, YUVNumberOfPlanes),
+ __ATTRIB(__DRI_ATTRIB_YUV_SUBSAMPLE, YUVSubsample),
+ __ATTRIB(__DRI_ATTRIB_YUV_DEPTH_RANGE, YUVDepthRange),
+ __ATTRIB(__DRI_ATTRIB_YUV_CSC_STANDARD, YUVCSCStandard),
+ __ATTRIB(__DRI_ATTRIB_YUV_PLANE_BPP, YUVPlaneBPP),
/* The struct field doesn't matter here, these are handled by the
* switch in driGetConfigAttribIndex. We need them in the array
@@ -487,10 +556,14 @@ driGetConfigAttribIndex(const __DRIconfig *config,
{
switch (attribMap[index].attrib) {
@@ -436,10 +500,14 @@ driGetConfigAttribIndex(const __DRIconfig *config,
break;
__ATTRIB(__DRI_ATTRIB_SAMPLES, samples);
case __DRI_ATTRIB_RENDER_TYPE:
- /* no support for color index mode */
- *value = __DRI_ATTRIB_RGBA_BIT;
@@ -290,116 +277,129 @@ index 0fdca2d9d84..85ffe2de64d 100644
+ *value |= __DRI_ATTRIB_FLOAT_BIT;
break;
case __DRI_ATTRIB_CONFIG_CAVEAT:
if (config->modes.visualRating == GLX_NON_CONFORMANT_CONFIG)
if (config->modes.accumRedBits != 0)
@@ -505,6 +573,12 @@ driGetConfigAttribIndex(const __DRIconfig *config,
__ATTRIB(__DRI_ATTRIB_GREEN_SHIFT, greenShift);
__ATTRIB(__DRI_ATTRIB_BLUE_SHIFT, blueShift);
__ATTRIB(__DRI_ATTRIB_ALPHA_SHIFT, alphaShift);
+ __ATTRIB(__DRI_ATTRIB_YUV_ORDER, YUVOrder);
+ __ATTRIB(__DRI_ATTRIB_YUV_NUMBER_OF_PLANES, YUVNumberOfPlanes);
+ __ATTRIB(__DRI_ATTRIB_YUV_SUBSAMPLE, YUVSubsample);
+ __ATTRIB(__DRI_ATTRIB_YUV_DEPTH_RANGE, YUVDepthRange);
+ __ATTRIB(__DRI_ATTRIB_YUV_CSC_STANDARD, YUVCSCStandard);
+ __ATTRIB(__DRI_ATTRIB_YUV_PLANE_BPP, YUVPlaneBPP);
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 7c9719f9f42..8159300c01d 100644
index 7be0465c261..ebd98d9dc33 100644
--- a/src/mesa/drivers/dri/common/utils.h
+++ b/src/mesa/drivers/dri/common/utils.h
@@ -46,7 +46,8 @@ driCreateConfigs(mesa_format format,
@@ -45,7 +45,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,
GLboolean enable_accum, GLboolean color_depth_match,
- GLboolean mutable_render_buffer);
+ GLboolean mutable_render_buffer,
- GLboolean enable_accum, GLboolean color_depth_match);
+ GLboolean enable_accum, GLboolean color_depth_match,
+ GLint yuv_depth_range, GLint yuv_csc_standards);
__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 60b35d37a6e..62973d83bd5 100644
index 6135357c2a0..a94c6de0a06 100644
--- a/src/mesa/drivers/dri/i915/intel_screen.c
+++ b/src/mesa/drivers/dri/i915/intel_screen.c
@@ -1067,7 +1067,9 @@ intel_screen_make_configs(__DRIscreen *dri_screen)
@@ -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, false, false,
- false, false);
+ false, false,
+ __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
+ __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
configs = driConcatConfigs(configs, new_configs);
}
@@ -1089,7 +1091,9 @@ intel_screen_make_configs(__DRIscreen *dri_screen)
@@ -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, false);
+ true, false, false,
- 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/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index 1e34cbbca1a..8fed9c6931a 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -2336,7 +2336,9 @@ intel_screen_make_configs(__DRIscreen *dri_screen)
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,
- /*mutable_render_buffer*/ true);
+ /*mutable_render_buffer*/ true,
- false, false);
+ false, false,
+ __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
+ __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
configs = driConcatConfigs(configs, new_configs);
}
@@ -2369,7 +2371,9 @@ intel_screen_make_configs(__DRIscreen *dri_screen)
@@ -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, false);
+ true, false, false,
- true, false);
+ true, false,
+ __DRI_ATTRIB_YUV_DEPTH_RANGE_NONE,
+ __DRI_ATTRIB_YUV_CSC_STANDARD_NONE);
configs = driConcatConfigs(configs, new_configs);
}
@@ -2434,7 +2438,9 @@ intel_screen_make_configs(__DRIscreen *dri_screen)
@@ -2390,7 +2394,9 @@ brw_screen_make_configs(__DRIscreen *dri_screen)
back_buffer_modes, 1,
multisample_samples,
num_msaa_modes,
- false, false, false);
+ false, false, false,
- false, false);
+ false, 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/nouveau/nouveau_screen.c b/src/mesa/drivers/dri/nouveau/nouveau_screen.c
index ba85aacf741..9d4c1d9bd94 100644
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_FALSE);
+ GL_TRUE, chipset < 0x10, GL_FALSE,
- 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 f61fe399c09..84aef8dd041 100644
index 3764a5d6538..f7628555b8f 100644
--- a/src/mesa/drivers/dri/radeon/radeon_screen.c
+++ b/src/mesa/drivers/dri/radeon/radeon_screen.c
@@ -839,7 +839,9 @@ __DRIconfig **radeonInitScreen2(__DRIscreen *psp)
@@ -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_FALSE);
+ GL_TRUE, GL_FALSE, GL_FALSE,
- 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/mesa/main/format_info.py b/src/mesa/main/format_info.py
index 42c236c7a6a..e07d2d98b89 100644
index edc0324e60b..d58403ea85e 100644
--- a/src/mesa/main/format_info.py
+++ b/src/mesa/main/format_info.py
@@ -29,7 +29,7 @@ import sys
@@ -412,10 +412,10 @@ index 42c236c7a6a..e07d2d98b89 100644
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 ac00a21306b..de7b9feb14b 100644
index 9cd026f7507..f81caeceff4 100644
--- a/src/mesa/main/formats.c
+++ b/src/mesa/main/formats.c
@@ -1450,6 +1450,15 @@ _mesa_format_matches_format_and_type(mesa_format mformat,
@@ -1452,6 +1452,15 @@ _mesa_format_matches_format_and_type(mesa_format mformat,
if (error)
*error = GL_NO_ERROR;
@@ -432,7 +432,7 @@ index ac00a21306b..de7b9feb14b 100644
if (error)
*error = GL_INVALID_ENUM;
diff --git a/src/mesa/main/formats.csv b/src/mesa/main/formats.csv
index e2b54e935bb..166c3d4830d 100644
index 21cdea26e08..b2d476577e0 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
@@ -442,13 +442,13 @@ index e2b54e935bb..166c3d4830d 100644
+MESA_FORMAT_YUV420_2PLANE , other , 1, 1, 1, x8 , , , , y___, yuv
+MESA_FORMAT_YVU420_2PLANE , other , 1, 1, 1, x8 , , , , y___, yuv
# Array normalized formats
MESA_FORMAT_A_UNORM8 , array , 1, 1, 1, un8 , , , , 000x, rgb
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 29c1308c383..4fcb5f73225 100644
index 508c9c342d2..0e778d64467 100644
--- a/src/mesa/main/formats.h
+++ b/src/mesa/main/formats.h
@@ -615,6 +615,13 @@ typedef enum pipe_format mesa_format;
@@ -617,6 +617,13 @@ 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
@@ -463,10 +463,10 @@ index 29c1308c383..4fcb5f73225 100644
/* Packed to array format adapters */
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 70e7b218197..96e55fc987d 100644
index 32528a5f16b..8f77d4c58dd 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -162,6 +162,7 @@ _mesa_varying_slot_in_fs(gl_varying_slot slot)
@@ -158,6 +158,7 @@ _mesa_varying_slot_in_fs(gl_varying_slot slot)
*/
struct gl_config
{
@@ -474,10 +474,10 @@ index 70e7b218197..96e55fc987d 100644
GLboolean floatMode;
GLuint doubleBufferMode;
GLuint stereoMode;
@@ -214,6 +215,14 @@ struct gl_config
@@ -179,6 +180,14 @@ struct gl_config
/* EGL_KHR_mutable_render_buffer */
GLuint mutableRenderBuffer; /* bool */
/* EXT_framebuffer_sRGB */
GLint sRGBCapable;
+
+ /* EXT_yuv_surface */
+ GLint YUVOrder;
@@ -490,5 +490,5 @@ index 70e7b218197..96e55fc987d 100644
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From cc2b278f33c3c9f5f74aa5b36ead67f89cb7a20d Mon Sep 17 00:00:00 2001
From 4e65ae659b775259b4f703eb563feffc623c17b7 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 32/50] egl: add support for EXT_yuv_surface
Subject: [PATCH 31/67] egl: add support for EXT_yuv_surface
This implements EXT_yuv_surface but doesn't expose it for any platform.
---
@@ -14,7 +14,7 @@ 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 cff3d9019dd..89e29299840 100644
index 4d5a1874dc2..62517e4004a 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -1154,6 +1154,7 @@ enum dri_loader_cap {
@@ -26,10 +26,10 @@ index cff3d9019dd..89e29299840 100644
struct __DRIdri2LoaderExtensionRec {
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 69da031fa00..a0b52eab983 100644
index db993f8f059..ee3bcda4d12 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -319,6 +319,7 @@ static const EGLint dri2_to_egl_attribute_map[__DRI_ATTRIB_MAX] = {
@@ -306,6 +306,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 69da031fa00..a0b52eab983 100644
};
const __DRIconfig *
@@ -446,6 +447,8 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
@@ -432,6 +433,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 69da031fa00..a0b52eab983 100644
else
return NULL;
base.ColorBufferType = value;
@@ -556,6 +559,73 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
@@ -536,6 +539,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 69da031fa00..a0b52eab983 100644
default:
key = dri2_to_egl_attribute_map[attrib];
if (key != 0)
@@ -612,6 +682,17 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
@@ -583,6 +653,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 69da031fa00..a0b52eab983 100644
base.MinSwapInterval = dri2_dpy->min_swap_interval;
base.MaxSwapInterval = dri2_dpy->max_swap_interval;
@@ -1043,6 +1124,8 @@ dri2_setup_screen(_EGLDisplay *disp)
@@ -1014,6 +1095,8 @@ dri2_setup_screen(_EGLDisplay *disp)
disp->Extensions.EXT_protected_surface =
dri2_renderer_query_integer(dri2_dpy,
__DRI2_RENDERER_HAS_PROTECTED_CONTENT);
@@ -148,7 +148,7 @@ index 69da031fa00..a0b52eab983 100644
void
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index c4dcc015941..8d9f4a76330 100644
index e2a7797d73e..6d7f62c6851 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -512,6 +512,7 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
@@ -537,5 +537,5 @@ index 0a7366b7c07..020529c57e2 100644
unsigned int IMG_context_priority;
#define __EGL_CONTEXT_PRIORITY_LOW_BIT 0
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From ab2935ddffde305a6bdf49a9e928de407e04871b Mon Sep 17 00:00:00 2001
From 5a22280c13e98932ad45fa6a131217abdffd16b4 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 33/50] dri: add missing __DRI_IMAGE_COMPONENTS define for
Subject: [PATCH 32/67] 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 89e29299840..8214e7a55c3 100644
index 62517e4004a..6490f6e80e2 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -1459,11 +1459,12 @@ struct __DRIdri2ExtensionRec {
@@ -1461,11 +1461,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
@@ -31,5 +31,5 @@ index 89e29299840..8214e7a55c3 100644
/**
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 2b9a147b073ed8ff1d52246be5c885959d859c45 Mon Sep 17 00:00:00 2001
From 3d47285da42c76fe36ae67c62e8d0a0d76d18da0 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 34/50] egl/wayland: expose EXT_yuv_surface support
Subject: [PATCH 33/67] 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 a0b52eab983..d359934a818 100644
index ee3bcda4d12..d511d73f2ed 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -2798,6 +2798,7 @@ static const struct wl_drm_components_descriptor {
@@ -2769,6 +2769,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 a0b52eab983..d359934a818 100644
static _EGLImage *
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index 43ad6420174..de12ec21f53 100644
index a096d9500c1..72456d5d748 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -134,6 +134,13 @@ static const struct dri2_wl_visual {
@@ -135,6 +135,13 @@ static const struct dri2_wl_visual {
{ 11, 5, 0, -1 },
{ 5, 6, 5, 0 },
},
@@ -39,7 +39,7 @@ index 43ad6420174..de12ec21f53 100644
};
static_assert(ARRAY_SIZE(dri2_wl_visuals) <= EGL_DRI2_MAX_FORMATS,
@@ -970,6 +977,7 @@ dri2_wl_get_capability(void *loaderPrivate, enum dri_loader_cap cap)
@@ -958,6 +965,7 @@ dri2_wl_get_capability(void *loaderPrivate, enum dri_loader_cap cap)
{
switch (cap) {
case DRI_LOADER_CAP_FP16:
@@ -47,7 +47,7 @@ index 43ad6420174..de12ec21f53 100644
return 1;
default:
return 0;
@@ -1561,6 +1569,7 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
@@ -1552,6 +1560,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,7 +55,7 @@ index 43ad6420174..de12ec21f53 100644
bool assigned;
for (unsigned i = 0; dri2_dpy->driver_configs[i]; i++) {
@@ -1572,8 +1581,12 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
@@ -1563,8 +1572,12 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp)
if (!BITSET_TEST(dri2_dpy->formats, j))
continue;
@@ -70,5 +70,5 @@ index 43ad6420174..de12ec21f53 100644
if (dri2_conf->base.ConfigID == count + 1)
count++;
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From daf8ff0be3c3fbfe5bfba656eca511a45720bdea Mon Sep 17 00:00:00 2001
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 35/50] egl/tizen: expose EXT_yuv_surface support
Subject: [PATCH 34/67] egl/tizen: expose EXT_yuv_surface support
This adds support for NV12 and NV21 configs.
---
@@ -353,5 +353,5 @@ index 2bc9b3e7c64..b6478a1875b 100644
if (caveat & __DRI_ATTRIB_NON_CONFORMANT_CONFIG)
attr_list[3] = EGL_NON_CONFORMANT_CONFIG;
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 812b414afa598605ddc163d0a07f4374d1a625c9 Mon Sep 17 00:00:00 2001
From 5bd42e648dc9068392641436b70fc28a00689c8e 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 36/50] gbm: add some new GBM formats
Subject: [PATCH 35/67] 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 f9adbc5c001..1144e9a62d1 100644
index 2aa9c7c41ad..5acb15b516f 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -508,11 +508,21 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = {
@@ -514,11 +514,21 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = {
{ 10, 5, 0, 11 },
{ 5, 5, 5, 1 },
},
@@ -38,7 +38,7 @@ index f9adbc5c001..1144e9a62d1 100644
{
GBM_FORMAT_XRGB8888, __DRI_IMAGE_FORMAT_XRGB8888,
{ 16, 8, 0, -1 },
@@ -565,6 +575,12 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = {
@@ -571,6 +581,12 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = {
{ 16, 16, 16, 16 },
true,
},
@@ -52,7 +52,7 @@ index f9adbc5c001..1144e9a62d1 100644
static int
diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
index e754edd5654..19b601dc1f3 100644
index 7c82cd661a3..81308ab9745 100644
--- a/src/gbm/main/gbm.h
+++ b/src/gbm/main/gbm.h
@@ -167,6 +167,8 @@ enum gbm_bo_format {
@@ -65,5 +65,5 @@ index e754edd5654..19b601dc1f3 100644
* 2 plane YCbCr
* index 0 = Y plane, [7:0] Y
--
2.17.1
2.25.1
+51 -31
View File
@@ -1,26 +1,26 @@
From 41dc5e009c2ad9e9db26256fbff335d04f03ccbd Mon Sep 17 00:00:00 2001
From def26b8534e4f8e150e5775dd1f7d2d955580c05 Mon Sep 17 00:00:00 2001
From: Frank Binns <francisbinns@gmail.com>
Date: Sun, 5 Jun 2016 12:04:40 +0100
Subject: [PATCH 37/50] egl: add "null" platform
Subject: [PATCH 36/67] egl: add "null" platform
---
meson.build | 25 +-
meson_options.txt | 2 +-
src/egl/drivers/dri2/egl_dri2.c | 6 +
src/egl/drivers/dri2/egl_dri2.c | 11 +-
src/egl/drivers/dri2/egl_dri2.h | 57 +-
src/egl/drivers/dri2/platform_null.c | 1176 ++++++++++++++++++++++++++
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, 1271 insertions(+), 7 deletions(-)
9 files changed, 1277 insertions(+), 9 deletions(-)
create mode 100644 src/egl/drivers/dri2/platform_null.c
diff --git a/meson.build b/meson.build
index c90e44254d2..56340b8ef3b 100644
index 3d9d345dbf2..2018562a1ec 100644
--- a/meson.build
+++ b/meson.build
@@ -328,7 +328,7 @@ endif
@@ -340,7 +340,7 @@ endif
_platforms = get_option('platforms')
if _platforms.contains('auto')
if system_has_kms_drm
@@ -29,7 +29,7 @@ index c90e44254d2..56340b8ef3b 100644
elif ['darwin', 'cygwin'].contains(host_machine.system())
_platforms = ['x11']
elif ['haiku'].contains(host_machine.system())
@@ -347,6 +347,7 @@ with_platform_wayland = _platforms.contains('wayland')
@@ -359,6 +359,7 @@ with_platform_wayland = _platforms.contains('wayland')
with_platform_haiku = _platforms.contains('haiku')
with_platform_windows = _platforms.contains('windows')
with_platform_tizen = _platforms.contains('tizen')
@@ -37,7 +37,7 @@ index c90e44254d2..56340b8ef3b 100644
if with_platform_tizen and _platforms.length() != 1
error('tizen cannot be enabled at the same time as other platforms')
@@ -903,6 +904,26 @@ if with_platform_tizen
@@ -958,6 +959,26 @@ if with_platform_tizen
]
pre_args += '-DHAVE_TIZEN_PLATFORM'
endif
@@ -64,7 +64,7 @@ index c90e44254d2..56340b8ef3b 100644
prog_python = import('python').find_installation('python3')
has_mako = run_command(
@@ -1502,7 +1523,7 @@ dep_libdrm = dependency(
@@ -1583,7 +1604,7 @@ 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
@@ -74,7 +74,7 @@ index c90e44254d2..56340b8ef3b 100644
if dep_libdrm.found()
pre_args += '-DHAVE_LIBDRM'
diff --git a/meson_options.txt b/meson_options.txt
index b2ba2d8d979..9073223e8f5 100644
index 8230db93c70..d90a25f97ff 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -23,7 +23,7 @@ option(
@@ -87,10 +87,10 @@ index b2ba2d8d979..9073223e8f5 100644
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 d359934a818..ee19d125675 100644
index d511d73f2ed..2f8414e0c60 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -1282,6 +1282,9 @@ dri2_initialize(_EGLDisplay *disp)
@@ -1253,6 +1253,9 @@ dri2_initialize(_EGLDisplay *disp)
case _EGL_PLATFORM_DEVICE:
ret = dri2_initialize_device(disp);
break;
@@ -100,7 +100,16 @@ index d359934a818..ee19d125675 100644
case _EGL_PLATFORM_X11:
case _EGL_PLATFORM_XCB:
ret = dri2_initialize_x11(disp);
@@ -1384,6 +1387,9 @@ dri2_display_destroy(_EGLDisplay *disp)
@@ -1318,8 +1321,6 @@ dri2_display_destroy(_EGLDisplay *disp)
dri2_dpy->vtbl->close_screen_notify(disp);
dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
}
- if (dri2_dpy->fd >= 0)
- close(dri2_dpy->fd);
/* 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);
break;
#endif
@@ -110,11 +119,19 @@ index d359934a818..ee19d125675 100644
default:
/* TODO: add teardown for other platforms */
break;
}
+ if (dri2_dpy->fd >= 0)
+ close(dri2_dpy->fd);
+
/* The drm platform does not create the screen/driver_configs but reuses
* 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 a33d87b23c1..95435b9ee12 100644
index f41f32cd234..eb2127e3fe6 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -75,6 +75,10 @@ struct zwp_linux_dmabuf_v1;
@@ -81,6 +81,10 @@ struct zwp_linux_dmabuf_v1;
#include <tbm_surface_internal.h>
#endif
@@ -125,7 +142,7 @@ index a33d87b23c1..95435b9ee12 100644
#include "eglconfig.h"
#include "eglcontext.h"
#include "egldevice.h"
@@ -93,6 +97,22 @@ struct zwp_linux_dmabuf_v1;
@@ -99,6 +103,22 @@ struct zwp_linux_dmabuf_v1;
struct wl_buffer;
@@ -148,7 +165,7 @@ index a33d87b23c1..95435b9ee12 100644
struct dri2_egl_display_vtbl {
/* mandatory on Wayland, unused otherwise */
int (*authenticate)(_EGLDisplay *disp, uint32_t id);
@@ -251,6 +271,11 @@ struct dri2_egl_display
@@ -257,6 +277,11 @@ struct dri2_egl_display
char *device_name;
#endif
@@ -159,8 +176,8 @@ index a33d87b23c1..95435b9ee12 100644
+
#ifdef HAVE_ANDROID_PLATFORM
const gralloc_module_t *gralloc;
#endif
@@ -324,7 +349,10 @@ struct dri2_egl_surface
/* 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;
@@ -172,7 +189,7 @@ index a33d87b23c1..95435b9ee12 100644
#endif
#ifdef HAVE_DRM_PLATFORM
@@ -350,9 +378,10 @@ struct dri2_egl_surface
@@ -358,9 +386,10 @@ struct dri2_egl_surface
__DRIbuffer *local_buffers[__DRI_BUFFER_COUNT];
#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM) || \
@@ -185,7 +202,7 @@ index a33d87b23c1..95435b9ee12 100644
__DRIimage *dri_image;
#endif
#ifdef HAVE_WAYLAND_PLATFORM
@@ -369,6 +398,9 @@ struct dri2_egl_surface
@@ -377,6 +406,9 @@ struct dri2_egl_surface
#endif
#ifdef HAVE_TIZEN_PLATFORM
tbm_surface_h tbm_surf;
@@ -195,7 +212,7 @@ index a33d87b23c1..95435b9ee12 100644
#endif
bool locked;
int age;
@@ -400,6 +432,10 @@ struct dri2_egl_surface
@@ -409,6 +441,10 @@ struct dri2_egl_surface
void *swrast_front;
#endif
@@ -206,7 +223,7 @@ index a33d87b23c1..95435b9ee12 100644
int out_fence_fd;
EGLBoolean enable_out_fence;
@@ -580,6 +616,21 @@ EGLBoolean
@@ -589,6 +625,21 @@ EGLBoolean
dri2_initialize_tizen(_EGLDisplay *disp);
#endif
@@ -230,10 +247,10 @@ index a33d87b23c1..95435b9ee12 100644
static inline void
diff --git a/src/egl/drivers/dri2/platform_null.c b/src/egl/drivers/dri2/platform_null.c
new file mode 100644
index 00000000000..2b3b08cc259
index 00000000000..fb03ecc36fd
--- /dev/null
+++ b/src/egl/drivers/dri2/platform_null.c
@@ -0,0 +1,1176 @@
@@ -0,0 +1,1179 @@
+/*
+ * Copyright (c) Imagination Technologies Ltd.
+ *
@@ -1282,8 +1299,11 @@ index 00000000000..2b3b08cc259
+ if (format_idx == -1)
+ continue;
+
+ if (!(dri2_dpy->output.formats & (1 << format_idx)))
+ if (!(dri2_dpy->output.formats & (1 << format_idx))) {
+ _eglLog(_EGL_DEBUG, "unsupported drm format 0x%04x",
+ dri2_null_formats[format_idx].drm_format);
+ continue;
+ }
+
+ dri2_conf = dri2_add_config(disp,
+ dri2_dpy->driver_configs[i], count + 1,
@@ -1411,7 +1431,7 @@ index 00000000000..2b3b08cc259
+ }
+}
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index 8d9f4a76330..893541f55b1 100644
index 6d7f62c6851..e4f2c43b4ef 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -989,7 +989,10 @@ _eglCreateWindowSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
@@ -1451,10 +1471,10 @@ index 020529c57e2..8489af9dde2 100644
_EGL_NUM_PLATFORMS,
_EGL_INVALID_PLATFORM = -1
diff --git a/src/egl/meson.build b/src/egl/meson.build
index 17e9c690b82..d23d62562da 100644
index 5749ec88f89..daa6a3a04f0 100644
--- a/src/egl/meson.build
+++ b/src/egl/meson.build
@@ -142,6 +142,11 @@ if with_platform_tizen
@@ -146,6 +146,11 @@ if with_platform_tizen
incs_for_egl += [inc_loader]
deps_for_egl += [dep_tizen, dep_libdrm]
endif
@@ -1467,5 +1487,5 @@ index 17e9c690b82..d23d62562da 100644
if cc.has_function('mincore')
c_args_for_egl += '-DHAVE_MINCORE'
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 7065e8e6bc0c3674ae310468b95cef1d538f5f03 Mon Sep 17 00:00:00 2001
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 38/50] egl: add config debug printout
Subject: [PATCH 37/67] egl: add config debug printout
Feature to print out EGL returned configs for debug purposes.
@@ -10,32 +10,16 @@ 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/Makefile.sources | 4 +-
src/egl/main/eglconfig.c | 20 ++-
src/egl/main/eglconfigdebug.c | 276 ++++++++++++++++++++++++++++++++++
src/egl/main/eglconfigdebug.h | 55 +++++++
src/egl/main/egllog.c | 9 ++
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 +
7 files changed, 365 insertions(+), 5 deletions(-)
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/Makefile.sources b/src/egl/Makefile.sources
index 5f5b6d27e64..d757ba9bed4 100644
--- a/src/egl/Makefile.sources
+++ b/src/egl/Makefile.sources
@@ -25,7 +25,9 @@ LIBEGL_C_FILES := \
main/eglsync.c \
main/eglsync.h \
main/eglentrypoint.h \
- main/egltypedefs.h
+ main/egltypedefs.h \
+ main/eglconfigdebug.h \
+ main/eglconfigdebug.c
dri2_backend_core_FILES := \
drivers/dri2/egl_dri2.c \
diff --git a/src/egl/main/eglconfig.c b/src/egl/main/eglconfig.c
index 5e56948ab72..ea4b3c15f3f 100644
--- a/src/egl/main/eglconfig.c
@@ -86,10 +70,10 @@ index 5e56948ab72..ea4b3c15f3f 100644
}
diff --git a/src/egl/main/eglconfigdebug.c b/src/egl/main/eglconfigdebug.c
new file mode 100644
index 00000000000..13e0a8bc350
index 00000000000..92ac41a5614
--- /dev/null
+++ b/src/egl/main/eglconfigdebug.c
@@ -0,0 +1,276 @@
@@ -0,0 +1,321 @@
+/*
+ * Copyright 2017 Imagination Technologies.
+ * All Rights Reserved.
@@ -144,6 +128,8 @@ index 00000000000..13e0a8bc350
+ EGLint vid, vtype, caveat, bindRgb, bindRgba;
+ EGLint samples, sampleBuffers;
+ char surfString[100];
+ EGLint colorBufferType;
+ EGLint numPlanes, subsample, order;
+};
+
+static void
@@ -158,7 +144,7 @@ index 00000000000..13e0a8bc350
+ * bfsz ----------------- EGL_BUFFER_SIZE
+ * lvl ------------------ EGL_LEVEL
+ *
+ * colourbuffer
+ * color size
+ * r -------------------- EGL_RED_SIZE
+ * g -------------------- EGL_GREEN_SIZE
+ * b -------------------- EGL_BLUE_SIZE
@@ -178,11 +164,19 @@ index 00000000000..13e0a8bc350
+ *
+ * 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 colourbuffer dp st ms vis cav bi renderable supported");
+ _eglLog(_EGL_DEBUG, "sen id sz l r g b a th cl ns b id eat nd gl es es2 es3 vg surfaces");
+ _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, "---------------");
+}
+
@@ -199,6 +193,26 @@ index 00000000000..13e0a8bc350
+ 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)
@@ -226,6 +240,14 @@ index 00000000000..13e0a8bc350
+
+ 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",
@@ -272,6 +294,13 @@ index 00000000000..13e0a8bc350
+ (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);
+}
+
@@ -463,10 +492,10 @@ index 2a06a34684a..a1cf9770ed8 100644
_eglLog(EGLint level, const char *fmtStr, ...);
diff --git a/src/egl/meson.build b/src/egl/meson.build
index d23d62562da..e0628c41c43 100644
index daa6a3a04f0..384bb98ebb3 100644
--- a/src/egl/meson.build
+++ b/src/egl/meson.build
@@ -30,6 +30,8 @@ files_egl = files(
@@ -31,6 +31,8 @@ files_egl = files(
'main/eglapi.c',
'main/eglarray.c',
'main/eglarray.h',
@@ -476,5 +505,5 @@ index d23d62562da..e0628c41c43 100644
'main/eglconfig.h',
'main/eglcontext.c',
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 1b9ddfc2a489056311c6eff3760ad6f450d13c94 Mon Sep 17 00:00:00 2001
From d1d64a3c11fbab083d6225857554ac1c9ad645b6 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 39/50] egl: add support for EXT_image_gl_colorspace
Subject: [PATCH 38/67] egl: add support for EXT_image_gl_colorspace
---
src/egl/drivers/dri2/egl_dri2.c | 57 +++++++++++++++++++++++++++++++--
@@ -12,10 +12,10 @@ Subject: [PATCH 39/50] egl: add support for EXT_image_gl_colorspace
5 files changed, 74 insertions(+), 2 deletions(-)
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index ee19d125675..f001ee7b98f 100644
index 2f8414e0c60..6b26ff979ae 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -1113,6 +1113,9 @@ dri2_setup_screen(_EGLDisplay *disp)
@@ -1084,6 +1084,9 @@ dri2_setup_screen(_EGLDisplay *disp)
dri2_dpy->image->createImageFromBuffer) {
disp->Extensions.IMG_cl_image = EGL_TRUE;
}
@@ -25,7 +25,7 @@ index ee19d125675..f001ee7b98f 100644
}
if (dri2_dpy->flush_control)
@@ -2752,6 +2755,11 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
@@ -2724,6 +2727,11 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
return NULL;
}
@@ -37,7 +37,7 @@ index ee19d125675..f001ee7b98f 100644
if (tbm_surface_get_info(tbm_surf, &info)) {
_eglError(EGL_BAD_PARAMETER, "tbm_surface_get_info");
return NULL;
@@ -2827,6 +2835,11 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
@@ -2799,6 +2807,11 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
if (!_eglParseImageAttribList(&attrs, disp, attr_list))
return NULL;
@@ -49,7 +49,7 @@ index ee19d125675..f001ee7b98f 100644
plane = attrs.PlaneWL;
f = buffer->driver_format;
if (plane < 0 || plane >= f->nplanes) {
@@ -2890,6 +2903,11 @@ dri2_create_image_khr_texture(_EGLDisplay *disp, _EGLContext *ctx,
@@ -2862,6 +2875,11 @@ dri2_create_image_khr_texture(_EGLDisplay *disp, _EGLContext *ctx,
if (!_eglParseImageAttribList(&attrs, disp, attr_list))
return EGL_NO_IMAGE_KHR;
@@ -61,7 +61,7 @@ index ee19d125675..f001ee7b98f 100644
switch (target) {
case EGL_GL_TEXTURE_2D_KHR:
if (!disp->Extensions.KHR_gl_texture_2D_image) {
@@ -3035,6 +3053,11 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
@@ -3007,6 +3025,11 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
return NULL;
}
@@ -73,7 +73,7 @@ index ee19d125675..f001ee7b98f 100644
switch (attrs.DRMBufferFormatMESA) {
case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA:
format = __DRI_IMAGE_FORMAT_ARGB8888;
@@ -3211,6 +3234,23 @@ dri2_num_fourcc_format_planes(EGLint format)
@@ -3189,6 +3212,23 @@ dri2_num_fourcc_format_planes(EGLint format)
}
}
@@ -97,7 +97,7 @@ index ee19d125675..f001ee7b98f 100644
/* Returns the total number of file descriptors. Zero indicates an error. */
static unsigned
dri2_check_dma_buf_format(const _EGLImageAttribs *attrs)
@@ -3356,6 +3396,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
@@ -3334,6 +3374,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 +105,7 @@ index ee19d125675..f001ee7b98f 100644
uint64_t modifier;
bool has_modifier = false;
unsigned error;
@@ -3381,6 +3422,18 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
@@ -3359,6 +3400,18 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
if (!num_fds)
return NULL;
@@ -124,7 +124,7 @@ index ee19d125675..f001ee7b98f 100644
for (unsigned i = 0; i < num_fds; ++i) {
fds[i] = attrs.DMABufPlaneFds[i].Value;
pitches[i] = attrs.DMABufPlanePitches[i].Value;
@@ -3425,7 +3478,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
@@ -3403,7 +3456,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
}
dri_image =
dri2_dpy->image->createImageFromDmaBufs2(dri2_dpy->dri_screen,
@@ -133,7 +133,7 @@ index ee19d125675..f001ee7b98f 100644
modifier, fds, num_fds, pitches, offsets,
attrs.DMABufYuvColorSpaceHint.Value,
attrs.DMABufSampleRangeHint.Value,
@@ -3437,7 +3490,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
@@ -3415,7 +3468,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
else {
dri_image =
dri2_dpy->image->createImageFromDmaBufs(dri2_dpy->dri_screen,
@@ -143,7 +143,7 @@ index ee19d125675..f001ee7b98f 100644
attrs.DMABufYuvColorSpaceHint.Value,
attrs.DMABufSampleRangeHint.Value,
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index 893541f55b1..431dd70d1d8 100644
index e4f2c43b4ef..2d3931dfd26 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -508,6 +508,7 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
@@ -213,5 +213,5 @@ index 9837f05dad1..fc02d7a265c 100644
EGLBoolean ProtectedContent;
};
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 04993e64906c7481f877dd6775a935259ea2d5b9 Mon Sep 17 00:00:00 2001
From c8a6405eaf4c9693f32381fa7aa6d292e7f95716 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 40/50] meson: force C++ 2011 for "thread_local"
Subject: [PATCH 39/67] 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,7 +14,7 @@ command line arguments.
1 file changed, 6 insertions(+)
diff --git a/meson.build b/meson.build
index 56340b8ef3b..3c55447b6eb 100644
index 2018562a1ec..21d93d372c2 100644
--- a/meson.build
+++ b/meson.build
@@ -32,6 +32,12 @@ project(
@@ -31,5 +31,5 @@ index 56340b8ef3b..3c55447b6eb 100644
if get_option('layout') != 'mirror'
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From dc031ad65131ed5de6e8dd8db21d49c0185d6e0b Mon Sep 17 00:00:00 2001
From dbb0d023abb9e4bfed70144514595f0477840f3e 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 41/50] dri2: add support for swap intervals other than 1
Subject: [PATCH 40/67] 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
@@ -22,10 +22,10 @@ Signed-off-by: Luigi Santivetti <luigi.santivetti@imgtec.com>
2 files changed, 497 insertions(+), 78 deletions(-)
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index 95435b9ee12..2fdba4bd62e 100644
index eb2127e3fe6..64d60ed66e4 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -324,6 +324,23 @@ struct tpl_swap_queue_elem
@@ -332,6 +332,23 @@ struct tpl_swap_queue_elem
};
#endif
@@ -49,7 +49,7 @@ index 95435b9ee12..2fdba4bd62e 100644
struct dri2_egl_surface
{
_EGLSurface base;
@@ -362,13 +379,18 @@ struct dri2_egl_surface
@@ -370,13 +387,18 @@ struct dri2_egl_surface
#ifdef HAVE_TIZEN_PLATFORM
tpl_surface_t *tpl_surf;
bool reset;
@@ -69,7 +69,7 @@ index 95435b9ee12..2fdba4bd62e 100644
int swap_queue_idx_head;
int swap_queue_idx_tail;
pthread_t swap_queue_processor;
@@ -404,7 +426,7 @@ struct dri2_egl_surface
@@ -412,7 +434,7 @@ struct dri2_egl_surface
#endif
bool locked;
int age;
@@ -78,7 +78,7 @@ index 95435b9ee12..2fdba4bd62e 100644
#endif
#ifdef HAVE_ANDROID_PLATFORM
@@ -433,7 +455,13 @@ struct dri2_egl_surface
@@ -442,7 +464,13 @@ struct dri2_egl_surface
#endif
#ifdef HAVE_NULL_PLATFORM
@@ -94,7 +94,7 @@ index 95435b9ee12..2fdba4bd62e 100644
int out_fence_fd;
diff --git a/src/egl/drivers/dri2/platform_null.c b/src/egl/drivers/dri2/platform_null.c
index 2b3b08cc259..0b20aef9e4d 100644
index fb03ecc36fd..5b7c1ec426c 100644
--- a/src/egl/drivers/dri2/platform_null.c
+++ b/src/egl/drivers/dri2/platform_null.c
@@ -31,6 +31,7 @@
@@ -730,7 +730,7 @@ index 2b3b08cc259..0b20aef9e4d 100644
.swap_buffers = dri2_null_swap_buffers,
.query_buffer_age = dri2_null_query_buffer_age,
.get_dri_drawable = dri2_surface_get_dri_drawable,
@@ -1059,12 +1431,35 @@ dri2_null_add_configs_for_formats(_EGLDisplay *disp)
@@ -1062,12 +1434,35 @@ dri2_null_add_configs_for_formats(_EGLDisplay *disp)
return count != 0;
}
@@ -767,7 +767,7 @@ index 2b3b08cc259..0b20aef9e4d 100644
int err;
dri2_dpy = calloc(1, sizeof(*dri2_dpy));
@@ -1111,11 +1506,7 @@ dri2_initialize_null(_EGLDisplay *disp)
@@ -1114,11 +1509,7 @@ dri2_initialize_null(_EGLDisplay *disp)
}
dri2_setup_screen(disp);
@@ -781,5 +781,5 @@ index 2b3b08cc259..0b20aef9e4d 100644
if (dri2_dpy->image->base.version < NULL_IMAGE_EXTENSION_VERSION_MIN) {
_eglError(EGL_NOT_INITIALIZED, "image extension version too old");
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 58d5fa48cf14a930322b5645dd5e26c8b546f394 Mon Sep 17 00:00:00 2001
From d286d05d0d84c913c8bfcbe8f693083caf3bcc77 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 42/50] null_platform: add support for explicit synchronisation
Subject: [PATCH 41/67] 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 2fdba4bd62e..3d5c9adb4f3 100644
index 64d60ed66e4..eb6e4551087 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -100,6 +100,7 @@ struct wl_buffer;
@@ -106,6 +106,7 @@ struct wl_buffer;
#ifdef HAVE_NULL_PLATFORM
struct display_output {
bool in_use;
@@ -53,7 +53,7 @@ index 2fdba4bd62e..3d5c9adb4f3 100644
uint32_t connector_id;
drmModePropertyRes **connector_prop_res;
uint32_t crtc_id;
@@ -330,6 +331,7 @@ struct swap_queue_elem
@@ -338,6 +339,7 @@ struct swap_queue_elem
uint32_t swap_interval;
uint32_t back_id;
uint32_t fb_id;
@@ -62,7 +62,7 @@ index 2fdba4bd62e..3d5c9adb4f3 100644
enum {
diff --git a/src/egl/drivers/dri2/platform_null.c b/src/egl/drivers/dri2/platform_null.c
index 0b20aef9e4d..c25ae0b2a04 100644
index 5b7c1ec426c..d36dc0ced2a 100644
--- a/src/egl/drivers/dri2/platform_null.c
+++ b/src/egl/drivers/dri2/platform_null.c
@@ -401,6 +401,9 @@ display_output_atomic_init(int fd, struct display_output *output)
@@ -210,5 +210,5 @@ index 0b20aef9e4d..c25ae0b2a04 100644
err_free_surface:
--
2.17.1
2.25.1
@@ -0,0 +1,401 @@
From 4f9ca104c16a6eb1af770e2447adb4413fb41cb7 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
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
iterate all formats with associated modifiers supported by the display
for the primary drm plane in use.
drmModeFormatModifierBlobIterNext() is added to the DRM api in a different
change and it is not upstream at present.
Internal notes:
[1] IN_FORMATS blobs are available since kernel 4.14:
- db1689aa61bd1efb5ce9b896e7aa860a85b7f1b6
- https://patchwork.freedesktop.org/patch/168543
[2] the dri image->base.version threshold is 14.
- Unlike for platform_wayland, where no details were found regarding
why it's using 15
- dri_interface.h makes createImageWithModifiers available since
version 14
- dri/gbm_dri.c as an example checks for minimum version 14.
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(-)
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
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -117,6 +117,8 @@ struct display_output {
uint32_t mode_blob_id;
unsigned formats;
drmModeAtomicReq *atomic_state;
+ uint32_t in_formats_id;
+ struct u_vector modifiers;
};
#endif
@@ -280,6 +282,7 @@ struct dri2_egl_display
#ifdef HAVE_NULL_PLATFORM
bool atomic_enabled;
+ bool in_formats_enabled;
struct display_output output;
#endif
diff --git a/src/egl/drivers/dri2/platform_null.c b/src/egl/drivers/dri2/platform_null.c
index d36dc0ced2a..2c79199da26 100644
--- a/src/egl/drivers/dri2/platform_null.c
+++ b/src/egl/drivers/dri2/platform_null.c
@@ -40,6 +40,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <util/u_vector.h>
#include <xf86drm.h>
#include "egl_dri2.h"
@@ -156,6 +157,18 @@ format_idx_get_from_drm_format(uint32_t drm_format)
return -1;
}
+static inline uint32_t
+blob_id_from_property_value(uint64_t prop_value)
+{
+ /* The KMS properties documetation, 01.org/linuxgraphics, says:
+ *
+ * For all property types except blob properties the value is a 64-bit
+ * unsigned integer.
+ */
+ assert(!(prop_value >> 32));
+ return (uint32_t) prop_value;
+}
+
static int
atomic_state_add_object_properties(drmModeAtomicReq *atomic_state,
const struct object_property *props,
@@ -645,7 +658,66 @@ drm_event_process(int fd)
}
static bool
-display_output_init(int fd, struct display_output *output, bool use_atomic)
+plane_init_in_formats(int fd, drmModePlane *plane, struct u_vector *modifiers,
+ uint32_t *in_formats_id_out, unsigned *formats_out)
+{
+ uint32_t blob_id, prev_fmt = DRM_FORMAT_INVALID, count_formats = 0;
+ drmModeFormatModifierIterator drm_iter = {0};
+ drmModePropertyBlobRes *blob;
+ uint64_t prop_value;
+ int idx, err;
+
+ assert(plane && in_formats_id_out && formats_out);
+
+ err = !object_property_value_for_name(fd, plane->plane_id,
+ DRM_MODE_OBJECT_PLANE,
+ "IN_FORMATS", &prop_value);
+ if (err)
+ return false;
+
+ blob_id = blob_id_from_property_value(prop_value);
+ blob = drmModeGetPropertyBlob(fd, blob_id);
+
+ while (drmModeFormatModifierBlobIterNext(blob, &drm_iter)) {
+ if (drm_iter.fmt != prev_fmt) {
+ prev_fmt = drm_iter.fmt;
+ count_formats++;
+
+ idx = format_idx_get_from_drm_format(drm_iter.fmt);
+ if (idx < 0)
+ continue;
+
+ *formats_out |= (1 << idx);
+ }
+ }
+
+ drmModeFreePropertyBlob(blob);
+
+ if (!count_formats) {
+ /* None of the formats in the IN_FORMATS blob has associated modifiers */
+ _eglLog(_EGL_WARNING, "no format-modifiers found in IN_FORMATS");
+ return false;
+ }
+
+ if (plane->count_formats != count_formats)
+ /* Only some of the formats in the IN_FORMATS blob have associated modifiers,
+ * try to use this subset.
+ */
+ _eglLog(_EGL_WARNING, "discarding formats without modifiers");
+
+ /* Allocate space for modifiers, if ENOMEM fallback to plane formats */
+ if (!u_vector_init(modifiers, sizeof(uint64_t), 64)) {
+ _eglLog(_EGL_WARNING, "failed to allocate modifiers");
+ return false;
+ }
+
+ *in_formats_id_out = blob_id;
+ return true;
+}
+
+static bool
+display_output_init(int fd, struct display_output *output, bool use_atomic,
+ bool prefer_in_formats, bool *in_formats_enabled_out)
{
drmModeRes *resources;
drmModeConnector *connector;
@@ -674,16 +746,34 @@ display_output_init(int fd, struct display_output *output, bool use_atomic)
goto err_free_plane;
output->mode = connector->modes[mode_idx];
- /* Record the display supported formats */
- for (unsigned i = 0; i < plane->count_formats; i++) {
- int format_idx;
+ assert(in_formats_enabled_out && !(*in_formats_enabled_out));
- format_idx = format_idx_get_from_drm_format(plane->formats[i]);
- if (format_idx == -1)
- continue;
+ /* Track display supported formats. Look them up from IN_FORMATS blobs
+ * if they are available, otherwise use plane formats.
+ */
+ if (prefer_in_formats)
+ *in_formats_enabled_out = plane_init_in_formats(fd, plane,
+ &output->modifiers,
+ &output->in_formats_id,
+ &output->formats);
- output->formats |= (1 << format_idx);
+ if (!*in_formats_enabled_out) {
+ _eglLog(_EGL_WARNING, "fallback to plane formats");
+
+ for (unsigned i = 0; i < plane->count_formats; i++) {
+ int format_idx;
+
+ format_idx = format_idx_get_from_drm_format(plane->formats[i]);
+ if (format_idx == -1)
+ continue;
+
+ output->formats |= (1 << format_idx);
+ }
}
+
+ /* At this point we can only shut down if the look up failed and
+ * it is safe to pass NULL to drmModeFreeFormats().
+ */
if (!output->formats)
goto err_free_plane;
@@ -983,10 +1073,12 @@ static bool
add_fb_for_dri_image(struct dri2_egl_display *dri2_dpy, __DRIimage *image,
uint32_t *fb_id_out)
{
+ uint64_t modifiers[4] = {0};
uint32_t handles[4] = {0};
uint32_t pitches[4] = {0};
uint32_t offsets[4] = {0};
- int handle, stride, width, height, format;
+ uint32_t flags = 0;
+ int handle, stride, width, height, format, l_mod, h_mod;
int format_idx;
dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_HANDLE, &handle);
@@ -1001,9 +1093,47 @@ add_fb_for_dri_image(struct dri2_egl_display *dri2_dpy, __DRIimage *image,
format_idx = format_idx_get_from_dri_image_format(format);
assert(format_idx != -1);
- return !drmModeAddFB2(dri2_dpy->fd, width, height,
- dri2_null_formats[format_idx].drm_format,
- handles, pitches, offsets, fb_id_out, 0);
+ if (dri2_dpy->in_formats_enabled) {
+ dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_MODIFIER_UPPER, &h_mod);
+ dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_MODIFIER_LOWER, &l_mod);
+
+ modifiers[0] = combine_u32_into_u64((uint32_t) h_mod, (uint32_t) l_mod);
+ flags |= DRM_MODE_FB_MODIFIERS;
+ }
+
+ return !drmModeAddFB2WithModifiers(dri2_dpy->fd, width, height,
+ dri2_null_formats[format_idx].drm_format,
+ handles, pitches, offsets, modifiers,
+ fb_id_out, flags);
+}
+
+static __DRIimage *
+create_image(struct dri2_egl_surface *dri2_surf, uint32_t flags)
+{
+ struct dri2_egl_display *dri2_dpy =
+ dri2_egl_display(dri2_surf->base.Resource.Display);
+ uint32_t count_modifiers;
+ uint64_t *modifiers;
+
+ if (dri2_dpy->in_formats_enabled) {
+ count_modifiers = u_vector_length(&dri2_dpy->output.modifiers);
+ modifiers = u_vector_tail(&dri2_dpy->output.modifiers);
+
+ return dri2_dpy->image->createImageWithModifiers(dri2_dpy->dri_screen,
+ dri2_surf->base.Width,
+ dri2_surf->base.Height,
+ dri2_surf->format,
+ modifiers,
+ count_modifiers,
+ NULL);
+ }
+
+ return dri2_dpy->image->createImage(dri2_dpy->dri_screen,
+ dri2_surf->base.Width,
+ dri2_surf->base.Height,
+ dri2_surf->format,
+ flags,
+ NULL);
}
static bool
@@ -1016,12 +1146,7 @@ get_front_bo(struct dri2_egl_surface *dri2_surf)
if (dri2_surf->base.Type == EGL_WINDOW_BIT)
use |= __DRI_IMAGE_USE_SCANOUT;
- dri2_surf->front = dri2_dpy->image->createImage(dri2_dpy->dri_screen,
- dri2_surf->base.Width,
- dri2_surf->base.Height,
- dri2_surf->format,
- use,
- NULL);
+ dri2_surf->front = create_image(dri2_surf, use);
if (!dri2_surf->front)
return false;
@@ -1058,13 +1183,8 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
}
if (!dri2_surf->back->dri_image) {
- dri2_surf->back->dri_image =
- dri2_dpy->image->createImage(dri2_dpy->dri_screen,
- dri2_surf->base.Width,
- dri2_surf->base.Height,
- dri2_surf->format,
- __DRI_IMAGE_USE_SCANOUT,
- NULL);
+ dri2_surf->back->dri_image = create_image(dri2_surf,
+ __DRI_IMAGE_USE_SCANOUT);
if (!dri2_surf->back->dri_image)
goto err_unlock;
}
@@ -1094,6 +1214,30 @@ static void surface_swap_queue_init(struct dri2_egl_surface *dri2_surf)
swap_queue[i].kms_in_fence_fd = -1;
}
+static bool
+in_formats_get_modifiers(const int fd, const uint32_t in_formats_id,
+ const int drm_format, struct u_vector *modifiers)
+{
+ drmModeFormatModifierIterator drm_iter = {0};
+ drmModePropertyBlobRes *blob;
+ uint64_t *mod = NULL;
+
+ blob = drmModeGetPropertyBlob(fd, in_formats_id);
+
+ while (drmModeFormatModifierBlobIterNext(blob, &drm_iter)) {
+ if (drm_iter.fmt == drm_format) {
+ assert(drm_iter.mod != DRM_FORMAT_MOD_INVALID);
+
+ mod = u_vector_add(modifiers);
+ *mod = drm_iter.mod;
+ }
+ }
+
+ drmModeFreePropertyBlob(blob);
+
+ return mod != NULL;
+}
+
static _EGLSurface *
create_surface(_EGLDisplay *disp, _EGLConfig *config, EGLint type,
const EGLint *attrib_list)
@@ -1105,6 +1249,7 @@ create_surface(_EGLDisplay *disp, _EGLConfig *config, EGLint type,
const __DRIconfig *dri_config;
_EGLSurface *surf;
int format_idx;
+ bool ret;
dri2_surf = calloc(1, sizeof(*dri2_surf));
if (!dri2_surf) {
@@ -1137,6 +1282,15 @@ 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,
+ dri2_dpy->output.in_formats_id,
+ dri2_null_formats[format_idx].drm_format,
+ &dri2_dpy->output.modifiers);
+ if (!ret)
+ goto err_free_surface;
+ }
+
surface_swap_queue_init(dri2_surf);
return surf;
@@ -1536,6 +1690,8 @@ EGLBoolean
dri2_initialize_null(_EGLDisplay *disp)
{
struct dri2_egl_display *dri2_dpy;
+ bool prefer_in_formats = false;
+ uint64_t value;
int err;
dri2_dpy = calloc(1, sizeof(*dri2_dpy));
@@ -1589,8 +1745,19 @@ dri2_initialize_null(_EGLDisplay *disp)
goto cleanup;
}
+ err = drmGetCap(dri2_dpy->fd_dpy, DRM_CAP_ADDFB2_MODIFIERS, &value);
+ if (!err && value) {
+ /* in_formats could be supported by the platform, however not being
+ * actually enabled, i.e. in_formats init can still fail.
+ */
+ prefer_in_formats = dri2_dpy->image->base.version >= 14 &&
+ dri2_dpy->image->createImageWithModifiers;
+ }
+
if (!display_output_init(dri2_dpy->fd, &dri2_dpy->output,
- dri2_dpy->atomic_enabled)) {
+ dri2_dpy->atomic_enabled,
+ prefer_in_formats,
+ &dri2_dpy->in_formats_enabled)) {
_eglError(EGL_NOT_INITIALIZED, "failed to create output");
goto cleanup;
}
@@ -1640,4 +1807,6 @@ dri2_teardown_null(struct dri2_egl_display *dri2_dpy)
drmModeFreeProperty(dri2_dpy->output.connector_prop_res[i]);
free(dri2_dpy->output.connector_prop_res);
}
+
+ u_vector_finish(&dri2_dpy->output.modifiers);
}
--
2.25.1
@@ -1,7 +1,7 @@
From 7c21f010de28888376dcafd99d3fa43d15279dc6 Mon Sep 17 00:00:00 2001
From 1e6466e541e1fc67198be3eeb090e3af22bd6d19 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 44/50] egl: query the supported ES2 context version
Subject: [PATCH 43/67] 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,10 +39,10 @@ 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 8214e7a55c3..302e4e08de0 100644
index 6490f6e80e2..9c7bcac4cae 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -2028,6 +2028,8 @@ typedef struct __DRIDriverVtableExtensionRec {
@@ -2052,6 +2052,8 @@ typedef struct __DRIDriverVtableExtensionRec {
#define __DRI2_RENDERER_HAS_PROTECTED_CONTENT 0x000e
@@ -52,10 +52,10 @@ index 8214e7a55c3..302e4e08de0 100644
struct __DRI2rendererQueryExtensionRec {
__DRIextension base;
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index f001ee7b98f..cda414f4adc 100644
index 6b26ff979ae..c4a49cae592 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -2083,6 +2083,26 @@ dri2_make_current(_EGLDisplay *disp, _EGLSurface *dsurf,
@@ -2055,6 +2055,26 @@ dri2_make_current(_EGLDisplay *disp, _EGLSurface *dsurf,
return EGL_TRUE;
}
@@ -82,7 +82,7 @@ index f001ee7b98f..cda414f4adc 100644
__DRIdrawable *
dri2_surface_get_dri_drawable(_EGLSurface *surf)
{
@@ -4347,6 +4367,7 @@ const _EGLDriver _eglDriver = {
@@ -4336,6 +4356,7 @@ const _EGLDriver _eglDriver = {
.CreateContext = dri2_create_context,
.DestroyContext = dri2_destroy_context,
.MakeCurrent = dri2_make_current,
@@ -91,7 +91,7 @@ index f001ee7b98f..cda414f4adc 100644
.CreatePixmapSurface = dri2_create_pixmap_surface,
.CreatePbufferSurface = dri2_create_pbuffer_surface,
diff --git a/src/egl/drivers/haiku/egl_haiku.cpp b/src/egl/drivers/haiku/egl_haiku.cpp
index 8eda31c2936..6fc58371063 100644
index 18c73c9cd8b..2690a82eb75 100644
--- a/src/egl/drivers/haiku/egl_haiku.cpp
+++ b/src/egl/drivers/haiku/egl_haiku.cpp
@@ -297,6 +297,14 @@ haiku_make_current(_EGLDisplay *disp, _EGLSurface *dsurf,
@@ -118,7 +118,7 @@ index 8eda31c2936..6fc58371063 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 431dd70d1d8..900ef7ab4cc 100644
index 2d3931dfd26..1cbff9656e4 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -948,7 +948,7 @@ eglQueryContext(EGLDisplay dpy, EGLContext ctx,
@@ -131,7 +131,7 @@ index 431dd70d1d8..900ef7ab4cc 100644
RETURN_EGL_EVAL(disp, ret);
}
diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c
index 65dc886abbb..09e7d3ee589 100644
index 15de7c99496..7274d246194 100644
--- a/src/egl/main/eglcontext.c
+++ b/src/egl/main/eglcontext.c
@@ -35,6 +35,7 @@
@@ -199,5 +199,5 @@ index 12f9a0aab86..92af8bd16d5 100644
/* surface funcs */
_EGLSurface *(*CreateWindowSurface)(_EGLDisplay *disp, _EGLConfig *config,
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 43662126e9973c6cff496ba32fae3cf372e0646b Mon Sep 17 00:00:00 2001
From 64e6997ded5825f10125313ea15e3164bdad769b 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 45/50] meson: allow libGL to be built without GLX
Subject: [PATCH 44/67] meson: allow libGL to be built without GLX
If Meson is run with option "glx" set to "null", build the
OpenGL library without GLX.
@@ -15,16 +15,16 @@ with OpenGL on platforms other than X11.
meson.build | 8 ++++++--
meson_options.txt | 2 +-
src/egl/main/eglcurrent.h | 7 +++----
src/glx/meson.build | 16 ++++++++++++----
src/glx/meson.build | 20 ++++++++++++++++----
src/meson.build | 2 +-
5 files changed, 23 insertions(+), 12 deletions(-)
5 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/meson.build b/meson.build
index 3c55447b6eb..af020203752 100644
index 21d93d372c2..8db1699729a 100644
--- a/meson.build
+++ b/meson.build
@@ -459,6 +459,10 @@ else
with_egl = false
@@ -485,6 +485,10 @@ if with_egl and not _platforms.contains(egl_native_platform)
error('-Degl-native-platform does not specify an enabled platform')
endif
+if with_egl and with_opengl and with_glx != 'disabled'
@@ -33,9 +33,9 @@ index 3c55447b6eb..af020203752 100644
+
# Android uses emutls for versions <= P/28. For USE_ELF_TLS we need ELF TLS.
use_elf_tls = false
if not ['windows', 'freebsd', 'openbsd', 'haiku'].contains(host_machine.system()) and (not with_platform_android or get_option('platform-sdk-version') >= 29)
@@ -466,7 +470,7 @@ if not ['windows', 'freebsd', 'openbsd', 'haiku'].contains(host_machine.system()
use_elf_tls = true
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
endif
-if with_glx != 'disabled'
@@ -43,7 +43,7 @@ index 3c55447b6eb..af020203752 100644
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'
@@ -528,7 +532,7 @@ if with_any_vk and (with_platform_x11 and not with_dri3)
@@ -564,7 +568,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,10 +53,10 @@ index 3c55447b6eb..af020203752 100644
endif
endif
diff --git a/meson_options.txt b/meson_options.txt
index 9073223e8f5..4038629544e 100644
index d90a25f97ff..d36e714ea4c 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -267,7 +267,7 @@ option(
@@ -290,7 +290,7 @@ option(
'glx',
type : 'combo',
value : 'auto',
@@ -85,14 +85,18 @@ index 32570970947..dcc418afd6f 100644
}
diff --git a/src/glx/meson.build b/src/glx/meson.build
index 58f9e1aa896..41ca936b8f4 100644
index 8f642d5e14b..605a9717e37 100644
--- a/src/glx/meson.build
+++ b/src/glx/meson.build
@@ -126,7 +126,11 @@ gl_lib_cargs = [
'-D_REENTRANT',
]
@@ -122,7 +122,15 @@ else
)
endif
-libglx = static_library(
+gl_lib_cargs = [
+ '-D_REENTRANT',
+]
+
+if with_glx == 'null'
+ libglx_link = [libglapi]
+ libglx_link_whole = [libglapi_static]
@@ -101,7 +105,7 @@ index 58f9e1aa896..41ca936b8f4 100644
'glx',
[files_libglx, glx_generated],
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux, inc_glapi, inc_loader],
@@ -143,13 +147,17 @@ libglx = static_library(
@@ -138,13 +146,17 @@ libglx = static_library(
idep_mesautil, idep_xmlconfig,
dep_libdrm, dep_dri2proto, dep_glproto, dep_x11, dep_glvnd,
],
@@ -123,10 +127,10 @@ index 58f9e1aa896..41ca936b8f4 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 d96c754a63d..a92580b2dd5 100644
index c3bab27718d..f6eede56648 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -104,7 +104,7 @@ subdir('loader')
@@ -110,7 +110,7 @@ subdir('loader')
if with_platform_haiku
subdir('hgl')
endif
@@ -136,5 +140,5 @@ index d96c754a63d..a92580b2dd5 100644
endif
if with_gbm
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From bc8f13db460c79ef9036e7f0983bb039ac1af777 Mon Sep 17 00:00:00 2001
From 394d340dda351452571ec8861d6768c52d338251 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 46/50] egl/wayland: process non-resized window movement
Subject: [PATCH 45/67] 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 de12ec21f53..f4b43aa26a2 100644
index 72456d5d748..06272d4081e 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -265,6 +265,9 @@ resize_callback(struct wl_egl_window *wl_win, void *data)
@@ -266,6 +266,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 de12ec21f53..f4b43aa26a2 100644
if (dri2_surf->base.Width == wl_win->width &&
dri2_surf->base.Height == wl_win->height)
return;
@@ -799,8 +802,6 @@ update_buffers(struct dri2_egl_display *dri2_dpy,
@@ -786,8 +789,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 de12ec21f53..f4b43aa26a2 100644
- dri2_surf->dy = dri2_surf->wl_win->dy;
}
if (dri2_surf->base.Width != dri2_surf->wl_win->attached_width ||
if (dri2_surf->wl_win &&
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 22afb695d4598a52198f9bbe98b359f9fcf77cfa Mon Sep 17 00:00:00 2001
From ed4671544a6add01e87e94c04df59a600403dd21 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 47/50] Separate EXT_framebuffer_object from ARB version
Subject: [PATCH 46/67] Separate EXT_framebuffer_object from ARB version
This patch separates the EXT_framebuffer_object entry points from the ARB
equivalents.
@@ -145,36 +145,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 32fb3b8f4f7..ecd650ab814 100644
index e231c176264..974f366d7b4 100644
--- a/src/mapi/glapi/gen/static_data.py
+++ b/src/mapi/glapi/gen/static_data.py
@@ -1694,6 +1694,21 @@ offsets = {
"FramebufferTextureMultisampleMultiviewOVR" : 1658,
"MultiDrawArraysIndirectEXT" : 1659,
"MultiDrawElementsIndirectEXT" : 1660,
+ "IsRenderbufferEXT" : 1661,
+ "DeleteRenderbuffersEXT" : 1662,
+ "GenRenderbuffersEXT" : 1663,
+ "RenderbufferStorageEXT" : 1664,
+ "GetRenderbufferParameterivEXT" : 1665,
+ "IsFramebufferEXT" : 1666,
+ "DeleteFramebuffersEXT" : 1667,
+ "GenFramebuffersEXT" : 1668,
+ "CheckFramebufferStatusEXT" : 1669,
+ "FramebufferTexture1DEXT" : 1670,
+ "FramebufferTexture2DEXT" : 1671,
+ "FramebufferTexture3DEXT" : 1672,
+ "FramebufferRenderbufferEXT" : 1673,
+ "GetFramebufferAttachmentParameterivEXT" : 1674,
+ "GenerateMipmapEXT" : 1675,
@@ -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,
}
functions = [
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 798f59d2499..21507ff7c19 100644
index 49893165250..885aa442911 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -1973,6 +1973,11 @@ _mesa_detach_renderbuffer(struct gl_context *ctx,
@@ -1995,6 +1995,11 @@ _mesa_detach_renderbuffer(struct gl_context *ctx,
return progress;
}
@@ -186,7 +186,7 @@ index 798f59d2499..21507ff7c19 100644
void GLAPIENTRY
_mesa_DeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
@@ -2682,6 +2687,12 @@ renderbuffer_storage_target(GLenum target, GLenum internalFormat,
@@ -2722,6 +2727,12 @@ renderbuffer_storage_target(GLenum target, GLenum internalFormat,
}
@@ -199,7 +199,7 @@ index 798f59d2499..21507ff7c19 100644
void GLAPIENTRY
_mesa_EGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
{
@@ -2712,6 +2723,11 @@ _mesa_EGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
@@ -2752,6 +2763,11 @@ _mesa_EGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
ctx->Driver.EGLImageTargetRenderbufferStorage(ctx, rb, image);
}
@@ -211,7 +211,7 @@ index 798f59d2499..21507ff7c19 100644
/**
* Helper function for _mesa_GetRenderbufferParameteriv() and
@@ -2744,6 +2760,12 @@ _mesa_RenderbufferStorage(GLenum target, GLenum internalFormat,
@@ -2784,6 +2800,12 @@ _mesa_RenderbufferStorage(GLenum target, GLenum internalFormat,
NO_SAMPLES, 0, "glRenderbufferStorage");
}
@@ -224,7 +224,7 @@ index 798f59d2499..21507ff7c19 100644
void GLAPIENTRY
_mesa_RenderbufferStorageMultisample(GLenum target, GLsizei samples,
@@ -2945,6 +2967,11 @@ _mesa_GetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname,
@@ -2985,6 +3007,11 @@ _mesa_GetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname,
"glGetNamedRenderbufferParameteriv");
}
@@ -236,7 +236,7 @@ index 798f59d2499..21507ff7c19 100644
void GLAPIENTRY
_mesa_GetNamedRenderbufferParameterivEXT(GLuint renderbuffer, GLenum pname,
@@ -2978,6 +3005,11 @@ _mesa_IsFramebuffer(GLuint framebuffer)
@@ -3018,6 +3045,11 @@ _mesa_IsFramebuffer(GLuint framebuffer)
return GL_FALSE;
}
@@ -248,7 +248,7 @@ index 798f59d2499..21507ff7c19 100644
/**
* Check if any of the attachments of the given framebuffer are textures
@@ -3212,6 +3244,11 @@ _mesa_DeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
@@ -3253,6 +3285,11 @@ _mesa_DeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
}
}
@@ -260,7 +260,7 @@ index 798f59d2499..21507ff7c19 100644
/**
* This is the implementation for glGenFramebuffers and glCreateFramebuffers.
@@ -3258,6 +3295,11 @@ create_framebuffers(GLsizei n, GLuint *framebuffers, bool dsa)
@@ -3299,6 +3336,11 @@ create_framebuffers(GLsizei n, GLuint *framebuffers, bool dsa)
_mesa_HashUnlockMutex(ctx->Shared->FrameBuffers);
}
@@ -272,7 +272,7 @@ index 798f59d2499..21507ff7c19 100644
void GLAPIENTRY
_mesa_GenFramebuffers(GLsizei n, GLuint *framebuffers)
@@ -3297,6 +3339,11 @@ _mesa_check_framebuffer_status(struct gl_context *ctx,
@@ -3338,6 +3380,11 @@ _mesa_check_framebuffer_status(struct gl_context *ctx,
return buffer->_Status;
}
@@ -284,7 +284,7 @@ index 798f59d2499..21507ff7c19 100644
GLenum GLAPIENTRY
_mesa_CheckFramebufferStatus_no_error(GLenum target)
@@ -3909,6 +3956,12 @@ _mesa_FramebufferTexture1D_no_error(GLenum target, GLenum attachment,
@@ -3950,6 +3997,12 @@ _mesa_FramebufferTexture1D_no_error(GLenum target, GLenum attachment,
texture, level, 0);
}
@@ -297,7 +297,7 @@ index 798f59d2499..21507ff7c19 100644
void GLAPIENTRY
_mesa_FramebufferTexture1D(GLenum target, GLenum attachment,
@@ -3949,6 +4002,12 @@ _mesa_FramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
@@ -3990,6 +4043,12 @@ _mesa_FramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
false);
}
@@ -310,7 +310,7 @@ index 798f59d2499..21507ff7c19 100644
void GLAPIENTRY
_mesa_FramebufferTexture3D_no_error(GLenum target, GLenum attachment,
@@ -4059,6 +4118,15 @@ frame_buffer_texture(GLuint framebuffer, GLenum target,
@@ -4100,6 +4159,15 @@ frame_buffer_texture(GLuint framebuffer, GLenum target,
level, 0, layer, layered);
}
@@ -326,7 +326,7 @@ index 798f59d2499..21507ff7c19 100644
void GLAPIENTRY
_mesa_FramebufferTextureLayer_no_error(GLenum target, GLenum attachment,
GLuint texture, GLint level,
@@ -4312,6 +4380,15 @@ _mesa_FramebufferRenderbuffer(GLenum target, GLenum attachment,
@@ -4353,6 +4421,15 @@ _mesa_FramebufferRenderbuffer(GLenum target, GLenum attachment,
renderbuffer, "glFramebufferRenderbuffer");
}
@@ -342,7 +342,7 @@ index 798f59d2499..21507ff7c19 100644
void GLAPIENTRY
_mesa_NamedFramebufferRenderbuffer_no_error(GLuint framebuffer,
GLenum attachment,
@@ -4713,6 +4790,12 @@ invalid_pname_enum:
@@ -4754,6 +4831,12 @@ invalid_pname_enum:
return;
}
@@ -507,7 +507,7 @@ index 2a32c158e68..98271d76f50 100644
_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 16e2b037635..4d7b7db36a5 100644
index 36727bb7060..8d262e53852 100644
--- a/src/mesa/main/genmipmap.c
+++ b/src/mesa/main/genmipmap.c
@@ -267,3 +267,9 @@ _mesa_GenerateMultiTexMipmapEXT(GLenum texunit, GLenum target)
@@ -535,5 +535,5 @@ index c661f2184c7..ff3b45a4417 100644
_mesa_GenerateTextureMipmap(GLuint texture);
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From b2bee752e8c3d4188037b0d538b86836a0ba19d3 Mon Sep 17 00:00:00 2001
From f775167cbe3f324468f8f355be13bd6efa7d4567 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 48/50] egl/null: add support for async flip with front buffer
Subject: [PATCH 47/67] 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 6ec9ee01885..9d60d21e8fd 100644
index 0f683d76e18..13b808bff80 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -276,6 +276,7 @@ struct dri2_egl_display
@@ -282,6 +282,7 @@ struct dri2_egl_display
#ifdef HAVE_NULL_PLATFORM
bool atomic_enabled;
bool in_formats_enabled;
@@ -56,7 +56,7 @@ index 6ec9ee01885..9d60d21e8fd 100644
struct display_output output;
#endif
@@ -434,8 +435,12 @@ struct dri2_egl_surface
@@ -442,8 +443,12 @@ struct dri2_egl_surface
#endif
bool locked;
int age;
@@ -69,7 +69,7 @@ index 6ec9ee01885..9d60d21e8fd 100644
#ifdef HAVE_ANDROID_PLATFORM
struct ANativeWindow *window;
@@ -463,12 +468,13 @@ struct dri2_egl_surface
@@ -472,12 +477,13 @@ struct dri2_egl_surface
#endif
#ifdef HAVE_NULL_PLATFORM
@@ -85,7 +85,7 @@ index 6ec9ee01885..9d60d21e8fd 100644
#endif
diff --git a/src/egl/drivers/dri2/platform_null.c b/src/egl/drivers/dri2/platform_null.c
index 701460dde4e..4969121bf37 100644
index 48a586b6f38..33cf576f147 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)
@@ -277,7 +277,7 @@ index 701460dde4e..4969121bf37 100644
}
if (buffer_mask & __DRI_IMAGE_BUFFER_BACK) {
@@ -1637,18 +1719,27 @@ dri2_null_setup_swap_interval(_EGLDisplay *disp)
@@ -1640,18 +1722,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);
@@ -317,5 +317,5 @@ index 701460dde4e..4969121bf37 100644
EGLBoolean
--
2.17.1
2.25.1
@@ -1,7 +1,7 @@
From 8ea569933388752a39e859989b69ab2f09f68309 Mon Sep 17 00:00:00 2001
From 4d19dc5cc9be4f3f25ed8befbfcda70c047065d3 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 49/50] gbm: add pbuffer support
Subject: [PATCH 48/67] 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,10 +18,10 @@ 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 9d60d21e8fd..2292f29772d 100644
index 13b808bff80..141df1b1732 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -462,6 +462,9 @@ struct dri2_egl_surface
@@ -471,6 +471,9 @@ struct dri2_egl_surface
/* surfaceless and device */
__DRIimage *front;
unsigned int visual;
@@ -32,7 +32,7 @@ index 9d60d21e8fd..2292f29772d 100644
#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 2944a5d7ad4..7fb8d2376d8 100644
index 2b329437f88..258e8b6593e 100644
--- a/src/egl/drivers/dri2/platform_drm.c
+++ b/src/egl/drivers/dri2/platform_drm.c
@@ -41,6 +41,38 @@
@@ -46,13 +46,13 @@ index 2944a5d7ad4..7fb8d2376d8 100644
+ struct dri2_egl_display *dri2_dpy =
+ dri2_egl_display(dri2_surf->base.Resource.Display);
+
+ struct gbm_surface *surf = &dri2_surf->gbm_surf->base;
+ struct gbm_dri_surface *surf = dri2_surf->gbm_surf;
+
+ dri2_surf->front_bo = gbm_bo_create(&dri2_dpy->gbm_dri->base,
+ surf->width,
+ surf->height,
+ surf->format,
+ surf->flags);
+ surf->base.v0.width,
+ surf->base.v0.height,
+ surf->base.v0.format,
+ surf->base.v0.flags);
+ if (!dri2_surf->front_bo) {
+ _eglError(EGL_BAD_ALLOC, "failed to allocate front buffer");
+ return false;
@@ -163,7 +163,7 @@ index 2944a5d7ad4..7fb8d2376d8 100644
dri2_fini_surface(surf);
free(surf);
@@ -400,12 +470,27 @@ dri2_drm_image_get_buffers(__DRIdrawable *driDrawable,
@@ -402,12 +472,27 @@ dri2_drm_image_get_buffers(__DRIdrawable *driDrawable,
struct dri2_egl_surface *dri2_surf = loaderPrivate;
struct gbm_dri_bo *bo;
@@ -196,7 +196,7 @@ index 2944a5d7ad4..7fb8d2376d8 100644
return 1;
}
@@ -423,6 +508,9 @@ dri2_drm_swap_buffers(_EGLDisplay *disp, _EGLSurface *draw)
@@ -425,6 +510,9 @@ dri2_drm_swap_buffers(_EGLDisplay *disp, _EGLSurface *draw)
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
@@ -206,7 +206,7 @@ index 2944a5d7ad4..7fb8d2376d8 100644
if (!dri2_dpy->flush) {
dri2_dpy->core->swapBuffers(dri2_surf->dri_drawable);
return EGL_TRUE;
@@ -646,7 +734,8 @@ drm_add_configs_for_visuals(_EGLDisplay *disp)
@@ -648,7 +736,8 @@ drm_add_configs_for_visuals(_EGLDisplay *disp)
};
dri2_conf = dri2_add_config(disp, dri2_dpy->driver_configs[i],
@@ -216,7 +216,7 @@ index 2944a5d7ad4..7fb8d2376d8 100644
if (dri2_conf) {
if (dri2_conf->base.ConfigID == config_count + 1)
config_count++;
@@ -670,6 +759,7 @@ static const struct dri2_egl_display_vtbl dri2_drm_display_vtbl = {
@@ -672,6 +761,7 @@ static const struct dri2_egl_display_vtbl dri2_drm_display_vtbl = {
.authenticate = dri2_drm_authenticate,
.create_window_surface = dri2_drm_create_window_surface,
.create_pixmap_surface = dri2_drm_create_pixmap_surface,
@@ -225,5 +225,5 @@ index 2944a5d7ad4..7fb8d2376d8 100644
.create_image = dri2_drm_create_image_khr,
.swap_buffers = dri2_drm_swap_buffers,
--
2.17.1
2.25.1
@@ -1,30 +1,254 @@
From b8488580d9d7e034aa39426f6ef161035e56915d Mon Sep 17 00:00:00 2001
From: Luigi Santivetti <luigi.santivetti@imagination.corp-partner.google.com>
Date: Mon, 25 Jan 2021 11:05:49 +0000
Subject: [PATCH 50/50] egl/null: expose EXT_yuv_surface support
From b0ea3289c16d31d840af71876187cf30b2b32e9a 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
---
src/egl/drivers/dri2/platform_null.c | 28 +++++++++++++++++++++++++---
1 file changed, 25 insertions(+), 3 deletions(-)
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(-)
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 4969121bf37..9830b73d704 100644
index f2c481c256b..d1e576af5ce 100644
--- a/src/egl/drivers/dri2/platform_null.c
+++ b/src/egl/drivers/dri2/platform_null.c
@@ -106,6 +106,12 @@ static const struct dri2_null_format {
@@ -79,6 +79,35 @@ uint32_t get_back_buffer_id(struct dri2_egl_surface *dri2_surf)
.prop_value = value, \
}
+static const struct dri2_null_yuv_attrib {
+ uint32_t order;
+ uint32_t subsample;
+ uint32_t num_planes;
+ uint32_t plane_bpp;
+} dri2_null_yuv_attribs[] = {
+ {
+ /* __DRI_IMAGE_FORMAT_YUYV */
+ .order = __DRI_ATTRIB_YUV_ORDER_YUYV_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_NV12 */
+ .order = __DRI_ATTRIB_YUV_ORDER_YUV_BIT,
+ .subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT,
+ .num_planes = 2,
+ .plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT,
+ },
+ {
+ /* __DRI_IMAGE_FORMAT_NV21 */
+ .order = __DRI_ATTRIB_YUV_ORDER_YVU_BIT,
+ .subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT,
+ .num_planes = 2,
+ .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 {
int dri_image_format;
int rgba_shifts[4];
unsigned int rgba_sizes[4];
+ const struct dri2_null_yuv_attrib *yuv;
} dri2_null_formats[] = {
{
.drm_format = DRM_FORMAT_XRGB8888,
.dri_image_format = __DRI_IMAGE_FORMAT_XRGB8888,
.rgba_shifts = { 16, 8, 0, -1 },
.rgba_sizes = { 8, 8, 8, 0 },
+ .yuv = NULL,
},
{
.drm_format = DRM_FORMAT_ARGB8888,
.dri_image_format = __DRI_IMAGE_FORMAT_ARGB8888,
.rgba_shifts = { 16, 8, 0, 24 },
.rgba_sizes = { 8, 8, 8, 8 },
+ .yuv = NULL,
},
{
.drm_format = DRM_FORMAT_RGB565,
.dri_image_format = __DRI_IMAGE_FORMAT_RGB565,
.rgba_shifts = { 11, 5, 0, -1 },
.rgba_sizes = { 5, 6, 5, 0 },
},
+ .yuv = NULL,
+ },
+ {
+ .drm_format = DRM_FORMAT_YUYV,
+ .dri_image_format = __DRI_IMAGE_FORMAT_YUYV,
+ .rgba_shifts = { -1, -1, -1, -1 },
+ .rgba_sizes = { 0, 0, 0, 0 },
+ .yuv = &dri2_null_yuv_attribs[0],
+ },
+ {
+ .drm_format = DRM_FORMAT_NV12,
+ .dri_image_format = __DRI_IMAGE_FORMAT_NV12,
+ .rgba_shifts = { -1, -1, -1, -1 },
+ .rgba_sizes = { 0, 0, 0, 0 },
+ .yuv = &dri2_null_yuv_attribs[1],
+ },
+ {
+ .drm_format = DRM_FORMAT_NV21,
+ .dri_image_format = __DRI_IMAGE_FORMAT_NV21,
+ .rgba_shifts = { -1, -1, -1, -1 },
+ .rgba_sizes = { 0, 0, 0, 0 },
+ .yuv = &dri2_null_yuv_attribs[2],
},
};
@@ -137,6 +191,36 @@ format_idx_get_from_config(struct dri2_egl_display *dri2_dpy,
return -1;
}
@@ -1595,6 +1601,17 @@ dri2_null_image_get_buffers(__DRIdrawable *driDrawable, unsigned int format,
+static int
+yuv_format_idx_get_from_config(struct dri2_egl_display *dri2_dpy,
+ const __DRIconfig *dri_config)
+{
+ for (unsigned int i = 0; i < ARRAY_SIZE(dri2_null_formats); i++) {
+ const struct dri2_null_yuv_attrib *yuv = dri2_null_formats[i].yuv;
+ unsigned order, subsample, num_planes, plane_bpp;
+
+ if (!yuv)
+ continue;
+
+ 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 (order != yuv->order || subsample != yuv->subsample ||
+ num_planes != yuv->num_planes || plane_bpp != yuv->plane_bpp)
+ continue;
+
+ return i;
+ }
+
+ return -1;
+}
+
static int
format_idx_get_from_dri_image_format(uint32_t dri_image_format)
{
@@ -1082,23 +1166,21 @@ static bool
add_fb_for_dri_image(struct dri2_egl_display *dri2_dpy, __DRIimage *image,
uint32_t *fb_id_out)
{
- uint64_t modifiers[4] = {0};
+ int handle, stride, width, height, format, l_mod, h_mod, offset;
+ uint64_t modifier = DRM_FORMAT_MOD_INVALID;
+ uint64_t *modifiers = NULL, mods[4] = {0};
uint32_t handles[4] = {0};
uint32_t pitches[4] = {0};
uint32_t offsets[4] = {0};
+ __DRIimage *p_image;
uint32_t flags = 0;
- int handle, stride, width, height, format, l_mod, h_mod;
int format_idx;
+ int num_planes;
- dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_HANDLE, &handle);
- dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &stride);
dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_WIDTH, &width);
dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_HEIGHT, &height);
dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FORMAT, &format);
- handles[0] = (uint32_t) handle;
- pitches[0] = (uint32_t) stride;
-
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,
dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_MODIFIER_UPPER, &h_mod);
dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_MODIFIER_LOWER, &l_mod);
- modifiers[0] = combine_u32_into_u64((uint32_t) h_mod, (uint32_t) l_mod);
+ modifier = combine_u32_into_u64((uint32_t) h_mod, (uint32_t) l_mod);
+ modifiers = mods;
+
flags |= DRM_MODE_FB_MODIFIERS;
}
+ dri2_dpy->image->queryImage(image,
+ __DRI_IMAGE_ATTRIB_NUM_PLANES, &num_planes);
+ if (num_planes <= 0)
+ num_planes = 1;
+
+ for (int i = 0; i < num_planes; i++) {
+ if (dri2_dpy->in_formats_enabled) {
+ assert(modifiers && modifier != DRM_FORMAT_MOD_INVALID);
+ modifiers[i] = modifier;
+ }
+
+ p_image = dri2_dpy->image->fromPlanar(image, i, NULL);
+ if (!p_image) {
+ assert(i == 0);
+ p_image = image;
+ }
+
+ dri2_dpy->image->queryImage(p_image, __DRI_IMAGE_ATTRIB_STRIDE,
+ &stride);
+ dri2_dpy->image->queryImage(p_image, __DRI_IMAGE_ATTRIB_OFFSET,
+ &offset);
+ dri2_dpy->image->queryImage(p_image, __DRI_IMAGE_ATTRIB_HANDLE,
+ &handle);
+
+ if (p_image != image)
+ dri2_dpy->image->destroyImage(p_image);
+
+ pitches[i] = (uint32_t) stride;
+ offsets[i] = (uint32_t) offset;
+ handles[i] = (uint32_t) handle;
+ }
+
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,
struct dri2_egl_config *dri2_config = dri2_egl_config(config);
struct dri2_egl_surface *dri2_surf;
const __DRIconfig *dri_config;
+ unsigned int render_type;
_EGLSurface *surf;
int format_idx;
bool ret;
@@ -1286,7 +1403,14 @@ create_surface(_EGLDisplay *disp, _EGLConfig *config, EGLint type,
goto err_free_surface;
}
- format_idx = format_idx_get_from_config(dri2_dpy, dri_config);
+ if (!dri2_dpy->core->getConfigAttrib(dri_config, __DRI_ATTRIB_RENDER_TYPE,
+ &render_type))
+ goto err_free_surface;
+
+ if (render_type & __DRI_ATTRIB_YUV_BIT)
+ format_idx = yuv_format_idx_get_from_config(dri2_dpy, dri_config);
+ else
+ format_idx = format_idx_get_from_config(dri2_dpy, dri_config);
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,
return 1;
}
@@ -42,7 +266,7 @@ index 4969121bf37..9830b73d704 100644
static void
dri2_null_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
{
@@ -1603,10 +1620,11 @@ dri2_null_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
@@ -1635,10 +1770,11 @@ dri2_null_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
}
static const __DRIimageLoaderExtension image_loader_extension = {
@@ -55,22 +279,35 @@ index 4969121bf37..9830b73d704 100644
};
static const __DRIextension *image_loader_extensions[] = {
@@ -1688,6 +1706,7 @@ dri2_null_add_configs_for_formats(_EGLDisplay *disp)
@@ -1720,10 +1856,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;
+ EGLint surface_type;
+ EGLint surface_type = EGL_WINDOW_BIT;
+ unsigned int render_type;
int format_idx;
format_idx = format_idx_get_from_config(dri2_dpy,
@@ -1698,10 +1717,13 @@ dri2_null_add_configs_for_formats(_EGLDisplay *disp)
if (!(dri2_dpy->output.formats & (1 << format_idx)))
- format_idx = format_idx_get_from_config(dri2_dpy,
- dri2_dpy->driver_configs[i]);
+ if (!dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
+ __DRI_ATTRIB_RENDER_TYPE,
+ &render_type))
+ continue;
+
+ if (render_type & __DRI_ATTRIB_YUV_BIT) {
+ format_idx = yuv_format_idx_get_from_config(dri2_dpy,
+ dri2_dpy->driver_configs[i]);
+ } else {
+ format_idx = format_idx_get_from_config(dri2_dpy,
+ dri2_dpy->driver_configs[i]);
+ surface_type |= EGL_PBUFFER_BIT;
+ }
+
if (format_idx == -1)
continue;
+ surface_type = EGL_WINDOW_BIT;
+ if (dri2_null_formats[format_idx].drm_format != DRM_FORMAT_YUYV)
+ surface_type |= EGL_PBUFFER_BIT;
+
@@ -1735,8 +1885,7 @@ dri2_null_add_configs_for_formats(_EGLDisplay *disp)
dri2_conf = dri2_add_config(disp,
dri2_dpy->driver_configs[i], count + 1,
- EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
@@ -79,6 +316,32 @@ index 4969121bf37..9830b73d704 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.17.1
2.25.1
@@ -0,0 +1,433 @@
From db015d5fd0ded075e759677c047c581151bb1b52 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.
If an application uses a different GPU from the default, allow the
file descriptor (FD) for that original GPU/display to be preserved
for use by drivers. Drivers may wish to use the original FD to
allocate shared surfaces, to ensure the surface properties are
compatible with the original GPU/display (e.g. for X11 or Wayland).
This feature is only available on platforms that choose to support
it, by implementing the new getDisplayFD function in the DRI image,
and DRI2 loader extensions.
If the feature is available, drivers can obtain the original FD
by calling the getDisplayFD function in the relevant loader extension.
Drivers should check the FD is valid before use (i.e. not -1). If
the FD is valid, it may be equal to the current GPU FD if a different
GPU is not being used. The FD is owned by the platform, not the
driver, and the platform is responsible for closing it.
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.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(-)
diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index 888a117d56e..2fb440feb50 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -1146,7 +1146,7 @@ struct __DRIbufferRec {
};
#define __DRI_DRI2_LOADER "DRI_DRI2Loader"
-#define __DRI_DRI2_LOADER_VERSION 5
+#define __DRI_DRI2_LOADER_VERSION 6
enum dri_loader_cap {
/* Whether the loader handles RGBA channel ordering correctly. If not,
@@ -1227,6 +1227,17 @@ struct __DRIdri2LoaderExtensionRec {
* \since 5
*/
void (*destroyLoaderImageState)(void *loaderPrivate);
+
+ /**
+ * Get the display FD
+ *
+ * Get the FD of the display device.
+ *
+ * \param loaderPrivate The last parameter of createNewScreen or
+ * createNewScreen2.
+ * \since 6
+ */
+ int (*getDisplayFD)(void *loaderPrivate);
};
/**
@@ -2131,7 +2142,7 @@ struct __DRIimageList {
};
#define __DRI_IMAGE_LOADER "DRI_IMAGE_LOADER"
-#define __DRI_IMAGE_LOADER_VERSION 4
+#define __DRI_IMAGE_LOADER_VERSION 5
struct __DRIimageLoaderExtensionRec {
__DRIextension base;
@@ -2199,6 +2210,17 @@ struct __DRIimageLoaderExtensionRec {
* \since 4
*/
void (*destroyLoaderImageState)(void *loaderPrivate);
+
+ /**
+ * Get the display FD
+ *
+ * Get the FD of the display device.
+ *
+ * \param loaderPrivate The last parameter of createNewScreen or
+ * createNewScreen2.
+ * \since 5
+ */
+ int (*getDisplayFD)(void *loaderPrivate);
};
/**
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index c4a49cae592..1df53ef011c 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)
break;
}
+ switch (disp->Platform) {
+ case _EGL_PLATFORM_WAYLAND:
+ case _EGL_PLATFORM_X11:
+ if (dri2_dpy->fd_dpy >= 0 && dri2_dpy->fd_dpy != dri2_dpy->fd)
+ close(dri2_dpy->fd_dpy);
+ break;
+ default:
+ break;
+ }
+
if (dri2_dpy->fd >= 0)
close(dri2_dpy->fd);
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index 141df1b1732..af03caee623 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
const __DRIconfigOptionsExtension *configOptions;
const __DRImutableRenderBufferDriverExtension *mutable_render_buffer;
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
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -44,6 +44,7 @@
#include "loader.h"
#include "util/u_vector.h"
#include "util/anon_file.h"
+#include "util/os_file.h"
#include "eglglobals.h"
#include <wayland-egl-backend.h>
@@ -973,21 +974,32 @@ dri2_wl_get_capability(void *loaderPrivate, enum dri_loader_cap cap)
}
}
+static int
+dri2_wl_get_display_fd(void *loaderPrivate)
+{
+ _EGLDisplay *disp = loaderPrivate;
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+
+ return dri2_dpy->fd_dpy;
+}
+
static const __DRIdri2LoaderExtension dri2_loader_extension = {
- .base = { __DRI_DRI2_LOADER, 4 },
+ .base = { __DRI_DRI2_LOADER, 6 },
.getBuffers = dri2_wl_get_buffers,
.flushFrontBuffer = dri2_wl_flush_front_buffer,
.getBuffersWithFormat = dri2_wl_get_buffers_with_format,
.getCapability = dri2_wl_get_capability,
+ .getDisplayFD = dri2_wl_get_display_fd,
};
static const __DRIimageLoaderExtension image_loader_extension = {
- .base = { __DRI_IMAGE_LOADER, 2 },
+ .base = { __DRI_IMAGE_LOADER, 5 },
.getBuffers = image_get_buffers,
.flushFrontBuffer = dri2_wl_flush_front_buffer,
.getCapability = dri2_wl_get_capability,
+ .getDisplayFD = dri2_wl_get_display_fd,
};
static void
@@ -1640,12 +1652,14 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
{
_EGLDevice *dev;
struct dri2_egl_display *dri2_dpy;
+ int fd_old;
dri2_dpy = calloc(1, sizeof *dri2_dpy);
if (!dri2_dpy)
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);
@@ -1690,8 +1704,20 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
(roundtrip(dri2_dpy) < 0 || !dri2_dpy->authenticated))
goto cleanup;
+ fd_old = dri2_dpy->fd;
+ dri2_dpy->fd_dpy = os_dupfd_cloexec(dri2_dpy->fd);
dri2_dpy->fd = loader_get_user_preferred_fd(dri2_dpy->fd,
&dri2_dpy->is_different_gpu);
+ if (dri2_dpy->fd == fd_old) {
+ if (dri2_dpy->fd_dpy != -1)
+ close(dri2_dpy->fd_dpy);
+
+ dri2_dpy->fd_dpy = dri2_dpy->fd;
+ } else if (dri2_dpy->fd_dpy == -1) {
+ _eglError(EGL_NOT_INITIALIZED, "DRI2: failed to dup display FD");
+ goto cleanup;
+ }
+
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)
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);
diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c
index 5ffdf132184..5cf3ce2a369 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)
return _eglError(EGL_BAD_ALLOC, "eglInitialize");
dri2_dpy->fd = -1;
+ dri2_dpy->fd_dpy = -1;
if (!dri2_get_xcb_connection(disp, dri2_dpy))
goto cleanup;
@@ -1364,6 +1365,7 @@ dri2_initialize_x11_dri3(_EGLDisplay *disp)
return _eglError(EGL_BAD_ALLOC, "eglInitialize");
dri2_dpy->fd = -1;
+ dri2_dpy->fd_dpy = -1;
if (!dri2_get_xcb_connection(disp, dri2_dpy))
goto cleanup;
@@ -1472,6 +1474,7 @@ dri2_initialize_x11_dri2(_EGLDisplay *disp)
return _eglError(EGL_BAD_ALLOC, "eglInitialize");
dri2_dpy->fd = -1;
+ dri2_dpy->fd_dpy = -1;
if (!dri2_get_xcb_connection(disp, dri2_dpy))
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
--- a/src/egl/drivers/dri2/platform_x11_dri3.c
+++ b/src/egl/drivers/dri2/platform_x11_dri3.c
@@ -32,6 +32,7 @@
#include <xf86drm.h>
#include "util/macros.h"
+#include "util/os_file.h"
#include "egl_dri2.h"
#include "platform_x11_dri3.h"
@@ -414,11 +415,21 @@ dri3_flush_front_buffer(__DRIdrawable *driDrawable, void *loaderPrivate)
_eglLog(_EGL_WARNING, "FIXME: egl/x11 doesn't support front buffer rendering.");
}
+static int
+dri3_get_display_fd(void *loaderPrivate)
+{
+ _EGLDisplay *disp = loaderPrivate;
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+
+ return dri2_dpy->fd_dpy;
+}
+
const __DRIimageLoaderExtension dri3_image_loader_extension = {
- .base = { __DRI_IMAGE_LOADER, 1 },
+ .base = { __DRI_IMAGE_LOADER, 5 },
.getBuffers = loader_dri3_get_buffers,
.flushFrontBuffer = dri3_flush_front_buffer,
+ .getDisplayFD = dri3_get_display_fd,
};
static EGLBoolean
@@ -537,6 +548,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;
+ int fd_old;
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)
return EGL_FALSE;
}
+ fd_old = dri2_dpy->fd;
+ dri2_dpy->fd_dpy = os_dupfd_cloexec(dri2_dpy->fd);
dri2_dpy->fd = loader_get_user_preferred_fd(dri2_dpy->fd, &dri2_dpy->is_different_gpu);
+ if (dri2_dpy->fd == fd_old) {
+ if (dri2_dpy->fd_dpy != -1)
+ close(dri2_dpy->fd_dpy);
+
+ dri2_dpy->fd_dpy = dri2_dpy->fd;
+ } else if (dri2_dpy->fd_dpy == -1) {
+ _eglLog(_EGL_WARNING, "DRI3: failed to dup display FD");
+ close(dri2_dpy->fd);
+ return EGL_FALSE;
+ }
dri2_dpy->driver_name = loader_get_driver_for_fd(dri2_dpy->fd);
if (!dri2_dpy->driver_name) {
_eglLog(_EGL_WARNING, "DRI3: No driver found");
close(dri2_dpy->fd);
+ close(dri2_dpy->fd_dpy);
return EGL_FALSE;
}
diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
index db1b079663f..1ed6b60ffe8 100644
--- a/src/glx/dri3_glx.c
+++ b/src/glx/dri3_glx.c
@@ -77,6 +77,7 @@
#include "dri3_priv.h"
#include "loader.h"
#include "dri2.h"
+#include "util/os_file.h"
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)
loader_dri3_swapbuffer_barrier(draw);
}
+static int
+dri3_get_display_fd(void *loaderPrivate)
+{
+ struct dri3_screen *psc = (struct dri3_screen *)loaderPrivate;
+
+ return psc->fd_dpy;
+}
+
static void
dri_set_background_context(void *loaderPrivate)
{
@@ -548,11 +557,12 @@ dri_is_thread_safe(void *loaderPrivate)
/* The image loader extension record for DRI3
*/
static const __DRIimageLoaderExtension imageLoaderExtension = {
- .base = { __DRI_IMAGE_LOADER, 3 },
+ .base = { __DRI_IMAGE_LOADER, 5 },
.getBuffers = loader_dri3_get_buffers,
.flushFrontBuffer = dri3_flush_front_buffer,
.flushSwapBuffers = dri3_flush_swap_buffers,
+ .getDisplayFD = dri3_get_display_fd,
};
const __DRIuseInvalidateExtension dri3UseInvalidate = {
@@ -618,6 +628,10 @@ dri3_destroy_screen(struct glx_screen *base)
loader_dri3_close_screen(psc->driScreen);
(*psc->core->destroyScreen) (psc->driScreen);
driDestroyConfigs(psc->driver_configs);
+
+ if (psc->fd_dpy != psc->fd)
+ close(psc->fd_dpy);
+
close(psc->fd);
free(psc);
}
@@ -842,8 +856,9 @@ dri3_create_screen(int screen, struct glx_display * priv)
struct dri3_screen *psc;
__GLXDRIscreen *psp;
struct glx_config *configs = NULL, *visuals = NULL;
- char *driverName, *driverNameDisplayGPU, *tmp;
+ char *driverName = NULL, *driverNameDisplayGPU, *tmp;
int i;
+ int fd_old;
psc = calloc(1, sizeof *psc);
if (psc == NULL)
@@ -851,6 +866,7 @@ dri3_create_screen(int screen, struct glx_display * priv)
psc->fd = -1;
psc->fd_display_gpu = -1;
+ psc->fd_dpy = -1;
if (!glx_screen_init(&psc->base, screen, priv)) {
free(psc);
@@ -871,12 +887,23 @@ dri3_create_screen(int screen, struct glx_display * priv)
return NULL;
}
+ fd_old = psc->fd;
+ psc->fd_dpy = os_dupfd_cloexec(psc->fd);
psc->fd_display_gpu = fcntl(psc->fd, F_DUPFD_CLOEXEC, 3);
psc->fd = loader_get_user_preferred_fd(psc->fd, &psc->is_different_gpu);
if (!psc->is_different_gpu) {
close(psc->fd_display_gpu);
psc->fd_display_gpu = -1;
}
+ if (psc->fd == fd_old) {
+ if (psc->fd_dpy != -1)
+ close(psc->fd_dpy);
+
+ psc->fd_dpy = psc->fd;
+ } else if (psc->fd_dpy == -1) {
+ ErrorMessageF("Unable to dup the display FD");
+ goto handle_error;
+ }
driverName = loader_get_driver_for_fd(psc->fd);
if (!driverName) {
@@ -1049,6 +1076,8 @@ handle_error:
if (psc->driScreenDisplayGPU)
psc->core->destroyScreen(psc->driScreenDisplayGPU);
psc->driScreenDisplayGPU = NULL;
+ if (psc->fd_dpy >= 0 && psc->fd_dpy != psc->fd)
+ close(psc->fd_dpy);
if (psc->fd >= 0)
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
--- a/src/glx/dri3_priv.h
+++ b/src/glx/dri3_priv.h
@@ -107,6 +107,7 @@ struct dri3_screen {
void *driver;
int fd;
+ int fd_dpy;
bool is_different_gpu;
/* fd for display GPU in case of prime */
--
2.25.1
@@ -0,0 +1,56 @@
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
@@ -0,0 +1,303 @@
From e57b9a1b34a733f88af51b1395eebe647006939d 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
modifiers
If the X Server supports DRM format modifiers, there is no need
for an additional linear buffer, as the client can allocate buffers
with attributes known to the Server.
---
src/egl/drivers/dri2/platform_x11_dri3.c | 7 +-
src/glx/dri3_glx.c | 137 +++++++++++++++--------
src/loader/loader_dri3_helper.c | 15 +++
src/loader/loader_dri3_helper.h | 4 +
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
--- 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,
struct dri3_egl_surface *dri3_surf;
const __DRIconfig *dri_config;
xcb_drawable_t drawable;
+ bool is_incompat_gpu;
dri3_surf = calloc(1, sizeof *dri3_surf);
if (!dri3_surf) {
@@ -150,6 +151,10 @@ dri3_create_surface(_EGLDisplay *disp, EGLint type, _EGLConfig *conf,
return NULL;
}
+ is_incompat_gpu = dri2_dpy->is_different_gpu &&
+ !loader_dri3_has_modifiers(dri2_dpy->multibuffers_available,
+ dri2_dpy->image);
+
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,
if (loader_dri3_drawable_init(dri2_dpy->conn, drawable,
dri2_dpy->dri_screen,
- dri2_dpy->is_different_gpu,
+ is_incompat_gpu,
dri2_dpy->multibuffers_available,
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
--- a/src/glx/dri3_glx.c
+++ b/src/glx/dri3_glx.c
@@ -354,6 +354,21 @@ dri3_destroy_drawable(__GLXDRIdrawable *base)
free(pdraw);
}
+static bool
+dri3_has_multibuffer(const __DRIimageExtension *image,
+ const struct dri3_display *pdp)
+{
+#ifdef HAVE_DRI3_MODIFIERS
+ return (image && image->base.version >= 15) &&
+ (pdp->dri3Major > 1 ||
+ (pdp->dri3Major == 1 && pdp->dri3Minor >= 2)) &&
+ (pdp->presentMajor > 1 ||
+ (pdp->presentMajor == 1 && pdp->presentMinor >= 2));
+#else
+ return false;
+#endif
+}
+
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,
struct dri3_drawable *pdraw;
struct dri3_screen *psc = (struct dri3_screen *) base;
__GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base;
- bool has_multibuffer = false;
-#ifdef HAVE_DRI3_MODIFIERS
const struct dri3_display *const pdp = (struct dri3_display *)
base->display->dri3Display;
-#endif
+ bool has_multibuffer = dri3_has_multibuffer(psc->image, pdp);
pdraw = calloc(1, sizeof(*pdraw));
if (!pdraw)
@@ -376,14 +389,6 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable,
pdraw->base.drawable = drawable;
pdraw->base.psc = &psc->base;
-#ifdef HAVE_DRI3_MODIFIERS
- if ((psc->image && psc->image->base.version >= 15) &&
- (pdp->dri3Major > 1 || (pdp->dri3Major == 1 && pdp->dri3Minor >= 2)) &&
- (pdp->presentMajor > 1 ||
- (pdp->presentMajor == 1 && pdp->presentMinor >= 2)))
- has_multibuffer = true;
-#endif
-
(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 = {
.interop_export_object = dri3_interop_export_object
};
-/** dri3_bind_extensions
+/** dri3_bind_extensions_part1
*
- * Enable all of the extensions supported on DRI3
+ * Enable the extensions supported on DRI3 that don't depend on
+ * whether we are using a different GPU.
*/
static void
-dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv,
- const char *driverName)
+dri3_bind_extensions_part1(struct dri3_screen *psc, struct glx_display * priv,
+ const char *driverName)
{
const __DRIextension **extensions;
unsigned mask;
@@ -774,16 +780,6 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv,
}
for (i = 0; extensions[i]; i++) {
- /* when on a different gpu than the server, the server pixmaps
- * can have a tiling mode we can't read. Thus we can't create
- * a texture from them.
- */
- if (!psc->is_different_gpu &&
- (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) {
- psc->texBuffer = (__DRItexBufferExtension *) extensions[i];
- __glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap");
- }
-
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,
}
}
+/** dri3_bind_extensions_part2
+ *
+ * Enable the extensions supported on DRI3 that depend on whether we
+ * are using a different GPU.
+ */
+static void
+dri3_bind_extensions_part2(struct dri3_screen *psc, struct glx_display * priv,
+ const char *driverName)
+{
+ const __DRIextension **extensions;
+ int i;
+
+ extensions = psc->core->getExtensions(psc->driScreen);
+
+ for (i = 0; extensions[i]; i++) {
+ /* when on a different gpu than the server, the server pixmaps
+ * can have a tiling mode we can't read. Thus we can't create
+ * a texture from them.
+ */
+ if (!psc->is_different_gpu &&
+ (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) {
+ psc->texBuffer = (__DRItexBufferExtension *) extensions[i];
+ __glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap");
+ }
+ }
+}
+
static char *
dri3_get_driver_name(struct glx_screen *glx_screen)
{
@@ -859,6 +882,8 @@ dri3_create_screen(int screen, struct glx_display * priv)
char *driverName = NULL, *driverNameDisplayGPU, *tmp;
int i;
int fd_old;
+ bool is_different_gpu;
+ bool have_modifiers;
psc = calloc(1, sizeof *psc);
if (psc == NULL)
@@ -890,8 +915,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);
- psc->fd = loader_get_user_preferred_fd(psc->fd, &psc->is_different_gpu);
- if (!psc->is_different_gpu) {
+ psc->fd = loader_get_user_preferred_fd(psc->fd, &is_different_gpu);
+ if (!is_different_gpu) {
close(psc->fd_display_gpu);
psc->fd_display_gpu = -1;
}
@@ -933,27 +958,6 @@ dri3_create_screen(int screen, struct glx_display * priv)
goto handle_error;
}
- if (psc->is_different_gpu) {
- driverNameDisplayGPU = loader_get_driver_for_fd(psc->fd_display_gpu);
- if (driverNameDisplayGPU) {
-
- /* check if driver name is matching so that non mesa drivers
- * will not crash. Also need this check since image extension
- * pointer from render gpu is shared with display gpu. Image
- * extension pointer is shared because it keeps things simple.
- */
- if (strcmp(driverName, driverNameDisplayGPU) == 0) {
- psc->driScreenDisplayGPU =
- psc->image_driver->createNewScreen2(screen, psc->fd_display_gpu,
- pdp->loader_extensions,
- extensions,
- &driver_configs, psc);
- }
-
- free(driverNameDisplayGPU);
- }
- }
-
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)
goto handle_error;
}
- dri3_bind_extensions(psc, priv, driverName);
+ dri3_bind_extensions_part1(psc, priv, driverName);
+
+ have_modifiers = loader_dri3_has_modifiers(dri3_has_multibuffer(psc->image,
+ pdp),
+ psc->image);
+
+ if (is_different_gpu) {
+ if (have_modifiers) {
+ close(psc->fd_display_gpu);
+ psc->fd_display_gpu = -1;
+ } else {
+ driverNameDisplayGPU = loader_get_driver_for_fd(psc->fd_display_gpu);
+ if (driverNameDisplayGPU) {
+
+ /* check if driver name is matching so that non mesa drivers
+ * will not crash. Also need this check since image extension
+ * pointer from render gpu is shared with display gpu. Image
+ * extension pointer is shared because it keeps things simple.
+ */
+ if (strcmp(driverName, driverNameDisplayGPU) == 0) {
+ psc->driScreenDisplayGPU =
+ psc->image_driver->createNewScreen2(screen,
+ psc->fd_display_gpu,
+ pdp->loader_extensions,
+ extensions,
+ &driver_configs, psc);
+ }
+
+ free(driverNameDisplayGPU);
+ }
+ }
+ }
+
+ psc->is_different_gpu = is_different_gpu && !have_modifiers;
+
+ dri3_bind_extensions_part2(psc, priv, driverName);
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
--- 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)
return back;
}
+
+bool
+loader_dri3_has_modifiers(bool multiplanes_available,
+ const __DRIimageExtension *image)
+{
+#ifdef HAVE_DRI3_MODIFIERS
+ return multiplanes_available && image &&
+ image->base.version >= 15 &&
+ image->queryDmaBufModifiers &&
+ image->createImageWithModifiers &&
+ image->createImageFromDmaBufs2;
+#else
+ return false;
+#endif
+}
diff --git a/src/loader/loader_dri3_helper.h b/src/loader/loader_dri3_helper.h
index 028e25dc070..5790f5444f5 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);
void
loader_dri3_close_screen(__DRIscreen *dri_screen);
+
+bool
+loader_dri3_has_modifiers(bool multiplanes_available,
+ const __DRIimageExtension *image);
#endif
--
2.25.1
@@ -0,0 +1,267 @@
From 8de0535741ce8d126da4d9b0b0eb8c46dd4810b5 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
Add support for selecting the GPU to be used for rendering using
the DRI_PRIME environment variable. If a different GPU is selected,
a duplicate of the file descriptor for the original GPU/display is
preserved, which can be obtained by calling the getDisplayFD
function in the image loader extension.
For server side Wayland, the ability to support PRIME is
determined by checking for the PRIME import and export
capabilities on the driver file descriptor, which may no
longer support them if a different GPU from the default has
been selected. It may be that the driver can still support
PRIME; for example, by making use of the original (default)
file descriptor. The driver can indicate it supports PRIME
via the getCapabilities function in the DRI Image extension.
---
include/GL/internal/dri_interface.h | 2 ++
src/egl/drivers/dri2/egl_dri2.c | 10 ++++++++
src/egl/drivers/dri2/platform_drm.c | 19 ++++++++++-----
src/gbm/backends/dri/gbm_dri.c | 38 +++++++++++++++++++++++++----
src/gbm/backends/dri/gbm_driint.h | 8 ++++++
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
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -1548,6 +1548,8 @@ enum __DRIChromaSiting {
*/
/*@{*/
#define __DRI_IMAGE_CAP_GLOBAL_NAMES 1
+#define __DRI_IMAGE_CAP_PRIME_IMPORT 0x2000
+#define __DRI_IMAGE_CAP_PRIME_EXPORT 0x4000
/*@}*/
/**
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 1df53ef011c..ec4ac602a84 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)
}
switch (disp->Platform) {
+ case _EGL_PLATFORM_DRM:
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)
dri2_dpy->image->base.version >= 7 &&
dri2_dpy->image->createImageFromFds != NULL)
flags |= WAYLAND_DRM_PRIME;
+ else if (dri2_dpy->image->base.version >= 10 &&
+ dri2_dpy->image->getCapabilities != NULL) {
+ int capabilities;
+
+ capabilities = dri2_dpy->image->getCapabilities(dri2_dpy->dri_screen);
+ if ((capabilities & __DRI_IMAGE_CAP_PRIME_IMPORT) != 0 &&
+ (capabilities & __DRI_IMAGE_CAP_PRIME_EXPORT) != 0)
+ flags |= WAYLAND_DRM_PRIME;
+ }
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
--- 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)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
- return drmAuthMagic(dri2_dpy->fd, id);
+ return drmAuthMagic(dri2_dpy->fd_dpy, id);
}
static void
@@ -782,6 +782,7 @@ dri2_initialize_drm(_EGLDisplay *disp)
return _eglError(EGL_BAD_ALLOC, "eglInitialize");
dri2_dpy->fd = -1;
+ dri2_dpy->fd_dpy = -1;
disp->DriverData = (void *) dri2_dpy;
gbm = disp->PlatformDisplay;
@@ -789,16 +790,16 @@ dri2_initialize_drm(_EGLDisplay *disp)
char buf[64];
int n = snprintf(buf, sizeof(buf), DRM_DEV_NAME, DRM_DIR_NAME, 0);
if (n != -1 && n < sizeof(buf))
- dri2_dpy->fd = loader_open_device(buf);
- gbm = gbm_create_device(dri2_dpy->fd);
+ dri2_dpy->fd_dpy = loader_open_device(buf);
+ gbm = gbm_create_device(dri2_dpy->fd_dpy);
if (gbm == NULL) {
err = "DRI2: failed to create gbm device";
goto cleanup;
}
dri2_dpy->own_device = true;
} else {
- dri2_dpy->fd = os_dupfd_cloexec(gbm_device_get_fd(gbm));
- if (dri2_dpy->fd < 0) {
+ dri2_dpy->fd_dpy = os_dupfd_cloexec(gbm_device_get_fd(gbm));
+ if (dri2_dpy->fd_dpy < 0) {
err = "DRI2: failed to fcntl() existing gbm device";
goto cleanup;
}
@@ -810,6 +811,12 @@ dri2_initialize_drm(_EGLDisplay *disp)
goto cleanup;
}
+ if (gbm_dri_device_get_fd(dri2_dpy->gbm_dri) ==
+ gbm_device_get_fd(gbm))
+ dri2_dpy->fd = dri2_dpy->fd_dpy;
+ else
+ dri2_dpy->fd = os_dupfd_cloexec(gbm_dri_device_get_fd(dri2_dpy->gbm_dri));
+
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)
disp->Extensions.EXT_buffer_age = EGL_TRUE;
#ifdef HAVE_WAYLAND_PLATFORM
- dri2_dpy->device_name = loader_get_device_name_for_fd(dri2_dpy->fd);
+ dri2_dpy->device_name = loader_get_device_name_for_fd(dri2_dpy->fd_dpy);
#endif
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
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -51,6 +51,7 @@
#include "loader.h"
#include "util/debug.h"
#include "util/macros.h"
+#include "util/os_file.h"
/* For importing wl_buffer */
#if HAVE_WAYLAND_PLATFORM
@@ -141,6 +142,14 @@ image_get_buffers(__DRIdrawable *driDrawable,
surf->dri_private, buffer_mask, buffers);
}
+static int
+dri_get_display_fd(void *loaderPrivate)
+{
+ struct gbm_dri_device *dri = loaderPrivate;
+
+ return dri->base.v0.fd;
+}
+
static void
swrast_get_drawable_info(__DRIdrawable *driDrawable,
int *x,
@@ -220,20 +229,22 @@ static const __DRIimageLookupExtension image_lookup_extension = {
};
static const __DRIdri2LoaderExtension dri2_loader_extension = {
- .base = { __DRI_DRI2_LOADER, 4 },
+ .base = { __DRI_DRI2_LOADER, 6 },
.getBuffers = dri_get_buffers,
.flushFrontBuffer = dri_flush_front_buffer,
.getBuffersWithFormat = dri_get_buffers_with_format,
.getCapability = dri_get_capability,
+ .getDisplayFD = dri_get_display_fd,
};
static const __DRIimageLoaderExtension image_loader_extension = {
- .base = { __DRI_IMAGE_LOADER, 2 },
+ .base = { __DRI_IMAGE_LOADER, 5 },
.getBuffers = image_get_buffers,
.flushFrontBuffer = dri_flush_front_buffer,
.getCapability = dri_get_capability,
+ .getDisplayFD = dri_get_display_fd,
};
static const __DRIswrastLoaderExtension swrast_loader_extension = {
@@ -398,12 +409,12 @@ dri_screen_create_dri2(struct gbm_dri_device *dri, char *driver_name)
return -1;
if (dri->dri2->base.version >= 4) {
- dri->screen = dri->dri2->createNewScreen2(0, dri->base.v0.fd,
+ dri->screen = dri->dri2->createNewScreen2(0, dri->fd,
dri->loader_extensions,
dri->driver_extensions,
&dri->driver_configs, dri);
} else {
- dri->screen = dri->dri2->createNewScreen(0, dri->base.v0.fd,
+ dri->screen = dri->dri2->createNewScreen(0, dri->fd,
dri->loader_extensions,
&dri->driver_configs, dri);
}
@@ -470,8 +481,20 @@ static int
dri_screen_create(struct gbm_dri_device *dri)
{
char *driver_name;
+ int dup_fd, new_fd;
+ bool is_different_gpu;
- driver_name = loader_get_driver_for_fd(dri->base.v0.fd);
+ dup_fd = os_dupfd_cloexec(dri->fd);
+ if (dup_fd < 0)
+ return -1;
+
+ new_fd = loader_get_user_preferred_fd(dup_fd, &is_different_gpu);
+ if (new_fd == dup_fd)
+ close(new_fd);
+ else
+ dri->fd = new_fd;
+
+ driver_name = loader_get_driver_for_fd(dri->fd);
if (!driver_name)
return -1;
@@ -1424,6 +1447,9 @@ dri_destroy(struct gbm_device *gbm)
dlclose(dri->driver);
free(dri->driver_name);
+ if (dri->fd >= 0 && dri->fd != dri->base.v0.fd)
+ close (dri->fd);
+
free(dri);
}
@@ -1445,6 +1471,8 @@ dri_device_create(int fd, uint32_t gbm_backend_version)
if (!dri)
return NULL;
+ dri->fd = fd;
+
dri->base.v0.fd = fd;
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
--- a/src/gbm/backends/dri/gbm_driint.h
+++ b/src/gbm/backends/dri/gbm_driint.h
@@ -61,6 +61,8 @@ struct gbm_dri_visual {
struct gbm_dri_device {
struct gbm_device base;
+ int fd;
+
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)
bo->map = NULL;
}
+static inline int
+gbm_dri_device_get_fd(struct gbm_dri_device *dri)
+{
+ return dri->fd;
+}
+
#endif
--
2.25.1
@@ -0,0 +1,304 @@
From f1f625dbcb4e0cc062369729b1da3d7fc65969e8 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
Add support for selecting the GPU to be used for rendering using
the DRI_PRIME environment variable. If a different GPU is selected,
a duplicate of the file descriptor for the original GPU/display is
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.
---
src/egl/drivers/dri2/egl_dri2.c | 1 +
src/egl/drivers/dri2/platform_null.c | 133 +++++++++++++++++++--------
2 files changed, 98 insertions(+), 36 deletions(-)
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index ec4ac602a84..56b5175db6e 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)
switch (disp->Platform) {
case _EGL_PLATFORM_DRM:
+ case _EGL_PLATFORM_NULL:
case _EGL_PLATFORM_WAYLAND:
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
--- a/src/egl/drivers/dri2/platform_null.c
+++ b/src/egl/drivers/dri2/platform_null.c
@@ -44,6 +44,7 @@
#include "egl_dri2.h"
#include "loader.h"
+#include "util/os_file.h"
#define NULL_CARD_MINOR_MAX 63U
@@ -953,7 +954,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.
*/
- err = display_get_vblank_sequence(dri2_dpy->fd, current_vblank_out);
+ err = display_get_vblank_sequence(dri2_dpy->fd_dpy, current_vblank_out);
if (err)
return err;
@@ -1003,7 +1004,7 @@ swap_vblank_state_transition(struct dri2_egl_surface *dri2_surf,
uint32_t flags = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
int err;
- err = display_request_vblank(dri2_dpy->fd, target_frame,
+ err = display_request_vblank(dri2_dpy->fd_dpy, target_frame,
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)
flags |= DRM_MODE_PAGE_FLIP_ASYNC;
}
- err = display_output_flip(dri2_dpy->fd, &dri2_dpy->output,
+ err = display_output_flip(dri2_dpy->fd_dpy, &dri2_dpy->output,
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)
int err;
/* dri2_surf->swap_state is being set inside the handler */
- err = drm_event_process(dri2_dpy->fd);
+ err = drm_event_process(dri2_dpy->fd_dpy);
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,
handles[i] = (uint32_t) handle;
}
- return !drmModeAddFB2WithModifiers(dri2_dpy->fd, width, height,
+ return !drmModeAddFB2WithModifiers(dri2_dpy->fd_dpy, width, height,
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,
goto err_destroy_surface;
}
- err = display_output_modeset(dri2_dpy->fd, &dri2_dpy->output,
+ err = display_output_modeset(dri2_dpy->fd_dpy, &dri2_dpy->output,
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)
dri2_dpy->image->destroyImage(dri2_surf->front_buffer.dri_image);
if (dri2_surf->front_buffer.fb_id)
- drmModeRmFB(dri2_dpy->fd, dri2_surf->front_buffer.fb_id);
+ drmModeRmFB(dri2_dpy->fd_dpy, dri2_surf->front_buffer.fb_id);
for (unsigned i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
if (dri2_surf->color_buffers[i].fb_id)
- drmModeRmFB(dri2_dpy->fd, dri2_surf->color_buffers[i].fb_id);
+ drmModeRmFB(dri2_dpy->fd_dpy, dri2_surf->color_buffers[i].fb_id);
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)
(void) loaderPrivate;
}
+static int
+dri2_null_get_display_fd(void *loaderPrivate)
+{
+ _EGLDisplay *disp = loaderPrivate;
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+
+ return dri2_dpy->fd_dpy;
+}
+
static const __DRIimageLoaderExtension image_loader_extension = {
- .base = { __DRI_IMAGE_LOADER, 2 },
+ .base = { __DRI_IMAGE_LOADER, 5 },
.getBuffers = dri2_null_image_get_buffers,
.flushFrontBuffer = dri2_null_flush_front_buffer,
.getCapability = dri2_null_get_capability,
+ .getDisplayFD = dri2_null_get_display_fd,
};
static const __DRIextension *image_loader_extensions[] = {
@@ -1768,12 +1779,74 @@ dri2_null_device_is_kms(int fd)
return is_kms;
}
+static bool
+dri2_null_try_device(_EGLDisplay *disp)
+{
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+
+ if (!dri2_null_device_is_kms(dri2_dpy->fd_dpy))
+ return false;
+
+#if 1
+ /* Skip devices not supported by the pvr driver */
+ {
+ char *driver_name = loader_get_driver_for_fd(dri2_dpy->fd_dpy);
+ bool skip = !driver_name || !!strcmp(driver_name, "pvr");
+
+ free(driver_name);
+
+ if (skip)
+ return false;
+ }
+#endif
+
+ dri2_dpy->fd = os_dupfd_cloexec(dri2_dpy->fd_dpy);
+ if (dri2_dpy->fd < 0) {
+ _eglLog(_EGL_WARNING, "DRI2: failed to dup display FD");
+ dri2_dpy->fd = dri2_dpy->fd_dpy;
+ } else {
+ int fd_old;
+ bool is_different_gpu;
+
+ fd_old = dri2_dpy->fd;
+ dri2_dpy->fd = loader_get_user_preferred_fd(dri2_dpy->fd,
+ &is_different_gpu);
+ if (dri2_dpy->fd == fd_old) {
+ close (dri2_dpy->fd);
+ dri2_dpy->fd = dri2_dpy->fd_dpy;
+ }
+ }
+
+ dri2_dpy->driver_name = loader_get_driver_for_fd(dri2_dpy->fd);
+ if (!dri2_dpy->driver_name)
+ return false;
+
+ if (dri2_load_driver_dri3(disp)) {
+ _EGLDevice *dev = _eglAddDevice(dri2_dpy->fd, false);
+ if (!dev) {
+ dlclose(dri2_dpy->driver);
+ _eglLog(_EGL_WARNING, "DRI2: failed to find EGLDevice");
+ } else {
+ dri2_dpy->loader_extensions = image_loader_extensions;
+ dri2_dpy->own_device = 1;
+ disp->Device = dev;
+ return true;
+ }
+ }
+
+ free(dri2_dpy->driver_name);
+ dri2_dpy->driver_name = NULL;
+
+ return false;
+}
+
static bool
dri2_null_probe_device(_EGLDisplay *disp)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
dri2_dpy->fd = -1;
+ dri2_dpy->fd_dpy = -1;
for (unsigned i = 0; i <= NULL_CARD_MINOR_MAX; i++) {
char *card_path;
@@ -1781,32 +1854,20 @@ dri2_null_probe_device(_EGLDisplay *disp)
if (asprintf(&card_path, DRM_DEV_NAME, DRM_DIR_NAME, i) < 0)
continue;
- dri2_dpy->fd = loader_open_device(card_path);
+ dri2_dpy->fd_dpy = loader_open_device(card_path);
free(card_path);
- if (dri2_dpy->fd < 0)
+ if (dri2_dpy->fd_dpy < 0)
continue;
- if (dri2_null_device_is_kms(dri2_dpy->fd)) {
- dri2_dpy->driver_name = loader_get_driver_for_fd(dri2_dpy->fd);
- if (dri2_dpy->driver_name) {
- if (dri2_load_driver_dri3(disp)) {
- _EGLDevice *dev = _eglAddDevice(dri2_dpy->fd, false);
- if (!dev) {
- dlclose(dri2_dpy->driver);
- _eglLog(_EGL_WARNING, "DRI2: failed to find EGLDevice");
- } else {
- dri2_dpy->loader_extensions = image_loader_extensions;
- dri2_dpy->own_device = 1;
- disp->Device = dev;
- return true;
- }
- }
- free(dri2_dpy->driver_name);
- dri2_dpy->driver_name = NULL;
- }
- }
+ if (dri2_null_try_device(disp))
+ return true;
+
+ close(dri2_dpy->fd_dpy);
+
+ if (dri2_dpy->fd >= 0 && dri2_dpy->fd != dri2_dpy->fd_dpy)
+ close(dri2_dpy->fd);
- close(dri2_dpy->fd);
+ dri2_dpy->fd_dpy = -1;
dri2_dpy->fd = -1;
}
@@ -1867,7 +1928,7 @@ 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);
+ err = drmGetCap(dri2_dpy->fd_dpy, DRM_CAP_ASYNC_PAGE_FLIP, &value);
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)
* modesetting if not. If this succeeds then universal planes will also have
* been enabled.
*/
- err = drmSetClientCap(dri2_dpy->fd, DRM_CLIENT_CAP_ATOMIC, 1);
+ err = drmSetClientCap(dri2_dpy->fd_dpy, DRM_CLIENT_CAP_ATOMIC, 1);
dri2_dpy->atomic_enabled = !err;
if (!dri2_dpy->atomic_enabled) {
@@ -1922,7 +1983,7 @@ dri2_initialize_null(_EGLDisplay *disp)
* Enable universal planes so that we can get the pixel formats for the
* primary plane
*/
- err = drmSetClientCap(dri2_dpy->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
+ err = drmSetClientCap(dri2_dpy->fd_dpy, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
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;
- 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);
if (dri2_dpy->output.mode_blob_id)
- drmModeDestroyPropertyBlob(dri2_dpy->fd, dri2_dpy->output.mode_blob_id);
+ drmModeDestroyPropertyBlob(dri2_dpy->fd_dpy, dri2_dpy->output.mode_blob_id);
if (dri2_dpy->output.plane_prop_res) {
for (unsigned i = 0; dri2_dpy->output.plane_prop_res[i]; i++)
--
2.25.1
@@ -0,0 +1,120 @@
From 693fff6d87abfcae887afde7f80f402b7ff5c0ab 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
Introduce the NULL_DRM_DISPLAY environment variable, which allows
a particular DRM display to be selected, rather than the first
suitable DRM device found.
To select a particular display, NULL_DRM_DISPLAY should be set to
the card number (i.e. minor number) of the DRM device representing
the display. For example, NULL_DRM_DISPLAY=2 will select
/dev/dri/card2.
---
src/egl/drivers/dri2/platform_null.c | 65 ++++++++++++++++++++--------
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
--- 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)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ dri2_dpy->fd = -1;
+
if (!dri2_null_device_is_kms(dri2_dpy->fd_dpy))
return false;
@@ -1841,34 +1843,56 @@ dri2_null_try_device(_EGLDisplay *disp)
}
static bool
-dri2_null_probe_device(_EGLDisplay *disp)
+dri2_null_probe_device(_EGLDisplay *disp, unsigned minor)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ char *card_path;
- dri2_dpy->fd = -1;
- dri2_dpy->fd_dpy = -1;
+ if (asprintf(&card_path, DRM_DEV_NAME, DRM_DIR_NAME, minor) < 0)
+ goto cleanup;
- for (unsigned i = 0; i <= NULL_CARD_MINOR_MAX; i++) {
- char *card_path;
+ dri2_dpy->fd_dpy = loader_open_device(card_path);
+ free(card_path);
+ if (dri2_dpy->fd_dpy < 0)
+ goto cleanup;
- if (asprintf(&card_path, DRM_DEV_NAME, DRM_DIR_NAME, i) < 0)
- continue;
+ if (dri2_null_try_device(disp))
+ return true;
- dri2_dpy->fd_dpy = loader_open_device(card_path);
- free(card_path);
- if (dri2_dpy->fd_dpy < 0)
- continue;
+ close(dri2_dpy->fd_dpy);
- if (dri2_null_try_device(disp))
- return true;
+ if (dri2_dpy->fd >= 0 && dri2_dpy->fd != dri2_dpy->fd_dpy)
+ close(dri2_dpy->fd);
- close(dri2_dpy->fd_dpy);
+cleanup:
+ dri2_dpy->fd_dpy = -1;
+ dri2_dpy->fd = -1;
- if (dri2_dpy->fd >= 0 && dri2_dpy->fd != dri2_dpy->fd_dpy)
- close(dri2_dpy->fd);
+ return false;
+}
+
+static bool
+dri2_null_probe_devices(_EGLDisplay *disp)
+{
+ const char *null_drm_display = getenv("NULL_DRM_DISPLAY");
+
+ if (null_drm_display) {
+ char *endptr;
+ long val = strtol(null_drm_display, &endptr, 10);
- dri2_dpy->fd_dpy = -1;
- dri2_dpy->fd = -1;
+ if (endptr != null_drm_display && !*endptr &&
+ val >= 0 && val <= NULL_CARD_MINOR_MAX) {
+ if (dri2_null_probe_device(disp, (unsigned)val))
+ return true;
+ } else {
+ _eglLog(_EGL_FATAL, "NULL_DRM_DISPLAY is invalid: %s",
+ null_drm_display);
+ }
+ } else {
+ for (unsigned i = 0; i <= NULL_CARD_MINOR_MAX; i++) {
+ if (dri2_null_probe_device(disp, i))
+ return true;
+ }
}
return false;
@@ -1965,7 +1989,10 @@ dri2_initialize_null(_EGLDisplay *disp)
disp->DriverData = (void *) dri2_dpy;
- if (!dri2_null_probe_device(disp)) {
+ dri2_dpy->fd_dpy = -1;
+ dri2_dpy->fd = -1;
+
+ if (!dri2_null_probe_devices(disp)) {
_eglError(EGL_NOT_INITIALIZED, "failed to load driver");
goto cleanup;
}
--
2.25.1
@@ -0,0 +1,37 @@
From a422756b7d73b48d3d10d15066a61e9332370719 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
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(-)
diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
index 9dce78eddeb..9eb624df640 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,
ver_cookie = xcb_present_query_version(conn, 1, 2);
ver_reply = xcb_present_query_version_reply(conn, ver_cookie, NULL);
- has_present_v1_2 =
+ has_present_v1_2 = ver_reply != NULL &&
(ver_reply->major_version > 1 || ver_reply->minor_version >= 2);
free(ver_reply);
}
--
2.25.1
@@ -0,0 +1,143 @@
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
@@ -0,0 +1,419 @@
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
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,76 @@
From 83953c9325e4cc9adb23ad7654a02ddabdd3fd99 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
The VK_EXT_pci_bus_info related code has been wrapped in
VULKAN_WSI_USE_PCI_BUS_INFO, effectively disabling it.
Not all platforms support the VK_EXT_pci_bus_info extension.
A better fix might be to pass another parameter to wsi_device_init,
to indicate that the device is a PCI one.
---
src/vulkan/wsi/wsi_common.c | 4 ++++
src/vulkan/wsi/wsi_common.h | 2 ++
src/vulkan/wsi/wsi_common_drm.c | 4 ++++
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
--- 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,
WSI_GET_CB(GetPhysicalDeviceQueueFamilyProperties);
#undef WSI_GET_CB
+#if defined(VULKAN_WSI_USE_PCI_BUS_INFO)
wsi->pci_bus_info.sType =
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT;
+#endif
VkPhysicalDeviceProperties2 pdp2 = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
+#if defined(VULKAN_WSI_USE_PCI_BUS_INFO)
.pNext = &wsi->pci_bus_info,
+#endif
};
GetPhysicalDeviceProperties2(pdevice, &pdp2);
diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
index c2563c677e6..4a733665d2c 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -112,7 +112,9 @@ struct wsi_device {
VkPhysicalDeviceMemoryProperties memory_props;
uint32_t queue_family_count;
+#if defined(VULKAN_WSI_USE_PCI_BUS_INFO)
VkPhysicalDevicePCIBusInfoPropertiesEXT pci_bus_info;
+#endif
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
--- 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)
if (ret)
return false;
+#if defined(VULKAN_WSI_USE_PCI_BUS_INFO)
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)
default:
break;
}
+#else
+ const bool match = true;
+#endif
drmFreeDevice(&fd_device);
--
2.25.1
@@ -0,0 +1,34 @@
From 10a0d4ec4f9d468c792f5e675d924fa7a8f97373 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
If VULKAN_WSI_BGRA8_SNORM_FIRST is not defined, default to
force_bgra8_unorm_first true.
This brings Mesa WSI into line with IMG WSI with regards to the
VK_FORMAT_B8G8R8A8_UNORM and VK_FORMAT_B8G8R8A8_SRGB formats.
With this change, the IMG Vulkan unit test, vkbonjour, will default
to VK_FORMAT_B8G8R8A8_UNORM rather than VK_FORMAT_B8G8R8A8_SRGB.
---
src/vulkan/wsi/wsi_common.c | 4 ++++
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
--- 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,
driQueryOptionb(dri_options, "vk_wsi_force_bgra8_unorm_first");
}
}
+#if !defined(VULKAN_WSI_BGRA8_SNORM_FIRST)
+ else
+ wsi->force_bgra8_unorm_first = true;
+#endif
return VK_SUCCESS;
#if defined(VK_USE_PLATFORM_XCB_KHR) || \
--
2.25.1
@@ -0,0 +1,64 @@
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,0 +1,27 @@
From c2b91fcb7c88bfec23077ae31c0035684249ea1b 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
Add VK_FORMAT_R5G6B5_UNORM_PACK16.
This is for compatibility with IMG WSI.
---
src/vulkan/wsi/wsi_common_display.c | 1 +
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
--- a/src/vulkan/wsi/wsi_common_display.c
+++ b/src/vulkan/wsi/wsi_common_display.c
@@ -900,6 +900,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 },
+ { .format = VK_FORMAT_R5G6B5_UNORM_PACK16, .drm_format = DRM_FORMAT_RGB565 },
};
static void
--
2.25.1
@@ -0,0 +1,183 @@
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,0 +1,58 @@
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
@@ -0,0 +1,59 @@
From 28e4349702566ba34dad4c214c64bfd702177c8a 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
This partially reverts commit 5ffd1ebe6b3c8c7dd316dd47fac088044222e6ef
("mesa: Remove misc pbuffer attributes from struct gl_config").
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 +++++
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,
return all;
}
+/* careful, lack of trailing semicolon */
#define __ATTRIB(attrib, field) case attrib: *value = config->modes.field; break
/**
@@ -555,9 +556,9 @@ driGetConfigAttribIndex(const __DRIconfig *config,
__ATTRIB(__DRI_ATTRIB_GREEN_MASK, greenMask);
__ATTRIB(__DRI_ATTRIB_BLUE_MASK, blueMask);
__ATTRIB(__DRI_ATTRIB_ALPHA_MASK, alphaMask);
- case __DRI_ATTRIB_MAX_PBUFFER_WIDTH:
- case __DRI_ATTRIB_MAX_PBUFFER_HEIGHT:
- case __DRI_ATTRIB_MAX_PBUFFER_PIXELS:
+ __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH, maxPbufferWidth);
+ __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT, maxPbufferHeight);
+ __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS, maxPbufferPixels);
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
/* ARB_multisample / SGIS_multisample */
GLuint samples;
+ /* GLX 1.3 */
+ GLint maxPbufferWidth;
+ GLint maxPbufferHeight;
+ GLint maxPbufferPixels;
+
/* OML_swap_method */
GLint swapMethod;
--
2.25.1
@@ -1,7 +1,7 @@
From 090a4c570fb58b5cd55a7628e6805cf16b36b030 Mon Sep 17 00:00:00 2001
From 9bb8868ebab2d041c24c76487b6419a8039a5ce7 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 07/50] egl_dri2: set pbuffer config attribs to 0 for
Subject: [PATCH 67/67] 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 fb5d5617511..a47589d929f 100644
index 56b5175db6e..1b10c2e7362 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -415,6 +415,7 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
@@ -407,6 +407,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 fb5d5617511..a47589d929f 100644
bool srgb = false;
EGLint key, bind_to_texture_rgb, bind_to_texture_rgba;
int dri_shifts[4] = { -1, -1, -1, -1 };
@@ -536,11 +537,17 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
@@ -530,11 +531,17 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
break;
case __DRI_ATTRIB_MAX_PBUFFER_WIDTH:
@@ -45,7 +45,7 @@ index fb5d5617511..a47589d929f 100644
case __DRI_ATTRIB_MUTABLE_RENDER_BUFFER:
if (disp->Extensions.KHR_mutable_render_buffer)
surface_type |= EGL_MUTABLE_RENDER_BUFFER_BIT_KHR;
@@ -553,6 +560,15 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
@@ -614,6 +621,15 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
}
}
@@ -62,5 +62,5 @@ index fb5d5617511..a47589d929f 100644
for (int i = 0; attr_list[i] != EGL_NONE; i += 2)
_eglSetConfigKey(&base, attr_list[i], attr_list[i+1]);
--
2.17.1
2.25.1
@@ -0,0 +1,146 @@
From f9c028d508bac22d7c78b0232c625e27d13340a7 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.
---
src/mapi/glapi/gen/ARB_geometry_shader4.xml | 97 +++++++++++++++++++++
src/mapi/glapi/gen/gl_API.xml | 2 +-
src/mapi/glapi/gen/static_data.py | 4 +
3 files changed, 102 insertions(+), 1 deletion(-)
create mode 100644 src/mapi/glapi/gen/ARB_geometry_shader4.xml
diff --git a/src/mapi/glapi/gen/ARB_geometry_shader4.xml b/src/mapi/glapi/gen/ARB_geometry_shader4.xml
new file mode 100644
index 00000000000..d92dc577b17
--- /dev/null
+++ b/src/mapi/glapi/gen/ARB_geometry_shader4.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0"?>
+<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
+
+<!-- Note: no GLX protocol info yet. -->
+
+
+<OpenGLAPI>
+<category name="GL_ARB_geometry_shader4" number="47">
+ <enum name="GEOMETRY_SHADER_ARB" value="0x8DD9"/>
+ <enum name="GEOMETRY_VERTICES_OUT_ARB" value="0x8DDA"/>
+ <enum name="GEOMETRY_INPUT_TYPE_ARB" value="0x8DDB"/>
+ <enum name="GEOMETRY_OUTPUT_TYPE_ARB" value="0x8DDC"/>
+
+ <enum name="MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB"
+ count="1" value="0x8C29">
+ <size name="Get" mode="get"/>
+ </enum>
+ <enum name="MAX_GEOMETRY_VARYING_COMPONENTS_ARB"
+ count="1" value="0x8DDD">
+ <size name="Get" mode="get"/>
+ </enum>
+ <enum name="MAX_VERTEX_VARYING_COMPONENTS_ARB"
+ count="1" value="0x8DDE">
+ <size name="Get" mode="get"/>
+ </enum>
+ <enum name="MAX_VARYING_COMPONENTS"
+ count="1" value="0x8B4B">
+ <size name="Get" mode="get"/>
+ </enum>
+ <enum name="MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB"
+ count="1" value="0x8DDF">
+ <size name="Get" mode="get"/>
+ </enum>
+ <enum name="MAX_GEOMETRY_OUTPUT_VERTICES_ARB"
+ count="1" value="0x8DE0">
+ <size name="Get" mode="get"/>
+ </enum>
+ <enum name="MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB"
+ count="1" value="0x8DE1">
+ <size name="Get" mode="get"/>
+ </enum>
+
+ <enum name="LINES_ADJACENCY_ARB" value="0xA"/>
+ <enum name="LINE_STRIP_ADJACENCY_ARB" value="0xB"/>
+ <enum name="TRIANGLES_ADJACENCY_ARB" value="0xC"/>
+ <enum name="TRIANGLE_STRIP_ADJACENCY_ARB" value="0xD"/>
+
+ <enum name="FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB" value="0x8DA8"/>
+ <enum name="FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB" value="0x8DA9"/>
+
+
+ <enum name="FRAMEBUFFER_ATTACHMENT_LAYERED_ARB"
+ count="1" value="0x8DA7">
+ <size name="GetFramebufferAttachmentParameteriv" mode="get"/>
+ </enum>
+ <enum name="FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER"
+ count="1" value="0x8CD4">
+ <size name="GetFramebufferAttachmentParameteriv" mode="get"/>
+ </enum>
+
+ <enum name="PROGRAM_POINT_SIZE_ARB" value="0x8642"/>
+ <enum name="PROGRAM_POINT_SIZE_ARB"
+ count="1" value="0x8642">
+ <size name="Get" mode="get"/>
+ </enum>
+
+ <function name="ProgramParameteriARB" exec="dynamic">
+ <param name="program" type="GLuint"/>
+ <param name="pname" type="GLenum"/>
+ <param name="value" type="GLint"/>
+ </function>
+
+ <function name="FramebufferTextureARB" exec="dynamic">
+ <param name="target" type="GLenum"/>
+ <param name="attachment" type="GLenum"/>
+ <param name="texture" type="GLuint"/>
+ <param name="level" type="GLint"/>
+ </function>
+
+ <function name="FramebufferTextureLayerARB" exec="dynamic">
+ <param name="target" type="GLenum"/>
+ <param name="attachment" type="GLenum"/>
+ <param name="texture" type="GLuint"/>
+ <param name="level" type="GLint"/>
+ <param name="layer" type="GLint"/>
+ </function>
+
+ <function name="FramebufferTextureFaceARB" exec="dynamic">
+ <param name="target" type="GLenum"/>
+ <param name="attachment" type="GLenum"/>
+ <param name="texture" type="GLuint"/>
+ <param name="level" type="GLint"/>
+ <param name="face" type="GLenum"/>
+ </function>
+</category>
+
+</OpenGLAPI>
diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
index 4e35de0f4ea..d5a5e7f5386 100644
--- a/src/mapi/glapi/gen/gl_API.xml
+++ b/src/mapi/glapi/gen/gl_API.xml
@@ -8064,7 +8064,7 @@
<!-- 46. GL_ARB_framebuffer_sRGB -->
-<!-- 47. GL_ARB_geometry_shader4. There are no intentions to implement this extension -->
+<xi:include href="ARB_geometry_shader4.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<!-- 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
--- 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,
}
functions = [
--
2.25.1
+3 -3
View File
@@ -1,6 +1,6 @@
# From https://lists.freedesktop.org/archives/mesa-announce/2021-March/000624.html
sha256 379fc984459394f2ab2d84049efdc3a659869dc1328ce72ef0598506611712bb mesa-21.0.1.tar.xz
sha512 b31b78778b6092dfaf0712f90de3074217574389c4236f8379c127739874f6bd1b47883140a26445d25e58df87e6207278efd048453096ee710d334b1dcfe419 mesa-21.0.1.tar.xz
# 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
# License
sha256 998437f3f75f0c542046f83c1cb349408122268168fb13eb4ae6967aa18b7d98 docs/license.rst
+1 -1
View File
@@ -5,7 +5,7 @@
################################################################################
# When updating the version, please also update mesa3d-headers
MESA3D_VERSION = 21.0.1
MESA3D_VERSION = 21.2.1
MESA3D_SOURCE = mesa-$(MESA3D_VERSION).tar.xz
MESA3D_SITE = https://archive.mesa3d.org
MESA3D_LICENSE = MIT, SGI, Khronos