From f9b6aa3aaf784f9149e091a646673ddf341cd7ca Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 26 Dec 2012 13:05:52 +0000 Subject: [PATCH] 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 --- src/sna/kgem.c | 33 ++++++++++++++++++++++++++------- src/sna/kgem.h | 2 ++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/sna/kgem.c b/src/sna/kgem.c index adeead10..dbc7f14a 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 1b14c203..b7126c0e 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 {