예제 #1
0
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);
}
예제 #2
0
파일: platform_drm.c 프로젝트: Haifen/mesa
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);
}