mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 13:00:09 +01:00
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:
parent
f84c830b14
commit
c1e60a61e8
2 changed files with 68 additions and 0 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue