sna: Use the cpu bo where possible as the source for texture extraction

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-01-25 23:21:36 +00:00
parent e583af9cca
commit cff6a1a2e4
1 changed files with 49 additions and 48 deletions

View File

@ -295,7 +295,7 @@ use_cpu_bo(struct sna *sna, PixmapPtr pixmap, const BoxRec *box)
if (DBG_NO_CPU_BO)
return NULL;
priv = sna_pixmap_attach(pixmap);
priv = sna_pixmap(pixmap);
if (priv == NULL || priv->cpu_bo == NULL) {
DBG(("%s: no cpu bo\n", __FUNCTION__));
return NULL;
@ -332,7 +332,7 @@ use_cpu_bo(struct sna *sna, PixmapPtr pixmap, const BoxRec *box)
int w = box->x2 - box->x1;
int h = box->y2 - box->y1;
if (pixmap->usage_hint)
if (!priv->gpu)
goto done;
if (priv->source_count*w*h >= pixmap->drawable.width * pixmap->drawable.height &&
@ -349,7 +349,7 @@ use_cpu_bo(struct sna *sna, PixmapPtr pixmap, const BoxRec *box)
done:
DBG(("%s for box=(%d, %d), (%d, %d)\n",
__FUNCTION__, box->x1, box->y1, box->x2, box->y2));
return kgem_bo_reference(priv->cpu_bo);
return priv->cpu_bo;
}
static Bool
@ -583,23 +583,25 @@ sna_render_pixmap_bo(struct sna *sna,
pixmap->drawable.width, pixmap->drawable.height));
bo = use_cpu_bo(sna, pixmap, &box);
if (bo == NULL &&
texture_is_cpu(pixmap, &box) &&
!move_to_gpu(pixmap, &box)) {
DBG(("%s: uploading CPU box (%d, %d), (%d, %d)\n",
__FUNCTION__, box.x1, box.y1, box.x2, box.y2));
bo = upload(sna, channel, pixmap, &box);
}
if (bo == NULL) {
priv = sna_pixmap_move_to_gpu(pixmap, MOVE_READ);
if (priv) {
bo = kgem_bo_reference(priv->gpu_bo);
} else {
DBG(("%s: failed to upload pixmap to gpu, uploading CPU box (%d, %d), (%d, %d) instead\n",
if (bo) {
bo = kgem_bo_reference(bo);
} else {
if (texture_is_cpu(pixmap, &box) && !move_to_gpu(pixmap, &box)) {
DBG(("%s: uploading CPU box (%d, %d), (%d, %d)\n",
__FUNCTION__, box.x1, box.y1, box.x2, box.y2));
bo = upload(sna, channel, pixmap, &box);
}
if (bo == NULL) {
priv = sna_pixmap_move_to_gpu(pixmap, MOVE_READ);
if (priv) {
bo = kgem_bo_reference(priv->gpu_bo);
} else {
DBG(("%s: failed to upload pixmap to gpu, uploading CPU box (%d, %d), (%d, %d) instead\n",
__FUNCTION__, box.x1, box.y1, box.x2, box.y2));
bo = upload(sna, channel, pixmap, &box);
}
}
}
channel->bo = bo;
@ -870,7 +872,7 @@ sna_render_picture_extract(struct sna *sna,
int16_t w, int16_t h,
int16_t dst_x, int16_t dst_y)
{
struct kgem_bo *bo = NULL;
struct kgem_bo *bo = NULL, *src_bo;
PixmapPtr pixmap = get_drawable_pixmap(picture->pDrawable);
int16_t ox, oy, ow, oh;
BoxRec box;
@ -962,49 +964,48 @@ sna_render_picture_extract(struct sna *sna,
dst_x, dst_y);
}
if (texture_is_cpu(pixmap, &box) && !move_to_gpu(pixmap, &box)) {
bo = kgem_upload_source_image(&sna->kgem,
pixmap->devPrivate.ptr,
&box,
pixmap->devKind,
pixmap->drawable.bitsPerPixel);
if (bo == NULL) {
DBG(("%s: failed to upload source image, using clear\n",
__FUNCTION__));
return 0;
}
} else {
if (!sna_pixmap_move_to_gpu(pixmap, MOVE_READ)) {
DBG(("%s: falback -- pixmap is not on the GPU\n",
__FUNCTION__));
return sna_render_picture_fixup(sna, picture, channel,
x, y, ow, oh, dst_x, dst_y);
}
src_bo = use_cpu_bo(sna, pixmap, &box);
if (src_bo == NULL) {
if (texture_is_cpu(pixmap, &box) &&
!move_to_gpu(pixmap, &box)) {
bo = kgem_upload_source_image(&sna->kgem,
pixmap->devPrivate.ptr,
&box,
pixmap->devKind,
pixmap->drawable.bitsPerPixel);
} else {
struct sna_pixmap *priv;
priv = sna_pixmap_move_to_gpu(pixmap, MOVE_READ);
if (priv)
src_bo = priv->gpu_bo;
}
}
if (src_bo) {
bo = kgem_create_2d(&sna->kgem, w, h,
pixmap->drawable.bitsPerPixel,
kgem_choose_tiling(&sna->kgem,
I915_TILING_X, w, h,
pixmap->drawable.bitsPerPixel),
0);
if (!bo) {
DBG(("%s: failed to create bo, using clear\n",
__FUNCTION__));
return 0;
}
if (!sna_blt_copy_boxes(sna, GXcopy,
sna_pixmap_get_bo(pixmap), 0, 0,
if (bo && !sna_blt_copy_boxes(sna, GXcopy,
src_bo, 0, 0,
bo, -box.x1, -box.y1,
pixmap->drawable.bitsPerPixel,
&box, 1)) {
DBG(("%s: fallback -- unable to copy boxes\n",
__FUNCTION__));
return sna_render_picture_fixup(sna, picture, channel,
x, y, ow, oh, dst_x, dst_y);
kgem_bo_destroy(&sna->kgem, bo);
bo = NULL;
}
}
if (bo == NULL) {
DBG(("%s: falback -- pixmap is not on the GPU\n",
__FUNCTION__));
return sna_render_picture_fixup(sna, picture, channel,
x, y, ow, oh, dst_x, dst_y);
}
if (ox == x && oy == y) {
x = y = 0;
} else if (channel->transform) {