From 592e40aa7bdbda5a09becb898300393d599c033a Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 13 Jan 2010 13:43:58 -0700 Subject: 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(+) (limited to 'src/gallium') 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); + } } @@ -229,6 +244,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 */ diff --git a/src/gallium/drivers/llvmpipe/lp_scene.h b/src/gallium/drivers/llvmpipe/lp_scene.h index 4b6527d67c7..86facf8eac2 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. -- cgit v1.2.3