[Nouveau] [PATCH] nouveau: fix glCompressedTexImage
Ilia Mirkin
imirkin at alum.mit.edu
Sun Sep 14 05:41:54 PDT 2014
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
More information about the Nouveau
mailing list