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