xf86-video-intel: 3 commits - src/sna/sna_display.c src/sna/sna_dri2.c

Chris Wilson ickle at kemper.freedesktop.org
Wed May 21 13:08:30 PDT 2014


 src/sna/sna_display.c |    4 ++--
 src/sna/sna_dri2.c    |   29 ++++++++++++++++++++++++-----
 2 files changed, 26 insertions(+), 7 deletions(-)

New commits:
commit 00d9396f6bf0bbbdfca7cdb1cbdbde8f0b2ad59c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 21 20:00:56 2014 +0100

    sna: Fix attachment of the default monitor to the first output
    
    Broke during code motion in
    
    commit add84cd8a8dc6d285912d0ea3a3a3e7faa9e0942
    Author: Chris Wilson <chris at chris-wilson.co.uk>
    Date:   Fri May 2 13:21:02 2014 +0100
    
        sna: Perform dynamic connector discovery
    
    Reported-and-tested-by: Jay Little <jaylittle at jaylittle.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79015
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 69d42b7..63631ef 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -2926,8 +2926,8 @@ sna_output_add(struct sna *sna, int id, int serial)
 	output->name = (char *)(output + 1);
 	memcpy(output->name, name, len + 1);
 
-	output->use_screen_monitor = config->num_output;
-	xf86OutputUseScreenMonitor(output, !config->num_output);
+	output->use_screen_monitor = config->num_output != 1;
+	xf86OutputUseScreenMonitor(output, !output->use_screen_monitor);
 
 	sna_output->id = compat_conn.conn.connector_id;
 	sna_output->is_panel = is_panel(compat_conn.conn.connector_type);
commit 5168a160a1385c23d275d616f2649d5cae7c15d9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 21 19:16:32 2014 +0100

    sna/dri2: Decouple queued events
    
    Becareful when reaping a chain on a destroyed window as some events may
    be queued ahead.
    
    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 86ce0dd..725e2c4 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -906,6 +906,7 @@ struct sna_dri2_frame_event {
 	xf86CrtcPtr crtc;
 	int pipe;
 	int count;
+	bool queued;
 
 	/* for swaps & flips only */
 	DRI2SwapEventPtr event_complete;
@@ -1074,7 +1075,11 @@ void sna_dri2_destroy_window(WindowPtr win)
 
 	while ((info = chain)) {
 		chain = info->chain;
-		sna_dri2_frame_event_info_free(sna, NULL, info);
+		if (info->queued) {
+			info->draw = NULL;
+			info->chain = NULL;
+		} else
+			sna_dri2_frame_event_info_free(sna, NULL, info);
 	}
 }
 
@@ -1120,6 +1125,7 @@ sna_dri2_page_flip(struct sna *sna, struct sna_dri2_frame_event *info)
 
 	sna->dri2.flip_pending = info;
 
+	info->queued = true;
 	swap_limit(info->draw, 1 + (info->type == FLIP_THROTTLE));
 	return true;
 }
@@ -1336,6 +1342,7 @@ static void chain_swap(struct sna *sna,
 			vbl.request.sequence = 1;
 			vbl.request.signal = (unsigned long)chain;
 
+			chain->queued = true;
 			if (!sna_wait_vblank(sna, &vbl, chain->pipe))
 				return;
 
@@ -1357,6 +1364,7 @@ static void chain_swap(struct sna *sna,
 		DRM_VBLANK_EVENT;
 	vbl.request.sequence = 1;
 	vbl.request.signal = (unsigned long)chain;
+	chain->queued = true;
 	if (sna_wait_vblank(sna, &vbl, chain->pipe)) {
 		DBG(("%s: vblank wait failed, unblocking client\n", __FUNCTION__));
 		DRI2SwapComplete(chain->client, draw,
@@ -1394,7 +1402,7 @@ static inline bool rq_is_busy(struct kgem *kgem, struct kgem_bo *bo)
 }
 
 static bool sna_dri2_blit_complete(struct sna *sna,
-				  struct sna_dri2_frame_event *info)
+				   struct sna_dri2_frame_event *info)
 {
 	if (rq_is_busy(&sna->kgem, info->bo)) {
 		union drm_wait_vblank vbl;
@@ -1408,6 +1416,7 @@ static bool sna_dri2_blit_complete(struct sna *sna,
 			DRM_VBLANK_EVENT;
 		vbl.request.sequence = 1;
 		vbl.request.signal = (unsigned long)info;
+		assert(info->queued);
 		if (!sna_wait_vblank(sna, &vbl, info->pipe))
 			return false;
 	}
@@ -1425,6 +1434,7 @@ void sna_dri2_vblank_handler(struct sna *sna, struct drm_event_vblank *event)
 
 	DBG(("%s(type=%d, sequence=%d)\n", __FUNCTION__, info->type, event->sequence));
 	assert((unsigned)info->pipe < MAX_PIPES);
+	assert(info->queued);
 	msc = sna_mode_record_event(sna, info->pipe, event);
 
 	draw = info->draw;
@@ -1459,6 +1469,7 @@ void sna_dri2_vblank_handler(struct sna *sna, struct drm_event_vblank *event)
 		vbl.request.sequence = 1;
 		vbl.request.signal = (unsigned long)info;
 
+		assert(info->queued);
 		if (!sna_wait_vblank(sna, &vbl, info->pipe))
 			return;
 
@@ -1553,8 +1564,10 @@ sna_dri2_immediate_blit(struct sna *sna,
 				vbl.request.sequence = 1;
 				vbl.request.signal = (unsigned long)info;
 				ret = !sna_wait_vblank(sna, &vbl, info->pipe);
-				if (ret)
+				if (ret) {
+					info->queued = true;
 					event = !swap_limit(draw, 2);
+				}
 			}
 			if (event) {
 				DBG(("%s: fake triple bufferring, unblocking client\n", __FUNCTION__));
@@ -1724,8 +1737,10 @@ static void chain_flip(struct sna *sna)
 			vbl.request.sequence = 1;
 			vbl.request.signal = (unsigned long)chain;
 
-			if (!sna_wait_vblank(sna, &vbl, chain->pipe))
+			if (!sna_wait_vblank(sna, &vbl, chain->pipe)) {
+				chain->queued = true;
 				return;
+			}
 		}
 #endif
 		DBG(("%s: fake triple buffering (or vblank wait failed), unblocking client\n", __FUNCTION__));
@@ -2147,6 +2162,7 @@ out:
 		return false;
 	}
 
+	info->queued = true;
 	swap_limit(draw, 1);
 	return true;
 }
@@ -2324,6 +2340,7 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	if (sna_wait_vblank(sna, &vbl, info->pipe))
 		goto blit;
 
+	info->queued = true;
 	swap_limit(draw, 1 + (info->type == SWAP_WAIT));
 	return TRUE;
 
@@ -2484,6 +2501,7 @@ sna_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw, CARD64 target_msc
 	if (sna_wait_vblank(sna, &vbl, pipe))
 		goto out_free_info;
 
+	info->queued = true;
 	DRI2BlockClient(client, draw);
 	return TRUE;
 
commit 66e14c96d0ddede90e36084a80a97c3f16c2b386
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 21 18:38:36 2014 +0100

    sna/dri2: Limit pending swaps to 1 when queueing a future blit
    
    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 e7cb26e..86ce0dd 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -1365,7 +1365,7 @@ static void chain_swap(struct sna *sna,
 				 chain->event_complete, chain->event_data);
 		sna_dri2_frame_event_info_free(sna, draw, chain);
 	} else {
-		if (!swap_limit(draw, 2)) {
+		if (chain->type == SWAP_THROTTLE && !swap_limit(draw, 2)) {
 			DBG(("%s: fake triple buffering, unblocking client\n", __FUNCTION__));
 			DRI2SwapComplete(chain->client, draw,
 					 frame, tv_sec, tv_usec,
@@ -2324,6 +2324,7 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	if (sna_wait_vblank(sna, &vbl, info->pipe))
 		goto blit;
 
+	swap_limit(draw, 1 + (info->type == SWAP_WAIT));
 	return TRUE;
 
 blit:


More information about the xorg-commit mailing list