xf86-video-intel: configure.ac src/sna/kgem.c src/sna/kgem.h
Chris Wilson
ickle at kemper.freedesktop.org
Thu Nov 8 10:37:44 PST 2012
configure.ac | 9 +++++++++
src/sna/kgem.c | 40 +++++++++++++++++++++++++++++++++-------
src/sna/kgem.h | 2 ++
3 files changed, 44 insertions(+), 7 deletions(-)
New commits:
commit 85ba7e96268dbb8da4bb34078333695a451c6570
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Nov 8 15:56:13 2012 +0000
sna: Experiment with using reloc.handle as an index into the execbuffer
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/configure.ac b/configure.ac
index 9ea1e3c..ce3b007 100644
--- a/configure.ac
+++ b/configure.ac
@@ -301,6 +301,15 @@ if test "x$FASTRELOC" = xyes; then
AC_DEFINE(USE_FASTRELOC,1,[Assume "fast reloc" support])
fi
+AC_ARG_ENABLE(handle-lut,
+ AS_HELP_STRING([--enable-handle-lut],
+ [Enable use of "handle LUT" (experimental) [default=no]]),
+ [HANDLE_LUT="$enableval"],
+ [HANDLE_LUT=no])
+if test "x$HANDLE_LUT" = xyes; then
+ AC_DEFINE(USE_HANDLE_LUT,1,[Assume "handle LUT" support])
+fi
+
AC_ARG_ENABLE(async-swap,
AS_HELP_STRING([--enable-async-swap],
[Enable use of asynchronous swaps (experimental) [default=no]]),
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index e643b85..e2c5da8 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -71,6 +71,7 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags);
#define DBG_NO_RELAXED_FENCING 0
#define DBG_NO_SECURE_BATCHES 0
#define DBG_NO_FAST_RELOC 0
+#define DBG_NO_HANDLE_LUT 0
#define DBG_DUMP 0
#define SHOW_BATCH 0
@@ -80,6 +81,11 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags);
#define DBG_NO_FAST_RELOC 1
#endif
+#ifndef USE_HANDLE_LUT
+#undef DBG_NO_HANDLE_LUT
+#define DBG_NO_HANDLE_LUT 1
+#endif
+
/* Worst case seems to be 965gm where we cannot write within a cacheline that
* is being simultaneously being read by the GPU, or within the sampler
* prefetch. In general, the chipsets seem to have a requirement that sampler
@@ -103,8 +109,10 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags);
#define LOCAL_I915_PARAM_HAS_SEMAPHORES 20
#define LOCAL_I915_PARAM_HAS_SECURE_BATCHES 23
#define LOCAL_I915_PARAM_HAS_NO_RELOC 24
+#define LOCAL_I915_PARAM_HAS_HANDLE_LUT 25
#define LOCAL_I915_EXEC_NO_RELOC (1<<10)
+#define LOCAL_I915_EXEC_HANDLE_LUT (1<<11)
#define LOCAL_I915_GEM_USERPTR 0x32
#define LOCAL_IOCTL_I915_GEM_USERPTR DRM_IOWR (DRM_COMMAND_BASE + LOCAL_I915_GEM_USERPTR, struct local_i915_gem_userptr)
@@ -668,6 +676,14 @@ static bool test_has_no_reloc(struct kgem *kgem)
return gem_param(kgem, LOCAL_I915_PARAM_HAS_NO_RELOC) > 0;
}
+static bool test_has_handle_lut(struct kgem *kgem)
+{
+ if (DBG_NO_HANDLE_LUT)
+ return false;
+
+ return gem_param(kgem, LOCAL_I915_PARAM_HAS_HANDLE_LUT) > 0;
+}
+
static bool test_has_semaphores_enabled(struct kgem *kgem)
{
FILE *file;
@@ -859,6 +875,10 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen)
DBG(("%s: has no-reloc? %d\n", __FUNCTION__,
kgem->has_no_reloc));
+ kgem->has_handle_lut = test_has_handle_lut(kgem);
+ DBG(("%s: has handle-lut? %d\n", __FUNCTION__,
+ kgem->has_handle_lut));
+
kgem->has_semaphores = false;
if (kgem->has_blt && test_has_semaphores_enabled(kgem))
kgem->has_semaphores = true;
@@ -1212,6 +1232,7 @@ kgem_add_handle(struct kgem *kgem, struct kgem_bo *bo)
__FUNCTION__, bo->handle, kgem->nexec));
assert(kgem->nexec < ARRAY_SIZE(kgem->exec));
+ bo->target_handle = kgem->has_handle_lut ? kgem->nexec : bo->handle;
exec = memset(&kgem->exec[kgem->nexec++], 0, sizeof(*exec));
exec->handle = bo->handle;
exec->offset = bo->presumed_offset;
@@ -1246,8 +1267,8 @@ 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 == 0) {
- kgem->reloc[n].target_handle = bo->handle;
+ 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;
@@ -2047,9 +2068,11 @@ static void kgem_finish_buffers(struct kgem *kgem)
gem_write(kgem->fd, shrink->handle,
0, bo->used, bo->mem);
+ shrink->target_handle =
+ kgem->has_handle_lut ? bo->base.target_handle : shrink->handle;
for (n = 0; n < kgem->nreloc; n++) {
- if (kgem->reloc[n].target_handle == bo->base.handle) {
- kgem->reloc[n].target_handle = shrink->handle;
+ if (kgem->reloc[n].target_handle == bo->base.target_handle) {
+ kgem->reloc[n].target_handle = shrink->target_handle;
kgem->reloc[n].presumed_offset = shrink->presumed_offset;
kgem->batch[kgem->reloc[n].offset/sizeof(kgem->batch[0])] =
kgem->reloc[n].delta + shrink->presumed_offset;
@@ -2202,6 +2225,8 @@ void kgem_reset(struct kgem *kgem)
kgem->batch_flags = 0;
if (kgem->has_no_reloc)
kgem->batch_flags |= LOCAL_I915_EXEC_NO_RELOC;
+ if (kgem->has_handle_lut)
+ kgem->batch_flags |= LOCAL_I915_EXEC_HANDLE_LUT;
kgem->next_request = __kgem_request_alloc();
@@ -2227,7 +2252,7 @@ static int compact_batch_surface(struct kgem *kgem)
shrink *= sizeof(uint32_t);
for (n = 0; n < kgem->nreloc; n++) {
if (kgem->reloc[n].read_domains == I915_GEM_DOMAIN_INSTRUCTION &&
- kgem->reloc[n].target_handle == 0)
+ kgem->reloc[n].target_handle == ~0U)
kgem->reloc[n].delta -= shrink;
if (kgem->reloc[n].offset >= sizeof(uint32_t)*kgem->nbatch)
@@ -2292,6 +2317,7 @@ void _kgem_submit(struct kgem *kgem)
kgem->exec[i].rsvd1 = 0;
kgem->exec[i].rsvd2 = 0;
+ rq->bo->target_handle = kgem->has_handle_lut ? i : handle;
rq->bo->exec = &kgem->exec[i];
rq->bo->rq = rq; /* useful sanity check */
list_add(&rq->bo->request, &rq->buffers);
@@ -3895,7 +3921,7 @@ uint32_t kgem_add_reloc(struct kgem *kgem,
}
kgem->reloc[index].delta = delta;
- kgem->reloc[index].target_handle = bo->handle;
+ kgem->reloc[index].target_handle = bo->target_handle;
kgem->reloc[index].presumed_offset = bo->presumed_offset;
if (read_write_domain & 0x7ff) {
@@ -3906,7 +3932,7 @@ uint32_t kgem_add_reloc(struct kgem *kgem,
delta += bo->presumed_offset;
} else {
kgem->reloc[index].delta = delta;
- kgem->reloc[index].target_handle = 0;
+ kgem->reloc[index].target_handle = ~0U;
kgem->reloc[index].presumed_offset = 0;
}
kgem->reloc[index].read_domains = read_write_domain >> 16;
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 8789b55..b42a8e0 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -64,6 +64,7 @@ struct kgem_bo {
uint32_t unique_id;
uint32_t refcnt;
uint32_t handle;
+ uint32_t target_handle;
uint32_t presumed_offset;
uint32_t delta;
union {
@@ -165,6 +166,7 @@ struct kgem {
uint32_t has_cacheing :1;
uint32_t has_llc :1;
uint32_t has_no_reloc :1;
+ uint32_t has_handle_lut :1;
uint32_t can_blt_cpu :1;
More information about the xorg-commit
mailing list