It fixes misused x and y variables on the calculation of the memory copy regions. And it adds limits of the height and the width on the copy region.
v2 [Eric Engestrom] - Add get_format_bpp() for handling of GBM_FORMATs. It is used for the calculation of x_bytes and width_bytes. - Polish the variable name. Fixes: 8430af5ebe1ee8119e14 "Add support for swrast to the DRM EGL platform" Signed-off-by: Mun Gwan-gyeong <elong...@gmail.com> Reviewed-by: Eric Engestrom <eric.engest...@imgtec.com> --- src/egl/drivers/dri2/platform_drm.c | 48 +++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index 8e12aed0b3..00180deaf8 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -40,6 +40,29 @@ #include "egl_dri2_fallbacks.h" #include "loader.h" +static int +get_format_bpp(int format) +{ + int bpp; + + switch (format) { + case GBM_FORMAT_XRGB2101010: + case GBM_FORMAT_ARGB2101010: + case GBM_FORMAT_XRGB8888: + case GBM_FORMAT_ARGB8888: + bpp = 4; + break; + case GBM_FORMAT_RGB565: + bpp = 2; + break; + default: + bpp = 0; + break; + } + + return bpp; +} + static struct gbm_bo * lock_front_buffer(struct gbm_surface *_surf) { @@ -525,6 +548,9 @@ swrast_put_image2(__DRIdrawable *driDrawable, struct dri2_egl_surface *dri2_surf = loaderPrivate; int internal_stride; struct gbm_dri_bo *bo; + int bpp; + int x_bytes, width_bytes; + char *src, *dst; if (op != __DRI_SWRAST_IMAGE_OP_DRAW && op != __DRI_SWRAST_IMAGE_OP_SWAP) @@ -534,14 +560,32 @@ swrast_put_image2(__DRIdrawable *driDrawable, return; bo = gbm_dri_bo(dri2_surf->current->bo); + + bpp = get_format_bpp(bo->base.format); + if (bpp == 0) + return; + + x_bytes = x * bpp; + width_bytes = width * bpp; + if (gbm_dri_bo_map_dumb(bo) == NULL) return; internal_stride = bo->base.stride; + if (height > dri2_surf->base.Height - y) + height = dri2_surf->base.Height - y; + + if (width_bytes > internal_stride - x_bytes) + width_bytes = internal_stride - x_bytes; + + 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.13.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev