egl/drm: Fix misused x and y offsets in swrast_put_image2()

It fixes misused x and y variables on the calculation of the memory copy regions.

Cc: Giovanni Campagna <gcampagna@src.gnome.org>
Fixes: 8430af5ebe "Add support for swrast to the DRM EGL platform"
Signed-off-by: Mun Gwan-gyeong <elongbug@gmail.com>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>

[Eric: use gbm_bo_get_bpp() instead of local function, split clamp patch]
Signed-off-by: Eric Engestrom <eric.engestrom@imgtec.com>
This commit is contained in:
Gwan-gyeong Mun 2017-07-19 15:05:30 +01:00 committed by Eric Engestrom
parent 04a40f7d2a
commit 3a5e3aa5a5
1 changed files with 17 additions and 2 deletions

View File

@ -526,6 +526,9 @@ swrast_put_image2(__DRIdrawable *driDrawable,
struct dri2_egl_surface *dri2_surf = loaderPrivate;
int internal_stride;
struct gbm_dri_bo *bo;
uint32_t bpp;
int x_bytes, width_bytes;
char *src, *dst;
if (op != __DRI_SWRAST_IMAGE_OP_DRAW &&
op != __DRI_SWRAST_IMAGE_OP_SWAP)
@ -535,14 +538,26 @@ swrast_put_image2(__DRIdrawable *driDrawable,
return;
bo = gbm_dri_bo(dri2_surf->current->bo);
bpp = gbm_bo_get_bpp(&bo->base);
if (bpp == 0)
return;
x_bytes = x * (bpp >> 3);
width_bytes = width * (bpp >> 3);
if (gbm_dri_bo_map_dumb(bo) == NULL)
return;
internal_stride = bo->base.stride;
dst = bo->map + x_bytes + (y * internal_stride);
src = data;
for (int i = 0; i < height; i++) {
memcpy(bo->map + (x + i) * internal_stride + y,
data + i * stride, stride);
memcpy(dst, src, width_bytes);
dst += internal_stride;
src += stride;
}
gbm_dri_bo_unmap_dumb(bo);