[Mesa-dev] [PATCH] svga: dynamically allocate svga_texture::rendered_to array

Jakob Bornecrantz wallbraker at gmail.com
Sat Nov 16 14:53:34 PST 2013


Reviewed-by: Jakob Bornecrantz <jakob at vmware.com>

On Sat, Nov 16, 2013 at 4:49 PM, Brian Paul <brianp at vmware.com> wrote:
> Needs to be larger than 6 to accomodate 3D textures and array textures.
> Fixes a few piglit tests (fbo-3d, copyteximage 3D).
> ---
>  src/gallium/drivers/svga/svga_resource_texture.c |    9 +++++
>  src/gallium/drivers/svga/svga_resource_texture.h |   41 ++++++++++++----------
>  2 files changed, 32 insertions(+), 18 deletions(-)
>
> diff --git a/src/gallium/drivers/svga/svga_resource_texture.c b/src/gallium/drivers/svga/svga_resource_texture.c
> index 17c87ef..88ab451 100644
> --- a/src/gallium/drivers/svga/svga_resource_texture.c
> +++ b/src/gallium/drivers/svga/svga_resource_texture.c
> @@ -238,6 +238,7 @@ svga_texture_destroy(struct pipe_screen *screen,
>
>     ss->total_resource_bytes -= tex->size;
>
> +   FREE(tex->rendered_to);
>     FREE(tex);
>  }
>
> @@ -735,9 +736,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;
> @@ -796,5 +803,7 @@ svga_texture_from_handle(struct pipe_screen *screen,
>     tex->key.cachable = 0;
>     tex->handle = srf;
>
> +   tex->rendered_to = malloc(sizeof(tex->rendered_to[0]));
> +
>     return &tex->b.b;
>  }
> diff --git a/src/gallium/drivers/svga/svga_resource_texture.h b/src/gallium/drivers/svga/svga_resource_texture.h
> index 6c7a754..1ff42fa 100644
> --- a/src/gallium/drivers/svga/svga_resource_texture.h
> +++ b/src/gallium/drivers/svga/svga_resource_texture.h
> @@ -79,7 +79,8 @@ struct svga_texture
>
>     unsigned size;  /**< Approximate size in bytes */
>
> -   unsigned rendered_to[6];  /** six cube faces, one bit per mipmap level */
> +   /** array indexed by cube face or 3D/array slice, one bit per mipmap level */
> +   ushort *rendered_to;
>  };
>
>
> @@ -157,16 +158,30 @@ svga_is_texture_level_defined(const struct svga_texture *tex,
>  }
>
>
> -static INLINE void
> -svga_set_texture_rendered_to(struct svga_texture *tex,
> -                             unsigned face, unsigned 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 < Elements(tex->rendered_to));
> +      assert(face < 6);
> +   }
> +   else if (tex->b.b.target == PIPE_TEXTURE_3D) {
> +      assert(face < tex->b.b.depth0);
>     }
>     else {
> -      assert(face == 0);
> +      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;
>  }
>
> @@ -175,12 +190,7 @@ static INLINE void
>  svga_clear_texture_rendered_to(struct svga_texture *tex,
>                                 unsigned face, unsigned level)
>  {
> -   if (tex->b.b.target == PIPE_TEXTURE_CUBE) {
> -      assert(face < Elements(tex->rendered_to));
> -   }
> -   else {
> -      assert(face == 0);
> -   }
> +   check_face_level(tex, face, level);
>     tex->rendered_to[face] &= ~(1 << level);
>  }
>
> @@ -189,12 +199,7 @@ static INLINE boolean
>  svga_was_texture_rendered_to(const struct svga_texture *tex,
>                               unsigned face, unsigned level)
>  {
> -   if (tex->b.b.target == PIPE_TEXTURE_CUBE) {
> -      assert(face < Elements(tex->rendered_to));
> -   }
> -   else {
> -      assert(face == 0);
> -   }
> +   check_face_level(tex, face, level);
>     return !!(tex->rendered_to[face] & (1 << level));
>  }
>
> --
> 1.7.10.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list