draw: mimize cost of translate key compares, use cache universally
authorKeith Whitwell <keith@tungstengraphics.com>
Fri, 9 May 2008 12:10:15 +0000 (13:10 +0100)
committerKeith Whitwell <keith@tungstengraphics.com>
Mon, 12 May 2008 16:40:54 +0000 (17:40 +0100)
src/gallium/auxiliary/draw/draw_pipe_vbuf.c
src/gallium/auxiliary/draw/draw_pt_emit.c
src/gallium/auxiliary/draw/draw_pt_fetch.c
src/gallium/auxiliary/draw/draw_pt_fetch_emit.c

index 64a9f9084fb8476623cc6dcc9ac864f12d5ab42b..67b9a9503d2d8b36e57c19b6006c2a1693058b18 100644 (file)
@@ -42,6 +42,7 @@
 #include "draw_vertex.h"
 #include "draw_pipe.h"
 #include "translate/translate.h"
+#include "translate/translate_cache.h"
 
 
 /**
@@ -75,6 +76,8 @@ struct vbuf_stage {
    /* Cache point size somewhere it's address won't change:
     */
    float point_size;
+
+   struct translate_cache *cache;
 };
 
 
@@ -220,7 +223,6 @@ vbuf_set_prim( struct vbuf_stage *vbuf, uint prim )
    /* Translate from pipeline vertices to hw vertices.
     */
    dst_offset = 0;
-   memset(&hw_key, 0, sizeof(hw_key));
 
    for (i = 0; i < vbuf->vinfo->num_attribs; i++) {
       unsigned emit_sz = 0;
@@ -277,12 +279,10 @@ vbuf_set_prim( struct vbuf_stage *vbuf, uint prim )
    /* Don't bother with caching at this stage:
     */
    if (!vbuf->translate ||
-       memcmp(&vbuf->translate->key, &hw_key, sizeof(hw_key)) != 0) 
+       translate_key_compare(&vbuf->translate->key, &hw_key) != 0) 
    {
-      if (vbuf->translate)
-        vbuf->translate->release(vbuf->translate);
-
-      vbuf->translate = translate_create( &hw_key );
+      translate_key_sanitize(&hw_key);
+      vbuf->translate = translate_cache_find(vbuf->cache, &hw_key);
 
       vbuf->translate->set_buffer(vbuf->translate, 1, &vbuf->point_size, 0);
    }
@@ -430,6 +430,9 @@ static void vbuf_destroy( struct draw_stage *stage )
    if (vbuf->render)
       vbuf->render->destroy( vbuf->render );
 
+   if (vbuf->cache)
+      translate_cache_destroy(vbuf->cache);
+
    FREE( stage );
 }
 
@@ -460,6 +463,11 @@ struct draw_stage *draw_vbuf_stage( struct draw_context *draw,
                                            16 );
    if (!vbuf->indices)
       goto fail;
+
+   vbuf->cache = translate_cache_create();
+   if (!vbuf->cache) 
+      goto fail;
+      
    
    vbuf->vertices = NULL;
    vbuf->vertex_ptr = vbuf->vertices;
index 999b2007a26bbac565f3ebb976f5117c16d4840c..4a854f4362e771adf20320f6ca466ba3d6432bbe 100644 (file)
@@ -49,7 +49,6 @@ void draw_pt_emit_prepare( struct pt_emit *emit,
    const struct vertex_info *vinfo;
    unsigned dst_offset;
    struct translate_key hw_key;
-   unsigned keysize;
    unsigned i;
    boolean ok;
 
@@ -62,7 +61,7 @@ void draw_pt_emit_prepare( struct pt_emit *emit,
    /* Must do this after set_primitive() above:
     */
    vinfo = draw->render->get_vertex_info(draw->render);
-   keysize = 2*4 + vinfo->num_attribs * sizeof(hw_key.element[0]);
+
 
    /* Translate from pipeline vertices to hw vertices.
     */
@@ -121,9 +120,9 @@ void draw_pt_emit_prepare( struct pt_emit *emit,
    hw_key.output_stride = vinfo->size * 4;
 
    if (!emit->translate ||
-       memcmp(&emit->translate->key, &hw_key, keysize) != 0)
+       translate_key_compare(&emit->translate->key, &hw_key) != 0)
    {
-      memset((char *)&hw_key + keysize, 0, sizeof(hw_key) - keysize);
+      translate_key_sanitize(&hw_key);
       emit->translate = translate_cache_find(emit->cache, &hw_key);
    }
 }
@@ -244,7 +243,8 @@ struct pt_emit *draw_pt_emit_create( struct draw_context *draw )
 
 void draw_pt_emit_destroy( struct pt_emit *emit )
 {
-   translate_cache_destroy(emit->cache);
+   if (emit->cache)
+      translate_cache_destroy(emit->cache);
 
    FREE(emit);
 }
index 034e0eccb26e1fb52902eab52ab3da1875d23139..07f4c991642c0d8b0a533e9738286d5ef1c97b5d 100644 (file)
@@ -62,11 +62,8 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch,
    unsigned i, nr = 0;
    unsigned dst_offset = 0;
    struct translate_key key;
-   unsigned keysize;
 
    fetch->vertex_size = vertex_size;
-   keysize = (2*4 + 
-              (draw->pt.nr_vertex_elements + 1) * sizeof(key.element[0]));
 
    /* Always emit/leave space for a vertex header.
     *
@@ -111,9 +108,9 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch,
 
 
    if (!fetch->translate ||
-       memcmp(&fetch->translate->key, &key, keysize) != 0)
+       translate_key_compare(&fetch->translate->key, &key) != 0)
    {
-      memset((char *)&key + keysize, 0, sizeof(key) - keysize);
+      translate_key_sanitize(&key);
       fetch->translate = translate_cache_find(fetch->cache, &key);
 
       {
index bdbb039f9e82a38c138b6eeaa7e2e56caa050869..a1d041a74f50d388eae78617916782efb81f3d35 100644 (file)
@@ -174,8 +174,9 @@ static void fetch_emit_prepare( struct draw_pt_middle_end *middle,
    /* Don't bother with caching at this stage:
     */
    if (!feme->translate ||
-       memcmp(&feme->translate->key, &key, sizeof(key)) != 0) 
+       translate_key_compare(&feme->translate->key, &key) != 0) 
    {
+      translate_key_sanitize(&key);
       feme->translate = translate_cache_find(feme->cache,
                                              &key);