diff options
Diffstat (limited to 'src/mesa/shader/prog_cache.c')
| -rw-r--r-- | src/mesa/shader/prog_cache.c | 29 | 
1 files changed, 21 insertions, 8 deletions
| diff --git a/src/mesa/shader/prog_cache.c b/src/mesa/shader/prog_cache.c index 36a25377c5..9437e59613 100644 --- a/src/mesa/shader/prog_cache.c +++ b/src/mesa/shader/prog_cache.c @@ -44,6 +44,7 @@ struct cache_item  struct gl_program_cache  {     struct cache_item **items; +   struct cache_item *last;     GLuint size, n_items;  }; @@ -83,6 +84,8 @@ rehash(struct gl_program_cache *cache)     struct cache_item *c, *next;     GLuint size, i; +   cache->last = NULL; +     size = cache->size * 3;     items = (struct cache_item**) _mesa_malloc(size * sizeof(*items));     _mesa_memset(items, 0, size * sizeof(*items)); @@ -105,6 +108,8 @@ clear_cache(GLcontext *ctx, struct gl_program_cache *cache)  {     struct cache_item *c, *next;     GLuint i; +    +   cache->last = NULL;     for (i = 0; i < cache->size; i++) {        for (c = cache->items[i]; c; c = next) { @@ -149,18 +154,26 @@ _mesa_delete_program_cache(GLcontext *ctx, struct gl_program_cache *cache)  struct gl_program * -_mesa_search_program_cache(const struct gl_program_cache *cache, +_mesa_search_program_cache(struct gl_program_cache *cache,                             const void *key, GLuint keysize)  { -   const GLuint hash = hash_key(key, keysize); -   struct cache_item *c; - -   for (c = cache->items[hash % cache->size]; c; c = c->next) { -      if (c->hash == hash && memcmp(c->key, key, keysize) == 0) -	 return c->program; +   if (cache->last &&  +       memcmp(cache->last->key, key, keysize) == 0) { +      return cache->last->program;     } +   else { +      const GLuint hash = hash_key(key, keysize); +      struct cache_item *c; -   return NULL; +      for (c = cache->items[hash % cache->size]; c; c = c->next) { +         if (c->hash == hash && memcmp(c->key, key, keysize) == 0) { +            cache->last = c; +            return c->program; +         } +      } + +      return NULL; +   }  } | 
