static void qxl_fb_dirty_flush(struct fb_info *info) { struct qxl_fbdev *qfbdev = info->par; struct qxl_device *qdev = qfbdev->qdev; struct qxl_fb_image qxl_fb_image; struct fb_image *image = &qxl_fb_image.fb_image; u32 x1, x2, y1, y2; /* TODO: hard coding 32 bpp */ int stride = qfbdev->qfb.base.pitches[0] * 4; x1 = qfbdev->dirty.x1; x2 = qfbdev->dirty.x2; y1 = qfbdev->dirty.y1; y2 = qfbdev->dirty.y2; /* * we are using a shadow draw buffer, at qdev->surface0_shadow */ qxl_io_log(qdev, "dirty x[%d, %d], y[%d, %d]", x1, x2, y1, y2); image->dx = x1; image->dy = y1; image->width = x2 - x1; image->height = y2 - y1; image->fg_color = 0xffffffff; /* unused, just to avoid uninitialized warnings */ image->bg_color = 0; image->depth = 32; /* TODO: take from somewhere? */ image->cmap.start = 0; image->cmap.len = 0; image->cmap.red = NULL; image->cmap.green = NULL; image->cmap.blue = NULL; image->cmap.transp = NULL; image->data = qfbdev->shadow + (x1 * 4) + (stride * y1); qxl_fb_image_init(&qxl_fb_image, qdev, info, NULL); qxl_draw_opaque_fb(&qxl_fb_image, stride); qfbdev->dirty.x1 = 0; qfbdev->dirty.x2 = 0; qfbdev->dirty.y1 = 0; qfbdev->dirty.y2 = 0; }
/* * FIXME * It should not be necessary to have a special dirty() callback for fbdev. */ static int qxlfb_framebuffer_dirty(struct drm_framebuffer *fb, struct drm_file *file_priv, unsigned flags, unsigned color, struct drm_clip_rect *clips, unsigned num_clips) { struct qxl_device *qdev = fb->dev->dev_private; struct fb_info *info = qdev->fbdev_info; struct qxl_fbdev *qfbdev = info->par; struct qxl_fb_image qxl_fb_image; struct fb_image *image = &qxl_fb_image.fb_image; /* TODO: hard coding 32 bpp */ int stride = qfbdev->qfb.base.pitches[0]; /* * we are using a shadow draw buffer, at qdev->surface0_shadow */ qxl_io_log(qdev, "dirty x[%d, %d], y[%d, %d]", clips->x1, clips->x2, clips->y1, clips->y2); image->dx = clips->x1; image->dy = clips->y1; image->width = clips->x2 - clips->x1; image->height = clips->y2 - clips->y1; image->fg_color = 0xffffffff; /* unused, just to avoid uninitialized warnings */ image->bg_color = 0; image->depth = 32; /* TODO: take from somewhere? */ image->cmap.start = 0; image->cmap.len = 0; image->cmap.red = NULL; image->cmap.green = NULL; image->cmap.blue = NULL; image->cmap.transp = NULL; image->data = qfbdev->shadow + (clips->x1 * 4) + (stride * clips->y1); qxl_fb_image_init(&qxl_fb_image, qdev, info, NULL); qxl_draw_opaque_fb(&qxl_fb_image, stride); return 0; }