summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Stratiienko <r.stratiienko@gmail.com>2021-08-13 20:04:51 +0300
committerEric Engestrom <eric@engestrom.ch>2021-09-07 20:08:47 +0100
commit251d2672f52f7b57cc15a0fb5c52da83eadb4f56 (patch)
treeffc45624e616b1b5331e478279ecfc94ebdbacc9
parenta6ec00134e674e55c3ac7338ef1631614d5126ea (diff)
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 <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> (cherry picked from commit 5ec6b6e9bbf607935cf864e63c9b555621fca590)
-rw-r--r--.pick_status.json2
-rw-r--r--src/gallium/drivers/lima/lima_resource.c30
2 files changed, 31 insertions, 1 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 79bf3e8fb1d..86c9a53fa74 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -2011,7 +2011,7 @@
"description": "lima: Implement lima_resource_get_param() callback",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "47f000c170ccb824b308e02db8c2c955a8c00217"
},
diff --git a/src/gallium/drivers/lima/lima_resource.c b/src/gallium/drivers/lima/lima_resource.c
index a17923ce84e..a8954eb72ec 100644
--- a/src/gallium/drivers/lima/lima_resource.c
+++ b/src/gallium/drivers/lima/lima_resource.c
@@ -423,6 +423,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)
@@ -518,6 +547,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;
}