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); }
static _EGLImage * dri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx, EGLClientBuffer buffer, const EGLint *attr_list) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); struct gbm_dri_bo *dri_bo = gbm_dri_bo((struct gbm_bo *) buffer); struct dri2_egl_image *dri2_img; dri2_img = malloc(sizeof *dri2_img); if (!dri2_img) { _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr_pixmap"); return NULL; } if (!_eglInitImage(&dri2_img->base, disp)) { free(dri2_img); return NULL; } dri2_img->dri_image = dri2_dpy->image->dupImage(dri_bo->image, dri2_img); if (dri2_img->dri_image == NULL) { free(dri2_img); _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr_pixmap"); return NULL; } return &dri2_img->base; }
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_dumb(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_dumb(bo); }