From 3a5e3aa5a53cff55a5e31766d713a41ffa5a93d7 Mon Sep 17 00:00:00 2001 From: Gwan-gyeong Mun Date: Wed, 19 Jul 2017 15:05:30 +0100 Subject: [PATCH] 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 Fixes: 8430af5ebe1ee8119e14 "Add support for swrast to the DRM EGL platform" Signed-off-by: Mun Gwan-gyeong Reviewed-by: Eric Engestrom Reviewed-by: Emil Velikov [Eric: use gbm_bo_get_bpp() instead of local function, split clamp patch] Signed-off-by: Eric Engestrom --- src/egl/drivers/dri2/platform_drm.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index d59009f..b1cb3e1 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -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); -- 2.7.4