xf86-video-intel: 6 commits - src/sna/kgem.c src/sna/sna_accel.c src/sna/sna_composite.c src/sna/sna_damage.c src/sna/sna_dri.c src/sna/sna_gradient.c src/sna/sna.h src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Tue Jan 17 10:40:56 PST 2012


 src/sna/kgem.c           |   23 +++++++++---
 src/sna/sna.h            |    1 
 src/sna/sna_accel.c      |   84 +++++++++++++++++++++++++++++++++++------------
 src/sna/sna_composite.c  |    5 +-
 src/sna/sna_damage.c     |    6 ++-
 src/sna/sna_dri.c        |    2 +
 src/sna/sna_gradient.c   |    8 ++++
 src/sna/sna_trapezoids.c |    1 
 8 files changed, 100 insertions(+), 30 deletions(-)

New commits:
commit bbd6c8123635899e89911104bf84e1b7d11d66a1
Author: Eugeni Dodonov <eugeni.dodonov at intel.com>
Date:   Tue Jan 17 16:16:37 2012 -0200

    sna: check for LLC support
    
    Instead of checking for CPU generation, use the libdrm-provided
    I915_PARAM_HAS_LLC instead.
    
    v2: use a define check to verify if we have I915_PARAM_HAS_LLC.
    
    Signed-off-by: Eugeni Dodonov <eugeni.dodonov at intel.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 9c43d96..c7e6aac 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -523,7 +523,7 @@ cpu_cache_size(void)
 static int gem_param(struct kgem *kgem, int name)
 {
 	drm_i915_getparam_t gp;
-	int v = 0;
+	int v = -1; /* No param uses the sign bit, reserve it for errors */
 
 	VG_CLEAR(gp);
 	gp.param = name;
@@ -597,7 +597,7 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen)
 	if (gen < 40) {
 		if (!DBG_NO_RELAXED_FENCING) {
 			kgem->has_relaxed_fencing =
-				gem_param(kgem, I915_PARAM_HAS_RELAXED_FENCING);
+				gem_param(kgem, I915_PARAM_HAS_RELAXED_FENCING) > 0;
 		}
 	} else
 		kgem->has_relaxed_fencing = 1;
@@ -605,8 +605,17 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen)
 	     kgem->has_relaxed_fencing));
 
 	kgem->has_llc = false;
-	if (!DBG_NO_LLC && gen >= 60)
-		kgem->has_llc = true;
+	if (!DBG_NO_LLC) {
+		int has_llc = -1;
+#if defined(I915_PARAM_HAS_LLC) /* Expected in libdrm-2.4.31 */
+		has_llc = gem_param(kgem, I915_PARAM_HAS_LLC);
+#endif
+		if (has_llc == -1) {
+			DBG(("%s: no kernel/drm support for HAS_LLC, assuming support for LLC based on GPU generation\n", __FUNCTION__));
+			has_llc = gen >= 60;
+		}
+		kgem->has_llc = has_llc;
+	}
 	kgem->has_cpu_bo = kgem->has_llc;
 	DBG(("%s: cpu bo enabled %d: llc? %d\n", __FUNCTION__,
 	     kgem->has_cpu_bo, kgem->has_llc));
commit e4efde920bcab980451e79df7d645d1814e5f78d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jan 17 13:44:12 2012 +0000

    sna: Track whether damage is a complete representation of the dirt
    
    The previous commit undoes a premature optimisation that assumed that
    the current damage captured all pixels written. However, it happens to
    be a useful optimisation along that path (tracking upload of partial
    images), so add the necessary booking that watches for when the union
    of cpu and gpu damage is no longer the complete set of all pixels
    written, that is if we either migrate from one pixmap to the other, the
    undamaged region goes untracked. We also take advantage of whenever we
    damage the whole pixel to restore knowledge that our tracking of all
    pixels written is complete.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index e9c85b7..2f79ac6 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -144,6 +144,7 @@ struct sna_pixmap {
 	uint8_t pinned :1;
 	uint8_t mapped :1;
 	uint8_t flush :1;
+	uint8_t undamaged :1;
 	uint8_t gpu :1;
 	uint8_t header :1;
 };
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 7aa5578..4a52983 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -315,6 +315,7 @@ static inline uint32_t default_tiling(PixmapPtr pixmap)
 			      pixmap->drawable.width,
 			      pixmap->drawable.height)) {
 		sna_damage_destroy(&priv->gpu_damage);
+		priv->undamaged = false;
 		return I915_TILING_Y;
 	}
 
@@ -786,6 +787,7 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int flags)
 				       pixmap->drawable.width,
 				       pixmap->drawable.height);
 			sna_damage_destroy(&priv->cpu_damage);
+			priv->undamaged = false;
 			list_del(&priv->list);
 			if (priv->cpu_bo)
 				sna_pixmap_free_cpu(sna, priv);
@@ -849,6 +851,7 @@ skip_inplace_map:
 
 		__sna_damage_destroy(DAMAGE_PTR(priv->gpu_damage));
 		priv->gpu_damage = NULL;
+		priv->undamaged = true;
 	}
 
 	if (flags & MOVE_WRITE) {
@@ -857,6 +860,7 @@ skip_inplace_map:
 			       pixmap->drawable.width,
 			       pixmap->drawable.height);
 		sna_pixmap_free_gpu(sna, priv);
+		priv->undamaged = false;
 
 		if (priv->flush)
 			list_move(&priv->list, &sna->dirty_pixmaps);
@@ -1059,11 +1063,12 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 				pixmap->devKind = priv->gpu_bo->pitch;
 
 				sna_damage_subtract(&priv->cpu_damage, region);
-				if (priv->cpu_damage == NULL)
+				if (priv->cpu_damage == NULL) {
 					sna_damage_all(&priv->gpu_damage,
 						       pixmap->drawable.width,
 						       pixmap->drawable.height);
-				else
+					priv->undamaged = false;
+				} else
 					sna_damage_add(&priv->gpu_damage,
 						       region);
 
@@ -1096,11 +1101,12 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 			pixmap->devKind = priv->gpu_bo->pitch;
 
 			sna_damage_subtract(&priv->cpu_damage, region);
-			if (priv->cpu_damage == NULL)
+			if (priv->cpu_damage == NULL) {
 				sna_damage_all(&priv->gpu_damage,
 					       pixmap->drawable.width,
 					       pixmap->drawable.height);
-			else
+				priv->undamaged = false;
+			} else
 				sna_damage_add(&priv->gpu_damage, region);
 
 			return true;
@@ -1170,6 +1176,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 					       box, n);
 		}
 		sna_damage_destroy(&priv->gpu_damage);
+		priv->undamaged = true;
 	}
 
 	if (sna_damage_contains_box(priv->gpu_damage,
@@ -1243,6 +1250,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 						       box, n);
 
 				sna_damage_destroy(&priv->gpu_damage);
+				priv->undamaged = true;
 			} else if (DAMAGE_IS_ALL(priv->gpu_damage) ||
 				   sna_damage_contains_box__no_reduce(priv->gpu_damage,
 								      &r->extents)) {
@@ -1263,6 +1271,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 						       box, n);
 
 				sna_damage_subtract(&priv->gpu_damage, r);
+				priv->undamaged = true;
 			} else {
 				RegionRec need;
 
@@ -1285,6 +1294,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 							       box, n);
 
 					sna_damage_subtract(&priv->gpu_damage, r);
+					priv->undamaged = true;
 					RegionUninit(&need);
 				}
 			}
@@ -1304,6 +1314,7 @@ done:
 				      pixmap->drawable.height)) {
 			DBG(("%s: replaced entire pixmap\n", __FUNCTION__));
 			sna_pixmap_free_gpu(sna, priv);
+			priv->undamaged = false;
 		}
 		if (priv->flush)
 			list_move(&priv->list, &sna->dirty_pixmaps);
@@ -1434,6 +1445,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box)
 
 		sna_damage_destroy(&priv->cpu_damage);
 		list_del(&priv->list);
+		priv->undamaged = true;
 	} else if (DAMAGE_IS_ALL(priv->cpu_damage) ||
 		   sna_damage_contains_box__no_reduce(priv->cpu_damage, box)) {
 		Bool ok = FALSE;
@@ -1453,6 +1465,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box)
 		sna_damage_subtract(&priv->cpu_damage, &r);
 		if (priv->cpu_damage == NULL)
 			list_del(&priv->list);
+		priv->undamaged = true;
 	} else if (sna_damage_intersect(priv->cpu_damage, &r, &i)) {
 		int n = REGION_NUM_RECTS(&i);
 		Bool ok;
@@ -1473,6 +1486,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box)
 					box, n);
 
 		sna_damage_subtract(&priv->cpu_damage, &r);
+		priv->undamaged = true;
 		RegionUninit(&i);
 
 		if (priv->cpu_damage == NULL)
@@ -1786,6 +1800,7 @@ sna_pixmap_force_to_gpu(PixmapPtr pixmap, unsigned flags)
 			sna_damage_all(&priv->gpu_damage,
 				       pixmap->drawable.width,
 				       pixmap->drawable.height);
+			priv->undamaged = false;
 			DBG(("%s: marking as all-damaged for GPU\n",
 			     __FUNCTION__));
 		}
@@ -1848,8 +1863,10 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 			sna_damage_all(&priv->gpu_damage,
 				       pixmap->drawable.width,
 				       pixmap->drawable.height);
+			priv->undamaged = false;
 			DBG(("%s: marking as all-damaged for GPU\n",
 			     __FUNCTION__));
+			goto active;
 		}
 	}
 
@@ -1892,12 +1909,15 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 
 	__sna_damage_destroy(DAMAGE_PTR(priv->cpu_damage));
 	priv->cpu_damage = NULL;
+	priv->undamaged = true;
 done:
 	list_del(&priv->list);
 
 	sna_damage_reduce_all(&priv->gpu_damage,
 			      pixmap->drawable.width,
 			      pixmap->drawable.height);
+	if (DAMAGE_IS_ALL(priv->gpu_damage))
+		priv->undamaged = false;
 active:
 	if (!priv->pinned)
 		list_move(&priv->inactive, &sna->active_pixmaps);
@@ -2214,11 +2234,12 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 				list_del(&priv->list);
 			} else
 				sna_damage_subtract(&priv->cpu_damage, region);
-			if (priv->cpu_damage == NULL)
+			if (priv->cpu_damage == NULL) {
 				sna_damage_all(&priv->gpu_damage,
 					       pixmap->drawable.width,
 					       pixmap->drawable.height);
-			else
+				priv->undamaged = false;
+			} else
 				sna_damage_add(&priv->gpu_damage, region);
 		}
 
@@ -2256,11 +2277,12 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 							list_del(&priv->list);
 						} else
 							sna_damage_subtract(&priv->cpu_damage, region);
-						if (priv->cpu_damage == NULL)
+						if (priv->cpu_damage == NULL) {
 							sna_damage_all(&priv->gpu_damage,
 								       pixmap->drawable.width,
 								       pixmap->drawable.height);
-						else
+							priv->undamaged = false;
+						} else
 							sna_damage_add(&priv->gpu_damage, region);
 					}
 
@@ -2277,12 +2299,16 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 							return false;
 					} else {
 						sna_damage_destroy(&priv->cpu_damage);
+						priv->undamaged = false;
 						list_del(&priv->list);
 					}
 				}
-				sna_damage_all(&priv->gpu_damage,
-					       pixmap->drawable.width,
-					       pixmap->drawable.height);
+				if (priv->undamaged) {
+					sna_damage_all(&priv->gpu_damage,
+						       pixmap->drawable.width,
+						       pixmap->drawable.height);
+					priv->undamaged = false;
+				}
 				sna_pixmap_free_cpu(sna, priv);
 			}
 		}
@@ -2308,6 +2334,7 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 				       pixmap->drawable.width,
 				       pixmap->drawable.height);
 			sna_pixmap_free_gpu(sna, priv);
+			priv->undamaged = false;
 		} else {
 			sna_damage_subtract(&priv->gpu_damage, region);
 			sna_damage_add(&priv->cpu_damage, region);
@@ -2317,6 +2344,7 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 					      pixmap->drawable.height)) {
 				DBG(("%s: replaced entire pixmap\n", __FUNCTION__));
 				sna_pixmap_free_gpu(sna, priv);
+				priv->undamaged = false;
 			}
 		}
 		if (priv->flush)
@@ -3000,6 +3028,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 					sna_damage_all(&dst_priv->gpu_damage,
 						       dst_pixmap->drawable.width,
 						       dst_pixmap->drawable.height);
+					dst_priv->undamaged = false;
 				} else {
 					RegionTranslate(&region, dst_dx, dst_dy);
 					assert_pixmap_contains_box(dst_pixmap,
@@ -3029,6 +3058,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 					sna_damage_all(&dst_priv->gpu_damage,
 						       dst_pixmap->drawable.width,
 						       dst_pixmap->drawable.height);
+					dst_priv->undamaged = false;
 				} else {
 					RegionTranslate(&region, dst_dx, dst_dy);
 					assert_pixmap_contains_box(dst_pixmap,
@@ -3125,6 +3155,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 					sna_damage_all(&dst_priv->gpu_damage,
 						       dst_pixmap->drawable.width,
 						       dst_pixmap->drawable.height);
+					dst_priv->undamaged = false;
 				}
 			} else {
 				DBG(("%s: dst is on the GPU, src is on the CPU, uploading into dst\n",
@@ -6909,11 +6940,12 @@ sna_poly_fill_rect_blt(DrawablePtr drawable,
 				if (damage) {
 					assert_pixmap_contains_box(pixmap, &r);
 					if (r.x2 - r.x1 == pixmap->drawable.width &&
-					    r.y2 - r.y1 == pixmap->drawable.height)
+					    r.y2 - r.y1 == pixmap->drawable.height) {
 						sna_damage_all(damage,
 							       pixmap->drawable.width,
 							       pixmap->drawable.height);
-					else
+						sna_pixmap(pixmap)->undamaged = false;
+					} else
 						sna_damage_add_box(damage, &r);
 				}
 			} else
@@ -10010,6 +10042,8 @@ static void sna_accel_inactive(struct sna *sna)
 			list_del(&priv->list);
 
 			sna_pixmap_free_cpu(sna, priv);
+			priv->undamaged = false;
+
 			list_add(&priv->inactive, &preserve);
 		} else {
 			DBG(("%s: discarding inactive GPU bo handle=%d\n",
diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index 15876f5..47eac63 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -774,10 +774,11 @@ sna_composite_rectangles(CARD8		 op,
 
 		if (region.data == NULL &&
 		    region.extents.x2 - region.extents.x1 == pixmap->drawable.width &&
-		    region.extents.y2 - region.extents.y1 == pixmap->drawable.height)
+		    region.extents.y2 - region.extents.y1 == pixmap->drawable.height) {
 			sna_damage_all(&priv->gpu_damage,
 				       pixmap->drawable.width, pixmap->drawable.height);
-		else
+			priv->undamaged = false;
+		} else
 			sna_damage_add(&priv->gpu_damage, &region);
 	}
 
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 9de7faa..2245c03 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -342,6 +342,7 @@ damage_all:
 			       pixmap->drawable.width,
 			       pixmap->drawable.height);
 		sna_damage_destroy(&priv->cpu_damage);
+		priv->undamaged = false;
 	} else {
 		BoxPtr box = RegionExtents(region);
 		if (region->data == NULL &&
@@ -364,6 +365,7 @@ static void set_bo(PixmapPtr pixmap, struct kgem_bo *bo)
 		       pixmap->drawable.width,
 		       pixmap->drawable.height);
 	sna_damage_destroy(&priv->cpu_damage);
+	priv->undamaged = false;
 
 	kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
 	priv->gpu_bo = ref(bo);
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 4f91842..d038539 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -3947,6 +3947,7 @@ static void mark_damaged(PixmapPtr pixmap, struct sna_pixmap *priv,
 		sna_damage_all(&priv->gpu_damage,
 			       pixmap->drawable.width,
 			       pixmap->drawable.height);
+		priv->undamaged = false;
 	} else {
 		sna_damage_add_box(&priv->gpu_damage, box);
 		sna_damage_subtract_box(&priv->cpu_damage, box);
commit a9b705f9a7bbd37a0543ce5fbd4c60c912d1017d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jan 17 12:58:43 2012 +0000

    sna: Mark GPU as all-damaged discarding the CPU bo to prevent stalls
    
    If we discard the CPU bo, we lose knowledge of whatever regions had been
    initialised but no longer dirty on the GPU, but instead must assume that
    the entirety of the GPU bo is dirty.
    
    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 80c21dd..7aa5578 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2280,6 +2280,9 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 						list_del(&priv->list);
 					}
 				}
+				sna_damage_all(&priv->gpu_damage,
+					       pixmap->drawable.width,
+					       pixmap->drawable.height);
 				sna_pixmap_free_cpu(sna, priv);
 			}
 		}
commit 9d631e26d758eb4c2032a502604f07c5403b25ff
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jan 17 12:58:03 2012 +0000

    sna: Mark the freshly allocated CPU bo as in the CPU domain
    
    As we immediately use it after creation, we need to inform GEM of the
    domain transfer.
    
    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 f9c152d..80c21dd 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -223,8 +223,10 @@ sna_pixmap_alloc_cpu(struct sna *sna,
 			if (priv->ptr == NULL) {
 				kgem_bo_destroy(&sna->kgem, priv->cpu_bo);
 				priv->cpu_bo = NULL;
-			} else
+			} else {
+				kgem_bo_sync__cpu(&sna->kgem, priv->cpu_bo);
 				priv->stride = priv->cpu_bo->pitch;
+			}
 		}
 	}
 
commit dfbf02b8778719b86e0f5d78ee833a19436d43a0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jan 17 10:55:29 2012 +0000

    sna: Add some DBG breadcrumbs to put_image upload paths
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 970e462..9c43d96 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -289,14 +289,16 @@ kgem_busy(struct kgem *kgem, int handle)
 
 static void kgem_bo_retire(struct kgem *kgem, struct kgem_bo *bo)
 {
+	DBG(("%s: handle=%d, domain=%d\n",
+	     __FUNCTION__, bo->handle, bo->domain));
 	assert(!kgem_busy(kgem, bo->handle));
 
 	if (bo->domain == DOMAIN_GPU)
 		kgem_retire(kgem);
 
 	if (bo->exec == NULL) {
-		DBG(("%s: retiring bo handle=%d (needed flush? %d)\n",
-		     __FUNCTION__, bo->handle, bo->needs_flush));
+		DBG(("%s: retiring bo handle=%d (needed flush? %d), rq? %d\n",
+		     __FUNCTION__, bo->handle, bo->needs_flush, bo->rq != NULL));
 		bo->rq = NULL;
 		list_del(&bo->request);
 		bo->needs_flush = bo->flush;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 7774cba..f9c152d 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2206,6 +2206,7 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 	    sna_put_image_upload_blt(drawable, gc, region,
 				     x, y, w, h, bits, stride)) {
 		if (!DAMAGE_IS_ALL(priv->gpu_damage)) {
+			DBG(("%s: marking damage\n", __FUNCTION__));
 			if (region_subsumes_drawable(region, &pixmap->drawable)) {
 				sna_damage_destroy(&priv->cpu_damage);
 				list_del(&priv->list);
@@ -2264,16 +2265,19 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 					return true;
 				}
 			} else {
-				if (!region_subsumes_drawable(region, &pixmap->drawable)) {
-					sna_damage_subtract(&priv->cpu_damage, region);
-					if (!sna_pixmap_move_to_gpu(pixmap,
-								    MOVE_WRITE))
-						return false;
-				} else {
-					sna_damage_destroy(&priv->cpu_damage);
-					list_del(&priv->list);
+				DBG(("%s: cpu bo will stall, upload damage and discard\n",
+				     __FUNCTION__));
+				if (priv->cpu_damage) {
+					if (!region_subsumes_drawable(region, &pixmap->drawable)) {
+						sna_damage_subtract(&priv->cpu_damage, region);
+						if (!sna_pixmap_move_to_gpu(pixmap,
+									    MOVE_WRITE))
+							return false;
+					} else {
+						sna_damage_destroy(&priv->cpu_damage);
+						list_del(&priv->list);
+					}
 				}
-
 				sna_pixmap_free_cpu(sna, priv);
 			}
 		}
@@ -2292,6 +2296,7 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 		return true;
 
 	if (!DAMAGE_IS_ALL(priv->cpu_damage)) {
+		DBG(("%s: marking damage\n", __FUNCTION__));
 		if (region_subsumes_drawable(region, &pixmap->drawable)) {
 			DBG(("%s: replacing entire pixmap\n", __FUNCTION__));
 			sna_damage_all(&priv->cpu_damage,
diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c
index 6e456cf..196f479 100644
--- a/src/sna/sna_damage.c
+++ b/src/sna/sna_damage.c
@@ -933,7 +933,7 @@ struct sna_damage *__sna_damage_all(struct sna_damage *damage,
 struct sna_damage *_sna_damage_is_all(struct sna_damage *damage,
 				      int width, int height)
 {
-	DBG(("%s(%d, %d)%s\n", __FUNCTION__, width, height,
+	DBG(("%s(%d, %d)%s?\n", __FUNCTION__, width, height,
 	     damage->dirty ? "*" : ""));
 	assert(damage->mode == DAMAGE_ADD);
 
@@ -947,8 +947,10 @@ struct sna_damage *_sna_damage_is_all(struct sna_damage *damage,
 		assert(RegionNotEmpty(&damage->region));
 	}
 
-	if (damage->region.data)
+	if (damage->region.data) {
+		DBG(("%s: no, not singular\n", __FUNCTION__));
 		return damage;
+	}
 
 	DBG(("%s: (%d, %d), (%d, %d)\n", __FUNCTION__,
 	     damage->extents.x1, damage->extents.y1,
commit da90afc32f19e9168cbaa4e0cdcd941d12f2c142
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jan 17 10:24:06 2012 +0000

    sna: Add DBG breadcrumbs to gradient initialisation
    
    Put some markers into the debug log as those functions create many
    proxies causing a lot of debug noise.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_gradient.c b/src/sna/sna_gradient.c
index 2aa9bbd..96841dd 100644
--- a/src/sna/sna_gradient.c
+++ b/src/sna/sna_gradient.c
@@ -314,6 +314,8 @@ static Bool sna_alpha_cache_init(struct sna *sna)
 	uint32_t color[256];
 	int i;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	cache->cache_bo = kgem_create_linear(&sna->kgem, sizeof(color));
 	if (!cache->cache_bo)
 		return FALSE;
@@ -333,6 +335,8 @@ static Bool sna_solid_cache_init(struct sna *sna)
 {
 	struct sna_solid_cache *cache = &sna->render.solid_cache;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	cache->cache_bo =
 		kgem_create_linear(&sna->kgem, sizeof(cache->color));
 	if (!cache->cache_bo)
@@ -354,6 +358,8 @@ static Bool sna_solid_cache_init(struct sna *sna)
 
 Bool sna_gradients_create(struct sna *sna)
 {
+	DBG(("%s\n", __FUNCTION__));
+
 	if (!sna_alpha_cache_init(sna))
 		return FALSE;
 
@@ -367,6 +373,8 @@ void sna_gradients_close(struct sna *sna)
 {
 	int i;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	for (i = 0; i < 256; i++) {
 		if (sna->render.alpha_cache.bo[i])
 			kgem_bo_destroy(&sna->kgem, sna->render.alpha_cache.bo[i]);


More information about the xorg-commit mailing list