diff options
Diffstat (limited to 'src')
-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); |