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>
This commit is contained in:
parent
a1e5db9888
commit
8f6e54c929
|
@ -1552,6 +1552,12 @@ isl_tiling_from_i915_tiling(uint32_t tiling);
|
|||
const struct isl_drm_modifier_info * ATTRIBUTE_CONST
|
||||
isl_drm_modifier_get_info(uint64_t modifier);
|
||||
|
||||
static inline bool
|
||||
isl_drm_modifier_has_aux(uint64_t modifier)
|
||||
{
|
||||
return isl_drm_modifier_get_info(modifier)->aux_usage != ISL_AUX_USAGE_NONE;
|
||||
}
|
||||
|
||||
struct isl_extent2d ATTRIBUTE_CONST
|
||||
isl_get_interleaved_msaa_px_size_sa(uint32_t samples);
|
||||
|
||||
|
|
|
@ -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;
|
||||
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;
|
||||
|
||||
f = parent->planar_format;
|
||||
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;
|
||||
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];
|
||||
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;
|
||||
|
|
Loading…
Reference in New Issue