Mesa (lp-binning): llvmpipe: added scene functions for texture reference counting

Brian Paul brianp at kemper.freedesktop.org
Wed Jan 13 22:12:15 UTC 2010


Module: Mesa
Branch: lp-binning
Commit: 592e40aa7bdbda5a09becb898300393d599c033a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=592e40aa7bdbda5a09becb898300393d599c033a

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Jan 13 13:43:58 2010 -0700

llvmpipe: added scene functions for texture reference counting

When a texture is used in the scene we add it to a list of texture
references.  The lp_scene_is_textured_referenced() function tells
us if a texture is referenced by the scene.

---

 src/gallium/drivers/llvmpipe/lp_scene.c |   48 +++++++++++++++++++++++++++++++
 src/gallium/drivers/llvmpipe/lp_scene.h |   16 ++++++++++
 2 files changed, 64 insertions(+), 0 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/lp_scene.c b/src/gallium/drivers/llvmpipe/lp_scene.c
index 967d666..191122d 100644
--- a/src/gallium/drivers/llvmpipe/lp_scene.c
+++ b/src/gallium/drivers/llvmpipe/lp_scene.c
@@ -27,6 +27,7 @@
 
 #include "util/u_math.h"
 #include "util/u_memory.h"
+#include "util/u_simple_list.h"
 #include "lp_scene.h"
 
 
@@ -62,6 +63,8 @@ lp_scene_init(struct lp_scene *scene)
    scene->data.head =
       scene->data.tail = CALLOC_STRUCT(data_block);
 
+   make_empty_list(&scene->textures);
+
    pipe_mutex_init(scene->mutex);
 }
 
@@ -140,6 +143,18 @@ lp_scene_reset(struct lp_scene *scene )
       list->head = list->tail;
       list->head->used = 0;
    }
+
+   /* Release texture refs
+    */
+   {
+      struct texture_ref *ref, *next, *ref_list = &scene->textures;
+      for (ref = ref_list->next; ref != ref_list; ref = next) {
+         next = next_elem(ref);
+         pipe_texture_reference(&ref->texture, NULL);
+         FREE(ref);
+      }
+      make_empty_list(ref_list);
+   }
 }
 
 
@@ -230,6 +245,39 @@ lp_scene_bin_size( const struct lp_scene *scene, unsigned x, unsigned y )
 
 
 /**
+ * Add a reference to a texture by the scene.
+ */
+void
+lp_scene_texture_reference( struct lp_scene *scene,
+                            struct pipe_texture *texture )
+{
+   struct texture_ref *ref = CALLOC_STRUCT(texture_ref);
+   if (ref) {
+      struct texture_ref *ref_list = &scene->textures;
+      pipe_texture_reference(&ref->texture, texture);
+      insert_at_tail(ref_list, ref);
+   }
+}
+
+
+/**
+ * Does this scene have a reference to the given texture?
+ */
+boolean
+lp_scene_is_textured_referenced( const struct lp_scene *scene,
+                                 const struct pipe_texture *texture )
+{
+   const struct texture_ref *ref_list = &scene->textures;
+   const struct texture_ref *ref;
+   foreach (ref, ref_list) {
+      if (ref->texture == texture)
+         return TRUE;
+   }
+   return FALSE;
+}
+
+
+/**
  * Return last command in the bin
  */
 static lp_rast_cmd
diff --git a/src/gallium/drivers/llvmpipe/lp_scene.h b/src/gallium/drivers/llvmpipe/lp_scene.h
index 4b6527d..86facf8 100644
--- a/src/gallium/drivers/llvmpipe/lp_scene.h
+++ b/src/gallium/drivers/llvmpipe/lp_scene.h
@@ -97,6 +97,13 @@ struct data_block_list {
 };
 
 
+/** List of texture references */
+struct texture_ref {
+   struct pipe_texture *texture;
+   struct texture_ref *prev, *next;  /**< linked list w/ u_simple_list.h */
+};
+
+
 /**
  * All bins and bin data are contained here.
  * Per-bin data goes into the 'tile' bins.
@@ -112,6 +119,9 @@ struct lp_scene {
    /** the framebuffer to render the scene into */
    struct pipe_framebuffer_state fb;
 
+   /** list of textures referenced by the scene commands */
+   struct texture_ref textures;
+
    boolean write_depth;
 
    /**
@@ -150,6 +160,12 @@ unsigned lp_scene_data_size( const struct lp_scene *scene );
 
 unsigned lp_scene_bin_size( const struct lp_scene *scene, unsigned x, unsigned y );
 
+void lp_scene_texture_reference( struct lp_scene *scene,
+                                 struct pipe_texture *texture );
+
+boolean lp_scene_is_textured_referenced( const struct lp_scene *scene,
+                                         const struct pipe_texture *texture );
+
 
 /**
  * Allocate space for a command/data in the bin's data buffer.




More information about the mesa-commit mailing list