diff options
author | Daniel Stone <[email protected]> | 2018-02-12 17:54:41 +0000 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-02-12 15:14:45 -0800 |
commit | c2c4e5bae3ba27bbdaafd8787a3e96266f82e70c (patch) | |
tree | 154d5530b94d3158ea606dd3b6ae45c66c145784 | |
parent | 1aed66dc1e7391914ba9ae5fd692cc97fc728096 (diff) |
i965: Fix bugs in intel_from_planar
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: [email protected]
Fixes: 8f6e54c92966bb94a3f05f2cc7ea804273e125ad
Signed-off-by: Daniel Stone <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_screen.c | 56 |
1 files 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 1f866cf8459..1c0fffa2e96 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); |