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