gallium/dri: fix dri2_from_planar for multiplanar images

Fix the gbm_dri_bo_get_handle_for_plane use case by allowing plane > 0
in dri2_from_planar for images with multiple planes in separate chained
texture resources.

Not all multiplanar resources are chained, though. The iris aux buffer
is a separate plane in the same resource.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7028>
diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c
index 86ac38d..3ed5586 100644
--- a/src/gallium/frontends/dri/dri2.c
+++ b/src/gallium/frontends/dri/dri2.c
@@ -1379,18 +1379,28 @@
 dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate)
 {
    __DRIimage *img;
+   struct pipe_resource *tex = image->texture;
+   int i;
 
    if (plane < 0) {
       return NULL;
    } else if (plane > 0) {
       uint64_t planes;
-      if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_NPLANES, 0,
-                                   &planes) ||
+      if (dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_NPLANES, 0,
+                                  &planes) &&
           plane >= planes) {
          return NULL;
       }
    }
 
+   if (tex->next) {
+      for (i = 0; i < plane; i++) {
+         tex = tex->next;
+         if (!tex)
+            return NULL;
+      }
+   }
+
    if (image->dri_components == 0) {
       uint64_t modifier;
       if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_MODIFIER, 0,
@@ -1404,6 +1414,8 @@
    if (img == NULL)
       return NULL;
 
+   pipe_resource_reference(&img->texture, tex);
+
    if (img->texture->screen->resource_changed)
       img->texture->screen->resource_changed(img->texture->screen,
                                              img->texture);