i965: Use bo_references for the state cache delete function.
authorEric Anholt <eric@anholt.net>
Fri, 2 Oct 2009 01:16:52 +0000 (18:16 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 9 Oct 2009 00:12:23 +0000 (17:12 -0700)
This appears to shave about 3% off the CPU usage in cairo-gl for firefox.

src/mesa/drivers/dri/i965/brw_state_cache.c

index f8e46aa..c262e1d 100644 (file)
@@ -534,14 +534,9 @@ brw_state_cache_bo_delete(struct brw_cache *cache, dri_bo *bo)
    for (i = 0; i < cache->size; i++) {
       for (prev = &cache->items[i]; *prev;) {
         struct brw_cache_item *c = *prev;
-        int j;
-
-        for (j = 0; j < c->nr_reloc_bufs; j++) {
-           if (c->reloc_bufs[j] == bo)
-              break;
-        }
 
-        if (j != c->nr_reloc_bufs) {
+        if (drm_intel_bo_references(c->bo, bo)) {
+           int j;
 
            *prev = c->next;
 
@@ -551,17 +546,8 @@ brw_state_cache_bo_delete(struct brw_cache *cache, dri_bo *bo)
            free((void *)c->key);
            free(c);
            cache->n_items--;
-
-           /* Delete up the tree.  Notably we're trying to get from
-            * a request to delete the surface, to deleting the surface state
-            * object, to deleting the binding table.  We're slack and restart
-            * the deletion process when we do this because the other delete
-            * may kill our *prev.
-            */
-           brw_state_cache_bo_delete(cache, c->bo);
-           prev = &cache->items[i];
         } else {
-           prev = &(*prev)->next;
+           prev = &c->next;
         }
       }
    }