From 5ec6b6e9bbf607935cf864e63c9b555621fca590 Mon Sep 17 00:00:00 2001 From: Roman Stratiienko Date: Fri, 13 Aug 2021 20:04:51 +0300 Subject: [PATCH] lima: Implement lima_resource_get_param() callback 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 Reviewed-by: Simon Ser Reviewed-by: Erico Nunes Part-of: --- src/gallium/drivers/lima/lima_resource.c | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/gallium/drivers/lima/lima_resource.c b/src/gallium/drivers/lima/lima_resource.c index 7b94dd48320..946edc86df8 100644 --- a/src/gallium/drivers/lima/lima_resource.c +++ b/src/gallium/drivers/lima/lima_resource.c @@ -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; }