[Mesa-dev] [PATCH v13 15/36] st/dri: support format modifier queries

Daniel Stone daniels at collabora.com
Fri May 19 09:37:58 UTC 2017


From: Varad Gautam <varad.gautam at collabora.com>

ask the driver for supported modifiers for a given format.
bump __DRIimageExtension to 16.

v2: move to __DRIimageExtension v16.
v3: fail if the supplied format is not supported by driver.
v4: purge PIPE_CAP_QUERY_DMABUF_ATTRIBS.

Signed-off-by: Varad Gautam <varad.gautam at collabora.com>
Signed-off-by: Daniel Stone <daniels at collabora.com>
---
 src/gallium/state_trackers/dri/dri2.c | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
index 814a08e3cb..36cd235b3c 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -1431,6 +1431,24 @@ dri2_query_dma_buf_formats(__DRIscreen *_screen, int max, int *formats,
    return true;
 }
 
+static boolean
+dri2_query_dma_buf_modifiers(__DRIscreen *_screen, int fourcc, int max,
+                             uint64_t *modifiers, int *count)
+{
+   struct dri_screen *screen = dri_screen(_screen);
+   struct pipe_screen *pscreen = screen->base.screen;
+   enum pipe_format format = fourcc_to_pipe_format(fourcc);
+   const unsigned usage = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
+
+   if (pscreen->query_dmabuf_modifiers != NULL &&
+       pscreen->is_format_supported(pscreen, format, screen->target, 0, usage)) {
+      pscreen->query_dmabuf_modifiers(pscreen, format, max, modifiers,
+                                             count);
+      return true;
+   }
+   return false;
+}
+
 static __DRIimage *
 dri2_from_dma_bufs(__DRIscreen *screen,
                    int width, int height, int fourcc,
@@ -1597,7 +1615,7 @@ dri2_get_capabilities(__DRIscreen *_screen)
 
 /* The extension is modified during runtime if DRI_PRIME is detected */
 static __DRIimageExtension dri2ImageExtension = {
-    .base = { __DRI_IMAGE, 15 },
+    .base = { __DRI_IMAGE, 16 },
 
     .createImageFromName          = dri2_create_image_from_name,
     .createImageFromRenderbuffer  = dri2_create_image_from_renderbuffer,
@@ -1618,6 +1636,7 @@ static __DRIimageExtension dri2ImageExtension = {
     .createImageWithModifiers     = NULL,
     .createImageFromDmaBufs2      = NULL,
     .queryDmaBufFormats           = NULL,
+    .queryDmaBufModifiers         = NULL,
 };
 
 
@@ -2165,6 +2184,8 @@ dri2_init_screen(__DRIscreen * sPriv)
          dri2ImageExtension.createImageFromDmaBufs = dri2_from_dma_bufs;
          dri2ImageExtension.createImageFromDmaBufs2 = dri2_from_dma_bufs2;
          dri2ImageExtension.queryDmaBufFormats = dri2_query_dma_buf_formats;
+         dri2ImageExtension.queryDmaBufModifiers =
+                                    dri2_query_dma_buf_modifiers;
       }
    }
 
@@ -2243,6 +2264,7 @@ dri_kms_init_screen(__DRIscreen * sPriv)
       dri2ImageExtension.createImageFromDmaBufs = dri2_from_dma_bufs;
       dri2ImageExtension.createImageFromDmaBufs2 = dri2_from_dma_bufs2;
       dri2ImageExtension.queryDmaBufFormats = dri2_query_dma_buf_formats;
+      dri2ImageExtension.queryDmaBufModifiers = dri2_query_dma_buf_modifiers;
    }
 
    sPriv->extensions = dri_screen_extensions;
-- 
2.13.0



More information about the mesa-dev mailing list