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);