xf86-video-intel: 2 commits - src/sna/gen6_render.c src/sna/kgem.c src/sna/kgem_debug_gen3.c src/sna/kgem_debug_gen4.c src/sna/kgem_debug_gen5.c src/sna/kgem.h
Chris Wilson
ickle at kemper.freedesktop.org
Wed Jan 11 04:49:21 PST 2012
src/sna/gen6_render.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
src/sna/kgem.c | 46 +++++++++++++++++++++++++++++++---------------
src/sna/kgem.h | 1 +
src/sna/kgem_debug_gen3.c | 2 +-
src/sna/kgem_debug_gen4.c | 4 ++--
src/sna/kgem_debug_gen5.c | 2 +-
6 files changed, 78 insertions(+), 21 deletions(-)
New commits:
commit e94807759eb6cfb10bd2d372fa71cc64a730bc7c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Jan 11 12:13:18 2012 +0000
sna/gen6: Special case spans with no transform
As the no transform is a special case of affine, we were attempting to
deference the NULL transform in order to determine if it was a simple
no-rotation matrix. As the operation is extremely simple, add a special
case vertex program to speed it up.
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 38d7f96..c7d4e7b 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2603,6 +2603,44 @@ gen6_emit_composite_spans_solid(struct sna *sna,
}
fastcall static void
+gen6_emit_composite_spans_identity(struct sna *sna,
+ const struct sna_composite_spans_op *op,
+ const BoxRec *box,
+ float opacity)
+{
+ float *v;
+ union {
+ struct sna_coordinate p;
+ float f;
+ } dst;
+
+ float sx = op->base.src.scale[0];
+ float sy = op->base.src.scale[1];
+ int16_t tx = op->base.src.offset[0];
+ int16_t ty = op->base.src.offset[1];
+
+ v = sna->render.vertex_data + sna->render.vertex_used;
+ sna->render.vertex_used += 3*5;
+
+ dst.p.x = box->x2;
+ dst.p.y = box->y2;
+ v[0] = dst.f;
+ v[1] = (box->x2 + tx) * sx;
+ v[7] = v[2] = (box->y2 + ty) * sy;
+ v[13] = v[8] = v[3] = opacity;
+ v[9] = v[4] = 1;
+
+ dst.p.x = box->x1;
+ v[5] = dst.f;
+ v[11] = v[6] = (box->x1 + tx) * sx;
+
+ dst.p.y = box->y1;
+ v[10] = dst.f;
+ v[12] = (box->y1 + ty) * sy;
+ v[14] = 0;
+}
+
+fastcall static void
gen6_emit_composite_spans_simple(struct sna *sna,
const struct sna_composite_spans_op *op,
const BoxRec *box,
@@ -2795,9 +2833,11 @@ gen6_render_composite_spans(struct sna *sna,
gen6_composite_alpha_gradient_init(sna, &tmp->base.mask);
tmp->prim_emit = gen6_emit_composite_spans_primitive;
- if (tmp->base.src.is_solid)
+ if (tmp->base.src.is_solid) {
tmp->prim_emit = gen6_emit_composite_spans_solid;
- else if (tmp->base.is_affine) {
+ } else if (tmp->base.src.transform == NULL) {
+ tmp->prim_emit = gen6_emit_composite_spans_identity;
+ } else if (tmp->base.is_affine) {
if (tmp->base.src.transform->matrix[0][1] == 0 &&
tmp->base.src.transform->matrix[1][0] == 0) {
tmp->base.src.scale[0] /= tmp->base.src.transform->matrix[2][2];
commit 0a5313900ec9a7c499eb5051f3a5f078a9b0bbde
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Jan 11 12:09:13 2012 +0000
sna: Explicitly retire the bo following a serialisation point
This is to keep the sanity checks in order, but conceptually should be
useful as well.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index aa98cea..f7bf116 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -284,6 +284,20 @@ kgem_busy(struct kgem *kgem, int handle)
return busy.busy;
}
+static void kgem_bo_retire(struct kgem *kgem, struct kgem_bo *bo)
+{
+ assert(!kgem_busy(kgem, bo->handle));
+
+ if (bo->domain == DOMAIN_GPU)
+ kgem_retire(kgem);
+
+ if (bo->exec == NULL) {
+ bo->rq = NULL;
+ list_del(&bo->request);
+ bo->needs_flush = bo->flush;
+ }
+}
+
Bool kgem_bo_write(struct kgem *kgem, struct kgem_bo *bo,
const void *data, int length)
{
@@ -295,9 +309,7 @@ Bool kgem_bo_write(struct kgem *kgem, struct kgem_bo *bo,
return FALSE;
DBG(("%s: flush=%d, domain=%d\n", __FUNCTION__, bo->flush, bo->domain));
- bo->needs_flush = bo->flush;
- if (bo->domain == DOMAIN_GPU)
- kgem_retire(kgem);
+ kgem_bo_retire(kgem, bo);
bo->domain = DOMAIN_NONE;
return TRUE;
}
@@ -2556,7 +2568,8 @@ void *kgem_bo_map(struct kgem *kgem, struct kgem_bo *bo, int prot)
{
void *ptr;
- assert(bo->refcnt || bo->exec); /* allow for debugging purposes */
+ assert(bo->refcnt);
+ assert(bo->exec == NULL);
assert(!bo->purged);
assert(list_is_empty(&bo->list));
@@ -2595,15 +2608,23 @@ void *kgem_bo_map(struct kgem *kgem, struct kgem_bo *bo, int prot)
set_domain.write_domain = I915_GEM_DOMAIN_GTT;
drmIoctl(kgem->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain);
- bo->needs_flush = bo->flush;
- if (bo->domain == DOMAIN_GPU)
- kgem_retire(kgem);
+ kgem_bo_retire(kgem, bo);
bo->domain = DOMAIN_GTT;
}
return ptr;
}
+void *kgem_bo_map__debug(struct kgem *kgem, struct kgem_bo *bo)
+{
+ if (bo->map)
+ return bo->map;
+
+ kgem_trim_vma_cache(kgem, MAP_GTT, bo->bucket);
+ return bo->map = gem_mmap(kgem->fd, bo->handle, bo->size,
+ PROT_READ | PROT_WRITE);
+}
+
void *kgem_bo_map__cpu(struct kgem *kgem, struct kgem_bo *bo)
{
struct drm_i915_gem_mmap mmap_arg;
@@ -2753,10 +2774,8 @@ void kgem_bo_sync__cpu(struct kgem *kgem, struct kgem_bo *bo)
set_domain.write_domain = I915_GEM_DOMAIN_CPU;
drmIoctl(kgem->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain);
- assert(!kgem_busy(kgem, bo->handle));
- bo->needs_flush = bo->flush;
- if (bo->domain == DOMAIN_GPU)
- kgem_retire(kgem);
+
+ kgem_bo_retire(kgem, bo);
bo->domain = DOMAIN_CPU;
}
}
@@ -3208,10 +3227,7 @@ void kgem_buffer_read_sync(struct kgem *kgem, struct kgem_bo *_bo)
gem_read(kgem->fd,
bo->base.handle, (char *)(bo+1)+offset,
offset, length);
- assert(!kgem_busy(kgem, bo->base.handle));
- bo->base.needs_flush = bo->base.flush;
- if (bo->base.domain == DOMAIN_GPU)
- kgem_retire(kgem);
+ kgem_bo_retire(kgem, &bo->base);
bo->base.domain = DOMAIN_NONE;
} else
kgem_bo_sync__cpu(kgem, &bo->base);
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 1bc0d9b..d6fdfbc 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -344,6 +344,7 @@ uint32_t kgem_add_reloc(struct kgem *kgem,
uint32_t delta);
void *kgem_bo_map(struct kgem *kgem, struct kgem_bo *bo, int prot);
+void *kgem_bo_map__debug(struct kgem *kgem, struct kgem_bo *bo);
void *kgem_bo_map__cpu(struct kgem *kgem, struct kgem_bo *bo);
void kgem_bo_sync__cpu(struct kgem *kgem, struct kgem_bo *bo);
uint32_t kgem_bo_flink(struct kgem *kgem, struct kgem_bo *bo);
diff --git a/src/sna/kgem_debug_gen3.c b/src/sna/kgem_debug_gen3.c
index 213c69f..969b1d1 100644
--- a/src/sna/kgem_debug_gen3.c
+++ b/src/sna/kgem_debug_gen3.c
@@ -97,7 +97,7 @@ static void gen3_update_vertex_buffer_addr(struct kgem *kgem,
if (bo->handle == handle)
break;
assert(&bo->request != &kgem->next_request->buffers);
- base = kgem_bo_map(kgem, bo, PROT_READ);
+ base = kgem_bo_map__debug(kgem, bo);
}
ptr = (char *)base + kgem->reloc[i].delta;
diff --git a/src/sna/kgem_debug_gen4.c b/src/sna/kgem_debug_gen4.c
index 0004ecf..53c350b 100644
--- a/src/sna/kgem_debug_gen4.c
+++ b/src/sna/kgem_debug_gen4.c
@@ -84,7 +84,7 @@ static void gen4_update_vertex_buffer(struct kgem *kgem, const uint32_t *data)
if (bo->handle == reloc)
break;
assert(&bo->request != &kgem->next_request->buffers);
- base = kgem_bo_map(kgem, bo, PROT_READ);
+ base = kgem_bo_map__debug(kgem, bo);
}
ptr = (char *)base + kgem->reloc[i].delta;
@@ -405,7 +405,7 @@ get_reloc(struct kgem *kgem,
if (bo->handle == handle)
break;
assert(&bo->request != &kgem->next_request->buffers);
- base = kgem_bo_map(kgem, bo, PROT_READ);
+ base = kgem_bo_map__debug(kgem, bo);
r->bo = bo;
r->base = base;
}
diff --git a/src/sna/kgem_debug_gen5.c b/src/sna/kgem_debug_gen5.c
index 7912cc9..f21220f 100644
--- a/src/sna/kgem_debug_gen5.c
+++ b/src/sna/kgem_debug_gen5.c
@@ -78,7 +78,7 @@ static void gen5_update_vertex_buffer(struct kgem *kgem, const uint32_t *data)
size = kgem->nbatch * sizeof(uint32_t);
} else {
bo = kgem_debug_get_bo_for_reloc_entry(kgem, reloc);
- base = kgem_bo_map(kgem, bo, PROT_READ);
+ base = kgem_bo_map__debug(kgem, bo);
size = bo->size;
}
ptr = (char *)base + reloc->delta;
More information about the xorg-commit
mailing list