+static void
+swrast_put_image2(__DRIdrawable *driDrawable,
+ int op,
+ int x,
+ int y,
+ int width,
+ int height,
+ int stride,
+ char *data,
+ void *loaderPrivate)
+{
+ struct dri2_egl_surface *dri2_surf = loaderPrivate;
+ int internal_stride, i;
+ struct gbm_dri_bo *bo;
+
+ if (op != __DRI_SWRAST_IMAGE_OP_DRAW &&
+ op != __DRI_SWRAST_IMAGE_OP_SWAP)
+ return;
+
+ if (get_swrast_front_bo(dri2_surf) < 0)
+ return;
+
+ bo = gbm_dri_bo(dri2_surf->current->bo);
+ if (gbm_dri_bo_map(bo) == NULL)
+ return;
+
+ internal_stride = bo->base.base.stride;
+
+ for (i = 0; i < height; i++) {
+ memcpy(bo->map + (x + i) * internal_stride + y,
+ data + i * stride, stride);
+ }
+
+ gbm_dri_bo_unmap(bo);
+}
+
+static void
+swrast_get_image(__DRIdrawable *driDrawable,
+ int x,
+ int y,
+ int width,
+ int height,
+ char *data,
+ void *loaderPrivate)
+{
+ struct dri2_egl_surface *dri2_surf = loaderPrivate;
+ int internal_stride, stride, i;
+ struct gbm_dri_bo *bo;
+
+ if (get_swrast_front_bo(dri2_surf) < 0)
+ return;
+
+ bo = gbm_dri_bo(dri2_surf->current->bo);
+ if (gbm_dri_bo_map(bo) == NULL)
+ return;
+
+ internal_stride = bo->base.base.stride;
+ stride = width * 4;
+
+ for (i = 0; i < height; i++) {
+ memcpy(data + i * stride,
+ bo->map + (x + i) * internal_stride + y, stride);
+ }
+
+ gbm_dri_bo_unmap(bo);
+}
+