OSDN Git Service

intel: Don't free the reloc list when putting a freed BO in the cache.
authorEric Anholt <eric@anholt.net>
Fri, 2 Oct 2009 18:11:31 +0000 (11:11 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 2 Oct 2009 18:11:31 +0000 (11:11 -0700)
This takes firefox-talos-gfx from 74 seconds to 70 seconds on my GM965.

libdrm/intel/intel_bufmgr_gem.c

index d4fa159..44d096f 100644 (file)
@@ -514,6 +514,9 @@ drm_intel_gem_bo_free(drm_intel_bo *bo)
     if (bo_gem->gtt_virtual)
        munmap (bo_gem->gtt_virtual, bo_gem->bo.size);
 
+    free(bo_gem->reloc_target_bo);
+    free(bo_gem->relocs);
+
     /* Close this object */
     memset(&close, 0, sizeof(close));
     close.handle = bo_gem->gem_handle;
@@ -566,8 +569,6 @@ drm_intel_gem_bo_unreference_locked(drm_intel_bo *bo)
            /* Unreference all the target buffers */
            for (i = 0; i < bo_gem->reloc_count; i++)
                 drm_intel_gem_bo_unreference_locked(bo_gem->reloc_target_bo[i]);
-           free(bo_gem->reloc_target_bo);
-           free(bo_gem->relocs);
        }
 
        DBG("bo_unreference final: %d (%s)\n",
@@ -586,8 +587,6 @@ drm_intel_gem_bo_unreference_locked(drm_intel_bo *bo)
 
            bo_gem->name = NULL;
            bo_gem->validate_index = -1;
-           bo_gem->relocs = NULL;
-           bo_gem->reloc_target_bo = NULL;
            bo_gem->reloc_count = 0;
 
            DRMLISTADDTAIL(&bo_gem->head, &bucket->head);