[Mesa-stable] [PATCH] i965: Fix bugs in intel_from_planar

Daniel Stone daniels at collabora.com
Mon Feb 12 17:54:41 UTC 2018


From: Jason Ekstrand <jason at jlekstrand.net>

This commit fixes two bugs in intel_from_planar.  First, if the planar
format was non-NULL but only had a single plane, we were falling through
to the planar case.  If we had a CCS modifier and plane == 1, we would
return NULL instead of the CCS plane.  Second, if we did end up in the
planar_format == NULL case and the modifier was DRM_FORMAT_MOD_INVALID,
we would end up segfaulting in isl_drm_modifier_has_aux.

Cc: mesa-stable at lists.freedesktop.org
Fixes: 8f6e54c92966bb94a3f05f2cc7ea804273e125ad
Signed-off-by: Daniel Stone <daniels at collabora.com>
---
 src/mesa/drivers/dri/i965/intel_screen.c | 56 +++++++++++++++++---------------
 1 file changed, 29 insertions(+), 27 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index 61d33311142..7dfaec63779 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -1312,42 +1312,44 @@ intel_query_dma_buf_modifiers(__DRIscreen *_screen, int fourcc, int max,
 static __DRIimage *
 intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate)
 {
-    int width, height, offset, stride, dri_format, index;
-    const struct intel_image_format *f;
+    int width, height, offset, stride, dri_format;
     __DRIimage *image;
 
-    if (parent == NULL) {
+    if (parent == NULL)
        return NULL;
-    } else if (parent->planar_format == NULL) {
-       const bool is_aux =
-          isl_drm_modifier_has_aux(parent->modifier) && plane == 1;
-       if (!is_aux)
-          return NULL;
-
-       width = parent->width;
-       height = parent->height;
-       dri_format = parent->dri_format;
-       offset = parent->aux_offset;
-       stride = parent->aux_pitch;
-    } else {
-       /* Planar formats don't support aux buffers/images */
-       assert(!isl_drm_modifier_has_aux(parent->modifier));
-       f = parent->planar_format;
 
-       if (plane >= f->nplanes)
-          return NULL;
+    width = parent->width;
+    height = parent->height;
 
-       width = parent->width >> f->planes[plane].width_shift;
-       height = parent->height >> f->planes[plane].height_shift;
+    const struct intel_image_format *f = parent->planar_format;
+
+    if (f && plane < f->nplanes) {
+       /* Use the planar format definition. */
+       width >>= f->planes[plane].width_shift;
+       height >>= f->planes[plane].height_shift;
        dri_format = f->planes[plane].dri_format;
-       index = f->planes[plane].buffer_index;
+       int index = f->planes[plane].buffer_index;
        offset = parent->offsets[index];
        stride = parent->strides[index];
+    } else if (plane == 0) {
+       /* The only plane of a non-planar image: copy the parent definition
+        * directly. */
+       dri_format = parent->dri_format;
+       offset = parent->offset;
+       stride = parent->pitch;
+    } else if (plane == 1 && parent->modifier != DRM_FORMAT_MOD_INVALID &&
+               isl_drm_modifier_has_aux(parent->modifier)) {
+       /* Auxiliary plane */
+       dri_format = parent->dri_format;
+       offset = parent->aux_offset;
+       stride = parent->aux_pitch;
+    } else {
+       return NULL;
+    }
 
-       if (offset + height * stride > parent->bo->size) {
-          _mesa_warning(NULL, "intel_create_sub_image: subimage out of bounds");
-          return NULL;
-       }
+    if (offset + height * stride > parent->bo->size) {
+       _mesa_warning(NULL, "intel_create_sub_image: subimage out of bounds");
+       return NULL;
     }
 
     image = intel_allocate_image(parent->screen, dri_format, loaderPrivate);
-- 
2.14.3



More information about the mesa-stable mailing list