Mesa (master): egl/wayland: Use visual map for format advertisement

Daniel Stone daniels at kemper.freedesktop.org
Fri Feb 9 16:25:42 UTC 2018


Module: Mesa
Branch: master
Commit: 68a80c11bd3b362d7782ded9c8c12ba0e9ecc933
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=68a80c11bd3b362d7782ded9c8c12ba0e9ecc933

Author: Daniel Stone <daniels at collabora.com>
Date:   Tue Feb  6 10:20:39 2018 +0000

egl/wayland: Use visual map for format advertisement

Signed-off-by: Daniel Stone <daniels at collabora.com>
Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
Tested-by: Ilia Mirkin <imirkin at alum.mit.edu>

---

 src/egl/drivers/dri2/platform_wayland.c | 75 ++++++++++++++++-----------------
 1 file changed, 36 insertions(+), 39 deletions(-)

diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index 28eba98092..9118709ac2 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -131,6 +131,19 @@ dri2_wl_visual_idx_from_config(struct dri2_egl_display *dri2_dpy,
 }
 
 static int
+dri2_wl_visual_idx_from_fourcc(uint32_t fourcc)
+{
+   for (int i = 0; i < ARRAY_SIZE(dri2_wl_visuals); i++) {
+      /* wl_drm format codes overlap with DRIImage FourCC codes for all formats
+       * we support. */
+      if (dri2_wl_visuals[i].wl_drm_format == fourcc)
+         return i;
+   }
+
+   return -1;
+}
+
+static int
 dri2_wl_visual_idx_from_dri_image_format(uint32_t dri_image_format)
 {
    for (int i = 0; i < ARRAY_SIZE(dri2_wl_visuals); i++) {
@@ -142,6 +155,17 @@ dri2_wl_visual_idx_from_dri_image_format(uint32_t dri_image_format)
 }
 
 static int
+dri2_wl_visual_idx_from_shm_format(uint32_t shm_format)
+{
+   for (int i = 0; i < ARRAY_SIZE(dri2_wl_visuals); i++) {
+      if (dri2_wl_visuals[i].wl_shm_format == shm_format)
+         return i;
+   }
+
+   return -1;
+}
+
+static int
 roundtrip(struct dri2_egl_display *dri2_dpy)
 {
    return wl_display_roundtrip_queue(dri2_dpy->wl_dpy, dri2_dpy->wl_queue);
@@ -1137,24 +1161,12 @@ static void
 drm_handle_format(void *data, struct wl_drm *drm, uint32_t format)
 {
    struct dri2_egl_display *dri2_dpy = data;
+   int visual_idx = dri2_wl_visual_idx_from_fourcc(format);
 
-   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;
-   case WL_DRM_FORMAT_XRGB8888:
-      dri2_dpy->formats |= HAS_XRGB8888;
-      break;
-   case WL_DRM_FORMAT_RGB565:
-      dri2_dpy->formats |= HAS_RGB565;
-      break;
-   }
+   if (visual_idx == -1)
+      return;
+
+   dri2_dpy->formats |= dri2_wl_visuals[visual_idx].has_format;
 }
 
 static void
@@ -1193,6 +1205,7 @@ dmabuf_handle_modifier(void *data, struct zwp_linux_dmabuf_v1 *dmabuf,
                        uint32_t modifier_lo)
 {
    struct dri2_egl_display *dri2_dpy = data;
+   int visual_idx = dri2_wl_visual_idx_from_fourcc(format);
    uint64_t *mod = NULL;
 
    if (modifier_hi == (DRM_FORMAT_MOD_INVALID >> 32) &&
@@ -1202,23 +1215,18 @@ dmabuf_handle_modifier(void *data, struct zwp_linux_dmabuf_v1 *dmabuf,
    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;
       break;
    case WL_DRM_FORMAT_XRGB8888:
       mod = u_vector_add(&dri2_dpy->wl_modifiers.xrgb8888);
-      dri2_dpy->formats |= HAS_XRGB8888;
       break;
    case WL_DRM_FORMAT_RGB565:
       mod = u_vector_add(&dri2_dpy->wl_modifiers.rgb565);
-      dri2_dpy->formats |= HAS_RGB565;
       break;
    default:
       break;
@@ -1227,6 +1235,7 @@ dmabuf_handle_modifier(void *data, struct zwp_linux_dmabuf_v1 *dmabuf,
    if (!mod)
       return;
 
+   dri2_dpy->formats |= dri2_wl_visuals[visual_idx].has_format;
    *mod = (uint64_t) modifier_hi << 32;
    *mod |= (uint64_t) (modifier_lo & 0xffffffff);
 }
@@ -1934,24 +1943,12 @@ static void
 shm_handle_format(void *data, struct wl_shm *shm, uint32_t format)
 {
    struct dri2_egl_display *dri2_dpy = data;
+   int visual_idx = dri2_wl_visual_idx_from_shm_format(format);
 
-   switch (format) {
-   case WL_SHM_FORMAT_ARGB2101010:
-      dri2_dpy->formats |= HAS_ARGB2101010;
-      break;
-   case WL_SHM_FORMAT_XRGB2101010:
-      dri2_dpy->formats |= HAS_XRGB2101010;
-      break;
-   case WL_SHM_FORMAT_ARGB8888:
-      dri2_dpy->formats |= HAS_ARGB8888;
-      break;
-   case WL_SHM_FORMAT_XRGB8888:
-      dri2_dpy->formats |= HAS_XRGB8888;
-      break;
-   case WL_SHM_FORMAT_RGB565:
-      dri2_dpy->formats |= HAS_RGB565;
-      break;
-   }
+   if (visual_idx == -1)
+      return;
+
+   dri2_dpy->formats |= dri2_wl_visuals[visual_idx].has_format;
 }
 
 static const struct wl_shm_listener shm_listener = {




More information about the mesa-commit mailing list