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:
parent
04a40f7d2a
commit
3a5e3aa5a5
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue