sna: Pass a hint to the backends when using copy_boxes for readback

If we expect to only emit this set of copy_boxes() and then submit the
batch, we would prefer to use the BLT for its lower latency.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-07-04 17:40:58 +01:00
parent d36623aaeb
commit 54ee41bf05
14 changed files with 69 additions and 51 deletions

View File

@ -2409,7 +2409,7 @@ static inline Bool prefer_blt_fill(struct sna *sna)
#endif
}
static inline Bool prefer_blt_copy(struct sna *sna)
static inline Bool prefer_blt_copy(struct sna *sna, unsigned flags)
{
#if PREFER_BLT_COPY
return true;
@ -2864,7 +2864,7 @@ static Bool
gen2_render_copy_boxes(struct sna *sna, uint8_t alu,
PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
const BoxRec *box, int n)
const BoxRec *box, int n, unsigned flags)
{
struct sna_composite_op tmp;
@ -2882,7 +2882,7 @@ gen2_render_copy_boxes(struct sna *sna, uint8_t alu,
DBG(("%s (%d, %d)->(%d, %d) x %d\n",
__FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n));
if (prefer_blt_copy(sna) &&
if (prefer_blt_copy(sna, flags) &&
sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
@ -3048,7 +3048,7 @@ gen2_render_copy(struct sna *sna, uint8_t alu,
#endif
/* Prefer to use the BLT */
if (prefer_blt_copy(sna) &&
if (prefer_blt_copy(sna, 0) &&
sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy(sna, alu,
src_bo, dst_bo,

View File

@ -4040,7 +4040,7 @@ static Bool
gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
const BoxRec *box, int n)
const BoxRec *box, int n, unsigned flags)
{
struct sna_composite_op tmp;

View File

@ -2576,11 +2576,22 @@ gen4_render_copy_one(struct sna *sna,
FLUSH(op);
}
static inline bool prefer_blt_copy(struct sna *sna, unsigned flags)
{
#if PREFER_BLT
return true;
(void)sna;
#else
return sna->kgem.mode != KGEM_RENDER;
#endif
(void)flags;
}
static Bool
gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
const BoxRec *box, int n)
const BoxRec *box, int n, unsigned flags)
{
struct sna_composite_op tmp;
@ -2597,7 +2608,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
box, n);
#endif
if (prefer_blt(sna) &&
if (prefer_blt_copy(sna, flags) &&
sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,

View File

@ -2909,7 +2909,7 @@ static Bool
gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
const BoxRec *box, int n)
const BoxRec *box, int n, unsigned flags)
{
struct sna_composite_op tmp;

View File

@ -3238,9 +3238,11 @@ static bool prefer_blt_bo(struct sna *sna,
static inline bool prefer_blt_copy(struct sna *sna,
PixmapPtr src, struct kgem_bo *src_bo,
PixmapPtr dst, struct kgem_bo *dst_bo)
PixmapPtr dst, struct kgem_bo *dst_bo,
unsigned flags)
{
return (sna->kgem.ring == KGEM_BLT ||
(flags & COPY_LAST && sna->kgem.mode == KGEM_NONE) ||
prefer_blt_bo(sna, src, src_bo) ||
prefer_blt_bo(sna, dst, dst_bo));
}
@ -3280,7 +3282,7 @@ static Bool
gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
const BoxRec *box, int n)
const BoxRec *box, int n, unsigned flags)
{
struct sna_composite_op tmp;
@ -3302,7 +3304,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
dst_bo, dst_dx, dst_dy,
box, n)));
if (prefer_blt_copy(sna, src, src_bo, dst, dst_bo) &&
if (prefer_blt_copy(sna, src, src_bo, dst, dst_bo, flags) &&
sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
@ -3537,7 +3539,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
src->drawable.width, src->drawable.height,
dst->drawable.width, dst->drawable.height));
if (prefer_blt_copy(sna, src, src_bo, dst, dst_bo) &&
if (prefer_blt_copy(sna, src, src_bo, dst, dst_bo, 0) &&
sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy(sna, alu,
src_bo, dst_bo,

View File

@ -3322,9 +3322,11 @@ static bool prefer_blt_bo(struct sna *sna,
static inline bool prefer_blt_copy(struct sna *sna,
PixmapPtr src, struct kgem_bo *src_bo,
PixmapPtr dst, struct kgem_bo *dst_bo)
PixmapPtr dst, struct kgem_bo *dst_bo,
unsigned flags)
{
return (sna->kgem.ring == KGEM_BLT ||
(flags & COPY_LAST && sna->kgem.mode == KGEM_NONE) ||
prefer_blt_bo(sna, src, src_bo) ||
prefer_blt_bo(sna, dst, dst_bo));
}
@ -3364,7 +3366,7 @@ static Bool
gen7_render_copy_boxes(struct sna *sna, uint8_t alu,
PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
const BoxRec *box, int n)
const BoxRec *box, int n, unsigned flags)
{
struct sna_composite_op tmp;
@ -3386,7 +3388,7 @@ gen7_render_copy_boxes(struct sna *sna, uint8_t alu,
dst_bo, dst_dx, dst_dy,
box, n)));
if (prefer_blt_copy(sna, src, src_bo, dst, dst_bo) &&
if (prefer_blt_copy(sna, src, src_bo, dst, dst_bo, flags) &&
sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
@ -3644,7 +3646,7 @@ gen7_render_copy(struct sna *sna, uint8_t alu,
src->drawable.width, src->drawable.height,
dst->drawable.width, dst->drawable.height));
if (prefer_blt_copy(sna, src, src_bo, dst, dst_bo) &&
if (prefer_blt_copy(sna, src, src_bo, dst, dst_bo, 0) &&
sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy(sna, alu,
src_bo, dst_bo,

View File

@ -594,7 +594,7 @@ struct kgem_bo *sna_pixmap_change_tiling(PixmapPtr pixmap, uint32_t tiling)
if (!sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->gpu_bo, 0, 0,
pixmap, bo, 0, 0,
&box, 1)) {
&box, 1, 0)) {
DBG(("%s: copy failed\n", __FUNCTION__));
kgem_bo_destroy(&sna->kgem, bo);
return NULL;
@ -1232,7 +1232,7 @@ skip_inplace_map:
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->gpu_bo, 0, 0,
pixmap, priv->cpu_bo, 0, 0,
box, n);
box, n, COPY_LAST);
if (!ok)
sna_read_boxes(sna,
priv->gpu_bo, 0, 0,
@ -1690,7 +1690,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->gpu_bo, 0, 0,
pixmap, priv->cpu_bo, 0, 0,
box, n);
box, n, COPY_LAST);
if (!ok)
sna_read_boxes(sna,
priv->gpu_bo, 0, 0,
@ -1798,7 +1798,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->gpu_bo, 0, 0,
pixmap, priv->cpu_bo, 0, 0,
box, n);
box, n, COPY_LAST);
if (!ok)
sna_read_boxes(sna,
@ -1823,7 +1823,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->gpu_bo, 0, 0,
pixmap, priv->cpu_bo, 0, 0,
box, n);
box, n, COPY_LAST);
if (!ok)
sna_read_boxes(sna,
priv->gpu_bo, 0, 0,
@ -1848,7 +1848,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->gpu_bo, 0, 0,
pixmap, priv->cpu_bo, 0, 0,
box, n);
box, n, COPY_LAST);
if (!ok)
sna_read_boxes(sna,
priv->gpu_bo, 0, 0,
@ -2096,7 +2096,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->cpu_bo, 0, 0,
pixmap, priv->gpu_bo, 0, 0,
box, n);
box, n, 0);
if (!ok) {
if (pixmap->devPrivate.ptr == NULL) {
assert(priv->stride && priv->ptr);
@ -2134,7 +2134,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->cpu_bo, 0, 0,
pixmap, priv->gpu_bo, 0, 0,
box, 1);
box, 1, 0);
if (!ok) {
if (pixmap->devPrivate.ptr == NULL) {
assert(priv->stride && priv->ptr);
@ -2163,7 +2163,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->cpu_bo, 0, 0,
pixmap, priv->gpu_bo, 0, 0,
box, n);
box, n,0);
if (!ok) {
if (pixmap->devPrivate.ptr == NULL) {
assert(priv->stride && priv->ptr);
@ -2641,7 +2641,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->cpu_bo, 0, 0,
pixmap, priv->gpu_bo, 0, 0,
box, n);
box, n, 0);
if (!ok) {
if (pixmap->devPrivate.ptr == NULL) {
assert(priv->stride && priv->ptr);
@ -3657,7 +3657,7 @@ sna_self_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
if (!sna->render.copy_boxes(sna, alu,
pixmap, priv->gpu_bo, dx, dy,
pixmap, priv->gpu_bo, tx, ty,
box, n)) {
box, n, 0)) {
DBG(("%s: fallback - accelerated copy boxes failed\n",
__FUNCTION__));
goto fallback;
@ -3874,7 +3874,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
if (!sna->render.copy_boxes(sna, alu,
src_pixmap, src_priv->gpu_bo, src_dx, src_dy,
dst_pixmap, bo, dst_dx, dst_dy,
box, n)) {
box, n, 0)) {
DBG(("%s: fallback - accelerated copy boxes failed\n",
__FUNCTION__));
goto fallback;
@ -3909,7 +3909,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
if (!sna->render.copy_boxes(sna, alu,
src_pixmap, src_priv->gpu_bo, src_dx, src_dy,
dst_pixmap, bo, dst_dx, dst_dy,
box, n)) {
box, n, 0)) {
DBG(("%s: fallback - accelerated copy boxes failed\n",
__FUNCTION__));
goto fallback;
@ -3945,7 +3945,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
if (!sna->render.copy_boxes(sna, alu,
src_pixmap, src_priv->cpu_bo, src_dx, src_dy,
dst_pixmap, bo, dst_dx, dst_dy,
box, n)) {
box, n, 0)) {
DBG(("%s: fallback - accelerated copy boxes failed\n",
__FUNCTION__));
goto fallback;
@ -4005,7 +4005,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
if (!sna->render.copy_boxes(sna, alu,
tmp, sna_pixmap_get_bo(tmp), dx, dy,
dst_pixmap, bo, dst_dx, dst_dy,
box, n)) {
box, n, 0)) {
DBG(("%s: fallback - accelerated copy boxes failed\n",
__FUNCTION__));
tmp->drawable.pScreen->DestroyPixmap(tmp);

View File

@ -814,7 +814,7 @@ void sna_copy_fbcon(struct sna *sna)
ok = sna->render.copy_boxes(sna, GXcopy,
scratch, bo, sx, sy,
sna->front, priv->gpu_bo, dx, dy,
&box, 1);
&box, 1, 0);
if (!DAMAGE_IS_ALL(priv->gpu_damage))
sna_damage_add_box(&priv->gpu_damage, &box);
@ -2780,7 +2780,7 @@ sna_crtc_redisplay(xf86CrtcPtr crtc, RegionPtr region)
if (sna->render.copy_boxes(sna, GXcopy,
sna->front, sna_pixmap_get_bo(sna->front), 0, 0,
&tmp, sna_crtc->bo, -tx, -ty,
REGION_RECTS(region), REGION_NUM_RECTS(region)))
REGION_RECTS(region), REGION_NUM_RECTS(region), 0))
return;
}
@ -2909,7 +2909,8 @@ disable:
sna->front, new, 0, 0,
sna->front, old, 0, 0,
REGION_RECTS(region),
REGION_NUM_RECTS(region));
REGION_NUM_RECTS(region),
COPY_LAST);
kgem_submit(&sna->kgem);
sna_pixmap(sna->front)->gpu_bo = old;

View File

@ -568,7 +568,7 @@ sna_dri_copy_to_front(struct sna *sna, DrawablePtr draw, RegionPtr region,
sna->render.copy_boxes(sna, GXcopy,
(PixmapPtr)draw, src_bo, -draw->x, -draw->y,
pixmap, dst_bo, dx, dy,
boxes, n);
boxes, n, COPY_LAST);
DBG(("%s: flushing? %d\n", __FUNCTION__, flush));
if (flush) { /* STAT! */
@ -654,7 +654,7 @@ sna_dri_copy_from_front(struct sna *sna, DrawablePtr draw, RegionPtr region,
sna->render.copy_boxes(sna, GXcopy,
pixmap, src_bo, dx, dy,
(PixmapPtr)draw, dst_bo, -draw->x, -draw->y,
boxes, n);
boxes, n, COPY_LAST);
if (region == &clip)
pixman_region_fini(&clip);
@ -697,7 +697,7 @@ sna_dri_copy(struct sna *sna, DrawablePtr draw, RegionPtr region,
sna->render.copy_boxes(sna, GXcopy,
(PixmapPtr)draw, src_bo, 0, 0,
(PixmapPtr)draw, dst_bo, 0, 0,
boxes, n);
boxes, n, COPY_LAST);
if (region == &clip)
pixman_region_fini(&clip);

View File

@ -276,7 +276,7 @@ fallback:
if (!sna->render.copy_boxes(sna, GXcopy,
dst, src_bo, src_dx, src_dy,
&tmp, dst_bo, -tile.x1, -tile.y1,
clipped, c-clipped)) {
clipped, c-clipped, COPY_LAST)) {
kgem_bo_destroy(&sna->kgem, dst_bo);
if (clipped != stack)
free(clipped);
@ -316,7 +316,7 @@ fallback:
if (!sna->render.copy_boxes(sna, GXcopy,
dst, src_bo, src_dx, src_dy,
&tmp, dst_bo, -extents.x1, -extents.y1,
box, nbox)) {
box, nbox, COPY_LAST)) {
kgem_bo_destroy(&sna->kgem, dst_bo);
goto fallback;
}
@ -689,7 +689,7 @@ tile:
n = sna->render.copy_boxes(sna, GXcopy,
&tmp, src_bo, -tile.x1, -tile.y1,
dst, dst_bo, dst_dx, dst_dy,
clipped, c - clipped);
clipped, c - clipped, 0);
else
n = 1;
@ -736,7 +736,7 @@ tile:
n = sna->render.copy_boxes(sna, GXcopy,
&tmp, src_bo, -extents.x1, -extents.y1,
dst, dst_bo, dst_dx, dst_dy,
box, nbox);
box, nbox, 0);
kgem_bo_destroy(&sna->kgem, src_bo);
@ -973,7 +973,7 @@ fallback:
n = sna->render.copy_boxes(sna, GXcopy,
&tmp, src_bo, -extents.x1, -extents.y1,
dst, dst_bo, dst_dx, dst_dy,
box, nbox);
box, nbox, 0);
kgem_bo_destroy(&sna->kgem, src_bo);
@ -1144,7 +1144,7 @@ indirect_replace(struct sna *sna,
ret = sna->render.copy_boxes(sna, GXcopy,
pixmap, src_bo, 0, 0,
pixmap, bo, 0, 0,
&box, 1);
&box, 1, 0);
kgem_bo_destroy(kgem, src_bo);

View File

@ -1167,7 +1167,7 @@ sna_render_picture_extract(struct sna *sna,
if (!sna->render.copy_boxes(sna, GXcopy,
pixmap, src_bo, 0, 0,
&tmp, bo, -box.x1, -box.y1,
&box, 1)) {
&box, 1, 0)) {
kgem_bo_destroy(&sna->kgem, bo);
bo = NULL;
}

View File

@ -237,7 +237,9 @@ struct sna_render {
Bool (*copy_boxes)(struct sna *sna, uint8_t alu,
PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
const BoxRec *box, int n);
const BoxRec *box, int n, unsigned flags);
#define COPY_LAST 0x1
Bool (*copy)(struct sna *sna, uint8_t alu,
PixmapPtr src, struct kgem_bo *src_bo,
PixmapPtr dst, struct kgem_bo *dst_bo,

View File

@ -659,7 +659,7 @@ sna_tiling_fill_boxes(struct sna *sna,
if (!sna->render.copy_boxes(sna, GXcopy,
dst, dst_bo, 0, 0,
&tmp, bo, -dx, -dy,
REGION_RECTS(&this), REGION_NUM_RECTS(&this)))
REGION_RECTS(&this), REGION_NUM_RECTS(&this), 0))
goto err;
RegionTranslate(&this, -dx, -dy);
@ -671,7 +671,7 @@ sna_tiling_fill_boxes(struct sna *sna,
if (!sna->render.copy_boxes(sna, GXcopy,
&tmp, bo, 0, 0,
dst, dst_bo, dx, dy,
REGION_RECTS(&this), REGION_NUM_RECTS(&this)))
REGION_RECTS(&this), REGION_NUM_RECTS(&this), 0))
goto err;
kgem_bo_destroy(&sna->kgem, bo);
@ -898,11 +898,11 @@ sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
i = (sna->render.copy_boxes(sna, GXcopy,
src, src_bo, src_dx, src_dy,
&p, tmp_bo, -tile.x1, -tile.y1,
clipped, c - clipped) &&
clipped, c - clipped, 0) &&
sna->render.copy_boxes(sna, alu,
&p, tmp_bo, -tile.x1, -tile.y1,
dst, dst_bo, dst_dx, dst_dy,
clipped, c - clipped));
clipped, c - clipped, 0));
kgem_bo_destroy(&sna->kgem, tmp_bo);

View File

@ -5779,7 +5779,7 @@ trap_mask_converter(PicturePtr picture,
sna->render.copy_boxes(sna, GXcopy,
scratch, sna_pixmap_get_bo(scratch), -extents.x1, -extents.x1,
pixmap, priv->gpu_bo, x, y,
&extents, 1);
&extents, 1, 0);
mark_damaged(pixmap, priv, &extents ,x, y);
screen->DestroyPixmap(scratch);
@ -5857,7 +5857,7 @@ trap_upload(PicturePtr picture,
sna->render.copy_boxes(sna, GXcopy,
scratch, sna_pixmap_get_bo(scratch), -extents.x1, -extents.x1,
pixmap, priv->gpu_bo, x, y,
&extents, 1);
&extents, 1, 0);
mark_damaged(pixmap, priv, &extents, x, y);
screen->DestroyPixmap(scratch);