summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mesa/drivers/dri/i965/intel_image.h3
-rw-r--r--src/mesa/drivers/dri/i965/intel_screen.c12
2 files changed, 12 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_image.h b/src/mesa/drivers/dri/i965/intel_image.h
index 78d689a11a3..a8193c6def9 100644
--- a/src/mesa/drivers/dri/i965/intel_image.h
+++ b/src/mesa/drivers/dri/i965/intel_image.h
@@ -98,6 +98,9 @@ struct __DRIimageRec {
/** Pitch of the auxiliary compression surface. */
uint32_t aux_pitch;
+ /** Total size in bytes of the auxiliary compression surface. */
+ uint32_t aux_size;
+
/**
* Provided by EGL_EXT_image_dma_buf_import.
* \{
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index cc9b3486743..768634d92e0 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -750,6 +750,7 @@ intel_create_image_common(__DRIscreen *dri_screen,
if (aux_surf.size) {
image->aux_offset = surf.size;
image->aux_pitch = aux_surf.row_pitch;
+ image->aux_size = aux_surf.size;
}
return image;
@@ -1137,6 +1138,8 @@ intel_create_image_from_fds_common(__DRIscreen *dri_screen,
return NULL;
}
+ image->aux_size = aux_surf.size;
+
const int end = image->aux_offset + aux_surf.size;
if (size < end)
size = end;
@@ -1312,7 +1315,7 @@ 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;
+ int width, height, offset, stride, size, dri_format;
__DRIimage *image;
if (parent == NULL)
@@ -1331,24 +1334,27 @@ intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate)
int index = f->planes[plane].buffer_index;
offset = parent->offsets[index];
stride = parent->strides[index];
+ size = height * stride;
} 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;
+ size = height * stride;
} 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;
+ size = parent->aux_size;
} else {
return NULL;
}
- if (offset + height * stride > parent->bo->size) {
- _mesa_warning(NULL, "intel_create_sub_image: subimage out of bounds");
+ if (offset + size > parent->bo->size) {
+ _mesa_warning(NULL, "intel_from_planar: subimage out of bounds");
return NULL;
}