mapImage can return a different stride value. This value must be
used for the mapped address.
BUG=b:
38152101 b:
79346377
TEST=graphics_Sanity autotest passed
Change-Id: Ie0eb716291366ae6a047d704f66d24ec41738713
Signed-off-by: Satyajit Sahu <satyajit.sahu@amd.com>
Reviewed-on: https://chromium-review.googlesource.com/
1041369
Commit-Ready: Bernie Thompson <bhthompson@chromium.org>
Tested-by: Drew Davenport <ddavenport@chromium.org>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
void *dri_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t map_flags)
{
struct dri_driver *dri = bo->drv->priv;
- int stride;
/* GBM flags and DRI flags are the same. */
- vma->addr = dri->image_extension->mapImage(dri->context, bo->priv, 0, 0, bo->width,
- bo->height, map_flags, &stride, &vma->priv);
+ vma->addr =
+ dri->image_extension->mapImage(dri->context, bo->priv, 0, 0, bo->width, bo->height,
+ map_flags, (int *)&vma->map_strides[plane], &vma->priv);
if (!vma->addr)
return MAP_FAILED;
}
mapping.vma = calloc(1, sizeof(*mapping.vma));
+ memcpy(mapping.vma->map_strides, bo->strides, sizeof(mapping.vma->map_strides));
addr = bo->drv->backend->bo_map(bo, mapping.vma, plane, map_flags);
if (addr == MAP_FAILED) {
*map_data = NULL;
uint32_t handle;
uint32_t map_flags;
int32_t refcount;
+ uint32_t map_strides[DRV_MAX_PLANES];
void *priv;
};
if (!bo || width == 0 || height == 0 || !stride || !map_data)
return NULL;
- *stride = gbm_bo_get_plane_stride(bo, plane);
map_flags = (transfer_flags & GBM_BO_TRANSFER_READ) ? BO_MAP_READ : BO_MAP_NONE;
map_flags |= (transfer_flags & GBM_BO_TRANSFER_WRITE) ? BO_MAP_WRITE : BO_MAP_NONE;
if (addr == MAP_FAILED)
return MAP_FAILED;
- offset = gbm_bo_get_plane_stride(bo, plane) * rect.y;
+ *stride = ((struct mapping *)*map_data)->vma->map_strides[plane];
+
+ offset = *stride * rect.y;
offset += drv_stride_from_format(bo->gbm_format, rect.x, plane);
return (void *)((uint8_t *)addr + offset);
}