xf86-video-intel: 2 commits - src/sna/sna_accel.c src/sna/sna_dri.c src/sna/sna.h
Chris Wilson
ickle at kemper.freedesktop.org
Tue Feb 21 05:22:07 PST 2012
src/sna/sna.h | 1 +
src/sna/sna_accel.c | 4 ++--
src/sna/sna_dri.c | 39 ++++++++++++++++++++++-----------------
3 files changed, 25 insertions(+), 19 deletions(-)
New commits:
commit 1541f1afca028453379083e564bc82debf0ba39a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Feb 21 13:17:35 2012 +0000
sna: Skip the CPU synchronization when marking a pixmap as inactive
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 575c213..00fc80a 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -442,6 +442,7 @@ struct kgem_bo *sna_pixmap_change_tiling(PixmapPtr pixmap, uint32_t tiling);
#define MOVE_WRITE 0x1
#define MOVE_READ 0x2
#define MOVE_INPLACE_HINT 0x4
+#define MOVE_ASYNC_HINT 0x8
bool must_check _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned flags);
static inline bool must_check sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned flags)
{
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 72c3907..3b417cc 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1058,7 +1058,7 @@ skip_inplace_map:
}
done:
- if (priv->cpu_bo) {
+ if ((flags & MOVE_ASYNC_HINT) == 0 && priv->cpu_bo) {
DBG(("%s: syncing CPU bo\n", __FUNCTION__));
kgem_bo_sync__cpu(&sna->kgem, priv->cpu_bo);
}
@@ -11763,7 +11763,7 @@ static void sna_accel_inactive(struct sna *sna)
DBG(("%s: discarding inactive GPU bo handle=%d\n",
__FUNCTION__, priv->gpu_bo->handle));
if (!sna_pixmap_move_to_cpu(priv->pixmap,
- MOVE_READ | MOVE_WRITE))
+ MOVE_READ | MOVE_WRITE | MOVE_ASYNC_HINT))
list_add(&priv->inactive, &preserve);
}
}
commit 74fd55a96bd6c63e9c49a4b7fee7ef91f6b00a2c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Feb 21 13:11:32 2012 +0000
sna/dri: Ensure that we reattach to the DRI2 front buffer after modeswitch
If we change the Screen pixmap due to a change of mode, we lose the
flag that we've attached a DRI2 buffer to it. So the next time we try to
copy from/to it, reassert its DRI2 status.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 58a3e3c..78d9a6e 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -164,7 +164,7 @@ static struct kgem_bo *sna_pixmap_set_dri(struct sna *sna,
return NULL;
if (priv->flush)
- return ref(priv->gpu_bo);
+ return priv->gpu_bo;
tiling = color_tiling(sna, &pixmap->drawable);
if (tiling < 0)
@@ -182,7 +182,7 @@ static struct kgem_bo *sna_pixmap_set_dri(struct sna *sna,
/* Don't allow this named buffer to be replaced */
priv->pinned = 1;
- return ref(priv->gpu_bo);
+ return priv->gpu_bo;
}
static DRI2Buffer2Ptr
@@ -201,16 +201,15 @@ sna_dri_create_buffer(DrawablePtr drawable,
__FUNCTION__, attachment, format,
drawable->width, drawable->height));
- buffer = calloc(1, sizeof *buffer + sizeof *private);
- if (buffer == NULL)
- return NULL;
-
pixmap = NULL;
- bo = NULL;
switch (attachment) {
case DRI2BufferFrontLeft:
pixmap = get_drawable_pixmap(drawable);
bo = sna_pixmap_set_dri(sna, pixmap);
+ if (bo == NULL)
+ return NULL;
+
+ bo = ref(bo);
bpp = pixmap->drawable.bitsPerPixel;
DBG(("%s: attaching to front buffer %dx%d [%p:%d]\n",
__FUNCTION__,
@@ -276,9 +275,13 @@ sna_dri_create_buffer(DrawablePtr drawable,
break;
default:
- break;
+ return NULL;
}
if (bo == NULL)
+ return NULL;
+
+ buffer = calloc(1, sizeof *buffer + sizeof *private);
+ if (buffer == NULL)
goto err;
private = get_private(buffer);
@@ -293,10 +296,8 @@ sna_dri_create_buffer(DrawablePtr drawable,
private->pixmap = pixmap;
private->bo = bo;
- if (buffer->name == 0) {
- kgem_bo_destroy(&sna->kgem, bo);
+ if (buffer->name == 0)
goto err;
- }
if (pixmap)
pixmap->refcnt++;
@@ -304,6 +305,7 @@ sna_dri_create_buffer(DrawablePtr drawable,
return buffer;
err:
+ kgem_bo_destroy(&sna->kgem, bo);
free(buffer);
return NULL;
}
@@ -505,22 +507,27 @@ sna_dri_copy_region(DrawablePtr draw,
DRI2BufferPtr dst_buffer,
DRI2BufferPtr src_buffer)
{
+ PixmapPtr pixmap = get_drawable_pixmap(draw);
+ struct sna *sna = to_sna_from_pixmap(pixmap);
struct kgem_bo *src, *dst;
if (dst_buffer->attachment == DRI2BufferFrontLeft)
- dst = sna_pixmap_get_bo(get_drawable_pixmap(draw));
+ dst = sna_pixmap_set_dri(sna, pixmap);
else
dst = get_private(dst_buffer)->bo;
if (src_buffer->attachment == DRI2BufferFrontLeft)
- src = sna_pixmap_get_bo(get_drawable_pixmap(draw));
+ src = sna_pixmap_set_dri(sna, pixmap);
else
src = get_private(src_buffer)->bo;
+ assert(dst != NULL);
+ assert(src != NULL);
+
DBG(("%s: dst -- attachment=%d, name=%d, handle=%d [screen=%d]\n",
__FUNCTION__,
dst_buffer->attachment, dst_buffer->name, dst->handle,
- sna_pixmap_get_bo(to_sna_from_drawable(draw)->front)->handle));
+ sna_pixmap_get_bo(sna->front)->handle));
DBG(("%s: src -- attachment=%d, name=%d, handle=%d\n",
__FUNCTION__,
src_buffer->attachment, src_buffer->name, src->handle));
@@ -529,10 +536,8 @@ sna_dri_copy_region(DrawablePtr draw,
region->extents.x1, region->extents.y1,
region->extents.x2, region->extents.y2,
REGION_NUM_RECTS(region)));
- assert(dst != NULL);
- assert(src != NULL);
- sna_dri_copy(to_sna_from_drawable(draw), draw, region, dst, src, false);
+ sna_dri_copy(sna, draw, region, dst, src, false);
}
#if DRI2INFOREC_VERSION >= 4
More information about the xorg-commit
mailing list