xf86-video-intel: src/intel_driver.c src/intel.h src/intel_uxa.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Sep 10 05:25:45 PDT 2010


 src/intel.h        |    5 ++--
 src/intel_driver.c |   25 ++++++++------------
 src/intel_uxa.c    |   65 ++++++++++++++++++++++++++---------------------------
 3 files changed, 46 insertions(+), 49 deletions(-)

New commits:
commit ae160d7fbfc79e78dad8702efcc55d9c0c25ff67
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Sep 10 13:19:12 2010 +0100

    shadow: Simply modify the Screen pixmap header
    
    This is a slightly less risky strategy than having to remember to update
    all pointers to the old Screen pixmap.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel.h b/src/intel.h
index c258a87..b816aeb 100644
--- a/src/intel.h
+++ b/src/intel.h
@@ -282,9 +282,10 @@ typedef struct intel_screen_private {
 	long GTTMapSize;
 
 	void *modes;
-	drm_intel_bo *front_buffer, *shadow_buffer;
+	drm_intel_bo *front_buffer;
 	long front_pitch, front_tiling;
-	PixmapPtr shadow_pixmap;
+	void *shadow_buffer;
+	int shadow_stride;
 	DamagePtr shadow_damage;
 
 	dri_bufmgr *bufmgr;
diff --git a/src/intel_driver.c b/src/intel_driver.c
index eab5c2c..6087f55 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -1140,22 +1140,19 @@ static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen)
 		intel->front_buffer = NULL;
 	}
 
-	if (intel->shadow_pixmap) {
-		PixmapPtr pixmap = intel->shadow_pixmap;
-
-		if (intel->shadow_damage) {
-			DamageUnregister(&pixmap->drawable,
-					 intel->shadow_damage);
-			DamageDestroy(intel->shadow_damage);
-			intel->shadow_damage = NULL;
-		}
-
-		if (intel->shadow_buffer) {
+	if (intel->shadow_buffer) {
+		if (IS_I8XX(intel))
 			drm_intel_bo_unreference(intel->shadow_buffer);
-			intel->shadow_buffer = NULL;
-		}
+		else
+			free(intel->shadow_buffer);
+		intel->shadow_buffer = NULL;
+	}
 
-		intel->shadow_pixmap = NULL;
+	if (intel->shadow_damage) {
+		DamageUnregister(&screen->GetScreenPixmap(screen)->drawable,
+				 intel->shadow_damage);
+		DamageDestroy(intel->shadow_damage);
+		intel->shadow_damage = NULL;
 	}
 
 	intel_batch_teardown(scrn);
diff --git a/src/intel_uxa.c b/src/intel_uxa.c
index 706d634..0dcd5d3 100644
--- a/src/intel_uxa.c
+++ b/src/intel_uxa.c
@@ -904,8 +904,8 @@ intel_shadow_create_bo(intel_screen_private *intel,
 	bo = drm_intel_bo_alloc(intel->bufmgr, "shadow", size, 0);
 	if (bo && drm_intel_gem_bo_map_gtt(bo) == 0) {
 		char *dst = bo->virtual;
-		char *src = intel->shadow_pixmap->devPrivate.ptr;
-		int src_pitch = intel->shadow_pixmap->devKind;
+		char *src = intel->shadow_buffer;
+		int src_pitch = intel->shadow_stride;
 		int row_length = w * intel->cpp;
 		int num_rows = h;
 		src += y1 * src_pitch + x1 * intel->cpp;
@@ -961,10 +961,10 @@ intel_shadow_blt(intel_screen_private *intel)
 		dri_bo *bo;
 		int offset;
 
-		if (intel->shadow_buffer) {
+		if (IS_I8XX(intel)) {
 			bo = intel->shadow_buffer;
 			offset = box->x1 | box->y1 << 16;
-			pitch = intel->shadow_pixmap->devKind;
+			pitch = intel->shadow_stride;
 		} else {
 			bo = intel_shadow_create_bo(intel,
 						    box->x1, box->y1,
@@ -1004,16 +1004,7 @@ static void intel_shadow_create(struct intel_screen_private *intel)
 	PixmapPtr pixmap;
 	int stride;
 
-	if (IS_I8XX(intel))
-		pixmap = screen->GetScreenPixmap(screen);
-	else
-		pixmap = intel->shadow_pixmap;
-
-	if (intel->shadow_damage) {
-		DamageUnregister(&pixmap->drawable, intel->shadow_damage);
-		DamageDestroy(intel->shadow_damage);
-	}
-
+	pixmap = screen->GetScreenPixmap(screen);
 	if (IS_I8XX(intel)) {
 		dri_bo *bo;
 		int size;
@@ -1043,29 +1034,37 @@ static void intel_shadow_create(struct intel_screen_private *intel)
 			intel->shadow_buffer = bo;
 		}
 	} else {
-		if (intel->shadow_pixmap)
-			fbDestroyPixmap(intel->shadow_pixmap);
-
-		pixmap = fbCreatePixmap(screen,
-					scrn->virtualX,
-					scrn->virtualY,
-					scrn->depth,
-					0);
-
-		screen->SetScreenPixmap(pixmap);
-		stride = pixmap->devKind;
+		void *buffer;
+
+		stride = intel->cpp*scrn->virtualX;
+		buffer = malloc(stride * scrn->virtualY);
+
+		if (buffer && screen->ModifyPixmapHeader(pixmap,
+							 scrn->virtualX,
+							 scrn->virtualY,
+							 -1, -1,
+							 stride,
+							 buffer)) {
+			if (intel->shadow_buffer)
+				free(intel->shadow_buffer);
+
+			intel->shadow_buffer = buffer;
+		} else
+			stride = intel->shadow_stride;
 	}
 
-	intel->shadow_pixmap = pixmap;
-	intel->shadow_damage = DamageCreate(NULL, NULL,
-					    DamageReportNone,
-					    TRUE,
-					    screen,
-					    intel);
-	DamageRegister(&pixmap->drawable, intel->shadow_damage);
-	DamageSetReportAfterOp(intel->shadow_damage, TRUE);
+	if (!intel->shadow_damage) {
+		intel->shadow_damage = DamageCreate(NULL, NULL,
+						    DamageReportNone,
+						    TRUE,
+						    screen,
+						    intel);
+		DamageRegister(&pixmap->drawable, intel->shadow_damage);
+		DamageSetReportAfterOp(intel->shadow_damage, TRUE);
+	}
 
 	scrn->displayWidth = stride / intel->cpp;
+	intel->shadow_stride = stride;
 }
 
 void intel_uxa_block_handler(intel_screen_private *intel)


More information about the xorg-commit mailing list