diff options
author | Roman Stratiienko <r.stratiienko@gmail.com> | 2021-08-13 20:04:51 +0300 |
---|---|---|
committer | Eric Engestrom <eric@engestrom.ch> | 2021-09-07 20:08:47 +0100 |
commit | 251d2672f52f7b57cc15a0fb5c52da83eadb4f56 (patch) | |
tree | ffc45624e616b1b5331e478279ecfc94ebdbacc9 | |
parent | a6ec00134e674e55c3ac7338ef1631614d5126ea (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.json | 2 | ||||
-rw-r--r-- | src/gallium/drivers/lima/lima_resource.c | 30 |
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; } |