nouveau: fix glCompressedTexImage
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 13 Sep 2014 22:14:46 +0000 (18:14 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Fri, 26 Sep 2014 02:15:49 +0000 (22:15 -0400)
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@alum.mit.edu>
Acked-by: Francisco Jerez <currojerez@riseup.net>
src/mesa/drivers/dri/nouveau/nouveau_texture.c

index 4626cc3022997cd19a4f5368b980717783f75f61..dc5699c76809681c0f59c96515bfc034dc50b542 100644 (file)
@@ -412,6 +412,31 @@ get_teximage_placement(struct gl_texture_image *ti)
                return NOUVEAU_BO_GART | NOUVEAU_BO_MAP;
 }
 
+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,
@@ -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);