[965] Do a little bit rotation in state hash to reduce collisions.
authorEric Anholt <eric@anholt.net>
Fri, 18 Jan 2008 18:15:28 +0000 (10:15 -0800)
committerEric Anholt <eric@anholt.net>
Fri, 18 Jan 2008 18:15:28 +0000 (10:15 -0800)
This was around 3% improvement in OA.

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

index 315fd9f206d5d5c617f0c5eb27b496b4c6b45c3d..9e5e6235612e060f9a8ccdeae051e1191c32a3c6 100644 (file)
@@ -79,14 +79,18 @@ static GLuint hash_key( const void *key, GLuint key_size,
 
    /* I'm sure this can be improved on:
     */
-   for (i = 0; i < key_size/4; i++)
+   for (i = 0; i < key_size/4; i++) {
       hash ^= ikey[i];
+      hash = (hash << 5) | (hash >> 27);
+   }
 
    /* Include the BO pointers as key data as well */
    ikey = (void *)reloc_bufs;
    key_size = nr_reloc_bufs * sizeof(dri_bo *);
-   for (i = 0; i < key_size/4; i++)
+   for (i = 0; i < key_size/4; i++) {
       hash ^= ikey[i];
+      hash = (hash << 5) | (hash >> 27);
+   }
 
    return hash;
 }
@@ -111,6 +115,16 @@ search_cache(struct brw_cache *cache, enum brw_cache_id cache_id,
 {
    struct brw_cache_item *c;
 
+#if 0
+   int bucketcount = 0;
+
+   for (c = cache->items[hash % cache->size]; c; c = c->next)
+      bucketcount++;
+
+   fprintf(stderr, "bucket %d/%d = %d/%d items\n", hash % cache->size,
+          cache->size, bucketcount, cache->n_items);
+#endif
+
    for (c = cache->items[hash % cache->size]; c; c = c->next) {
       if (c->cache_id == cache_id &&
          c->hash == hash &&