From: Philipp Zabel Date: Thu, 22 Jul 2021 10:47:15 +0000 (+0200) Subject: etnaviv: fix gbm_bo_get_handle_for_plane for multiplanar images X-Git-Tag: upstream/22.3.5~19814 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8ba44103b31d90b0c7531d66aa74254412485c85;p=platform%2Fupstream%2Fmesa.git etnaviv: fix gbm_bo_get_handle_for_plane for multiplanar images Implement resource_get_param for PIPE_RESOURCE_PARAM_NPLANES and fix resource_get_handle to walk to the correct linked resource for multiplanar images, allowing gbm_bo_get_handle_for_plane to be called with plane > 0. This fixes an assert that is triggered when a wayland client tries to send weston an NV12 dmabuf, for example: weston: .../mesa/src/gbm/backends/dri/gbm_dri.c:752: gbm_dri_bo_get_handle_for_plane: Assertion `plane == 0' failed. Fixes: 788f6dc85781 ('Revert "gallium/dri: fix dri2_from_planar for multiplanar images"') Signed-off-by: Philipp Zabel Reviewed-by: Christian Gmeiner Part-of: --- diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c b/src/gallium/drivers/etnaviv/etnaviv_resource.c index 0c8c28e..ce37b0e 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_resource.c +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c @@ -581,8 +581,21 @@ etna_resource_get_handle(struct pipe_screen *pscreen, struct winsys_handle *handle, unsigned usage) { struct etna_resource *rsc = etna_resource(prsc); + struct renderonly_scanout *scanout; + + if (handle->plane) { + struct pipe_resource *cur = prsc; + + for (int i = 0; i < handle->plane; i++) { + cur = cur->next; + if (!cur) + return false; + } + rsc = etna_resource(cur); + } + /* Scanout is always attached to the base resource */ - struct renderonly_scanout *scanout = rsc->scanout; + scanout = rsc->scanout; handle->stride = rsc->levels[0].stride; handle->offset = rsc->levels[0].offset; @@ -608,6 +621,27 @@ etna_resource_get_handle(struct pipe_screen *pscreen, } } +static bool +etna_resource_get_param(struct pipe_screen *pscreen, + struct pipe_context *pctx, struct pipe_resource *prsc, + unsigned plane, unsigned layer, unsigned level, + enum pipe_resource_param param, + unsigned usage, uint64_t *value) +{ + switch (param) { + case PIPE_RESOURCE_PARAM_NPLANES: { + unsigned count = 0; + + for (struct pipe_resource *cur = prsc; cur; cur = cur->next) + count++; + *value = count; + return true; + } + default: + return false; + } +} + void etna_resource_used(struct etna_context *ctx, struct pipe_resource *prsc, enum etna_resource_status status) @@ -707,6 +741,7 @@ etna_resource_screen_init(struct pipe_screen *pscreen) pscreen->resource_create_with_modifiers = etna_resource_create_modifiers; pscreen->resource_from_handle = etna_resource_from_handle; pscreen->resource_get_handle = etna_resource_get_handle; + pscreen->resource_get_param = etna_resource_get_param; pscreen->resource_changed = etna_resource_changed; pscreen->resource_destroy = etna_resource_destroy; }