xf86-video-intel: 2 commits - src/sna/sna_dri2.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri Jun 12 06:11:10 PDT 2015
src/sna/sna_dri2.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
New commits:
commit d46c793663d2b1b5ffb923500111b7affa8402b6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 12 13:50:35 2015 +0100
sna/dri2: Remove the active_scanout flag when deleting the event
If we cancel the event, make sure we remove active_scanout marker.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index 0e50718..187e53f 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -763,6 +763,11 @@ static void _sna_dri2_destroy_buffer(struct sna *sna, DRI2Buffer2Ptr buffer)
private->pixmap = NULL;
}
+ if (private->copy) {
+ private->copy->active_scanout--;
+ kgem_bo_destroy(&sna->kgem, private->copy);
+ }
+
if (private->pixmap) {
PixmapPtr pixmap = private->pixmap;
struct sna_pixmap *priv = sna_pixmap(pixmap);
@@ -2271,6 +2276,8 @@ static void chain_swap(struct sna_dri2_event *chain)
__sna_dri2_copy_event(chain, DRI2_BO);
}
get_private(chain->back)->bo = tmp;
+ kgem_bo_destroy(&chain->sna->kgem,
+ get_private(chain->back)->copy);
get_private(chain->back)->copy = NULL;
case SWAP:
break;
@@ -2488,9 +2495,12 @@ sna_dri2_immediate_blit(struct sna *sna,
get_private(info->back)->copy ? get_private(info->back)->copy->active_scanout : 0,
get_private(info->back)->copy ? get_private(info->back)->copy->handle : 0));
assert(get_private(info->back)->bo->active_scanout == 0);
- if (get_private(info->back)->copy)
+ if (get_private(info->back)->copy) {
get_private(info->back)->copy->active_scanout--;
- get_private(info->back)->copy = get_private(info->back)->bo;
+ kgem_bo_destroy(&chain->sna->kgem,
+ get_private(chain->back)->copy);
+ }
+ get_private(info->back)->copy = ref(get_private(info->back)->bo);
get_private(info->back)->bo->active_scanout++;
if (chain->chain != info && chain->chain->type == SWAP_THROTTLE) {
commit 4c17a20a71d94de392a7ca068ca01c755da8e74d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 12 13:44:41 2015 +0100
sna/dri2: Keep the async swap event alive until the copy is complete
Although we are ordered wrt to the client, there is no point allowing
the client to continue submitting rendering and eventually blocking
whilst we are still waiting for the previous frame to be shown.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index 9bfa9c5..0e50718 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -1004,6 +1004,7 @@ static bool is_front(int attachment)
#define DRI2_SYNC 0x1
#define DRI2_DAMAGE 0x2
+#define DRI2_BO 0x4
static struct kgem_bo *
__sna_dri2_copy_region(struct sna *sna, DrawablePtr draw, RegionPtr region,
DRI2BufferPtr src, DRI2BufferPtr dst,
@@ -1233,7 +1234,7 @@ __sna_dri2_copy_region(struct sna *sna, DrawablePtr draw, RegionPtr region,
boxes, n, hint);
DBG(("%s: flushing? %d\n", __FUNCTION__, sync));
- if (flags & DRI2_SYNC) { /* STAT! */
+ if (flags & (DRI2_SYNC | DRI2_BO)) { /* STAT! */
struct kgem_request *rq = sna->kgem.next_request;
kgem_submit(&sna->kgem);
if (rq->bo) {
@@ -2267,7 +2268,7 @@ static void chain_swap(struct sna_dri2_event *chain)
sna_dri2_xchg_crtc(chain->sna, chain->draw, chain->crtc, chain->front, chain->back);
} else {
assert(chain->queued);
- __sna_dri2_copy_event(chain, 0);
+ __sna_dri2_copy_event(chain, DRI2_BO);
}
get_private(chain->back)->bo = tmp;
get_private(chain->back)->copy = NULL;
@@ -2463,7 +2464,7 @@ sna_dri2_immediate_blit(struct sna *sna,
DBG(("%s: no pending blit, starting chain\n", __FUNCTION__));
info->queued = true;
- __sna_dri2_copy_event(info, sync);
+ __sna_dri2_copy_event(info, sync | DRI2_BO);
VG_CLEAR(vbl);
vbl.request.type =
More information about the xorg-commit
mailing list