lima: Implement lima_resource_get_param() callback
authorRoman Stratiienko <r.stratiienko@gmail.com>
Fri, 13 Aug 2021 17:04:51 +0000 (20:04 +0300)
committerMarge Bot <eric+marge@anholt.net>
Tue, 17 Aug 2021 10:50:51 +0000 (10:50 +0000)
Currently stride, offset, modifier is obtained by invoking
lima_resource_get_handle() with WINSYS_HANDLE_TYPE_KMS.

Before commit 47f000c170cc this path was working. Obtained handle
was simply ignored by DRI frontend and only requested data used.

After commit 47f000c170cc such requests started to fail when
DRI is initialized using KMSRO and resource has no scanout data.

When lima_resource_get_param() is implemented, it will be used in
a first place to obtain resource data.

Fixes: 47f000c170cc ("lima: fail in get_handle(TYPE_KMS) without a scanout resource")
Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
Reviewed-by: Simon Ser <contact@emersion.fr>
Reviewed-by: Erico Nunes <nunes.erico@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12362>

src/gallium/drivers/lima/lima_resource.c

index 7b94dd4..946edc8 100644 (file)
@@ -427,6 +427,35 @@ lima_resource_get_handle(struct pipe_screen *pscreen,
    return true;
 }
 
+static bool
+lima_resource_get_param(struct pipe_screen *pscreen,
+                        struct pipe_context *pctx,
+                        struct pipe_resource *pres,
+                        unsigned plane, unsigned layer, unsigned level,
+                        enum pipe_resource_param param,
+                        unsigned usage, uint64_t *value)
+{
+   struct lima_resource *res = lima_resource(pres);
+
+   switch (param) {
+   case PIPE_RESOURCE_PARAM_STRIDE:
+      *value = res->levels[level].stride;
+      return true;
+   case PIPE_RESOURCE_PARAM_OFFSET:
+      *value = res->levels[level].offset;
+      return true;
+   case PIPE_RESOURCE_PARAM_MODIFIER:
+      if (res->tiled)
+         *value = DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED;
+      else
+         *value = DRM_FORMAT_MOD_LINEAR;
+
+      return true;
+   default:
+      return false;
+   }
+}
+
 static void
 get_scissor_from_box(struct pipe_scissor_state *s,
                      const struct pipe_box *b, int h)
@@ -522,6 +551,7 @@ lima_resource_screen_init(struct lima_screen *screen)
    screen->base.resource_from_handle = lima_resource_from_handle;
    screen->base.resource_destroy = lima_resource_destroy;
    screen->base.resource_get_handle = lima_resource_get_handle;
+   screen->base.resource_get_param = lima_resource_get_param;
    screen->base.set_damage_region = lima_resource_set_damage_region;
 }