gallium/dri2: Support images with multiple planes for modifiers
authorJordan Justen <jordan.l.justen@intel.com>
Mon, 24 Jun 2019 17:39:03 +0000 (10:39 -0700)
committerJordan Justen <jordan.l.justen@intel.com>
Tue, 13 Aug 2019 08:12:29 +0000 (01:12 -0700)
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Acked-by: Eric Anholt <eric@anholt.net>
src/gallium/state_trackers/dri/dri2.c
src/gallium/state_trackers/dri/dri_screen.h

index ac842ddf756d48a76a7a6417f787f36ee2e2ada4..4b4ab3196c295c1500077273bbc38fa2975f404f 100644 (file)
@@ -907,6 +907,7 @@ dri2_create_image_from_fd(__DRIscreen *_screen,
       whandles[i].stride = (unsigned)strides[index];
       whandles[i].offset = (unsigned)offsets[index];
       whandles[i].modifier = modifier;
+      whandles[i].plane = i;
    }
 
    img = dri2_create_image_from_winsys(_screen, width, height, map,
@@ -1063,6 +1064,7 @@ dri2_query_image_by_resource_handle(__DRIimage *image, int attrib, int *value)
    struct winsys_handle whandle;
    unsigned usage;
    memset(&whandle, 0, sizeof(whandle));
+   whandle.plane = image->plane;
 
    switch (attrib) {
    case __DRI_IMAGE_ATTRIB_STRIDE:
@@ -1124,6 +1126,18 @@ dri2_query_image_by_resource_handle(__DRIimage *image, int attrib, int *value)
    }
 }
 
+static bool
+dri2_resource_get_param(__DRIimage *image, enum pipe_resource_param param,
+                        uint64_t *value)
+{
+   struct pipe_screen *pscreen = image->texture->screen;
+   if (!pscreen->resource_get_param)
+      return false;
+
+   return pscreen->resource_get_param(pscreen, image->texture, image->plane,
+                                      param, value);
+}
+
 static GLboolean
 dri2_query_image(__DRIimage *image, int attrib, int *value)
 {
@@ -1223,11 +1237,25 @@ dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate)
 {
    __DRIimage *img;
 
-   if (plane != 0)
+   if (plane < 0) {
       return NULL;
+   } else if (plane > 0) {
+      uint64_t planes;
+      if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_NPLANES,
+                                   &planes) ||
+          plane >= planes) {
+         return NULL;
+      }
+   }
 
-   if (image->dri_components == 0)
-      return NULL;
+   if (image->dri_components == 0) {
+      uint64_t modifier;
+      if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_MODIFIER,
+                                   &modifier) ||
+          modifier == DRM_FORMAT_MOD_INVALID) {
+         return NULL;
+      }
+   }
 
    img = dri2_dup_image(image, loaderPrivate);
    if (img == NULL)
@@ -1239,6 +1267,7 @@ dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate)
 
    /* set this to 0 for sub images. */
    img->dri_components = 0;
+   img->plane = plane;
    return img;
 }
 
index 85372cb97c889f76a4c178668edcd61a91e27895..f16715dee5633d0f54087e046b2b38ab2bc1ca63 100644 (file)
@@ -105,6 +105,7 @@ struct __DRIimageRec {
    uint32_t dri_fourcc;
    uint32_t dri_components;
    unsigned use;
+   unsigned plane;
 
    void *loader_private;