diff options
author | Brian Paul <[email protected]> | 2010-01-13 13:43:58 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2010-01-13 15:10:57 -0700 |
commit | 592e40aa7bdbda5a09becb898300393d599c033a (patch) | |
tree | b568509e39b217fd78e220db15c1c6cceb632c15 /src/gallium/drivers/llvmpipe/lp_scene.c | |
parent | 4769328fe1ddaa1882dddbaad21239d5fdcddf19 (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.c | 48 |
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 |