Successfully tested under Weston 3.0, both with the new (experimental) dmabuf+modifiers path, and the old buffer import path. Photometer confirms 10 rgb bits from rendering to display.
Signed-off-by: Mario Kleiner <mario.kleiner...@gmail.com> --- src/egl/drivers/dri2/egl_dri2.c | 3 ++ src/egl/drivers/dri2/egl_dri2.h | 2 + src/egl/drivers/dri2/platform_wayland.c | 65 ++++++++++++++++++++++++++++--- src/egl/wayland/wayland-drm/wayland-drm.c | 6 +++ 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 2667aa5..b044716 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -986,6 +986,9 @@ dri2_display_destroy(_EGLDisplay *disp) 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); diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 4a52b49..2353a0f 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -220,6 +220,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; diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index bf2adbf..3d46723 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -61,6 +61,8 @@ enum wl_drm_format_flags { HAS_ARGB8888 = 1, HAS_XRGB8888 = 2, HAS_RGB565 = 4, + HAS_ARGB2101010 = 8, + HAS_XRGB2101010 = 16, }; static int @@ -148,18 +150,26 @@ dri2_wl_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp, if (dri2_dpy->wl_dmabuf || dri2_dpy->wl_drm) { if (conf->RedSize == 5) dri2_surf->format = WL_DRM_FORMAT_RGB565; - else if (conf->AlphaSize == 0) + else if (conf->RedSize == 8 && conf->AlphaSize == 0) dri2_surf->format = WL_DRM_FORMAT_XRGB8888; - else + else if (conf->RedSize == 8) dri2_surf->format = WL_DRM_FORMAT_ARGB8888; + else if (conf->RedSize == 10 && conf->AlphaSize == 0) + dri2_surf->format = WL_DRM_FORMAT_XRGB2101010; + else if (conf->RedSize == 10) + dri2_surf->format = WL_DRM_FORMAT_ARGB2101010; } else { assert(dri2_dpy->wl_shm); if (conf->RedSize == 5) dri2_surf->format = WL_SHM_FORMAT_RGB565; - else if (conf->AlphaSize == 0) + else if (conf->RedSize == 8 && conf->AlphaSize == 0) dri2_surf->format = WL_SHM_FORMAT_XRGB8888; - else + else if (conf->RedSize == 8) dri2_surf->format = WL_SHM_FORMAT_ARGB8888; + else if (conf->RedSize == 10 && conf->AlphaSize == 0) + dri2_surf->format = WL_SHM_FORMAT_XRGB2101010; + else if (conf->RedSize == 10) + dri2_surf->format = WL_SHM_FORMAT_ARGB2101010; } dri2_surf->wl_queue = wl_display_create_queue(dri2_dpy->wl_dpy); @@ -339,8 +349,9 @@ get_back_bo(struct dri2_egl_surface *dri2_surf) uint64_t *modifiers; int num_modifiers; - /* currently supports three WL DRM formats, + /* currently supports five WL DRM formats, * WL_DRM_FORMAT_ARGB8888, WL_DRM_FORMAT_XRGB8888, + * WL_DRM_FORMAT_ARGB2101010, WL_DRM_FORMAT_XRGB2101010, * and WL_DRM_FORMAT_RGB565 */ switch (dri2_surf->format) { @@ -359,6 +370,16 @@ get_back_bo(struct dri2_egl_surface *dri2_surf) modifiers = u_vector_tail(&dri2_dpy->wl_modifiers.rgb565); num_modifiers = u_vector_length(&dri2_dpy->wl_modifiers.rgb565); break; + 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; default: /* format is not supported */ return -1; @@ -582,6 +603,8 @@ dri2_wl_get_buffers(__DRIdrawable * driDrawable, switch (dri2_surf->format) { case WL_DRM_FORMAT_ARGB8888: case WL_DRM_FORMAT_XRGB8888: + case WL_DRM_FORMAT_ARGB2101010: + case WL_DRM_FORMAT_XRGB2101010: bpp = 32; break; case WL_DRM_FORMAT_RGB565: @@ -921,6 +944,14 @@ dri2_wl_create_wayland_buffer_from_image(_EGLDriver *drv, if (!(dri2_dpy->formats & HAS_XRGB8888)) goto bad_format; break; + case __DRI_IMAGE_FORMAT_ARGB2101010: + if (!(dri2_dpy->formats & HAS_ARGB2101010)) + goto bad_format; + break; + case __DRI_IMAGE_FORMAT_XRGB2101010: + if (!(dri2_dpy->formats & HAS_XRGB2101010)) + goto bad_format; + break; default: goto bad_format; } @@ -1000,6 +1031,12 @@ drm_handle_format(void *data, struct wl_drm *drm, uint32_t format) struct dri2_egl_display *dri2_dpy = data; switch (format) { + case WL_DRM_FORMAT_ARGB2101010: + dri2_dpy->formats |= HAS_ARGB2101010; + break; + case WL_DRM_FORMAT_XRGB2101010: + dri2_dpy->formats |= HAS_XRGB2101010; + break; case WL_DRM_FORMAT_ARGB8888: dri2_dpy->formats |= HAS_ARGB8888; break; @@ -1055,6 +1092,12 @@ 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); + break; + case WL_DRM_FORMAT_XRGB2101010: + mod = u_vector_add(&dri2_dpy->wl_modifiers.xrgb2101010); + break; case WL_DRM_FORMAT_ARGB8888: mod = u_vector_add(&dri2_dpy->wl_modifiers.argb8888); dri2_dpy->formats |= HAS_ARGB8888; @@ -1168,6 +1211,8 @@ dri2_wl_add_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *disp) int has_format; unsigned int rgba_masks[4]; } visuals[] = { + { "XRGB2101010", HAS_XRGB2101010, { 0x3ff00000, 0xffc00, 0x3ff, 0 } }, + { "ARGB2101010", HAS_ARGB2101010, { 0x3ff00000, 0xffc00, 0x3ff, 0xc0000000 } }, { "XRGB8888", HAS_XRGB8888, { 0xff0000, 0xff00, 0x00ff, 0xff000000 } }, { "ARGB8888", HAS_ARGB8888, { 0xff0000, 0xff00, 0x00ff, 0 } }, { "RGB565", HAS_RGB565, { 0x00f800, 0x07e0, 0x001f, 0 } }, @@ -1226,6 +1271,8 @@ dri2_initialize_wayland_drm(_EGLDriver *drv, _EGLDisplay *disp) if (!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.xrgb2101010, sizeof(uint64_t), 32) || + !u_vector_init(&dri2_dpy->wl_modifiers.argb2101010, sizeof(uint64_t), 32) || !u_vector_init(&dri2_dpy->wl_modifiers.rgb565, sizeof(uint64_t), 32)) { goto cleanup; } @@ -1365,7 +1412,7 @@ dri2_wl_swrast_get_stride_for_format(int format, int w) { if (format == WL_SHM_FORMAT_RGB565) return 2 * w; - else /* ARGB8888 || XRGB8888 */ + else /* ARGB8888 || XRGB8888 || ARGB2101010 || XRGB2101010 */ return 4 * w; } @@ -1799,6 +1846,12 @@ shm_handle_format(void *data, struct wl_shm *shm, uint32_t format) case WL_SHM_FORMAT_RGB565: dri2_dpy->formats |= HAS_RGB565; break; + case WL_SHM_FORMAT_ARGB2101010: + dri2_dpy->formats |= HAS_ARGB2101010; + break; + case WL_SHM_FORMAT_XRGB2101010: + dri2_dpy->formats |= HAS_XRGB2101010; + break; } } diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c b/src/egl/wayland/wayland-drm/wayland-drm.c index 4fc1252..bc3bc14 100644 --- a/src/egl/wayland/wayland-drm/wayland-drm.c +++ b/src/egl/wayland/wayland-drm/wayland-drm.c @@ -124,6 +124,8 @@ drm_create_buffer(struct wl_client *client, struct wl_resource *resource, uint32_t stride, uint32_t format) { switch (format) { + case WL_DRM_FORMAT_ARGB2101010: + case WL_DRM_FORMAT_XRGB2101010: case WL_DRM_FORMAT_ARGB8888: case WL_DRM_FORMAT_XRGB8888: case WL_DRM_FORMAT_YUYV: @@ -222,6 +224,10 @@ bind_drm(struct wl_client *client, void *data, uint32_t version, uint32_t id) wl_resource_post_event(resource, WL_DRM_DEVICE, drm->device_name); wl_resource_post_event(resource, WL_DRM_FORMAT, + WL_DRM_FORMAT_ARGB2101010); + wl_resource_post_event(resource, WL_DRM_FORMAT, + WL_DRM_FORMAT_XRGB2101010); + wl_resource_post_event(resource, WL_DRM_FORMAT, WL_DRM_FORMAT_ARGB8888); wl_resource_post_event(resource, WL_DRM_FORMAT, WL_DRM_FORMAT_XRGB8888); -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev