[Nouveau] [PATCH] nouveau: fix glCompressedTexImage
Francisco Jerez
currojerez at riseup.net
Sun Sep 14 00:37:53 PDT 2014
Ilia Mirkin <imirkin at alum.mit.edu> writes:
> mesa_texstore expects pixel data, not compressed data. For compressed
> textures, we want to just copy the bits in without any conversion.
>
Any reason we cannot use _mesa_store_compressed_*image for this instead
of rolling our own?
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
> src/mesa/drivers/dri/nouveau/nouveau_texture.c | 65 ++++++++++++++++++++------
> 1 file changed, 52 insertions(+), 13 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.c b/src/mesa/drivers/dri/nouveau/nouveau_texture.c
> index 4626cc3..dc5699c 100644
> --- a/src/mesa/drivers/dri/nouveau/nouveau_texture.c
> +++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.c
> @@ -413,6 +413,31 @@ get_teximage_placement(struct gl_texture_image *ti)
> }
>
> static void
> +nouveau_compressed_copy(struct gl_context *ctx, GLint dims,
> + struct gl_texture_image *ti,
> + GLsizei width, GLsizei height, GLsizei depth,
> + const GLvoid *src, GLvoid *dst, int row_stride)
> +{
> + struct compressed_pixelstore store;
> + int i;
> +
> + _mesa_compute_compressed_pixelstore(dims, ti->TexFormat,
> + width, height, depth,
> + &ctx->Unpack, &store);
> +
> + src += store.SkipBytes;
> +
> + assert(store.CopySlices == 1);
> +
> + /* copy rows of blocks */
> + for (i = 0; i < store.CopyRowsPerSlice; i++) {
> + memcpy(dst, src, store.CopyBytesPerRow);
> + dst += row_stride;
> + src += store.TotalBytesPerRow;
> + }
> +}
> +
> +static void
> nouveau_teximage(struct gl_context *ctx, GLint dims,
> struct gl_texture_image *ti,
> GLsizei imageSize,
> @@ -451,13 +476,19 @@ nouveau_teximage(struct gl_context *ctx, GLint dims,
> GL_MAP_WRITE_BIT,
> &map, &row_stride);
>
> - ret = _mesa_texstore(ctx, dims, ti->_BaseFormat,
> - ti->TexFormat,
> - row_stride,
> - &map,
> - ti->Width, ti->Height, depth,
> - format, type, pixels, packing);
> - assert(ret);
> + if (compressed) {
> + nouveau_compressed_copy(ctx, dims, ti,
> + ti->Width, ti->Height, depth,
> + pixels, map, row_stride);
> + } else {
> + ret = _mesa_texstore(ctx, dims, ti->_BaseFormat,
> + ti->TexFormat,
> + row_stride,
> + &map,
> + ti->Width, ti->Height, depth,
> + format, type, pixels, packing);
> + assert(ret);
> + }
>
> nouveau_unmap_texture_image(ctx, ti, 0);
> _mesa_unmap_teximage_pbo(ctx, packing);
> @@ -502,7 +533,8 @@ static GLboolean
> nouveau_teximage_alloc(struct gl_context *ctx, struct gl_texture_image *ti)
> {
> nouveau_teximage(ctx, 3, ti, 0, 0, 0, NULL,
> - &ctx->DefaultPacking, GL_FALSE);
> + &ctx->DefaultPacking,
> + _mesa_is_format_compressed(ti->TexFormat));
> return GL_TRUE;
> }
>
> @@ -535,11 +567,18 @@ nouveau_texsubimage(struct gl_context *ctx, GLint dims,
> xoffset, yoffset, width, height,
> GL_MAP_WRITE_BIT, &map, &row_stride);
>
> - ret = _mesa_texstore(ctx, dims, ti->_BaseFormat, ti->TexFormat,
> - row_stride, &map,
> - width, height, depth,
> - format, type, pixels, packing);
> - assert(ret);
> + if (compressed) {
> + nouveau_compressed_copy(ctx, dims, ti,
> + width, height, depth,
> + pixels, map, row_stride);
> + } else {
> + ret = _mesa_texstore(ctx, dims, ti->_BaseFormat,
> + ti->TexFormat,
> + row_stride, &map,
> + width, height, depth,
> + format, type, pixels, packing);
> + assert(ret);
> + }
>
> nouveau_unmap_texture_image(ctx, ti, 0);
> _mesa_unmap_teximage_pbo(ctx, packing);
> --
> 1.8.5.5
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/nouveau/attachments/20140914/5b45266d/attachment.sig>
More information about the Nouveau
mailing list