gallium: dmabuf support for yuv formats that are not natively supported
authorJames Xiong <james.xiong@intel.com>
Thu, 16 Jan 2020 18:19:34 +0000 (10:19 -0800)
committerMarge Bot <eric+marge@anholt.net>
Wed, 22 Jan 2020 21:18:49 +0000 (21:18 +0000)
V2 (Kenneth Graunke):
   added a helper function to check if every format is supported

Signed-off-by: James Xiong <james.xiong@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2846>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2846>

src/gallium/state_trackers/dri/dri2.c
src/gallium/state_trackers/dri/dri_helpers.c
src/gallium/state_trackers/dri/dri_helpers.h

index 82c57b78d9989b661b76501a10b3a2cedf867f38..05ebb4ef1d7198606407b5c46745523635d52287 100644 (file)
@@ -755,15 +755,7 @@ dri2_create_image_from_winsys(__DRIscreen *_screen,
        * add sampler view usage.
        */
       use_lowered = true;
-      for (i = 0; i < map->nplanes; i++) {
-          if (!pscreen->is_format_supported(pscreen,
-                                            dri2_get_pipe_format_for_dri_format(map->planes[i].dri_format),
-                                            screen->target, 0, 0,
-                                            PIPE_BIND_SAMPLER_VIEW))
-             break;
-      }
-
-      if (i == map->nplanes)
+      if (dri2_yuv_dma_buf_supported(screen, map))
          tex_usage |= PIPE_BIND_SAMPLER_VIEW;
    }
 
@@ -1407,6 +1399,11 @@ dri2_query_dma_buf_modifiers(__DRIscreen *_screen, int fourcc, int max,
       pscreen->query_dmabuf_modifiers(pscreen, format, max, modifiers,
                                       external_only, count);
       return true;
+   } else if (dri2_yuv_dma_buf_supported(screen, map)) {
+      *count = 1;
+      if (modifiers)
+         modifiers[0] = DRM_FORMAT_MOD_NONE;
+      return true;
    }
    return false;
 }
index d4de8cdc59facc68ad0c4b7d65a7d1d1f7ffa410..90a8a392fad52aa854b24543d9bae1d3d6ef6c18 100644 (file)
@@ -566,6 +566,21 @@ dri2_get_pipe_format_for_dri_format(int format)
    return PIPE_FORMAT_NONE;
 }
 
+boolean
+dri2_yuv_dma_buf_supported(struct dri_screen *screen,
+                           const struct dri2_format_mapping *map)
+{
+   struct pipe_screen *pscreen = screen->base.screen;
+
+   for (unsigned i = 0; i < map->nplanes; i++) {
+      if (!pscreen->is_format_supported(pscreen,
+            dri2_get_pipe_format_for_dri_format(map->planes[i].dri_format),
+            screen->target, 0, 0, PIPE_BIND_SAMPLER_VIEW))
+         return false;
+   }
+   return true;
+}
+
 boolean
 dri2_query_dma_buf_formats(__DRIscreen *_screen, int max, int *formats,
                            int *count)
@@ -589,7 +604,8 @@ dri2_query_dma_buf_formats(__DRIscreen *_screen, int max, int *formats,
                                        PIPE_BIND_RENDER_TARGET) ||
           pscreen->is_format_supported(pscreen, map->pipe_format,
                                        screen->target, 0, 0,
-                                       PIPE_BIND_SAMPLER_VIEW)) {
+                                       PIPE_BIND_SAMPLER_VIEW) ||
+          dri2_yuv_dma_buf_supported(screen, map)) {
          if (j < max)
             formats[j] = map->dri_fourcc;
          j++;
index f0c1bbf15973d36df1867453f42cf072fda30246..0393a48a8ee4087f924a0ddb4383d765704aef37 100644 (file)
@@ -56,6 +56,9 @@ dri2_get_pipe_format_for_dri_format(int format);
 boolean
 dri2_query_dma_buf_formats(__DRIscreen *_screen, int max, int *formats,
                            int *count);
+boolean
+dri2_yuv_dma_buf_supported(struct dri_screen *screen,
+                           const struct dri2_format_mapping *map);
 
 __DRIimage *
 dri2_lookup_egl_image(struct dri_screen *screen, void *handle);