xf86-video-intel: 2 commits - src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/kgem.h

Chris Wilson ickle at kemper.freedesktop.org
Wed Dec 26 08:36:31 PST 2012


 src/sna/gen6_render.c |   42 +++++++++++++++++++++++-------------------
 src/sna/gen7_render.c |   42 ++++++++++++++++++++----------------------
 src/sna/kgem.c        |   31 +++++++++++++++++++++++++------
 src/sna/kgem.h        |    2 ++
 4 files changed, 70 insertions(+), 47 deletions(-)

New commits:
commit 861c2362dd38d7d43fe7ffb181cb197199a1c570
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Dec 26 14:12:42 2012 +0000

    sna/gen6+: Tweak to only consider active ring on destination
    
    Otherwise we decide to use BLT when hitting the render/sampler cache
    is preferrable for a source bo.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 647ef50..ef1a7c0 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1949,15 +1949,8 @@ gen6_composite_set_target(struct sna *sna,
 	return true;
 }
 
-static bool prefer_blt_ring(struct sna *sna)
-{
-	if (PREFER_RENDER)
-		return PREFER_RENDER < 0;
-
-	return sna->kgem.ring != KGEM_RENDER;
-}
-
-inline static bool can_switch_to_blt(struct sna *sna)
+inline static bool can_switch_to_blt(struct sna *sna,
+				     struct kgem_bo *bo)
 {
 	if (sna->kgem.ring != KGEM_RENDER)
 		return true;
@@ -1968,6 +1961,9 @@ inline static bool can_switch_to_blt(struct sna *sna)
 	if (!sna->kgem.has_semaphores)
 		return false;
 
+	if (bo && RQ_IS_BLT(bo->rq))
+		return true;
+
 	return kgem_ring_is_idle(&sna->kgem, KGEM_BLT);
 }
 
@@ -1984,12 +1980,18 @@ static int prefer_blt_bo(struct sna *sna, struct kgem_bo *bo)
 	return bo->tiling == I915_TILING_NONE;
 }
 
+inline static bool prefer_blt_ring(struct sna *sna,
+				   struct kgem_bo *bo)
+{
+	return sna->kgem.ring != KGEM_RENDER || can_switch_to_blt(sna, bo);
+}
+
 static bool
 try_blt(struct sna *sna,
 	PicturePtr dst, PicturePtr src,
 	int width, int height)
 {
-	if (prefer_blt_ring(sna)) {
+	if (sna->kgem.ring == KGEM_BLT) {
 		DBG(("%s: already performing BLT\n", __FUNCTION__));
 		return true;
 	}
@@ -2000,7 +2002,7 @@ try_blt(struct sna *sna,
 		return true;
 	}
 
-	if (can_switch_to_blt(sna) && sna_picture_is_solid(src, NULL))
+	if (can_switch_to_blt(sna, NULL) && sna_picture_is_solid(src, NULL))
 		return true;
 
 	return false;
@@ -2227,11 +2229,10 @@ prefer_blt_composite(struct sna *sna, struct sna_composite_op *tmp)
 	    untiled_tlb_miss(tmp->src.bo))
 		return true;
 
-	if (!prefer_blt_ring(sna))
+	if (!prefer_blt_ring(sna, tmp->dst.bo))
 		return false;
 
-	return (prefer_blt_bo(sna, tmp->dst.bo) >= 0 &&
-		prefer_blt_bo(sna, tmp->src.bo) >= 0);
+	return (prefer_blt_bo(sna, tmp->dst.bo) | prefer_blt_bo(sna, tmp->src.bo)) > 0;
 }
 
 static bool
@@ -2640,7 +2641,7 @@ static inline bool prefer_blt_copy(struct sna *sna,
 	if (sna->kgem.ring == KGEM_BLT)
 		return true;
 
-	if (src_bo == dst_bo && can_switch_to_blt(sna))
+	if (src_bo == dst_bo && can_switch_to_blt(sna, dst_bo))
 		return true;
 
 	if ((flags & COPY_LAST && sna->kgem.ring != KGEM_RENDER))
@@ -2650,8 +2651,11 @@ static inline bool prefer_blt_copy(struct sna *sna,
 	    untiled_tlb_miss(dst_bo))
 		return true;
 
+	if (!prefer_blt_ring(sna, dst_bo))
+		return false;
+
 	return (prefer_blt_bo(sna, src_bo) >= 0 &&
-		prefer_blt_bo(sna, dst_bo) >= 0);
+		prefer_blt_bo(sna, dst_bo) > 0);
 }
 
 inline static void boxes_extents(const BoxRec *box, int n, BoxRec *extents)
@@ -2732,7 +2736,7 @@ fallback_blt:
 		if (too_large(extents.x2-extents.x1, extents.y2-extents.y1))
 			goto fallback_blt;
 
-		if ((flags & COPY_LAST || can_switch_to_blt(sna)) &&
+		if ((flags & COPY_LAST || can_switch_to_blt(sna, dst_bo)) &&
 		    sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 		    sna_blt_copy_boxes(sna, alu,
 				       src_bo, src_dx, src_dy,
@@ -3052,8 +3056,8 @@ static inline bool prefer_blt_fill(struct sna *sna,
 	if (untiled_tlb_miss(bo))
 		return true;
 
-	return (can_switch_to_blt(sna) ||
-		prefer_blt_ring(sna) ||
+	return (can_switch_to_blt(sna, bo) ||
+		prefer_blt_ring(sna, bo) ||
 		prefer_blt_bo(sna, bo) >= 0);
 }
 
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 04ffdc5..18d4a5f 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2072,7 +2072,8 @@ gen7_composite_set_target(struct sna *sna,
 	return true;
 }
 
-inline static bool can_switch_to_blt(struct sna *sna)
+inline static bool can_switch_to_blt(struct sna *sna,
+				     struct kgem_bo *bo)
 {
 	if (sna->kgem.ring != KGEM_RENDER)
 		return true;
@@ -2083,6 +2084,9 @@ inline static bool can_switch_to_blt(struct sna *sna)
 	if (!sna->kgem.has_semaphores)
 		return false;
 
+	if (bo && RQ_IS_BLT(bo->rq))
+		return true;
+
 	return kgem_ring_is_idle(&sna->kgem, KGEM_BLT);
 }
 
@@ -2099,9 +2103,10 @@ static int prefer_blt_bo(struct sna *sna, struct kgem_bo *bo)
 	return bo->tiling == I915_TILING_NONE;
 }
 
-inline static bool prefer_blt_ring(struct sna *sna)
+inline static bool prefer_blt_ring(struct sna *sna,
+				   struct kgem_bo *bo)
 {
-	return sna->kgem.ring != KGEM_RENDER || can_switch_to_blt(sna);
+	return sna->kgem.ring != KGEM_RENDER || can_switch_to_blt(sna, bo);
 }
 
 static bool
@@ -2120,17 +2125,8 @@ try_blt(struct sna *sna,
 		return true;
 	}
 
-	if (can_switch_to_blt(sna)) {
-		if (sna_picture_is_solid(src, NULL))
-			return true;
-
-		if (dst->pDrawable == src->pDrawable)
-			return true;
-
-		if (src->pDrawable &&
-		    get_drawable_pixmap(dst->pDrawable) == get_drawable_pixmap(src->pDrawable))
-			return true;
-	}
+	if (can_switch_to_blt(sna, NULL) && sna_picture_is_solid(src, NULL))
+		return true;
 
 	return false;
 }
@@ -2356,11 +2352,10 @@ prefer_blt_composite(struct sna *sna, struct sna_composite_op *tmp)
 	    untiled_tlb_miss(tmp->src.bo))
 		return true;
 
-	if (!prefer_blt_ring(sna))
+	if (!prefer_blt_ring(sna, tmp->dst.bo))
 		return false;
 
-	return (prefer_blt_bo(sna, tmp->dst.bo) >= 0 &&
-		prefer_blt_bo(sna, tmp->src.bo) >= 0);
+	return (prefer_blt_bo(sna, tmp->dst.bo) | prefer_blt_bo(sna, tmp->src.bo)) > 0;
 }
 
 static bool
@@ -2747,7 +2742,7 @@ static inline bool prefer_blt_copy(struct sna *sna,
 	if (sna->kgem.ring == KGEM_BLT)
 		return true;
 
-	if (src_bo == dst_bo && can_switch_to_blt(sna))
+	if (src_bo == dst_bo && can_switch_to_blt(sna, dst_bo))
 		return true;
 
 	if ((flags & COPY_LAST && sna->kgem.ring != KGEM_RENDER))
@@ -2757,8 +2752,11 @@ static inline bool prefer_blt_copy(struct sna *sna,
 	    untiled_tlb_miss(dst_bo))
 		return true;
 
+	if (!prefer_blt_ring(sna, dst_bo))
+		return false;
+
 	return (prefer_blt_bo(sna, src_bo) >= 0 &&
-		prefer_blt_bo(sna, dst_bo) >= 0);
+		prefer_blt_bo(sna, dst_bo) > 0);
 }
 
 inline static void boxes_extents(const BoxRec *box, int n, BoxRec *extents)
@@ -2839,7 +2837,7 @@ fallback_blt:
 		if (too_large(extents.x2-extents.x1, extents.y2-extents.y1))
 			goto fallback_blt;
 
-		if ((flags & COPY_LAST || can_switch_to_blt(sna)) &&
+		if ((flags & COPY_LAST || can_switch_to_blt(sna, dst_bo)) &&
 		    sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 		    sna_blt_copy_boxes(sna, alu,
 				       src_bo, src_dx, src_dy,
@@ -3148,8 +3146,8 @@ static inline bool prefer_blt_fill(struct sna *sna,
 	if (untiled_tlb_miss(bo))
 		return true;
 
-	return (can_switch_to_blt(sna) ||
-		prefer_blt_ring(sna) ||
+	return (can_switch_to_blt(sna, bo) ||
+		prefer_blt_ring(sna, bo) ||
 		prefer_blt_bo(sna, bo) >= 0);
 }
 
commit f9b6aa3aaf784f9149e091a646673ddf341cd7ca
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Dec 26 13:05:52 2012 +0000

    sna: Explicitly track self-relocation entries
    
    Avoid having to walk the full relocation array for the few entries that
    need to be updated for the batch buffer offset.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index adeead1..dbc7f14 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1380,14 +1380,30 @@ static void kgem_fixup_self_relocs(struct kgem *kgem, struct kgem_bo *bo)
 {
 	int n;
 
-	for (n = 0; n < kgem->nreloc; n++) {
-		if (kgem->reloc[n].target_handle == ~0U) {
-			kgem->reloc[n].target_handle = bo->target_handle;
-			kgem->reloc[n].presumed_offset = bo->presumed_offset;
-			kgem->batch[kgem->reloc[n].offset/sizeof(kgem->batch[0])] =
-				kgem->reloc[n].delta + bo->presumed_offset;
+	if (kgem->nreloc__self == 0)
+		return;
+
+	for (n = 0; n < kgem->nreloc__self; n++) {
+		int i = kgem->reloc__self[n];
+		assert(kgem->reloc[i].target_handle == ~0U);
+		kgem->reloc[i].target_handle = bo->target_handle;
+		kgem->reloc[i].presumed_offset = bo->presumed_offset;
+		kgem->batch[kgem->reloc[i].offset/sizeof(kgem->batch[0])] =
+			kgem->reloc[i].delta + bo->presumed_offset;
+	}
+
+	if (n == 256) {
+		for (n = kgem->reloc__self[255]; n < kgem->nreloc; n++) {
+			if (kgem->reloc[n].target_handle == ~0U) {
+				kgem->reloc[n].target_handle = bo->target_handle;
+				kgem->reloc[n].presumed_offset = bo->presumed_offset;
+				kgem->batch[kgem->reloc[n].offset/sizeof(kgem->batch[0])] =
+					kgem->reloc[n].delta + bo->presumed_offset;
+			}
 		}
+
 	}
+
 }
 
 static void kgem_bo_binding_free(struct kgem *kgem, struct kgem_bo *bo)
@@ -2333,6 +2349,7 @@ void kgem_reset(struct kgem *kgem)
 	kgem->nfence = 0;
 	kgem->nexec = 0;
 	kgem->nreloc = 0;
+	kgem->nreloc__self = 0;
 	kgem->aperture = 0;
 	kgem->aperture_fenced = 0;
 	kgem->nbatch = 0;
@@ -4149,6 +4166,8 @@ uint32_t kgem_add_reloc(struct kgem *kgem,
 		kgem->reloc[index].delta = delta;
 		kgem->reloc[index].target_handle = ~0U;
 		kgem->reloc[index].presumed_offset = 0;
+		if (kgem->nreloc__self < 256)
+			kgem->reloc__self[kgem->nreloc__self++] = index;
 	}
 	kgem->reloc[index].read_domains = read_write_domain >> 16;
 	kgem->reloc[index].write_domain = read_write_domain & 0x7fff;
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 1b14c20..b7126c0 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -152,6 +152,7 @@ struct kgem {
 	uint16_t surface;
 	uint16_t nexec;
 	uint16_t nreloc;
+	uint16_t nreloc__self;
 	uint16_t nfence;
 	uint16_t batch_size;
 	uint16_t min_alignment;
@@ -194,6 +195,7 @@ struct kgem {
 	uint32_t batch[64*1024-8];
 	struct drm_i915_gem_exec_object2 exec[256];
 	struct drm_i915_gem_relocation_entry reloc[4096];
+	uint16_t reloc__self[256];
 
 #ifdef DEBUG_MEMORY
 	struct {


More information about the xorg-commit mailing list