Reviewed-by: Jakob Bornecrantz <ja...@vmware.com>
On Sat, Nov 16, 2013 at 4:49 PM, Brian Paul <bri...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev