On 2 April 2013 01:31, Chris Forbes <chr...@ijw.co.nz> wrote: > Reported-by: `per` in #intel-gfx > > The size of the cache key varies, so store the actual size as well as > the key blob itself, rather than just assuming it's the same as the size > passed in. > > NOTE: This is a candidate for stable branches. > > V2: Don't leave silly holes in structure; use unsigned instead of > GLuint. > > Signed-off-by: Chris Forbes <chr...@ijw.co.nz> > --- > src/mesa/program/prog_cache.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/src/mesa/program/prog_cache.c b/src/mesa/program/prog_cache.c > index 47f926b..1041f35 100644 > --- a/src/mesa/program/prog_cache.c > +++ b/src/mesa/program/prog_cache.c > @@ -37,6 +37,7 @@ > struct cache_item > { > GLuint hash; > + unsigned keysize; > void *key; > struct gl_program *program; > struct cache_item *next; > @@ -183,7 +184,10 @@ _mesa_search_program_cache(struct gl_program_cache > *cache, > 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) { > + if (c->hash == hash && > + c->keysize == keysize && > + memcmp(c->key, key, keysize) == 0) { > + >
At the top of this function (_mesa_search_program_cache) there's another memcmp that needs to be fixed: if (cache->last && memcmp(cache->last->key, key, keysize) == 0) { return cache->last->program; } needs to change to: if (cache->last && cache->last->keysize == keysize && memcmp(cache->last->key, key, keysize) == 0) { return cache->last->program; } With that additional fix, this patch is: Reviewed-by: Paul Berry <stereotype...@gmail.com> > cache->last = c; > return c->program; > } > @@ -207,6 +211,7 @@ _mesa_program_cache_insert(struct gl_context *ctx, > > c->key = malloc(keysize); > memcpy(c->key, key, keysize); > + c->keysize = keysize; > > c->program = program; /* no refcount change */ > > @@ -235,6 +240,7 @@ _mesa_shader_cache_insert(struct gl_context *ctx, > > c->key = malloc(keysize); > memcpy(c->key, key, keysize); > + c->keysize = keysize; > > c->program = (struct gl_program *)program; /* no refcount change */ > > -- > 1.8.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev