[Nouveau] [PATCH] nouveau: fix glCompressedTexImage
Ilia Mirkin
imirkin at alum.mit.edu
Wed Sep 24 19:26:12 PDT 2014
On Sun, Sep 14, 2014 at 8:41 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> 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?
Hrmph, well, *actually* testing it, it doesn't work, neither for
Tex*Image nor for CompressedTex*Image. No idea why, and quite frankly
don't feel like investigating. I'm going to check this in as-is. I
suspect the reason points to a more general fail within the driver,
since it _ought_ to work. Perhaps it has to do with the context
dirtying/validate_teximage calls?
>
>>
>>> 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