diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2017-05-30 17:23:59 +0530 |
---|---|---|
committer | Jason Ekstrand <jason.ekstrand@intel.com> | 2017-08-14 10:43:30 -0700 |
commit | 8f6e54c92966bb94a3f05f2cc7ea804273e125ad (patch) | |
tree | 60f2423925e086106757501b8ad39401cf261312 /src/mesa | |
parent | a1e5db98886eea14bb759922523c57f8ba0d8add (diff) |
i965: Pretend that CCS modified images are two planes
v2: move is_aux into if block. (Jason)
Use else block instead of goto (Jason)
v3: Fix up logic for is_aux (Ben)
Fix up size calculations and add FIXME (Ben)
v4 (Jason Ekstrand):
Use the aux_pitch in the image instead of calculating it
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Acked-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
Reviewed-by: Chad Versace <chadversary@chromium.org>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_screen.c | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c index 673fb6d7516..e448a2aecc6 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -763,7 +763,7 @@ intel_query_image(__DRIimage *image, int attrib, int *value) case __DRI_IMAGE_ATTRIB_FOURCC: return intel_lookup_fourcc(image->dri_format, value); case __DRI_IMAGE_ATTRIB_NUM_PLANES: - *value = 1; + *value = isl_drm_modifier_has_aux(image->modifier) ? 2 : 1; return true; case __DRI_IMAGE_ATTRIB_OFFSET: *value = image->offset; @@ -1171,31 +1171,44 @@ intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate) const struct intel_image_format *f; __DRIimage *image; - if (parent == NULL || parent->planar_format == NULL) - return NULL; - - f = parent->planar_format; - - if (plane >= f->nplanes) - return NULL; - - width = parent->width >> f->planes[plane].width_shift; - height = parent->height >> f->planes[plane].height_shift; - dri_format = f->planes[plane].dri_format; - index = f->planes[plane].buffer_index; - offset = parent->offsets[index]; - stride = parent->strides[index]; + 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 >> f->planes[plane].width_shift; + height = parent->height >> f->planes[plane].height_shift; + dri_format = f->planes[plane].dri_format; + index = f->planes[plane].buffer_index; + offset = parent->offsets[index]; + stride = parent->strides[index]; + + 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); if (image == NULL) return NULL; - if (offset + height * stride > parent->bo->size) { - _mesa_warning(NULL, "intel_create_sub_image: subimage out of bounds"); - free(image); - return NULL; - } - image->bo = parent->bo; brw_bo_reference(parent->bo); image->modifier = parent->modifier; |