xf86-video-intel: src/sna/kgem.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Oct 24 01:27:37 PDT 2014


 src/sna/kgem.c |   69 +++++++++++++++++++++++++++++++++------------------------
 1 file changed, 40 insertions(+), 29 deletions(-)

New commits:
commit 4df0052a21efd744c4b8cb2409139ded6e45f5c8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 24 08:08:23 2014 +0100

    sna: Update the reloc->delta for the shrunk batch
    
    As well as actually updating the value in the batch for the relocation
    address, we need to tell the kernel in case it has to update the
    address.
    
    Another regression from
    commit b4872f74c05a92c91d7b57146eb35ed2ecc86d97
    Author: Chris Wilson <chris at chris-wilson.co.uk>
    Date:   Tue Oct 21 10:38:22 2014 +0100
    
        sna: Avoid pwriting large batches
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85389
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 146d22f..0eef036 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1260,36 +1260,47 @@ static void kgem_fixup_relocs(struct kgem *kgem, struct kgem_bo *bo, int shrink)
 	bo->target_handle = kgem->has_handle_lut ? kgem->nexec : bo->handle;
 
 	assert(kgem->nreloc__self <= 256);
-	if (kgem->nreloc__self) {
-		DBG(("%s: fixing up %d%s self-relocations\n",
-		     __FUNCTION__, kgem->nreloc__self,
-		     kgem->nreloc__self == 256 ? "+" : ""));
-		for (n = 0; n < kgem->nreloc__self; n++) {
-			int i = kgem->reloc__self[n];
-			uint32_t *b;
-
-			assert(kgem->reloc[i].target_handle == ~0U);
-			kgem->reloc[i].target_handle = bo->target_handle;
-			kgem->reloc[i].presumed_offset = bo->presumed_offset;
-
-			b = &kgem->batch[kgem->reloc[i].offset/sizeof(*b)];
-			*b = kgem->reloc[i].delta + bo->presumed_offset;
-			if (kgem->reloc[i].read_domains == I915_GEM_DOMAIN_INSTRUCTION)
-				*b -= shrink;
-		}
-
-		if (n == 256) {
-			for (n = kgem->reloc__self[255]; n < kgem->nreloc; n++) {
-				if (kgem->reloc[n].target_handle == ~0U) {
-					uint32_t *b;
-					kgem->reloc[n].target_handle = bo->target_handle;
-					kgem->reloc[n].presumed_offset = bo->presumed_offset;
-
-					b = &kgem->batch[kgem->reloc[n].offset/sizeof(*b)];
-					*b = kgem->reloc[n].delta + bo->presumed_offset;
-					if (kgem->reloc[n].read_domains == I915_GEM_DOMAIN_INSTRUCTION)
-						*b -= shrink;
+	if (kgem->nreloc__self == 0)
+		return;
+
+	DBG(("%s: fixing up %d%s self-relocations to handle=%p, presumed-offset=%llx\n",
+	     __FUNCTION__, kgem->nreloc__self,
+	     kgem->nreloc__self == 256 ? "+" : "",
+	     bo->handle, (long long)bo->presumed_offset));
+	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;
+
+		if (kgem->reloc[i].read_domains == I915_GEM_DOMAIN_INSTRUCTION) {
+			DBG(("%s: moving base of self-reloc[%d:%d] %d -> %d\n",
+			     __FUNCTION__, n, i,
+			     kgem->reloc[i].delta,
+			     kgem->reloc[i].delta - shrink));
+
+			kgem->reloc[i].delta -= shrink;
+		}
+		kgem->batch[kgem->reloc[i].offset/sizeof(uint32_t)] =
+			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;
+
+				if (kgem->reloc[n].read_domains == I915_GEM_DOMAIN_INSTRUCTION) {
+					DBG(("%s: moving base of reloc[%d] %d -> %d\n",
+					     __FUNCTION__, n,
+					     kgem->reloc[n].delta,
+					     kgem->reloc[n].delta - shrink));
+					kgem->reloc[n].delta -= shrink;
 				}
+				kgem->batch[kgem->reloc[n].offset/sizeof(uint32_t)] =
+					kgem->reloc[n].delta + bo->presumed_offset;
 			}
 		}
 	}


More information about the xorg-commit mailing list