xf86-video-intel: 2 commits - src/sna/sna_accel.c src/sna/sna_display.c src/sna/sna_display_fake.c src/sna/sna_dri.c src/sna/sna_driver.c src/sna/sna.h src/sna/sna_video.c src/sna/sna_video.h src/sna/sna_video_overlay.c src/sna/sna_video_sprite.c src/sna/sna_video_textured.c

Chris Wilson ickle at kemper.freedesktop.org
Sun Aug 25 03:44:39 PDT 2013


 src/sna/sna.h                |    2 +-
 src/sna/sna_accel.c          |   19 ++++++++++++++-----
 src/sna/sna_display.c        |   34 +++++++++++++++++++++-------------
 src/sna/sna_display_fake.c   |   18 ++++++++----------
 src/sna/sna_dri.c            |   18 +++++++++---------
 src/sna/sna_driver.c         |   34 ++++++++++++++++++----------------
 src/sna/sna_video.c          |    7 +++----
 src/sna/sna_video.h          |    5 ++---
 src/sna/sna_video_overlay.c  |    3 +--
 src/sna/sna_video_sprite.c   |    3 +--
 src/sna/sna_video_textured.c |    3 +--
 11 files changed, 79 insertions(+), 67 deletions(-)

New commits:
commit c1dbbe69ada3323a82ebd672e9ef47a0d95911c9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 25 11:26:46 2013 +0100

    sna: Make SetScreenPixmap do as it says
    
    Make sna_set_screen_pixmap() a little more complete and remove the
    assertion that the caller manages sna->front. This should make the
    function easier to reuse.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 1f5a18e..66d2fd0 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -15244,15 +15244,19 @@ migrate_dirty_tracking(PixmapPtr old_front, PixmapPtr new_front)
 static void
 sna_set_screen_pixmap(PixmapPtr pixmap)
 {
-	PixmapPtr old_front = pixmap->drawable.pScreen->devPrivate;
+	ScreenPtr screen = pixmap->drawable.pScreen;
+	PixmapPtr old_front = screen->devPrivate;
 	WindowPtr root;
 
-	assert(pixmap == to_sna_from_pixmap(pixmap)->front);
+	assert(to_sna_from_pixmap(pixmap) == to_sna_from_screen(screen));
+	assert(to_sna_from_pixmap(pixmap)->front == old_front);
 
-	if (old_front)
+	if (old_front) {
+		assert(to_sna_from_pixmap(old_front)->front == old_front);
 		migrate_dirty_tracking(old_front, pixmap);
+	}
 
-	root = get_root_window(pixmap->drawable.pScreen);
+	root = get_root_window(screen);
 	if (root) {
 		struct sna_visit_set_pixmap_window visit;
 
@@ -15262,7 +15266,12 @@ sna_set_screen_pixmap(PixmapPtr pixmap)
 		assert(fbGetWindowPixmap(root) == pixmap);
 	}
 
-	pixmap->drawable.pScreen->devPrivate = pixmap;
+	to_sna_from_pixmap(pixmap)->front = pixmap;
+	screen->devPrivate = pixmap;
+	pixmap->refcnt++;
+
+	if (old_front)
+		screen->DestroyPixmap(old_front);
 }
 
 static Bool
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index daffbc2..da3475f 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -2731,7 +2731,7 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
 	struct sna *sna = to_sna(scrn);
 	ScreenPtr screen = scrn->pScreen;
-	PixmapPtr old_front, new_front;
+	PixmapPtr new_front;
 	int i;
 
 	DBG(("%s (%d, %d) -> (%d, %d)\n", __FUNCTION__,
@@ -2748,7 +2748,6 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
 	DBG(("%s: creating new framebuffer %dx%d\n",
 	     __FUNCTION__, width, height));
 
-	old_front = sna->front;
 	new_front = screen->CreatePixmap(screen,
 					 width, height, scrn->depth,
 					 SNA_CREATE_FB);
@@ -2767,7 +2766,11 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
 
 	copy_front(sna, sna->front, new_front);
 
-	sna->front = new_front;
+	screen->SetScreenPixmap(new_front);
+	assert(screen->GetScreenPixmap(screen) == new_front);
+	assert(sna->front == new_front);
+	screen->DestroyPixmap(new_front); /* owned by screen now */
+
 	scrn->virtualX = width;
 	scrn->virtualY = height;
 	scrn->displayWidth = width;
@@ -2784,11 +2787,6 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
 			sna_crtc_disable(crtc);
 	}
 
-	screen->SetScreenPixmap(sna->front);
-	assert(screen->GetScreenPixmap(screen) == sna->front);
-
-	screen->DestroyPixmap(old_front);
-
 	while (sna_mode_has_pending_events(sna))
 		sna_mode_wakeup(sna);
 
diff --git a/src/sna/sna_display_fake.c b/src/sna/sna_display_fake.c
index 113c44a..6231eb5 100644
--- a/src/sna/sna_display_fake.c
+++ b/src/sna/sna_display_fake.c
@@ -202,9 +202,8 @@ sna_output_fake(struct sna *sna)
 static Bool
 sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
 {
-	struct sna *sna = to_sna(scrn);
 	ScreenPtr screen = scrn->pScreen;
-	PixmapPtr old_front, new_front;
+	PixmapPtr new_front;
 
 	DBG(("%s (%d, %d) -> (%d, %d)\n", __FUNCTION__,
 	     scrn->virtualX, scrn->virtualY,
@@ -213,28 +212,27 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
 	if (scrn->virtualX == width && scrn->virtualY == height)
 		return TRUE;
 
-	assert(sna->front);
-	assert(screen->GetScreenPixmap(screen) == sna->front);
+	assert(to_sna_from_screen(screen)->front);
+	assert(screen->GetScreenPixmap(screen) == to_sna_from_screen(screen)->front);
 
 	DBG(("%s: creating new framebuffer %dx%d\n",
 	     __FUNCTION__, width, height));
 
-	old_front = sna->front;
 	new_front = screen->CreatePixmap(screen,
 					 width, height, scrn->depth,
-					 SNA_CREATE_FB);
+					 0);
 	if (!new_front)
 		return FALSE;
 
-	sna->front = new_front;
 	scrn->virtualX = width;
 	scrn->virtualY = height;
 	scrn->displayWidth = width;
 
-	screen->SetScreenPixmap(sna->front);
-	assert(screen->GetScreenPixmap(screen) == sna->front);
+	screen->SetScreenPixmap(new_front);
+	assert(screen->GetScreenPixmap(screen) == new_front);
+	assert(to_sna_from_screen(screen)->front == new_front);
 
-	screen->DestroyPixmap(old_front);
+	screen->DestroyPixmap(new_front);
 
 	return TRUE;
 }
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 1c98c87..0787d8f 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -220,6 +220,7 @@ static Bool sna_become_master(struct sna *sna)
 static Bool sna_create_screen_resources(ScreenPtr screen)
 {
 	struct sna *sna = to_sna_from_screen(screen);
+	PixmapPtr new_front;
 	unsigned hint;
 
 	DBG(("%s(%dx%d@%d)\n", __FUNCTION__,
@@ -228,6 +229,7 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
 	assert(sna->scrn == xf86ScreenToScrn(screen));
 	assert(sna->scrn->pScreen == screen);
 
+	/* free the data used during miInitScreen */
 	free(screen->devPrivate);
 	screen->devPrivate = NULL;
 
@@ -237,12 +239,12 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
 	if (sna->flags & SNA_IS_HOSTED)
 		hint = 0;
 
-	sna->front = screen->CreatePixmap(screen,
-					  screen->width,
-					  screen->height,
-					  screen->rootDepth,
-					  hint);
-	if (!sna->front) {
+	new_front = screen->CreatePixmap(screen,
+					 screen->width,
+					 screen->height,
+					 screen->rootDepth,
+					 hint);
+	if (!new_front) {
 		xf86DrvMsg(screen->myNum, X_ERROR,
 			   "[intel] Unable to create front buffer %dx%d at depth %d\n",
 			   screen->width,
@@ -252,16 +254,20 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
 		return FALSE;
 	}
 
-	if (!sna_pixmap_force_to_gpu(sna->front, MOVE_WRITE)) {
+	if (!sna_pixmap_force_to_gpu(new_front, MOVE_WRITE)) {
 		xf86DrvMsg(screen->myNum, X_ERROR,
 			   "[intel] Failed to allocate video resources for front buffer %dx%d at depth %d\n",
 			   screen->width,
 			   screen->height,
 			   screen->rootDepth);
-		goto cleanup_front;
+		screen->DestroyPixmap(new_front);
+		return FALSE;
 	}
 
-	screen->SetScreenPixmap(sna->front);
+	screen->SetScreenPixmap(new_front);
+	assert(screen->GetScreenPixmap(screen) == new_front);
+	assert(sna->front == new_front);
+	screen->DestroyPixmap(new_front); /* transfer ownership to screen */
 
 	/* Only preserve the fbcon, not any subsequent server regens */
 	if (serverGeneration == 1 && (sna->flags & SNA_IS_HOSTED) == 0)
@@ -270,16 +276,12 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
 	if (!sna_become_master(sna)) {
 		xf86DrvMsg(screen->myNum, X_ERROR,
 			   "[intel] Failed to become DRM master\n");
-		goto cleanup_front;
+		screen->DestroyPixmap(sna->front);
+		sna->front = NULL;
+		return FALSE;
 	}
 
 	return TRUE;
-
-cleanup_front:
-	screen->SetScreenPixmap(NULL);
-	screen->DestroyPixmap(sna->front);
-	sna->front = NULL;
-	return FALSE;
 }
 
 static void sna_selftest(void)
commit 097c2567939f2063749acf0bc768df7bb002d535
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 25 10:49:57 2013 +0100

    sna: Add a few more checks for a hosted Xserver before walking CRTC lists
    
    If we are hosted, we do not own the CRTC configuration, and deferencing
    the private data structures believing them to be ours, only leads to
    disaster.
    
    Based on patches by Christopher James Halse Rogers.
    
    Reported-by: Christopher James Halse Rogers <raof at ubuntu.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index f4722d1..337ebc8 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -389,7 +389,7 @@ to_sna_from_kgem(struct kgem *kgem)
 #define MAX(a,b)	((a) >= (b) ? (a) : (b))
 #endif
 
-extern xf86CrtcPtr sna_covering_crtc(ScrnInfoPtr scrn,
+extern xf86CrtcPtr sna_covering_crtc(struct sna *sna,
 				     const BoxRec *box,
 				     xf86CrtcPtr desired);
 
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 3d42eb9..daffbc2 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1004,6 +1004,7 @@ void sna_copy_fbcon(struct sna *sna)
 		return;
 
 	DBG(("%s\n", __FUNCTION__));
+	assert((sna->flags & SNA_IS_HOSTED) == 0);
 
 	priv = sna_pixmap(sna->front);
 	assert(priv && priv->gpu_bo);
@@ -2736,6 +2737,7 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
 	DBG(("%s (%d, %d) -> (%d, %d)\n", __FUNCTION__,
 	     scrn->virtualX, scrn->virtualY,
 	     width, height));
+	assert((sna->flags & SNA_IS_HOSTED) == 0);
 
 	if (scrn->virtualX == width && scrn->virtualY == height)
 		return TRUE;
@@ -2873,6 +2875,7 @@ sna_page_flip(struct sna *sna,
 
 	DBG(("%s: handle %d attached\n", __FUNCTION__, bo->handle));
 	assert(bo->refcnt);
+	assert((sna->flags & SNA_IS_HOSTED) == 0);
 
 	kgem_bo_submit(&sna->kgem, bo);
 
@@ -2979,6 +2982,8 @@ static bool sna_probe_initial_configuration(struct sna *sna)
 	int width, height;
 	int i, j;
 
+	assert((sna->flags & SNA_IS_HOSTED) == 0);
+
 	if (xf86ReturnOptValBool(sna->Options, OPTION_REPROBE, FALSE))
 		return false;
 
@@ -3278,16 +3283,17 @@ static int sna_box_area(const BoxRec *box)
  * with greater coverage
  */
 xf86CrtcPtr
-sna_covering_crtc(ScrnInfoPtr scrn,
-		  const BoxRec *box,
-		  xf86CrtcPtr desired)
+sna_covering_crtc(struct sna *sna, const BoxRec *box, xf86CrtcPtr desired)
 {
-	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
 	xf86CrtcPtr best_crtc;
 	int best_coverage, c;
 
+	if (sna->flags & SNA_IS_HOSTED)
+		return NULL;
+
 	/* If we do not own the VT, we do not own the CRTC either */
-	if (!scrn->vtSema)
+	if (!sna->scrn->vtSema)
 		return NULL;
 
 	DBG(("%s for box=(%d, %d), (%d, %d)\n",
@@ -3616,6 +3622,9 @@ void sna_mode_update(struct sna *sna)
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
 	int i;
 
+	if (sna->flags & SNA_IS_HOSTED)
+		return;
+
 	/* Validate CRTC attachments and force consistency upon the kernel */
 	for (i = 0; i < xf86_config->num_crtc; i++) {
 		xf86CrtcPtr crtc = xf86_config->crtc[i];
@@ -3906,6 +3915,7 @@ void sna_mode_redisplay(struct sna *sna)
 		return;
 
 	DBG(("%s: posting shadow damage\n", __FUNCTION__));
+	assert((sna->flags & SNA_IS_HOSTED) == 0);
 	assert(sna->mode.shadow_active);
 
 	region = DamageRegion(sna->mode.shadow_damage);
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 5f2811b..1eec740 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -781,7 +781,7 @@ __sna_dri_copy_region(struct sna *sna, DrawablePtr draw, RegionPtr region,
 
 		crtc = NULL;
 		if (sync && sna_pixmap_is_scanout(sna, pixmap))
-			crtc = sna_covering_crtc(sna->scrn, &clip.extents, NULL);
+			crtc = sna_covering_crtc(sna, &clip.extents, NULL);
 		sna_dri_select_mode(sna, dst_bo, src_bo, crtc != NULL);
 
 		sync = (crtc != NULL&&
@@ -885,22 +885,22 @@ static inline int sna_wait_vblank(struct sna *sna, drmVBlank *vbl)
 #if DRI2INFOREC_VERSION >= 4
 
 static int
-sna_dri_get_pipe(DrawablePtr pDraw)
+sna_dri_get_pipe(DrawablePtr draw)
 {
-	ScrnInfoPtr pScrn = xf86ScreenToScrn(pDraw->pScreen);
+	struct sna *sna = to_sna_from_drawable(draw);
 	xf86CrtcPtr crtc;
 	BoxRec box;
 	int pipe;
 
-	if (pDraw->type == DRAWABLE_PIXMAP)
+	if (draw->type == DRAWABLE_PIXMAP)
 		return -1;
 
-	box.x1 = pDraw->x;
-	box.y1 = pDraw->y;
-	box.x2 = box.x1 + pDraw->width;
-	box.y2 = box.y1 + pDraw->height;
+	box.x1 = draw->x;
+	box.y1 = draw->y;
+	box.x2 = box.x1 + draw->width;
+	box.y2 = box.y1 + draw->height;
 
-	crtc = sna_covering_crtc(pScrn, &box, NULL);
+	crtc = sna_covering_crtc(sna, &box, NULL);
 
 	/* Make sure the CRTC is valid and this is the real front buffer */
 	pipe = -1;
diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
index cd9e3ee..2083a22 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -121,10 +121,9 @@ void sna_video_buffer_fini(struct sna_video *video)
 }
 
 bool
-sna_video_clip_helper(ScrnInfoPtr scrn,
-		      struct sna_video *video,
+sna_video_clip_helper(struct sna_video *video,
 		      struct sna_video_frame *frame,
-		      xf86CrtcPtr * crtc_ret,
+		      xf86CrtcPtr *crtc_ret,
 		      BoxPtr dst,
 		      short src_x, short src_y,
 		      short drw_x, short drw_y,
@@ -152,7 +151,7 @@ sna_video_clip_helper(ScrnInfoPtr scrn,
 	 * For overlay video, compute the relevant CRTC and
 	 * clip video to that
 	 */
-	crtc = sna_covering_crtc(scrn, dst, video->desired_crtc);
+	crtc = sna_covering_crtc(video->sna, dst, video->desired_crtc);
 
 	/* For textured video, we don't actually want to clip at all. */
 	if (crtc && !video->textured) {
diff --git a/src/sna/sna_video.h b/src/sna/sna_video.h
index 875f8cc..cbb3ea3 100644
--- a/src/sna/sna_video.h
+++ b/src/sna/sna_video.h
@@ -162,10 +162,9 @@ static inline int is_planar_fourcc(int id)
 }
 
 bool
-sna_video_clip_helper(ScrnInfoPtr scrn,
-		      struct sna_video *adaptor_priv,
+sna_video_clip_helper(struct sna_video *video,
 		      struct sna_video_frame *frame,
-		      xf86CrtcPtr * crtc_ret,
+		      xf86CrtcPtr *crtc_ret,
 		      BoxPtr dst,
 		      short src_x, short src_y,
 		      short drw_x, short drw_y,
diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
index 0b53e6e..766e048 100644
--- a/src/sna/sna_video_overlay.c
+++ b/src/sna/sna_video_overlay.c
@@ -524,8 +524,7 @@ sna_video_overlay_put_image(ClientPtr client,
 
 	sna_video_frame_init(video, format->id, width, height, &frame);
 
-	if (!sna_video_clip_helper(sna->scrn, video, &frame,
-				   &crtc, &dstBox,
+	if (!sna_video_clip_helper(video, &frame, &crtc, &dstBox,
 				   src_x, src_y, draw->x + drw_x, draw->y + drw_y,
 				   src_w, src_h, drw_w, drw_h,
 				   &clip))
diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
index 8b094c4..22b5e08 100644
--- a/src/sna/sna_video_sprite.c
+++ b/src/sna/sna_video_sprite.c
@@ -366,8 +366,7 @@ static int sna_video_sprite_put_image(ClientPtr client,
 
 	sna_video_frame_init(video, format->id, width, height, &frame);
 
-	if (!sna_video_clip_helper(sna->scrn, video, &frame,
-				   &crtc, &dst_box,
+	if (!sna_video_clip_helper(video, &frame, &crtc, &dst_box,
 				   src_x, src_y, draw->x + drw_x, draw->y + drw_y,
 				   src_w, src_h, drw_w, drw_h,
 				   &clip))
diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
index 7ec17d1..b7f4d4f 100644
--- a/src/sna/sna_video_textured.c
+++ b/src/sna/sna_video_textured.c
@@ -205,8 +205,7 @@ sna_video_textured_put_image(ClientPtr client,
 
 	sna_video_frame_init(video, format->id, width, height, &frame);
 
-	if (!sna_video_clip_helper(sna->scrn, video, &frame,
-				   &crtc, &dstBox,
+	if (!sna_video_clip_helper(video, &frame, &crtc, &dstBox,
 				   src_x, src_y, drw_x + draw->x, drw_y + draw->y,
 				   src_w, src_h, drw_w, drw_h,
 				   &clip))


More information about the xorg-commit mailing list