From 13859c769f0e00291bda9bd60f0600c45ac17a03 Mon Sep 17 00:00:00 2001 From: Philipp Zabel Date: Thu, 14 Feb 2019 18:40:57 +0100 Subject: [PATCH] gallium/dri: fix dri2_from_planar for multiplanar images MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix the gbm_dri_bo_get_handle_for_plane use case by allowing plane > 0 in dri2_from_planar for images with multiple planes in separate chained texture resources. Not all multiplanar resources are chained, though. The iris aux buffer is a separate plane in the same resource. Signed-off-by: Philipp Zabel Signed-off-by: Lucas Stach Reviewed-by: Marek Olšák Part-of: --- src/gallium/frontends/dri/dri2.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index 86ac38df1f4..3ed55866ad7 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -1379,18 +1379,28 @@ static __DRIimage * dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate) { __DRIimage *img; + struct pipe_resource *tex = image->texture; + int i; if (plane < 0) { return NULL; } else if (plane > 0) { uint64_t planes; - if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_NPLANES, 0, - &planes) || + if (dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_NPLANES, 0, + &planes) && plane >= planes) { return NULL; } } + if (tex->next) { + for (i = 0; i < plane; i++) { + tex = tex->next; + if (!tex) + return NULL; + } + } + if (image->dri_components == 0) { uint64_t modifier; if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_MODIFIER, 0, @@ -1404,6 +1414,8 @@ dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate) if (img == NULL) return NULL; + pipe_resource_reference(&img->texture, tex); + if (img->texture->screen->resource_changed) img->texture->screen->resource_changed(img->texture->screen, img->texture);