mesa_texstore expects pixel data, not compressed data. For compressed textures, we want to just copy the bits in without any conversion. 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
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>
On Sun, Sep 14, 2014 at 3:37 AM, Francisco Jerez <currojerez at riseup.net> wrote:> 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?Hmmm... no reason that I can think of off-hand -- nor do I see one for not using the default _mesa_store_*image... Perhaps there was before the AllocTextureImageBuffer thing existed?> >> 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
Apparently Analagous Threads
- [PATCH] nouveau: fix glCompressedTexImage
- [PATCH] nouveau: fix glCompressedTexImage
- [WIP PATCH] dri/nouveau: Add S3TC support for nv20.
- [PATCH] dri/nouveau: Add AllocTextureImageBuffer() implementation
- [PATCH] nouveau_vieux: add AllocTextureImageBuffer implementation