Create a sharable translate_cache and use it.
authorZack Rusin <zack@tungstengraphics.com>
Wed, 23 Apr 2008 18:00:13 +0000 (14:00 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Wed, 23 Apr 2008 18:01:08 +0000 (14:01 -0400)
src/gallium/auxiliary/cso_cache/cso_hash.h
src/gallium/auxiliary/draw/draw_pt_emit.c
src/gallium/auxiliary/draw/draw_pt_fetch.c
src/gallium/auxiliary/translate/Makefile
src/gallium/auxiliary/translate/SConscript
src/gallium/auxiliary/translate/translate.h
src/gallium/auxiliary/translate/translate_cache.c [new file with mode: 0644]
src/gallium/auxiliary/translate/translate_cache.h [new file with mode: 0644]

index 73c47420068d09de42eb66bfc4bd8454375a089c..85f3e276c6ae37a28e458ba06f00b5a4b43058b9 100644 (file)
@@ -106,12 +106,12 @@ struct cso_hash_iter cso_hash_iter_prev(struct cso_hash_iter iter);
 
 
 /**
- * Convenience routine to iterate over the collision list while doing a memory 
+ * Convenience routine to iterate over the collision list while doing a memory
  * comparison to see which entry in the list is a direct copy of our template
  * and returns that entry.
  */
 void *cso_hash_find_data_from_template( struct cso_hash *hash,
-                                       unsigned hash_key, 
+                                       unsigned hash_key,
                                        void *templ,
                                        int size );
 
index 92ad8f70497fbd1c535f8abfa52a459d2aa667d1..c6d95375302f94ad4540999c15be821b105abae3 100644 (file)
 #include "draw/draw_vertex.h"
 #include "draw/draw_pt.h"
 #include "translate/translate.h"
-
-#include "cso_cache/cso_cache.h"
-#include "cso_cache/cso_hash.h"
+#include "translate/translate_cache.h"
 
 struct pt_emit {
    struct draw_context *draw;
 
    struct translate *translate;
 
-   struct cso_hash *hash;
+   struct translate_cache *cache;
 };
 
-static INLINE unsigned translate_hash_key_size(struct translate_key *key)
-{
-   unsigned size = sizeof(struct translate_key) -
-                   sizeof(struct translate_element) * (PIPE_MAX_ATTRIBS - key->nr_elements);
-   return size;
-}
-
-static INLINE unsigned create_key(struct translate_key *key)
-{
-   unsigned hash_key;
-   unsigned size = translate_hash_key_size(key);
-   /*debug_printf("key size = %d, (els = %d)\n",
-     size, key->nr_elements);*/
-   hash_key = cso_construct_key(key, size);
-   return hash_key;
-}
-
-static struct translate *cached_translate(struct pt_emit *emit,
-                                          struct translate_key *key)
-{
-   unsigned hash_key = create_key(key);
-   struct translate *translate = (struct translate*)
-      cso_hash_find_data_from_template(emit->hash,
-                                       hash_key,
-                                       key, sizeof(*key));
-   if (!translate) {
-      /* create/insert */
-      translate = translate_create(key);
-      cso_hash_insert(emit->hash, hash_key, translate);
-   }
-
-   return translate;
-}
-
-
-static INLINE void delete_translates(struct pt_emit *emit)
-{
-   struct cso_hash *hash = emit->hash;
-   struct cso_hash_iter iter = cso_hash_first_node(hash);
-   while (!cso_hash_iter_is_null(iter)) {
-      struct translate *state = (struct translate*)cso_hash_iter_data(iter);
-      iter = cso_hash_iter_next(iter);
-      if (state) {
-         state->release(state);
-      }
-   }
-}
-
 void draw_pt_emit_prepare( struct pt_emit *emit,
                           unsigned prim )
 {
@@ -169,12 +119,10 @@ void draw_pt_emit_prepare( struct pt_emit *emit,
    hw_key.nr_elements = vinfo->num_attribs;
    hw_key.output_stride = vinfo->size * 4;
 
-   /* Don't bother with caching at this stage:
-    */
    if (!emit->translate ||
-       memcmp(&emit->translate->key, &hw_key, sizeof(hw_key)) != 0) 
+       memcmp(&emit->translate->key, &hw_key, sizeof(hw_key)) != 0)
    {
-      emit->translate = cached_translate(emit, &hw_key);
+      emit->translate = translate_cache_find(emit->cache, &hw_key);
    }
 }
 
@@ -236,15 +184,14 @@ struct pt_emit *draw_pt_emit_create( struct draw_context *draw )
       return NULL;
 
    emit->draw = draw;
-   emit->hash = cso_hash_create();
+   emit->cache = translate_cache_create();
 
    return emit;
 }
 
 void draw_pt_emit_destroy( struct pt_emit *emit )
 {
-   delete_translates(emit);
-   cso_hash_delete(emit->hash);
+   translate_cache_destroy(emit->cache);
 
    FREE(emit);
 }
index 013d16e1bcc0c328455bbf29ae37f7c3036087a9..8183c5167607fd51f0bb698ef9a8d5c3967be632 100644 (file)
@@ -32,9 +32,8 @@
 #include "draw/draw_vertex.h"
 #include "draw/draw_pt.h"
 #include "translate/translate.h"
+#include "translate/translate_cache.h"
 
-#include "cso_cache/cso_cache.h"
-#include "cso_cache/cso_hash.h"
 
 struct pt_fetch {
    struct draw_context *draw;
@@ -43,57 +42,9 @@ struct pt_fetch {
 
    unsigned vertex_size;
 
-   struct cso_hash *hash;
+   struct translate_cache *cache;
 };
 
-static INLINE unsigned translate_hash_key_size(struct translate_key *key)
-{
-   unsigned size = sizeof(struct translate_key) -
-                   sizeof(struct translate_element) * (PIPE_MAX_ATTRIBS - key->nr_elements);
-   return size;
-}
-
-static INLINE unsigned create_key(struct translate_key *key)
-{
-   unsigned hash_key;
-   unsigned size = translate_hash_key_size(key);
-   /*debug_printf("key size = %d, (els = %d)\n",
-     size, key->nr_elements);*/
-   hash_key = cso_construct_key(key, size);
-   return hash_key;
-}
-
-static struct translate *cached_translate(struct pt_fetch *fetch,
-                                          struct translate_key *key)
-{
-   unsigned hash_key = create_key(key);
-   struct translate *translate = (struct translate*)
-      cso_hash_find_data_from_template(fetch->hash,
-                                       hash_key,
-                                       key, sizeof(*key));
-
-   if (!translate) {
-      /* create/insert */
-      translate = translate_create(key);
-      cso_hash_insert(fetch->hash, hash_key, translate);
-   }
-
-   return translate;
-}
-
-static INLINE void delete_translates(struct pt_fetch *fetch)
-{
-   struct cso_hash *hash = fetch->hash;
-   struct cso_hash_iter iter = cso_hash_first_node(hash);
-   while (!cso_hash_iter_is_null(iter)) {
-      struct translate *state = (struct translate*)cso_hash_iter_data(iter);
-      iter = cso_hash_iter_next(iter);
-      if (state) {
-         state->release(state);
-      }
-   }
-}
-
 /* Perform the fetch from API vertex elements & vertex buffers, to a
  * contiguous set of float[4] attributes as required for the
  * vertex_shader->run_linear() method.
@@ -157,17 +108,15 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch,
    key.output_stride = vertex_size;
 
 
-   /* Don't bother with caching at this stage:
-    */
    if (!fetch->translate ||
-       memcmp(&fetch->translate->key, &key, sizeof(key)) != 0) 
+       memcmp(&fetch->translate->key, &key, sizeof(key)) != 0)
    {
-      fetch->translate = cached_translate(fetch, &key);
+      fetch->translate = translate_cache_find(fetch->cache, &key);
 
       {
         static struct vertex_header vh = { 0, 0, 0, 0xffff };
-        fetch->translate->set_buffer(fetch->translate, 
-                                     draw->pt.nr_vertex_buffers, 
+        fetch->translate->set_buffer(fetch->translate,
+                                     draw->pt.nr_vertex_buffers,
                                      &vh,
                                      0);
       }
@@ -208,14 +157,13 @@ struct pt_fetch *draw_pt_fetch_create( struct draw_context *draw )
       return NULL;
 
    fetch->draw = draw;
-   fetch->hash = cso_hash_create();
+   fetch->cache = translate_cache_create();
    return fetch;
 }
 
 void draw_pt_fetch_destroy( struct pt_fetch *fetch )
 {
-   delete_translates(fetch);
-   cso_hash_delete(fetch->hash);
+   translate_cache_destroy(fetch->cache);
 
    FREE(fetch);
 }
index 39dfb0de30090405d5408367fb44cc6ffcb0db04..ad2a5b705e4f5cf9f2b32c92653360d24b4c25be 100644 (file)
@@ -6,7 +6,8 @@ LIBNAME = translate
 C_SOURCES = \
        translate_generic.c \
        translate_sse.c \
-       translate.c
+       translate.c \
+        translate_cache.c
 
 include ../../Makefile.template
 
index 7608908915fd99f528f22d1e09f0dee318349562..9553a675372b629e541121de7ef6d62a39f77476 100644 (file)
@@ -6,6 +6,7 @@ translate = env.ConvenienceLibrary(
                'translate_generic.c',
                'translate_sse.c',
                'translate.c',
+               'translate_cache.c',
        ])
 
 auxiliaries.insert(0, translate)
index d95d1ac4f3d3dd1cb00097fefbaf963662f479f5..6c15d7e4dc7bb3e56a7805ed0af21d79f8c6d317 100644 (file)
@@ -96,7 +96,6 @@ struct translate *translate_lookup_or_create( struct translate_context *tctx,
 
 struct translate *translate_create( const struct translate_key *key );
 
-
 /*******************************************************************************
  *  Private:
  */
diff --git a/src/gallium/auxiliary/translate/translate_cache.c b/src/gallium/auxiliary/translate/translate_cache.c
new file mode 100644 (file)
index 0000000..c14f37c
--- /dev/null
@@ -0,0 +1,100 @@
+/**************************************************************************
+ *
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+#include "pipe/p_util.h"
+#include "pipe/p_state.h"
+#include "translate.h"
+
+#include "cso_cache/cso_cache.h"
+#include "cso_cache/cso_hash.h"
+
+struct translate_cache {
+   struct cso_hash *hash;
+};
+
+struct translate_cache * translate_cache_create()
+{
+   struct translate_cache *cache = MALLOC_STRUCT(translate_cache);
+   cache->hash = cso_hash_create();
+}
+
+
+static INLINE void delete_translates(struct translate_cache *cache)
+{
+   struct cso_hash *hash = cache->hash;
+   struct cso_hash_iter iter = cso_hash_first_node(hash);
+   while (!cso_hash_iter_is_null(iter)) {
+      struct translate *state = (struct translate*)cso_hash_iter_data(iter);
+      iter = cso_hash_iter_next(iter);
+      if (state) {
+         state->release(state);
+      }
+   }
+}
+
+void translate_cache_destroy(struct translate_cache *cache)
+{
+   delete_translates(cache);
+   cso_hash_delete(cache->hash);
+   FREE(cache);
+}
+
+
+static INLINE unsigned translate_hash_key_size(struct translate_key *key)
+{
+   unsigned size = sizeof(struct translate_key) -
+                   sizeof(struct translate_element) * (PIPE_MAX_ATTRIBS - key->nr_elements);
+   return size;
+}
+
+static INLINE unsigned create_key(struct translate_key *key)
+{
+   unsigned hash_key;
+   unsigned size = translate_hash_key_size(key);
+   /*debug_printf("key size = %d, (els = %d)\n",
+     size, key->nr_elements);*/
+   hash_key = cso_construct_key(key, size);
+   return hash_key;
+}
+
+struct translate * translate_cache_find(struct translate_cache *cache,
+                                        struct translate_key *key)
+{
+   unsigned hash_key = create_key(key);
+   struct translate *translate = (struct translate*)
+      cso_hash_find_data_from_template(cache->hash,
+                                       hash_key,
+                                       key, sizeof(*key));
+
+   if (!translate) {
+      /* create/insert */
+      translate = translate_create(key);
+      cso_hash_insert(cache->hash, hash_key, translate);
+   }
+
+   return translate;
+}
diff --git a/src/gallium/auxiliary/translate/translate_cache.h b/src/gallium/auxiliary/translate/translate_cache.h
new file mode 100644 (file)
index 0000000..63fc57b
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 Tungsten Graphics, inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#ifndef _TRANSLATE_CACHE_H
+#define _TRANSLATE_CACHE_H
+
+
+/*******************************************************************************
+ * Translate cache.
+ * Simply used to cache created translates. Avoids unecessary creation of
+ * translate's if one suitable for a given translate_key has already been
+ * created.
+ *
+ * Note: this functionality depends and requires the CSO module.
+ */
+struct translate_cache;
+
+struct translate_key;
+struct translate;
+
+struct translate_cache *translate_cache_create();
+void translate_cache_destroy(struct translate_cache *cache);
+
+/**
+ * Will try to find a translate structure matched by the given key.
+ * If such a structure doesn't exist in the cache the function
+ * will automatically create it, insert it in the cache and
+ * return the created version.
+ *
+ */
+struct translate *translate_cache_find(struct translate_cache *cache,
+                                       struct translate_key *key);
+
+#endif