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