diff options
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nouveau_texture.c | 65 |
1 files 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 4626cc30229..dc5699c7680 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); |