[Mesa-dev] [PATCH v2 1/2] egl/drm: Fix misused x and y offsets on swrast_put_image2() (v2)

Gwan-gyeong Mun elongbug at gmail.com
Wed Jul 19 10:25:27 UTC 2017


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 <elongbug at gmail.com>
Reviewed-by: Eric Engestrom <eric.engestrom at 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



More information about the mesa-dev mailing list