svga: add helpers for tracking rendering to textures

Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
Cc: "10.1" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
Brian Paul 2014-02-08 09:51:14 -08:00
parent f84c830b14
commit c1e60a61e8
2 changed files with 68 additions and 0 deletions

View file

@ -232,6 +232,7 @@ svga_texture_destroy(struct pipe_screen *screen,
ss->total_resource_bytes -= tex->size;
FREE(tex->rendered_to);
FREE(tex);
}
@ -475,9 +476,15 @@ svga_texture_create(struct pipe_screen *screen,
tex->size = util_resource_size(template);
svgascreen->total_resource_bytes += tex->size;
tex->rendered_to = CALLOC(template->depth0 * template->array_size,
sizeof(tex->rendered_to[0]));
if (!tex->rendered_to)
goto error2;
return &tex->b.b;
error2:
FREE(tex->rendered_to);
FREE(tex);
error1:
return NULL;
@ -536,5 +543,7 @@ svga_texture_from_handle(struct pipe_screen *screen,
tex->key.cachable = 0;
tex->handle = srf;
tex->rendered_to = CALLOC(1, sizeof(tex->rendered_to[0]));
return &tex->b.b;
}

View file

@ -78,6 +78,9 @@ struct svga_texture
struct svga_winsys_surface *handle;
unsigned size; /**< Approximate size in bytes */
/** array indexed by cube face or 3D/array slice, one bit per mipmap level */
ushort *rendered_to;
};
@ -143,6 +146,62 @@ svga_define_texture_level(struct svga_texture *tex,
}
static INLINE bool
svga_is_texture_level_defined(const struct svga_texture *tex,
unsigned face, unsigned level)
{
assert(face < Elements(tex->defined));
assert(level < Elements(tex->defined[0]));
return tex->defined[face][level];
}
/** For debugging, check that face and level are legal */
static inline void
check_face_level(const struct svga_texture *tex,
unsigned face, unsigned level)
{
if (tex->b.b.target == PIPE_TEXTURE_CUBE) {
assert(face < 6);
}
else if (tex->b.b.target == PIPE_TEXTURE_3D) {
assert(face < tex->b.b.depth0);
}
else {
assert(face < tex->b.b.array_size);
}
assert(level < 8 * sizeof(tex->rendered_to[0]));
}
static INLINE void
svga_set_texture_rendered_to(struct svga_texture *tex,
unsigned face, unsigned level)
{
check_face_level(tex, face, level);
tex->rendered_to[face] |= 1 << level;
}
static INLINE void
svga_clear_texture_rendered_to(struct svga_texture *tex,
unsigned face, unsigned level)
{
check_face_level(tex, face, level);
tex->rendered_to[face] &= ~(1 << level);
}
static INLINE boolean
svga_was_texture_rendered_to(const struct svga_texture *tex,
unsigned face, unsigned level)
{
check_face_level(tex, face, level);
return !!(tex->rendered_to[face] & (1 << level));
}
struct pipe_resource *
svga_texture_create(struct pipe_screen *screen,
const struct pipe_resource *template);