xf86-video-intel: 9 commits - configure.ac src/intel_module.c src/sna/kgem.c src/sna/Makefile.am src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna_display.c src/sna/sna_dri.c src/sna/sna.h src/sna/sna_render.h

Chris Wilson ickle at kemper.freedesktop.org
Fri Jun 10 11:54:35 PDT 2011


 configure.ac          |   38 --------
 src/intel_module.c    |   60 -------------
 src/sna/Makefile.am   |   21 ----
 src/sna/kgem.c        |   14 +--
 src/sna/sna.h         |    6 -
 src/sna/sna_accel.c   |    3 
 src/sna/sna_blt.c     |   15 +++
 src/sna/sna_display.c |   71 +++++++++++-----
 src/sna/sna_dri.c     |  215 +++++++++++++++++++++++++-------------------------
 src/sna/sna_render.h  |   24 -----
 10 files changed, 193 insertions(+), 274 deletions(-)

New commits:
commit d0d65940b4f4d4993eccb8c66ec7e8b633b331da
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 19:51:12 2011 +0100

    sna: Remove the ability to disable chipset specific code
    
    This was a fun little, but pointless, exercise.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/configure.ac b/configure.ac
index 31106af..5f193b3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -94,7 +94,7 @@ AC_ARG_ENABLE(kms-only, AS_HELP_STRING([--enable-kms-only],
 
 AC_ARG_ENABLE(sna,
 	      AS_HELP_STRING([--enable-sna],
-			     [Enable SandyBridge's New Acceleration (SNA) [options=default|gen2|gen3|ge4|gen5|gen6]]),
+			     [Enable SandyBridge's New Acceleration (SNA) [default=no]]),
 	      [SNA="$enableval"],
 	      [SNA=no])
 
@@ -187,42 +187,8 @@ if test "x$VMAP" = xyes; then
 fi
 
 AM_CONDITIONAL(SNA, test x$SNA != xno)
-AM_CONDITIONAL(SNA_GEN2, [echo $SNA | grep -E -qsi '(yes)|(all)|(gen2)'])
-AM_CONDITIONAL(SNA_GEN3, [echo $SNA | grep -E -qsi '(yes)|(all)|(pnv)|(gen3)'])
-AM_CONDITIONAL(SNA_GEN4, [echo $SNA | grep -E -qsi '(yes)|(all)|(brw)|(gen4)'])
-AM_CONDITIONAL(SNA_GEN5, [echo $SNA | grep -E -qsi '(yes)|(all)|(ilk)|(gen5)'])
-AM_CONDITIONAL(SNA_GEN6, [echo $SNA | grep -E -qsi '(yes)|(all)|(snb)|(gen6)'])
 AC_MSG_CHECKING([whether to include SNA support])
-sna_drivers="no"
-if test "x$SNA" != xno; then
-	sna_drivers=""
-	AC_DEFINE(SNA,1,[Enable SandyBridge's New Architecture])
-	if echo $SNA | grep -E -qsi '(yes)|(default)'; then
-		AC_DEFINE(SNA_DEFAULT,1,[Enable SandyBridge's New Architecture by default])
-		sna_drivers="default $sna_drivers"
-	fi
-	if echo $SNA | grep -E -qsi '(yes)|(all)|(gen2)'; then
-		AC_DEFINE(SNA_GEN2,1,[Enable SandyBridge's New Architecture for GEN2])
-		sna_drivers="i8xx $sna_drivers"
-	fi
-	if echo $SNA | grep -E -qsi '(yes)|(all)|(pnv)|(gen3)'; then
-		AC_DEFINE(SNA_GEN3,1,[Enable SandyBridge's New Architecture for PNV])
-		sna_drivers="pnv $sna_drivers"
-	fi
-	if echo $SNA | grep -E -qsi '(yes)|(all)|(brw)|(gen4)'; then
-		AC_DEFINE(SNA_GEN4,1,[Enable SandyBridge's New Architecture for BRW])
-		sna_drivers="brw $sna_drivers"
-	fi
-	if echo $SNA | grep -E -qsi '(yes)|(all)|(ilk)|(gen5)'; then
-		AC_DEFINE(SNA_GEN5,1,[Enable SandyBridge's New Architecture for ILK])
-		sna_drivers="ilk $sna_drivers"
-	fi
-	if echo $SNA | grep -E -qsi '(yes)|(all)|(snb)|(gen6)'; then
-		AC_DEFINE(SNA_GEN6,1,[Enable SandyBridge's New Architecture for SNB])
-		sna_drivers="snb $sna_drivers"
-	fi
-fi
-AC_MSG_RESULT([$sna_drivers])
+AC_MSG_RESULT([$SNA])
 
 AM_CONDITIONAL(DEBUG, test x$DEBUG != xno)
 if test "x$DEBUG" = xno; then
diff --git a/src/intel_module.c b/src/intel_module.c
index bec3d0f..63a63b8 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -334,40 +334,8 @@ static Bool intel_pci_probe(DriverPtr		driver,
 			break;
 #endif
 
-#if SNA
-		case 0:
-#if SNA_GEN2
-		case PCI_CHIP_I830_M:
-		case PCI_CHIP_845_G:
-		case PCI_CHIP_I854:
-		case PCI_CHIP_I855_GM:
-		case PCI_CHIP_I865_G:
-#endif
-#if SNA_GEN3
-		case PCI_CHIP_PINEVIEW_M:
-		case PCI_CHIP_PINEVIEW_G:
-		case PCI_CHIP_G33_G:
-		case PCI_CHIP_Q35_G:
-		case PCI_CHIP_Q33_G:
-#endif
-#if SNA_GEN5
-		case PCI_CHIP_IRONLAKE_D_G:
-		case PCI_CHIP_IRONLAKE_M_G:
-#endif
-#if SNA_GEN6
-		case PCI_CHIP_SANDYBRIDGE_GT1:
-		case PCI_CHIP_SANDYBRIDGE_GT2:
-		case PCI_CHIP_SANDYBRIDGE_GT2_PLUS:
-		case PCI_CHIP_SANDYBRIDGE_M_GT1:
-		case PCI_CHIP_SANDYBRIDGE_M_GT2:
-		case PCI_CHIP_SANDYBRIDGE_M_GT2_PLUS:
-		case PCI_CHIP_SANDYBRIDGE_S_GT:
-#endif
-			sna_init_scrn(scrn, entity_num);
-			break;
-#endif
 		default:
-#if SNA_DEFAULT
+#if SNA
 			sna_init_scrn(scrn, entity_num);
 #else
 			intel_init_scrn(scrn);
@@ -407,32 +375,8 @@ intel_available_options(int chipid, int busid)
 		return lg_i810_available_options(chipid, busid);
 #endif
 
-#if SNA
-	case 0:
-#if SNA_GEN3
-	case PCI_CHIP_PINEVIEW_M:
-	case PCI_CHIP_PINEVIEW_G:
-	case PCI_CHIP_G33_G:
-	case PCI_CHIP_Q35_G:
-	case PCI_CHIP_Q33_G:
-#endif
-#if SNA_GEN5
-	case PCI_CHIP_IRONLAKE_D_G:
-	case PCI_CHIP_IRONLAKE_M_G:
-#endif
-#if SNA_GEN6
-	case PCI_CHIP_SANDYBRIDGE_GT1:
-	case PCI_CHIP_SANDYBRIDGE_GT2:
-	case PCI_CHIP_SANDYBRIDGE_GT2_PLUS:
-	case PCI_CHIP_SANDYBRIDGE_M_GT1:
-	case PCI_CHIP_SANDYBRIDGE_M_GT2:
-	case PCI_CHIP_SANDYBRIDGE_M_GT2_PLUS:
-	case PCI_CHIP_SANDYBRIDGE_S_GT:
-#endif
-		return sna_available_options(chipid, busid);
-#endif
 	default:
-#if SNA_DEFAULT
+#if SNA
 		return sna_available_options(chipid, busid);
 #else
 		return intel_uxa_available_options(chipid, busid);
diff --git a/src/sna/Makefile.am b/src/sna/Makefile.am
index f65b281..24df843 100644
--- a/src/sna/Makefile.am
+++ b/src/sna/Makefile.am
@@ -54,38 +54,17 @@ libsna_la_SOURCES = \
 	sna_video.h \
 	sna_video_overlay.c \
 	sna_video_textured.c \
-	$(NULL)
-
-if SNA_GEN2
-libsna_la_SOURCES += \
 	gen2_render.c \
 	gen2_render.h \
-	$(NULL)
-endif
-if SNA_GEN3
-libsna_la_SOURCES += \
 	gen3_render.c \
 	gen3_render.h \
-	$(NULL)
-endif
-if SNA_GEN4
-libsna_la_SOURCES += \
 	gen4_render.c \
 	gen4_render.h \
-	$(NULL)
-endif
-if SNA_GEN5
-libsna_la_SOURCES += \
 	gen5_render.c \
 	gen5_render.h \
-	$(NULL)
-endif
-if SNA_GEN6
-libsna_la_SOURCES += \
 	gen6_render.c \
 	gen6_render.h \
 	$(NULL)
-endif
 
 if DRI
 libsna_la_SOURCES += \
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 55ca549..c2d6f12 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -384,35 +384,11 @@ Bool sna_picture_is_solid(PicturePtr picture, uint32_t *color);
 
 void no_render_init(struct sna *sna);
 
-#ifdef SNA_GEN2
 Bool gen2_render_init(struct sna *sna);
-#else
-static inline Bool gen2_render_init(struct sna *sna) { return FALSE; }
-#endif
-
-#ifdef SNA_GEN3
 Bool gen3_render_init(struct sna *sna);
-#else
-static inline Bool gen3_render_init(struct sna *sna) { return FALSE; }
-#endif
-
-#ifdef SNA_GEN4
 Bool gen4_render_init(struct sna *sna);
-#else
-static inline Bool gen4_render_init(struct sna *sna) { return FALSE; }
-#endif
-
-#ifdef SNA_GEN5
 Bool gen5_render_init(struct sna *sna);
-#else
-static inline Bool gen5_render_init(struct sna *sna) { return FALSE; }
-#endif
-
-#ifdef SNA_GEN6
 Bool gen6_render_init(struct sna *sna);
-#else
-static inline Bool gen6_render_init(struct sna *sna) { return FALSE; }
-#endif
 
 Bool sna_tiling_composite(struct sna *sna,
 			  uint32_t op,
commit 6f035e80b98e478ff4c59427e50e57ecd710da62
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 18:41:56 2011 +0100

    sna/dri: Keep reference on swap buffers until the end of the pageflip
    
    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 3faa199..c90545e 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -81,7 +81,6 @@ struct sna_dri_private {
 	int refcnt;
 	PixmapPtr pixmap;
 	struct kgem_bo *bo;
-	unsigned int attachment;
 };
 
 struct sna_dri_frame_event {
@@ -244,7 +243,6 @@ sna_dri_create_buffer(DrawablePtr drawable,
 	private->refcnt = 1;
 	private->pixmap = pixmap;
 	private->bo = bo;
-	private->attachment = attachment;
 
 	if (buffer->name == 0) {
 		/* failed to name buffer */
@@ -262,22 +260,26 @@ err:
 	return NULL;
 }
 
-static void sna_dri_destroy_buffer(DrawablePtr drawable, DRI2Buffer2Ptr buffer)
+static void _sna_dri_destroy_buffer(struct sna *sna, DRI2Buffer2Ptr buffer)
 {
-	if (buffer && buffer->driverPrivate) {
-		struct sna_dri_private *private = buffer->driverPrivate;
-		if (--private->refcnt == 0) {
-			if (private->pixmap) {
-				ScreenPtr screen = private->pixmap->drawable.pScreen;
-				screen->DestroyPixmap(private->pixmap);
-			} else {
-				struct sna *sna = to_sna_from_drawable(drawable);
-				kgem_bo_destroy(&sna->kgem, private->bo);
-			}
+	struct sna_dri_private *private = buffer->driverPrivate;
 
-			free(buffer);
-		}
-	} else
+	if (--private->refcnt == 0) {
+		if (private->pixmap) {
+			ScreenPtr screen = private->pixmap->drawable.pScreen;
+			screen->DestroyPixmap(private->pixmap);
+		} else
+			kgem_bo_destroy(&sna->kgem, private->bo);
+
+		free(buffer);
+	}
+}
+
+static void sna_dri_destroy_buffer(DrawablePtr drawable, DRI2Buffer2Ptr buffer)
+{
+	if (buffer && buffer->driverPrivate)
+		_sna_dri_destroy_buffer(to_sna_from_drawable(drawable), buffer);
+	else
 		free(buffer);
 }
 
@@ -349,15 +351,15 @@ static void damage(DrawablePtr drawable, RegionPtr region)
 
 static void
 sna_dri_copy_region(DrawablePtr drawable, RegionPtr region,
-		     DRI2BufferPtr destBuffer, DRI2BufferPtr sourceBuffer)
+		     DRI2BufferPtr dst_buffer, DRI2BufferPtr src_buffer)
 {
 	struct sna *sna = to_sna_from_drawable(drawable);
-	struct sna_dri_private *srcPrivate = sourceBuffer->driverPrivate;
-	struct sna_dri_private *dstPrivate = destBuffer->driverPrivate;
+	struct sna_dri_private *srcPrivate = src_buffer->driverPrivate;
+	struct sna_dri_private *dstPrivate = dst_buffer->driverPrivate;
 	ScreenPtr screen = drawable->pScreen;
-	DrawablePtr src = (srcPrivate->attachment == DRI2BufferFrontLeft)
+	DrawablePtr src = (src_buffer->attachment == DRI2BufferFrontLeft)
 		? drawable : &srcPrivate->pixmap->drawable;
-	DrawablePtr dst = (dstPrivate->attachment == DRI2BufferFrontLeft)
+	DrawablePtr dst = (dst_buffer->attachment == DRI2BufferFrontLeft)
 		? drawable : &dstPrivate->pixmap->drawable;
 	GCPtr gc;
 	bool flush = false;
@@ -368,6 +370,17 @@ sna_dri_copy_region(DrawablePtr drawable, RegionPtr region,
 	     region ? REGION_EXTENTS(NULL, region)->x2 : dst->width,
 	     region ? REGION_EXTENTS(NULL, region)->y2 : dst->height));
 
+	DBG(("%s: dst -- attachment=%d, name=%d, handle=%d\n",
+	     __FUNCTION__,
+	     dst_buffer->attachment,
+	     dst_buffer->name,
+	     dstPrivate->bo->handle));
+	DBG(("%s: src -- attachment=%d, name=%d, handle=%d\n",
+	     __FUNCTION__,
+	     src_buffer->attachment,
+	     src_buffer->name,
+	     srcPrivate->bo->handle));
+
 	gc = GetScratchGC(dst->depth, screen);
 	if (!gc)
 		return;
@@ -520,31 +533,39 @@ sna_dri_add_frame_event(struct sna_dri_frame_event *frame_event)
 }
 
 static void
-sna_dri_del_frame_event(struct sna_dri_frame_event *frame_event)
+sna_dri_frame_event_info(struct sna_dri_frame_event *info)
 {
-	if (frame_event->client_id)
-		FreeResourceByType(frame_event->client_id,
+	if (info->client_id)
+		FreeResourceByType(info->client_id,
 				   frame_event_client_type,
 				   TRUE);
 
-	if (frame_event->drawable_id)
-		FreeResourceByType(frame_event->drawable_id,
+	if (info->drawable_id)
+		FreeResourceByType(info->drawable_id,
 				   frame_event_drawable_type,
 				   TRUE);
+
+	if (info->front)
+		_sna_dri_destroy_buffer(info->sna, info->front);
+	if (info->back)
+		_sna_dri_destroy_buffer(info->sna, info->back);
+	free(info);
 }
 
 static void
 sna_dri_exchange_buffers(DrawablePtr draw,
-			  DRI2BufferPtr front, DRI2BufferPtr back)
+			 DRI2BufferPtr front,
+			 DRI2BufferPtr back)
 {
 	int tmp;
 
 	DBG(("%s()\n", __FUNCTION__));
 
-	/* Swap BO names so DRI works */
-	tmp = front->name;
-	front->name = back->name;
-	back->name = tmp;
+	assert(front->format == back->format);
+
+	tmp = front->attachment;
+	front->attachment = back->attachment;
+	back->attachment = tmp;
 }
 
 /*
@@ -553,53 +574,29 @@ sna_dri_exchange_buffers(DrawablePtr draw,
  */
 static Bool
 sna_dri_schedule_flip(struct sna *sna,
-		      ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
-		      DRI2BufferPtr back, DRI2SwapEventPtr func, void *data,
-		      unsigned int target_msc)
+		      DrawablePtr draw,
+		      struct sna_dri_frame_event *info)
 {
 	struct sna_dri *dri = &sna->dri;
 	struct sna_dri_private *back_priv;
-	struct sna_dri_frame_event *info;
 
 	/* Main crtc for this drawable shall finally deliver pageflip event. */
 	int ref_crtc_hw_id = sna_dri_get_pipe(draw);
 
 	DBG(("%s()\n", __FUNCTION__));
 
-	info = calloc(1, sizeof(struct sna_dri_frame_event));
-	if (!info)
-		return FALSE;
-
-	info->sna = sna;
-	info->drawable_id = draw->id;
-	info->client = client;
-	info->type = DRI2_SWAP;
-	info->event_complete = func;
-	info->event_data = data;
-	info->frame = target_msc;
-
-	if (!sna_dri_add_frame_event(info)) {
-		free(info);
-		return FALSE;
-	}
-
 	dri->fe_frame = 0;
 	dri->fe_tv_sec = 0;
 	dri->fe_tv_usec = 0;
 
 	/* Page flip the full screen buffer */
-	back_priv = back->driverPrivate;
+	back_priv = info->back->driverPrivate;
 	info->count = sna_do_pageflip(sna,
 				      back_priv->pixmap,
 				      info, ref_crtc_hw_id,
 				      &info->old_front,
 				      &info->old_fb);
-	if (info->count)
-		return TRUE;
-
-	sna_dri_del_frame_event(info);
-	free(info);
-	return FALSE;
+	return info->count != 0;
 }
 
 static Bool
@@ -662,7 +659,6 @@ can_flip(struct sna * sna,
 	 DRI2BufferPtr front,
 	 DRI2BufferPtr back)
 {
-	struct sna_dri_private *front_priv = front->driverPrivate;
 	struct sna_dri_private *back_priv = back->driverPrivate;
 	struct sna_pixmap *front_sna, *back_sna;
 	WindowPtr win = (WindowPtr)draw;
@@ -673,10 +669,16 @@ can_flip(struct sna * sna,
 
 	assert(draw->type == DRAWABLE_WINDOW);
 
-	if (front_priv->attachment != DRI2BufferFrontLeft) {
+	if (front->format != back->format) {
+		DBG(("%s: no, format mismatch, front = %d, back = %d\n",
+		     __FUNCTION__, front->format, back->format));
+		return FALSE;
+	}
+
+	if (front->attachment != DRI2BufferFrontLeft) {
 		DBG(("%s: no, front attachment [%d] is not FrontLeft [%d]\n",
 		     __FUNCTION__,
-		     front_priv->attachment,
+		     front->attachment,
 		     DRI2BufferFrontLeft));
 		return FALSE;
 	}
@@ -772,7 +774,7 @@ static void sna_dri_vblank_handle(int fd,
 				  void *data)
 {
 	struct sna_dri_frame_event *swap_info = data;
-	DrawablePtr drawable;
+	DrawablePtr draw;
 	ScreenPtr screen;
 	ScrnInfoPtr scrn;
 	struct sna *sna;
@@ -783,53 +785,46 @@ static void sna_dri_vblank_handle(int fd,
 
 	status = BadDrawable;
 	if (swap_info->drawable_id)
-		status = dixLookupDrawable(&drawable,
+		status = dixLookupDrawable(&draw,
 					   swap_info->drawable_id,
 					   serverClient,
 					   M_ANY, DixWriteAccess);
 	if (status != Success)
 		goto done;
 
-	screen = drawable->pScreen;
+	screen = draw->pScreen;
 	scrn = xf86Screens[screen->myNum];
 	sna = to_sna(scrn);
 
 	switch (swap_info->type) {
 	case DRI2_FLIP:
 		/* If we can still flip... */
-		if (can_flip(sna, drawable,
+		if (can_flip(sna, draw,
 			     swap_info->front, swap_info->back) &&
-		    sna_dri_schedule_flip(sna,
-					   swap_info->client,
-					   drawable,
-					   swap_info->front,
-					   swap_info->back,
-					   swap_info->event_complete,
-					   swap_info->event_data,
-					   swap_info->frame)) {
-			sna_dri_exchange_buffers(drawable,
-						  swap_info->front,
-						  swap_info->back);
-			break;
+		    sna_dri_schedule_flip(sna, draw, swap_info)) {
+			sna_dri_exchange_buffers(draw,
+						 swap_info->front,
+						 swap_info->back);
+			return;
 		}
 		/* else fall through to exchange/blit */
 	case DRI2_SWAP: {
 		int swap_type;
 
-		if (DRI2CanExchange(drawable) &&
+		if (DRI2CanExchange(draw) &&
 		    can_exchange(swap_info->front, swap_info->back)) {
-			sna_dri_exchange_buffers(drawable,
-						  swap_info->front,
-						  swap_info->back);
+			sna_dri_exchange_buffers(draw,
+						 swap_info->front,
+						 swap_info->back);
 			swap_type = DRI2_EXCHANGE_COMPLETE;
 		} else {
-			sna_dri_copy_region(drawable, NULL,
-					     swap_info->front,
-					     swap_info->back);
+			sna_dri_copy_region(draw, NULL,
+					    swap_info->front,
+					    swap_info->back);
 			swap_type = DRI2_BLIT_COMPLETE;
 		}
 		DRI2SwapComplete(swap_info->client,
-				 drawable, frame,
+				 draw, frame,
 				 tv_sec, tv_usec,
 				 swap_type,
 				 swap_info->client ? swap_info->event_complete : NULL,
@@ -838,7 +833,7 @@ static void sna_dri_vblank_handle(int fd,
 	}
 	case DRI2_WAITMSC:
 		if (swap_info->client)
-			DRI2WaitMSCComplete(swap_info->client, drawable,
+			DRI2WaitMSCComplete(swap_info->client, draw,
 					    frame, tv_sec, tv_usec);
 		break;
 	default:
@@ -849,13 +844,11 @@ static void sna_dri_vblank_handle(int fd,
 	}
 
 done:
-	sna_dri_del_frame_event(swap_info);
-	sna_dri_destroy_buffer(drawable, swap_info->front);
-	sna_dri_destroy_buffer(drawable, swap_info->back);
-	free(swap_info);
+	sna_dri_frame_event_info(swap_info);
 }
 
-static void sna_dri_flip_event(struct sna *sna, struct sna_dri_frame_event *flip)
+static void sna_dri_flip_event(struct sna *sna,
+			       struct sna_dri_frame_event *flip)
 {
 	DrawablePtr drawable;
 	int status;
@@ -879,7 +872,7 @@ static void sna_dri_flip_event(struct sna *sna, struct sna_dri_frame_event *flip
 
 	/* We assume our flips arrive in order, so we don't check the frame */
 	switch (flip->type) {
-	case DRI2_SWAP:
+	case DRI2_FLIP:
 		/* Deliver cached msc, ust from reference crtc */
 		/* Check for too small vblank count of pageflip completion, taking wraparound
 		 * into account. This usually means some defective kms pageflip completion,
@@ -903,12 +896,13 @@ static void sna_dri_flip_event(struct sna *sna, struct sna_dri_frame_event *flip
 			sna->dri.fe_frame = sna->dri.fe_tv_sec = sna->dri.fe_tv_usec = 0;
 		}
 
-		DBG(("%s: swap complete\n", __FUNCTION__));
+		DBG(("%s: flip complete\n", __FUNCTION__));
 		DRI2SwapComplete(flip->client, drawable,
 				 sna->dri.fe_frame,
 				 sna->dri.fe_tv_sec,
 				 sna->dri.fe_tv_usec,
-				 DRI2_FLIP_COMPLETE, flip->client ? flip->event_complete : NULL,
+				 DRI2_FLIP_COMPLETE,
+				 flip->client ? flip->event_complete : NULL,
 				 flip->event_data);
 		break;
 
@@ -949,8 +943,7 @@ sna_dri_page_flip_handler(int fd, unsigned int frame, unsigned int tv_sec,
 	sna_dri_flip_event(info->sna, info);
 
 	sna_mode_delete_fb(info->sna, info->old_front, info->old_fb);
-	sna_dri_del_frame_event(info);
-	free(info);
+	sna_dri_frame_event_info(info);
 }
 
 /*
@@ -1003,6 +996,7 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	if (!swap_info)
 		goto blit_fallback;
 
+	swap_info->sna = sna;
 	swap_info->drawable_id = draw->id;
 	swap_info->client = client;
 	swap_info->event_complete = func;
@@ -1141,12 +1135,8 @@ blit_fallback:
 	sna_dri_copy_region(draw, NULL, front, back);
 
 	DRI2SwapComplete(client, draw, 0, 0, 0, DRI2_BLIT_COMPLETE, func, data);
-	if (swap_info) {
-		sna_dri_del_frame_event(swap_info);
-		sna_dri_destroy_buffer(draw, swap_info->front);
-		sna_dri_destroy_buffer(draw, swap_info->back);
-		free(swap_info);
-	}
+	if (swap_info)
+		sna_dri_frame_event_info(swap_info);
 	*target_msc = 0; /* offscreen, so zero out target vblank count */
 	return TRUE;
 }
@@ -1367,6 +1357,7 @@ sna_dri_schedule_wait_msc(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 	if (!wait_info)
 		goto out_complete;
 
+	wait_info->sna = sna;
 	wait_info->drawable_id = draw->id;
 	wait_info->client = client;
 	wait_info->type = DRI2_WAITMSC;
commit cf6c7901825bb831443615ef21555c5843184bdb
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 17:49:13 2011 +0100

    sna: Use the ScreenPixmap->serialNumber as a generation count
    
    DRI2 presumes that the pixmap->serialNumber can be used as unique id.
    If it changes revokes *all* the buffers, it presumes a new pixmap has
    been attached to the window, for example after a reconfiguration event
    (resizing of a window, or a mode switch). However, as we updated the
    root pixmap upon a pageflip, we were triggering revocations everytime,
    causing further revocations and massive aperture thrashing.
    
    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 b21ce39..6131be1 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1575,10 +1575,19 @@ sna_do_pageflip(struct sna *sna,
 	 */
 	count = do_page_flip(sna, data, ref_crtc_hw_id);
 	if (count > 0) {
+		int id = sna->front->drawable.serialNumber;
+
 		sna->front = pixmap;
 		pixmap->refcnt++;
+
 		sna_redirect_screen_pixmap(scrn, *old_front, sna->front);
 		scrn->displayWidth = bo->pitch / sna->mode.cpp;
+
+		/* DRI2 uses the serialNumber as a means for detecting
+		 * when to revoke its buffers after a reconfigureatin event.
+		 * For the ScreenPixmap this means set_size.
+		  */
+		pixmap->drawable.serialNumber = id;
 	} else {
 		drmModeRmFB(sna->kgem.fd, mode->fb_id);
 		mode->fb_id = *old_fb;
commit 3f19270d6795738b58d9ce1721896b3067b38c9f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 15:29:57 2011 +0100

    sna/dri: Actually restrict pageflipping to properly aligned fs windows
    
    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 ad28202..3faa199 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -707,7 +707,12 @@ can_flip(struct sna * sna,
 		return FALSE;
 	}
 
-	if (draw->width != front_pixmap->drawable.width ||
+	if (draw->x != 0 || draw->y != 0 ||
+#ifdef COMPOSITE
+	    draw->x != front_pixmap->screen_x ||
+	    draw->y != front_pixmap->screen_y ||
+#endif
+	    draw->width != front_pixmap->drawable.width ||
 	    draw->height != front_pixmap->drawable.height) {
 		DBG(("%s: no, window is not full size (%dx%d)!=(%dx%d)\n",
 		     __FUNCTION__,
commit 9e9c628708ae838e5df3df89331243f84b297e8e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 15:17:18 2011 +0100

    sna/dri: Create pixmap suitable for the framebuffer for fullscreen buffers
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 436b69b..d600936 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1141,6 +1141,9 @@ int kgem_choose_tiling(struct kgem *kgem, int tiling, int width, int height, int
 		}
 	}
 
+	if (tiling < 0)
+		return tiling;
+
 	if (tiling == I915_TILING_Y && height < 16) {
 		DBG(("%s: too short [%d] for TILING_Y\n",
 		     __FUNCTION__,height));
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 6492749..d84d703 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -127,6 +127,9 @@ static uint32_t sna_pixmap_choose_tiling(PixmapPtr pixmap)
 	if ((sna->tiling && (1 << bit)) == 0)
 		tiling = I915_TILING_NONE;
 
+	if (pixmap->usage_hint == SNA_CREATE_FB)
+		tiling = -tiling;
+
 	/* Also adjust tiling if it is not supported or likely to
 	 * slow us down,
 	 */
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 9abc66d..ad28202 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -135,8 +135,9 @@ static struct kgem_bo *sna_pixmap_set_dri(struct sna *sna,
 }
 
 static DRI2Buffer2Ptr
-sna_dri_create_buffer(DrawablePtr drawable, unsigned int attachment,
-		       unsigned int format)
+sna_dri_create_buffer(DrawablePtr drawable,
+		      unsigned int attachment,
+		      unsigned int format)
 {
 	ScreenPtr screen = drawable->pScreen;
 	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
@@ -172,7 +173,13 @@ sna_dri_create_buffer(DrawablePtr drawable, unsigned int attachment,
 	case DRI2BufferBackLeft:
 	case DRI2BufferBackRight:
 	case DRI2BufferFrontRight:
+		/* Allocate a normal window, perhaps flippable */
 		usage = 0;
+		if (drawable->width == sna->front->drawable.width &&
+		    drawable->height == sna->front->drawable.height &&
+		    drawable->bitsPerPixel == sna->front->drawable.bitsPerPixel)
+			usage = SNA_CREATE_FB;
+
 	case DRI2BufferFakeFrontLeft:
 	case DRI2BufferFakeFrontRight:
 		pixmap = screen->CreatePixmap(screen,
commit b22de0b01453884d5018e7e0faef439421fa63a0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 13:30:54 2011 +0100

    sna/blt: Suppress overwriting boxes through fill_boxes()
    
    As the introduction of the unrolled fill_boxes() was bypassing the
    effective optimisation in fill_one().
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index d82f417..3d350b1 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -1178,6 +1178,21 @@ Bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
 	case 8: break;
 	}
 
+	/* All too frequently one blt completely overwrites the previous */
+	if (kgem->nbatch >= 6 &&
+	    (alu == GXcopy || alu == GXclear) &&
+	    kgem->batch[kgem->nbatch-6] == cmd &&
+	    kgem->batch[kgem->nbatch-4] == (box[0].y1 << 16 | box[0].x1) &&
+	    kgem->batch[kgem->nbatch-3] == (box[0].y2 << 16 | box[0].x2) &&
+	    kgem->reloc[kgem->nreloc-1].target_handle == bo->handle) {
+		DBG(("%s: replacing last fill\n", __FUNCTION__));
+		kgem->batch[kgem->nbatch-5] = br13;
+		kgem->batch[kgem->nbatch-1] = color;
+		if (--nbox == 0)
+			return TRUE;
+		box++;
+	}
+
 	kgem_set_mode(kgem, KGEM_BLT);
 	if (!kgem_check_batch(kgem, 6) ||
 	    !kgem_check_bo_fenced(kgem, bo, NULL) ||
commit ebeebc2044610e6e31d9cef746c768d2e435f32c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 13:07:13 2011 +0100

    sna: Use temporary for storing the current crtc box when computing best crtc
    
    ... as the caller may be reusing an input parameter for the result.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 08de443..844705d 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -309,8 +309,10 @@ to_sna_from_drawable(DrawablePtr drawable)
 #define ALIGN(i,m)	(((i) + (m) - 1) & ~((m) - 1))
 #define MIN(a,b)	((a) < (b) ? (a) : (b))
 
-extern xf86CrtcPtr sna_covering_crtc(ScrnInfoPtr scrn, BoxPtr box,
-				      xf86CrtcPtr desired, BoxPtr crtc_box_ret);
+extern xf86CrtcPtr sna_covering_crtc(ScrnInfoPtr scrn,
+				     const BoxRec *box,
+				     xf86CrtcPtr desired,
+				     BoxPtr crtc_box_ret);
 
 extern bool sna_wait_for_scanline(struct sna *sna, PixmapPtr pixmap,
 				  xf86CrtcPtr crtc, RegionPtr clip);
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index a5e1f6f..b21ce39 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1683,17 +1683,22 @@ static void sna_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box)
 		crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
 }
 
-static void sna_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
+static void sna_box_intersect(BoxPtr r, const BoxRec *a, const BoxRec *b)
 {
-	dest->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
-	dest->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
-	dest->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
-	dest->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
-	if (dest->x1 >= dest->x2 || dest->y1 >= dest->y2)
-		dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
+	r->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
+	r->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
+	r->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
+	r->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
+	DBG(("%s: (%d, %d), (%d, %d) intersect (%d, %d), (%d, %d) = (%d, %d), (%d, %d)\n",
+	     __FUNCTION__,
+	     a->x1, a->y1, a->x2, a->y2,
+	     b->x1, b->y1, b->x2, b->y2,
+	     r->x1, r->y1, r->x2, r->y2));
+	if (r->x1 >= r->x2 || r->y1 >= r->y2)
+		r->x1 = r->x2 = r->y1 = r->y2 = 0;
 }
 
-static int sna_box_area(BoxPtr box)
+static int sna_box_area(const BoxRec *box)
 {
 	return (int)(box->x2 - box->x1) * (int)(box->y2 - box->y1);
 }
@@ -1705,25 +1710,28 @@ static int sna_box_area(BoxPtr box)
  */
 xf86CrtcPtr
 sna_covering_crtc(ScrnInfoPtr scrn,
-		  BoxPtr box, xf86CrtcPtr desired, BoxPtr crtc_box_ret)
+		  const BoxRec *box,
+		  xf86CrtcPtr desired,
+		  BoxPtr crtc_box_ret)
 {
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-	xf86CrtcPtr crtc, best_crtc;
-	int coverage, best_coverage;
-	int c;
-	BoxRec crtc_box, cover_box;
+	xf86CrtcPtr best_crtc;
+	int best_coverage, c;
+	BoxRec best_crtc_box;
 
 	DBG(("%s for box=(%d, %d), (%d, %d)\n",
 	     __FUNCTION__, box->x1, box->y1, box->x2, box->y2));
 
 	best_crtc = NULL;
 	best_coverage = 0;
-	crtc_box_ret->x1 = 0;
-	crtc_box_ret->x2 = 0;
-	crtc_box_ret->y1 = 0;
-	crtc_box_ret->y2 = 0;
+	best_crtc_box.x1 = 0;
+	best_crtc_box.x2 = 0;
+	best_crtc_box.y1 = 0;
+	best_crtc_box.y2 = 0;
 	for (c = 0; c < xf86_config->num_crtc; c++) {
-		crtc = xf86_config->crtc[c];
+		xf86CrtcPtr crtc = xf86_config->crtc[c];
+		BoxRec crtc_box, cover_box;
+		int coverage;
 
 		/* If the CRTC is off, treat it as not covering */
 		if (!sna_crtc_on(crtc)) {
@@ -1732,8 +1740,20 @@ sna_covering_crtc(ScrnInfoPtr scrn,
 		}
 
 		sna_crtc_box(crtc, &crtc_box);
+		DBG(("%s: crtc %d: (%d, %d), (%d, %d)\n",
+		     __FUNCTION__, c,
+		     crtc_box.x1, crtc_box.y1,
+		     crtc_box.x2, crtc_box.y2));
+
 		sna_box_intersect(&cover_box, &crtc_box, box);
+		DBG(("%s: box instersects (%d, %d), (%d, %d) of crtc %d\n",
+		     __FUNCTION__,
+		     cover_box.x1, cover_box.y1,
+		     cover_box.x2, cover_box.y2,
+		     c));
 		coverage = sna_box_area(&cover_box);
+		DBG(("%s: box covers %d of crtc %d\n",
+		     __FUNCTION__, coverage, c));
 		if (coverage && crtc == desired) {
 			DBG(("%s: box is on desired crtc [%p]\n",
 			     __FUNCTION__, crtc));
@@ -1741,12 +1761,14 @@ sna_covering_crtc(ScrnInfoPtr scrn,
 			return crtc;
 		}
 		if (coverage > best_coverage) {
-			*crtc_box_ret = crtc_box;
+			best_crtc_box = crtc_box;
 			best_crtc = crtc;
 			best_coverage = coverage;
 		}
 	}
-	DBG(("%s: best crtc = %p\n", __FUNCTION__, best_crtc));
+	DBG(("%s: best crtc = %p, coverage = %d\n",
+	     __FUNCTION__, best_crtc, best_coverage));
+	*crtc_box_ret = best_crtc_box;
 	return best_crtc;
 }
 
commit b3949d0d7424242703c9e60e2e33908499aa6a43
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 12:45:24 2011 +0100

    sna/kgem: remove erroneous assert during submit
    
    This was only valid for gen6+ with the multiple rings.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index e5a9c78..436b69b 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -774,7 +774,6 @@ void _kgem_submit(struct kgem *kgem)
 	assert(kgem->nbatch);
 	assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
 	assert(kgem->nbatch <= kgem->surface);
-	assert(kgem->mode == KGEM_NONE || kgem->mode == kgem->ring);
 
 	batch_end = kgem_end_batch(kgem);
 	kgem_sna_flush(kgem);
commit 33abb68da2c49081f28898f93cc4e14702b40d70
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 12:44:56 2011 +0100

    sna/kgem: remove redundant clears upon initialisation
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 2c7f832..e5a9c78 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -296,14 +296,15 @@ void kgem_init(struct kgem *kgem, int fd, int gen)
 	struct drm_i915_gem_get_aperture aperture;
 	int i;
 
+	/* We presume we are partt of a zeroed structure
+	memset(kgem, 0, sizeof(*kgem));
+	*/
+
 	kgem->fd = fd;
 	kgem->gen = gen;
 	kgem->wedged = drmCommandNone(kgem->fd, DRM_I915_GEM_THROTTLE) == -EIO;
 	kgem->wedged |= DBG_NO_HW;
 
-	kgem->ring = kgem->mode = KGEM_NONE;
-	kgem->flush = 0;
-
 	list_init(&kgem->partial);
 	list_init(&kgem->requests);
 	list_init(&kgem->active);
@@ -313,7 +314,6 @@ void kgem_init(struct kgem *kgem, int fd, int gen)
 
 	kgem->next_request = __kgem_request_alloc();
 
-	kgem->has_vmap = 0;
 #if defined(USE_VMAP) && defined(I915_PARAM_HAS_VMAP)
 	if (!DBG_NO_VMAP) {
 		drm_i915_getparam_t gp;
@@ -328,7 +328,6 @@ void kgem_init(struct kgem *kgem, int fd, int gen)
 	DBG(("%s: using vmap=%d\n", __FUNCTION__, kgem->has_vmap));
 
 	if (gen < 40) {
-		kgem->has_relaxed_fencing = 0;
 		if (!DBG_NO_RELAXED_FENCING) {
 			drm_i915_getparam_t gp;
 
@@ -351,7 +350,6 @@ void kgem_init(struct kgem *kgem, int fd, int gen)
 
 	kgem->aperture_high = aperture.aper_available_size * 3/4;
 	kgem->aperture_low = aperture.aper_available_size * 1/4;
-	kgem->aperture = 0;
 	DBG(("%s: aperture low=%d, high=%d\n", __FUNCTION__,
 	     kgem->aperture_low, kgem->aperture_high));
 


More information about the xorg-commit mailing list