egl/wayland: Add Wayland dmabuf support for RGB10 winsys buffers. (v2)
authorMario Kleiner <mario.kleiner.de@gmail.com>
Fri, 15 Dec 2017 22:05:01 +0000 (23:05 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 3 Jan 2018 21:57:56 +0000 (22:57 +0100)
Successfully tested under Weston 3.0.
Photometer confirms 10 rgb bits from rendering to display.

v2: Rebased onto master for dri2_teardown_wayland().

Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
src/egl/drivers/dri2/egl_dri2.h
src/egl/drivers/dri2/platform_wayland.c

index ef375b68f8239f8db52f865245f8ff036c8f2b8c..cc76c73eab2f28860a9db39d67f420e20aeecdd7 100644 (file)
@@ -212,6 +212,8 @@ struct dri2_egl_display
    struct wl_event_queue    *wl_queue;
    struct zwp_linux_dmabuf_v1 *wl_dmabuf;
    struct {
+      struct u_vector        xrgb2101010;
+      struct u_vector        argb2101010;
       struct u_vector        xrgb8888;
       struct u_vector        argb8888;
       struct u_vector        rgb565;
index 8b67a02e1b9933926c015c1aa0748bd19eb5dda8..da46449c439bd2939c3c6026ed6b339c75704511 100644 (file)
@@ -354,9 +354,13 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
    switch (dri2_surf->format) {
    case WL_DRM_FORMAT_ARGB2101010:
       dri_image_format = __DRI_IMAGE_FORMAT_ARGB2101010;
+      modifiers = u_vector_tail(&dri2_dpy->wl_modifiers.argb2101010);
+      num_modifiers = u_vector_length(&dri2_dpy->wl_modifiers.argb2101010);
       break;
    case WL_DRM_FORMAT_XRGB2101010:
       dri_image_format = __DRI_IMAGE_FORMAT_XRGB2101010;
+      modifiers = u_vector_tail(&dri2_dpy->wl_modifiers.xrgb2101010);
+      num_modifiers = u_vector_length(&dri2_dpy->wl_modifiers.xrgb2101010);
       break;
    case WL_DRM_FORMAT_ARGB8888:
       dri_image_format = __DRI_IMAGE_FORMAT_ARGB8888;
@@ -1143,6 +1147,14 @@ dmabuf_handle_modifier(void *data, struct zwp_linux_dmabuf_v1 *dmabuf,
       return;
 
    switch (format) {
+   case WL_DRM_FORMAT_ARGB2101010:
+      mod = u_vector_add(&dri2_dpy->wl_modifiers.argb2101010);
+      dri2_dpy->formats |= HAS_ARGB2101010;
+      break;
+   case WL_DRM_FORMAT_XRGB2101010:
+      mod = u_vector_add(&dri2_dpy->wl_modifiers.xrgb2101010);
+      dri2_dpy->formats |= HAS_XRGB2101010;
+      break;
    case WL_DRM_FORMAT_ARGB8888:
       mod = u_vector_add(&dri2_dpy->wl_modifiers.argb8888);
       dri2_dpy->formats |= HAS_ARGB8888;
@@ -1314,7 +1326,9 @@ dri2_initialize_wayland_drm(_EGLDriver *drv, _EGLDisplay *disp)
       dri2_dpy->wl_dpy = disp->PlatformDisplay;
    }
 
-   if (!u_vector_init(&dri2_dpy->wl_modifiers.xrgb8888, sizeof(uint64_t), 32) ||
+   if (!u_vector_init(&dri2_dpy->wl_modifiers.xrgb2101010, sizeof(uint64_t), 32) ||
+       !u_vector_init(&dri2_dpy->wl_modifiers.argb2101010, sizeof(uint64_t), 32) ||
+       !u_vector_init(&dri2_dpy->wl_modifiers.xrgb8888, sizeof(uint64_t), 32) ||
        !u_vector_init(&dri2_dpy->wl_modifiers.argb8888, sizeof(uint64_t), 32) ||
        !u_vector_init(&dri2_dpy->wl_modifiers.rgb565, sizeof(uint64_t), 32)) {
       goto cleanup;
@@ -2055,6 +2069,8 @@ dri2_teardown_wayland(struct dri2_egl_display *dri2_dpy)
       wl_event_queue_destroy(dri2_dpy->wl_queue);
    if (dri2_dpy->wl_dpy_wrapper)
       wl_proxy_wrapper_destroy(dri2_dpy->wl_dpy_wrapper);
+   u_vector_finish(&dri2_dpy->wl_modifiers.argb2101010);
+   u_vector_finish(&dri2_dpy->wl_modifiers.xrgb2101010);
    u_vector_finish(&dri2_dpy->wl_modifiers.argb8888);
    u_vector_finish(&dri2_dpy->wl_modifiers.xrgb8888);
    u_vector_finish(&dri2_dpy->wl_modifiers.rgb565);