summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/llvmpipe/lp_scene.c
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2010-01-13 13:43:58 -0700
committerBrian Paul <[email protected]>2010-01-13 15:10:57 -0700
commit592e40aa7bdbda5a09becb898300393d599c033a (patch)
treeb568509e39b217fd78e220db15c1c6cceb632c15 /src/gallium/drivers/llvmpipe/lp_scene.c
parent4769328fe1ddaa1882dddbaad21239d5fdcddf19 (diff)
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.
Diffstat (limited to 'src/gallium/drivers/llvmpipe/lp_scene.c')
-rw-r--r--src/gallium/drivers/llvmpipe/lp_scene.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_scene.c b/src/gallium/drivers/llvmpipe/lp_scene.c
index 967d666bb46..191122de7db 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