mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 15:30:14 +01:00
nouveau: fix glCompressedTexImage
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>
This commit is contained in:
parent
0147c10c5f
commit
d78b533c29
1 changed files with 52 additions and 13 deletions
|
|
@ -412,6 +412,31 @@ get_teximage_placement(struct gl_texture_image *ti)
|
||||||
return NOUVEAU_BO_GART | NOUVEAU_BO_MAP;
|
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
|
static void
|
||||||
nouveau_teximage(struct gl_context *ctx, GLint dims,
|
nouveau_teximage(struct gl_context *ctx, GLint dims,
|
||||||
struct gl_texture_image *ti,
|
struct gl_texture_image *ti,
|
||||||
|
|
@ -451,13 +476,19 @@ nouveau_teximage(struct gl_context *ctx, GLint dims,
|
||||||
GL_MAP_WRITE_BIT,
|
GL_MAP_WRITE_BIT,
|
||||||
&map, &row_stride);
|
&map, &row_stride);
|
||||||
|
|
||||||
ret = _mesa_texstore(ctx, dims, ti->_BaseFormat,
|
if (compressed) {
|
||||||
ti->TexFormat,
|
nouveau_compressed_copy(ctx, dims, ti,
|
||||||
row_stride,
|
ti->Width, ti->Height, depth,
|
||||||
&map,
|
pixels, map, row_stride);
|
||||||
ti->Width, ti->Height, depth,
|
} else {
|
||||||
format, type, pixels, packing);
|
ret = _mesa_texstore(ctx, dims, ti->_BaseFormat,
|
||||||
assert(ret);
|
ti->TexFormat,
|
||||||
|
row_stride,
|
||||||
|
&map,
|
||||||
|
ti->Width, ti->Height, depth,
|
||||||
|
format, type, pixels, packing);
|
||||||
|
assert(ret);
|
||||||
|
}
|
||||||
|
|
||||||
nouveau_unmap_texture_image(ctx, ti, 0);
|
nouveau_unmap_texture_image(ctx, ti, 0);
|
||||||
_mesa_unmap_teximage_pbo(ctx, packing);
|
_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_alloc(struct gl_context *ctx, struct gl_texture_image *ti)
|
||||||
{
|
{
|
||||||
nouveau_teximage(ctx, 3, ti, 0, 0, 0, NULL,
|
nouveau_teximage(ctx, 3, ti, 0, 0, 0, NULL,
|
||||||
&ctx->DefaultPacking, GL_FALSE);
|
&ctx->DefaultPacking,
|
||||||
|
_mesa_is_format_compressed(ti->TexFormat));
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -535,11 +567,18 @@ nouveau_texsubimage(struct gl_context *ctx, GLint dims,
|
||||||
xoffset, yoffset, width, height,
|
xoffset, yoffset, width, height,
|
||||||
GL_MAP_WRITE_BIT, &map, &row_stride);
|
GL_MAP_WRITE_BIT, &map, &row_stride);
|
||||||
|
|
||||||
ret = _mesa_texstore(ctx, dims, ti->_BaseFormat, ti->TexFormat,
|
if (compressed) {
|
||||||
row_stride, &map,
|
nouveau_compressed_copy(ctx, dims, ti,
|
||||||
width, height, depth,
|
width, height, depth,
|
||||||
format, type, pixels, packing);
|
pixels, map, row_stride);
|
||||||
assert(ret);
|
} 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);
|
nouveau_unmap_texture_image(ctx, ti, 0);
|
||||||
_mesa_unmap_teximage_pbo(ctx, packing);
|
_mesa_unmap_teximage_pbo(ctx, packing);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue