[arch-commits] Commit in libdrm/trunk (PKGBUILD git-fixes.patch)

Jan de Groot jgc at archlinux.org
Sat Mar 7 16:56:42 UTC 2009


    Date: Saturday, March 7, 2009 @ 11:56:42
  Author: jgc
Revision: 29272

upgpkg: libdrm 2.4.5-2
    Add two important intel fixes from git

Added:
  libdrm/trunk/git-fixes.patch
Modified:
  libdrm/trunk/PKGBUILD

-----------------+
 PKGBUILD        |   11 +++--
 git-fixes.patch |  118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 125 insertions(+), 4 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2009-03-07 16:46:21 UTC (rev 29271)
+++ PKGBUILD	2009-03-07 16:56:42 UTC (rev 29272)
@@ -3,7 +3,7 @@
 
 pkgname=libdrm
 pkgver=2.4.5
-pkgrel=1
+pkgrel=2
 pkgdesc="Userspace interface to kernel DRM services"
 arch=(i686 x86_64)
 depends=('glibc')
@@ -12,17 +12,20 @@
 source=(http://dri.freedesktop.org/${pkgname}/${pkgname}-${pkgver}.tar.bz2
 	no-pthread-stubs.patch
 	nouveau_private.h
-	nouveau_dma.h)
+	nouveau_dma.h
+	git-fixes.patch)
 md5sums=('0d09025f069ff1a986cf3339e51908b3'
          'e5f8f3b9f6357c2f82950cdfb8e9c9ec'
          '0cb6d0d40b4031604a9063f6e384b548'
-	 'a9c94dcf9625fa99862f695a744258e8')
+	 'a9c94dcf9625fa99862f695a744258e8'
+	 '2dee581529aa50477f7c22e59dfbdf5d')
 
 build() {
   cd "${srcdir}/${pkgname}-${pkgver}"
-  patch -Np1 -i "${srcdir}/no-pthread-stubs.patch" || return 1
   cp "${srcdir}/nouveau_private.h" "${srcdir}/nouveau_dma.h" \
     libdrm/nouveau/ || return 1
+  patch -Np1 -i "${srcdir}/no-pthread-stubs.patch" || return 1
+  patch -Np1 -i "${srcdir}/git-fixes.patch" || return 1
   libtoolize --force || return 1
   aclocal || return 1
   autoconf || return 1

Added: git-fixes.patch
===================================================================
--- git-fixes.patch	                        (rev 0)
+++ git-fixes.patch	2009-03-07 16:56:42 UTC (rev 29272)
@@ -0,0 +1,118 @@
+From efa485b2cf2f1f46760a3d9297ba1a73a2dbcd05 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric at anholt.net>
+Date: Wed, 25 Feb 2009 05:36:56 +0000
+Subject: intel: Don't copy dirty data out when freeing a BO in the fake bufmgr.
+
+---
+diff --git a/libdrm/intel/intel_bufmgr_fake.c b/libdrm/intel/intel_bufmgr_fake.c
+index e7cec35..e1f98d6 100644
+--- a/libdrm/intel/intel_bufmgr_fake.c
++++ b/libdrm/intel/intel_bufmgr_fake.c
+@@ -444,7 +444,8 @@ alloc_block(drm_intel_bo *bo)
+ 
+ /* Release the card storage associated with buf:
+  */
+-static void free_block(drm_intel_bufmgr_fake *bufmgr_fake, struct block *block)
++static void free_block(drm_intel_bufmgr_fake *bufmgr_fake, struct block *block,
++		       int skip_dirty_copy)
+ {
+    drm_intel_bo_fake *bo_fake;
+    DBG("free block %p %08x %d %d\n", block, block->mem->ofs, block->on_hardware, block->fenced);
+@@ -453,7 +454,11 @@ static void free_block(drm_intel_bufmgr_fake *bufmgr_fake, struct block *block)
+       return;
+ 
+    bo_fake = (drm_intel_bo_fake *)block->bo;
+-   if (!(bo_fake->flags & (BM_PINNED | BM_NO_BACKING_STORE)) && (bo_fake->card_dirty == 1)) {
++
++   if (bo_fake->flags & (BM_PINNED | BM_NO_BACKING_STORE))
++      skip_dirty_copy = 1;
++
++   if (!skip_dirty_copy && (bo_fake->card_dirty == 1)) {
+      memcpy(bo_fake->backing_store, block->virtual, block->bo->size);
+      bo_fake->card_dirty = 0;
+      bo_fake->dirty = 1;
+@@ -534,7 +539,7 @@ evict_lru(drm_intel_bufmgr_fake *bufmgr_fake, unsigned int max_fence)
+       set_dirty(&bo_fake->bo);
+       bo_fake->block = NULL;
+ 
+-      free_block(bufmgr_fake, block);
++      free_block(bufmgr_fake, block, 0);
+       return 1;
+    }
+ 
+@@ -557,7 +562,7 @@ evict_mru(drm_intel_bufmgr_fake *bufmgr_fake)
+       set_dirty(&bo_fake->bo);
+       bo_fake->block = NULL;
+ 
+-      free_block(bufmgr_fake, block);
++      free_block(bufmgr_fake, block, 0);
+       return 1;
+    }
+ 
+@@ -872,7 +877,7 @@ drm_intel_fake_bo_unreference_locked(drm_intel_bo *bo)
+       assert(bo_fake->map_count == 0);
+       /* No remaining references, so free it */
+       if (bo_fake->block)
+-	 free_block(bufmgr_fake, bo_fake->block);
++	 free_block(bufmgr_fake, bo_fake->block, 1);
+       free_backing_store(bo);
+ 
+       for (i = 0; i < bo_fake->nr_relocs; i++)
+@@ -1064,7 +1069,7 @@ drm_intel_fake_kick_all_locked(drm_intel_bufmgr_fake *bufmgr_fake)
+       drm_intel_bo_fake *bo_fake = (drm_intel_bo_fake *)block->bo;
+ 
+       block->on_hardware = 0;
+-      free_block(bufmgr_fake, block);
++      free_block(bufmgr_fake, block, 0);
+       bo_fake->block = NULL;
+       bo_fake->validated = 0;
+       if (!(bo_fake->flags & BM_NO_BACKING_STORE))
+@@ -1463,7 +1468,7 @@ drm_intel_bufmgr_fake_evict_all(drm_intel_bufmgr *bufmgr)
+ 
+    DRMLISTFOREACHSAFE(block, tmp, &bufmgr_fake->lru) {
+       /* Releases the memory, and memcpys dirty contents out if necessary. */
+-      free_block(bufmgr_fake, block);
++      free_block(bufmgr_fake, block, 0);
+    }
+ 
+    pthread_mutex_unlock(&bufmgr_fake->lock);
+--
+cgit v0.8.2
+From 7ce8d4c1fec618ac2578ea0ddb8915b1b41ab9cb Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric at anholt.net>
+Date: Fri, 27 Feb 2009 21:46:31 +0000
+Subject: intel: Update reloc_tree_size of the first buffer when we count the tree size.
+
+This helps avoid the n^2 performance cost of counting tree size when we
+get a lot of relocations into our batch buffer.  rgb10text on keithp's laptop
+went from 136k glyphs/sec to 234k glyphs/sec.
+---
+diff --git a/libdrm/intel/intel_bufmgr_gem.c b/libdrm/intel/intel_bufmgr_gem.c
+index 6ddecf4..9e49d7c 100644
+--- a/libdrm/intel/intel_bufmgr_gem.c
++++ b/libdrm/intel/intel_bufmgr_gem.c
+@@ -1260,8 +1260,21 @@ drm_intel_gem_compute_batch_space(drm_intel_bo **bo_array, int count)
+     int i;
+     unsigned int total = 0;
+ 
+-    for (i = 0; i < count; i++)
++    for (i = 0; i < count; i++) {
+ 	total += drm_intel_gem_bo_get_aperture_space(bo_array[i]);
++	/* For the first buffer object in the array, we get an accurate count
++	 * back for its reloc_tree size (since nothing had been flagged as
++	 * being counted yet).  We can save that value out as a more
++	 * conservative reloc_tree_size that avoids double-counting target
++	 * buffers.  Since the first buffer happens to usually be the batch
++	 * buffer in our callers, this can pull us back from doing the tree
++	 * walk on every new batch emit.
++	 */
++	if (i == 0) {
++	    drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo_array[i];
++	    bo_gem->reloc_tree_size = total;
++	}
++    }
+ 
+     for (i = 0; i < count; i++)
+ 	drm_intel_gem_bo_clear_aperture_space_flag(bo_array[i]);
+--
+cgit v0.8.2




More information about the arch-commits mailing list