xf86-video-intel: 6 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/kgem.c src/sna/kgem.h src/sna/sna_accel.c src/sna/sna_display.c src/sna/sna_driver.c src/sna/sna.h

Chris Wilson ickle at kemper.freedesktop.org
Fri Jun 10 03:30:26 PDT 2011


 src/sna/gen2_render.c |    2 -
 src/sna/gen3_render.c |    2 -
 src/sna/gen4_render.c |    9 +++++---
 src/sna/gen5_render.c |    1 
 src/sna/gen6_render.c |    1 
 src/sna/kgem.c        |   30 +++++++++++++++-------------
 src/sna/kgem.h        |    1 
 src/sna/sna.h         |    1 
 src/sna/sna_accel.c   |    2 +
 src/sna/sna_display.c |    1 
 src/sna/sna_driver.c  |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++
 11 files changed, 78 insertions(+), 24 deletions(-)

New commits:
commit cfde920a2e449efaa387850173e46f87d928023b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 11:27:04 2011 +0100

    sna: Remember to decouple the fb on closing
    
    ... so that we actually attach a new one after regen!
    
    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 4d11063..a5e1f6f 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1846,4 +1846,3 @@ sna_wait_for_scanline(struct sna *sna, PixmapPtr pixmap,
 	kgem_advance_batch(&sna->kgem, 5);
 	return true;
 }
-
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 42d4091..2c9cae9 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -763,6 +763,7 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
 		sna->directRenderingOpen = FALSE;
 	}
 
+	sna_mode_remove_fb(sna);
 	xf86GARTCloseScreen(scrnIndex);
 
 	scrn->vtSema = FALSE;
commit b6192ce95af8aa8be6d9a68a500393f2a73c2f4c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 11:05:41 2011 +0100

    sna/gen4: Tweak calculation of required batch space for CA
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 13d9533..c7bc751 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1046,13 +1046,18 @@ static bool gen4_rectangle_begin(struct sna *sna,
 	int ndwords;
 
 	ndwords = 0;
+	if (FLUSH_EVERY_VERTEX)
+		ndwords = 1;
 	if ((sna->render_state.gen4.vb_id & (1 << id)) == 0)
 		ndwords += 5;
 	if (sna->render_state.gen4.vertex_offset == 0)
-		ndwords += op->need_magic_ca_pass ? 20 : 6;
+		ndwords += 6;
 	if (ndwords == 0)
 		return true;
 
+	if (op->need_magic_ca_pass)
+		ndwords += 12; /* pipelined pointers + primitive + flush */
+
 	if (!kgem_check_batch(&sna->kgem, ndwords))
 		return false;
 
commit c9b89fc87f1d43a715cd9c5915bfed957175986d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 10:53:29 2011 +0100

    sna: Drain the event queues before CloseScreen
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 60bd53a..42d4091 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -737,6 +737,10 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
 	sna_uevent_fini(scrn);
 #endif
 
+	/* drain the event queues */
+	sna_accel_wakeup_handler(sna);
+	sna_dri_wakeup(sna);
+
 	if (scrn->vtSema == TRUE)
 		sna_leave_vt(scrnIndex, 0);
 
commit ea560e25dfcce3750339b477a1a3c05f504cf91e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 10:44:27 2011 +0100

    sna: Workaround the random free of the ScreenPixmap in fbCloseScreen
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index a02c4d8..60bd53a 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -744,6 +744,13 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
 
 	xf86_cursors_fini(screen);
 
+	/* XXX unhook devPrivate otherwise fbCloseScreen frees it! */
+	if (sna->front) {
+		screen->DestroyPixmap(sna->front);
+		sna->front = NULL;
+		screen->devPrivate = NULL;
+	}
+
 	screen->CloseScreen = sna->CloseScreen;
 	(*screen->CloseScreen) (scrnIndex, screen);
 
commit 1f364c6d241e8971e8fc1447871c718240e4563e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 10:03:01 2011 +0100

    sna: Reset the kgem state on server regen
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 0ead969..34c053b 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1267,8 +1267,6 @@ Bool gen2_render_init(struct sna *sna)
 {
 	struct sna_render *render = &sna->render;
 
-	gen2_render_reset(sna);
-
 	/* Use the BLT (and overlay) for everything except when forced to
 	 * use the texture combiners.
 	 */
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index fcc3ba2..542856d 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3668,8 +3668,6 @@ Bool gen3_render_init(struct sna *sna)
 {
 	struct sna_render *render = &sna->render;
 
-	gen3_render_reset(sna);
-
 	render->composite = gen3_render_composite;
 	render->composite_spans = gen3_render_composite_spans;
 
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 582e398..13d9533 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2792,8 +2792,6 @@ Bool gen4_render_init(struct sna *sna)
 	if (!gen4_render_setup(sna))
 		return FALSE;
 
-	gen4_render_reset(sna);
-
 	sna->render.composite = gen4_render_composite;
 	sna->render.video = gen4_render_video;
 
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index c444b69..69c71f5 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2809,7 +2809,6 @@ Bool gen5_render_init(struct sna *sna)
 	if (!gen5_render_setup(sna))
 		return FALSE;
 
-	gen5_render_reset(sna);
 	sna->kgem.context_switch = gen5_render_context_switch;
 
 	sna->render.composite = gen5_render_composite;
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 2195882..80d1f3d 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2852,7 +2852,6 @@ Bool gen6_render_init(struct sna *sna)
 	if (!gen6_render_setup(sna))
 		return FALSE;
 
-	gen6_render_reset(sna);
 	sna->kgem.context_switch = gen6_render_context_switch;
 
 	sna->render.composite = gen6_render_composite;
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 43a82d4..2c7f832 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -304,10 +304,6 @@ void kgem_init(struct kgem *kgem, int fd, int gen)
 	kgem->ring = kgem->mode = KGEM_NONE;
 	kgem->flush = 0;
 
-	kgem->nbatch = 0;
-	kgem->nreloc = 0;
-	kgem->nexec = 0;
-	kgem->surface = ARRAY_SIZE(kgem->batch);
 	list_init(&kgem->partial);
 	list_init(&kgem->requests);
 	list_init(&kgem->active);
@@ -757,6 +753,20 @@ static int kgem_batch_write(struct kgem *kgem, uint32_t handle)
 			kgem->batch + kgem->surface);
 }
 
+void kgem_reset(struct kgem *kgem)
+{
+	kgem->nfence = 0;
+	kgem->nexec = 0;
+	kgem->nreloc = 0;
+	kgem->aperture = 0;
+	kgem->nbatch = 0;
+	kgem->surface = ARRAY_SIZE(kgem->batch);
+	kgem->mode = KGEM_NONE;
+	kgem->flush = 0;
+
+	kgem_sna_reset(kgem);
+}
+
 void _kgem_submit(struct kgem *kgem)
 {
 	struct kgem_request *rq;
@@ -917,16 +927,7 @@ void _kgem_submit(struct kgem *kgem)
 	if (kgem->wedged)
 		kgem_cleanup(kgem);
 
-	kgem->nfence = 0;
-	kgem->nexec = 0;
-	kgem->nreloc = 0;
-	kgem->aperture = 0;
-	kgem->nbatch = 0;
-	kgem->surface = ARRAY_SIZE(kgem->batch);
-	kgem->mode = KGEM_NONE;
-	kgem->flush = 0;
-
-	kgem_sna_reset(kgem);
+	kgem_reset(kgem);
 }
 
 void kgem_throttle(struct kgem *kgem)
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 3709930..fc1c38c 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -122,6 +122,7 @@ struct kgem {
 #define KGEM_RELOC_SIZE(K) (ARRAY_SIZE((K)->reloc)-KGEM_RELOC_RESERVED)
 
 void kgem_init(struct kgem *kgem, int fd, int gen);
+void kgem_reset(struct kgem *kgem);
 
 struct kgem_bo *kgem_create_map(struct kgem *kgem,
 				void *ptr, uint32_t size,
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index af021b6..6492749 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3270,6 +3270,8 @@ Bool sna_accel_init(ScreenPtr screen, struct sna *sna)
 	DBG(("%s(backend=%s, have_render=%d)\n",
 	     __FUNCTION__, backend, sna->have_render));
 
+	kgem_reset(&sna->kgem);
+
 	xf86DrvMsg(sna->scrn->scrnIndex, X_INFO,
 		   "SNA initialized with %s backend\n",
 		   backend);
commit 95ae39a93467655b2107b82bd7970f732c8de066
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 10 09:57:22 2011 +0100

    sna: Add some debug statements to the core DDX interface
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index c560531..43a82d4 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -766,6 +766,7 @@ 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);
diff --git a/src/sna/sna.h b/src/sna/sna.h
index d963d9c..08de443 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -78,6 +78,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define DEBUG_DAMAGE (DEBUG_ALL || 0)
 #define DEBUG_DISPLAY (DEBUG_ALL || 0)
 #define DEBUG_DRI (DEBUG_ALL || 0)
+#define DEBUG_DRIVER (DEBUG_ALL || 0)
 #define DEBUG_GRADIENT (DEBUG_ALL || 0)
 #define DEBUG_GLYPHS (DEBUG_ALL || 0)
 #define DEBUG_IO (DEBUG_ALL || 0)
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index ca1f32c..a02c4d8 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -71,6 +71,13 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include <sys/fcntl.h>
 #include "i915_drm.h"
 
+#if DEBUG_DRIVER
+#undef DBG
+#define DBG(x) ErrorF x
+#else
+#define NDEBUG 1
+#endif
+
 static OptionInfoRec sna_options[] = {
    {OPTION_TILING_FB,	"LinearFramebuffer",	OPTV_BOOLEAN,	{0},	FALSE},
    {OPTION_TILING_2D,	"Tiling",	OPTV_BOOLEAN,	{0},	TRUE},
@@ -105,6 +112,8 @@ sna_load_palette(ScrnInfoPtr scrn, int numColors, int *indices,
 	int p;
 	uint16_t lut_r[256], lut_g[256], lut_b[256];
 
+	DBG(("%s\n", __FUNCTION__));
+
 	for (p = 0; p < xf86_config->num_crtc; p++) {
 		xf86CrtcPtr crtc = xf86_config->crtc[p];
 
@@ -171,6 +180,8 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
 	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
 	struct sna *sna = to_sna(scrn);
 
+	DBG(("%s\n", __FUNCTION__));
+
 	free(screen->devPrivate);
 	screen->devPrivate = NULL;
 
@@ -286,6 +297,8 @@ static int sna_open_drm_master(ScrnInfoPtr scrn)
 	char busid[20];
 	int fd;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	dev = sna_device(scrn);
 	if (dev) {
 		dev->open_count++;
@@ -351,6 +364,8 @@ static void sna_close_drm_master(ScrnInfoPtr scrn)
 {
 	struct sna_device *dev = sna_device(scrn);
 
+	DBG(("%s(open_count=%d)\n", __FUNCTION__, dev->open_count));
+
 	if (--dev->open_count)
 		return;
 
@@ -386,6 +401,8 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 	Gamma zeros = { 0.0, 0.0, 0.0 };
 	int fd;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	sna_selftest();
 
 	if (scrn->numEntities != 1)
@@ -545,6 +562,8 @@ sna_block_handler(int i, pointer data, pointer timeout, pointer read_mask)
 	ScrnInfoPtr scrn = xf86Screens[i];
 	struct sna *sna = to_sna(scrn);
 
+	DBG(("%s\n", __FUNCTION__));
+
 	screen->BlockHandler = sna->BlockHandler;
 
 	(*screen->BlockHandler) (i, data, timeout, read_mask);
@@ -562,6 +581,8 @@ sna_wakeup_handler(int i, pointer data, unsigned long result, pointer read_mask)
 	ScrnInfoPtr scrn = xf86Screens[i];
 	struct sna *sna = to_sna(scrn);
 
+	DBG(("%s\n", __FUNCTION__));
+
 	screen->WakeupHandler = sna->WakeupHandler;
 
 	(*screen->WakeupHandler) (i, data, result, read_mask);
@@ -590,6 +611,8 @@ sna_handle_uevents(int fd, void *closure)
 	struct stat s;
 	dev_t udev_devnum;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	dev = udev_monitor_receive_device(sna->uevent_monitor);
 	if (!dev)
 		return;
@@ -620,6 +643,8 @@ sna_uevent_init(ScrnInfoPtr scrn)
 	Bool hotplug;
 	MessageType from = X_CONFIG;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	if (!xf86GetOptValBool(sna->Options, OPTION_HOTPLUG, &hotplug)) {
 		from = X_DEFAULT;
 		hotplug = TRUE;
@@ -688,6 +713,8 @@ static void sna_leave_vt(int scrnIndex, int flags)
 	struct sna *sna = to_sna(scrn);
 	int ret;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	xf86RotateFreeShadow(scrn);
 
 	xf86_hide_cursors(scrn);
@@ -704,6 +731,8 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
 	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
 	struct sna *sna = to_sna(scrn);
 
+	DBG(("%s\n", __FUNCTION__));
+
 #if HAVE_UDEV
 	sna_uevent_fini(scrn);
 #endif
@@ -737,6 +766,8 @@ sna_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv)
 	VisualPtr visual;
 	struct pci_device *const device = sna->PciInfo;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	scrn->videoRam = device->regions[2].size / 1024;
 
 #ifdef DRI2
@@ -856,6 +887,8 @@ static void sna_free_screen(int scrnIndex, int flags)
 	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
 	struct sna *sna = to_sna(scrn);
 
+	DBG(("%s\n", __FUNCTION__));
+
 	if (sna) {
 		sna_mode_fini(sna);
 
@@ -877,6 +910,8 @@ static Bool sna_enter_vt(int scrnIndex, int flags)
 	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
 	struct sna *sna = to_sna(scrn);
 
+	DBG(("%s\n", __FUNCTION__));
+
 	if (drmSetMaster(sna->kgem.fd)) {
 		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 			   "drmSetMaster failed: %s\n",
@@ -888,6 +923,7 @@ static Bool sna_enter_vt(int scrnIndex, int flags)
 
 static Bool sna_switch_mode(int scrnIndex, DisplayModePtr mode, int flags)
 {
+	DBG(("%s\n", __FUNCTION__));
 	return xf86SetSingleMode(xf86Screens[scrnIndex], mode, RR_Rotate_0);
 }
 
@@ -914,6 +950,8 @@ static Bool sna_pm_event(int scrnIndex, pmEvent event, Bool undo)
 	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
 	struct sna *sna = to_sna(scrn);
 
+	DBG(("%s\n", __FUNCTION__));
+
 	switch (event) {
 	case XF86_APM_SYS_SUSPEND:
 	case XF86_APM_CRITICAL_SUSPEND:	/*do we want to delay a critical suspend? */
@@ -963,6 +1001,8 @@ void sna_init_scrn(ScrnInfoPtr scrn, int entity_num)
 {
 	EntityInfoPtr entity;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	sna_device_key = xf86AllocateEntityPrivateIndex();
 
 	scrn->PreInit = sna_pre_init;


More information about the xorg-commit mailing list