[mutter/wip/nielsdg/meta-multi-texture-dmabuf: 1/4] wip
- From: Niels De Graef <nielsdg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/nielsdg/meta-multi-texture-dmabuf: 1/4] wip
- Date: Sat, 23 May 2020 13:03:03 +0000 (UTC)
commit 82149a3caa4c3752ac2acb8757d9947a84287991
Author: Niels De Graef <niels degraef barco com>
Date: Fri Oct 25 09:16:51 2019 +0200
wip
src/wayland/meta-wayland-dma-buf.c | 68 ++++++++++++++++++++++++++++++++++----
1 file changed, 61 insertions(+), 7 deletions(-)
---
diff --git a/src/wayland/meta-wayland-dma-buf.c b/src/wayland/meta-wayland-dma-buf.c
index 6897d58b5..8af21f5d6 100644
--- a/src/wayland/meta-wayland-dma-buf.c
+++ b/src/wayland/meta-wayland-dma-buf.c
@@ -87,10 +87,12 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffer *buffer,
MetaWaylandDmaBufBuffer *dma_buf = buffer->dma_buf.dma_buf;
uint32_t n_planes;
uint64_t modifiers[META_WAYLAND_DMA_BUF_MAX_FDS];
- CoglPixelFormat cogl_format;
+ MetaMultiTextureFormat multi_format = META_MULTI_TEXTURE_FORMAT_SIMPLE;
+ CoglPixelFormat subformats[META_WAYLAND_DMA_BUF_MAX_FDS] = { COGL_PIXEL_FORMAT_ANY, };
EGLImageKHR egl_image;
CoglEglImageFlags flags;
CoglTexture2D *cogl_texture;
+ GPtrArray *planes;
if (buffer->dma_buf.texture)
return TRUE;
@@ -105,16 +107,55 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffer *buffer,
* and access the buffer memory at all.
*/
case DRM_FORMAT_XRGB8888:
- cogl_format = COGL_PIXEL_FORMAT_RGB_888;
+ subformats[0] = COGL_PIXEL_FORMAT_RGB_888;
break;
case DRM_FORMAT_ARGB8888:
- cogl_format = COGL_PIXEL_FORMAT_ARGB_8888_PRE;
+ subformats[0] = COGL_PIXEL_FORMAT_ARGB_8888_PRE;
break;
case DRM_FORMAT_ARGB2101010:
- cogl_format = COGL_PIXEL_FORMAT_ARGB_2101010_PRE;
+ subformats[0] = COGL_PIXEL_FORMAT_ARGB_2101010_PRE;
break;
case DRM_FORMAT_RGB565:
- cogl_format = COGL_PIXEL_FORMAT_RGB_565;
+ subformats[0] = COGL_PIXEL_FORMAT_RGB_565;
+ break;
+ case DRM_FORMAT_YUYV:
+ multi_format = META_MULTI_TEXTURE_FORMAT_YUYV;
+ break;
+ case DRM_FORMAT_NV12:
+ multi_format = META_MULTI_TEXTURE_FORMAT_NV12;
+ break;
+ case DRM_FORMAT_NV21:
+ multi_format = META_MULTI_TEXTURE_FORMAT_NV21;
+ break;
+ case DRM_FORMAT_YUV410:
+ multi_format = META_MULTI_TEXTURE_FORMAT_YUV410;
+ break;
+ case DRM_FORMAT_YVU410:
+ multi_format = META_MULTI_TEXTURE_FORMAT_YVU410;
+ break;
+ case DRM_FORMAT_YUV411:
+ multi_format = META_MULTI_TEXTURE_FORMAT_YUV411;
+ break;
+ case DRM_FORMAT_YVU411:
+ multi_format = META_MULTI_TEXTURE_FORMAT_YVU411;
+ break;
+ case DRM_FORMAT_YUV420:
+ multi_format = META_MULTI_TEXTURE_FORMAT_YUV420;
+ break;
+ case DRM_FORMAT_YVU420:
+ multi_format = META_MULTI_TEXTURE_FORMAT_YVU420;
+ break;
+ case DRM_FORMAT_YUV422:
+ multi_format = META_MULTI_TEXTURE_FORMAT_YUV422;
+ break;
+ case DRM_FORMAT_YVU422:
+ multi_format = META_MULTI_TEXTURE_FORMAT_YVU422;
+ break;
+ case DRM_FORMAT_YUV444:
+ multi_format = META_MULTI_TEXTURE_FORMAT_YUV444;
+ break;
+ case DRM_FORMAT_YVU444:
+ multi_format = META_MULTI_TEXTURE_FORMAT_YVU444;
break;
default:
g_set_error (error, G_IO_ERROR,
@@ -123,6 +164,9 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffer *buffer,
return FALSE;
}
+ if (multi_format != META_MULTI_TEXTURE_FORMAT_SIMPLE)
+ meta_multi_texture_format_get_subformats (multi_format, subformats);
+
for (n_planes = 0; n_planes < META_WAYLAND_DMA_BUF_MAX_FDS; n_planes++)
{
if (dma_buf->fds[n_planes] < 0)
@@ -131,6 +175,8 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffer *buffer,
modifiers[n_planes] = dma_buf->drm_modifier;
}
+ planes = g_ptr_array_new_full (n_planes, cogl_object_unref);
+
egl_image = meta_egl_create_dmabuf_image (egl,
egl_display,
dma_buf->width,
@@ -145,11 +191,13 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffer *buffer,
if (egl_image == EGL_NO_IMAGE_KHR)
return FALSE;
+ /* FIXME: at this point, we might want to try importing each plane separately */
+
flags = COGL_EGL_IMAGE_FLAG_NO_GET_DATA;
cogl_texture = cogl_egl_texture_2d_new_from_image (cogl_context,
dma_buf->width,
dma_buf->height,
- cogl_format,
+ subformats[0],
egl_image,
flags,
error);
@@ -159,7 +207,12 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffer *buffer,
if (!cogl_texture)
return FALSE;
- buffer->dma_buf.texture = meta_multi_texture_new_simple (COGL_TEXTURE (cogl_texture));
+ g_ptr_array_add (planes, COGL_TEXTURE (cogl_texture));
+
+ buffer->dma_buf.texture =
+ meta_multi_texture_new (multi_format,
+ (CoglTexture**) g_ptr_array_free (planes, FALSE),
+ n_planes);
buffer->is_y_inverted = dma_buf->is_y_inverted;
return TRUE;
@@ -530,6 +583,7 @@ dma_buf_bind (struct wl_client *client,
send_modifiers (resource, DRM_FORMAT_XRGB8888);
send_modifiers (resource, DRM_FORMAT_ARGB2101010);
send_modifiers (resource, DRM_FORMAT_RGB565);
+ send_modifiers (resource, DRM_FORMAT_NV12);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]