From: Pierre-Eric Pelloux-Prayer Date: Fri, 5 Jun 2020 09:20:55 +0000 (+0200) Subject: st/mesa: make texture views inherit compressed_data storage X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b6db703e0f007fbcf4389ec607ae4c3e8fc9ee0d;p=mesa.git st/mesa: make texture views inherit compressed_data storage Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2775 Fixes: c3fafa127a0 ("st/mesa: generalize code for the compressed texture map/unmap fallback") Reviewed-by: Marek Olšák Part-of: --- diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 32e390c53d6..72274579187 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -231,9 +231,10 @@ st_FreeTextureImageBuffer(struct gl_context *ctx, stImage->transfer = NULL; stImage->num_transfers = 0; - if (stImage->compressed_data) { + if (stImage->compressed_data && + pipe_reference(&stImage->compressed_data->reference, NULL)) { + free(stImage->compressed_data->ptr); free(stImage->compressed_data); - stImage->compressed_data = NULL; } /* if the texture image is being deallocated, the structure of the @@ -280,16 +281,21 @@ compressed_tex_fallback_allocate(struct st_context *st, if (!st_compressed_format_fallback(st, texImage->TexFormat)) return; - if (stImage->compressed_data) + if (stImage->compressed_data && + pipe_reference(&stImage->compressed_data->reference, NULL)) { + free(stImage->compressed_data->ptr); free(stImage->compressed_data); + } unsigned data_size = _mesa_format_image_size(texImage->TexFormat, texImage->Width2, texImage->Height2, texImage->Depth2); - stImage->compressed_data = + stImage->compressed_data = ST_CALLOC_STRUCT(st_compressed_data); + stImage->compressed_data->ptr = malloc(data_size * _mesa_num_tex_faces(texImage->TexObject->Target)); + pipe_reference_init(&stImage->compressed_data->reference, 1); } @@ -336,8 +342,9 @@ st_MapTextureImage(struct gl_context *ctx, _mesa_format_row_stride(texImage->TexFormat, texImage->Width2); unsigned block_size = _mesa_get_format_bytes(texImage->TexFormat); + assert(stImage->compressed_data); *mapOut = itransfer->temp_data = - stImage->compressed_data + + stImage->compressed_data->ptr + (z * y_blocks + (y / blk_h)) * stride + (x / blk_w) * block_size; itransfer->map = map; @@ -3116,7 +3123,15 @@ st_TextureView(struct gl_context *ctx, for (face = 0; face < numFaces; face++) { struct st_texture_image *stImage = st_texture_image(texObj->Image[face][level]); + struct st_texture_image *origImage = + st_texture_image(origTexObj->Image[face][level]); pipe_resource_reference(&stImage->pt, tex->pt); + if (origImage && + origImage->compressed_data) { + pipe_reference(NULL, + &origImage->compressed_data->reference); + stImage->compressed_data = origImage->compressed_data; + } } } diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h index 7948daa6542..7a9ac150b70 100644 --- a/src/mesa/state_tracker/st_texture.h +++ b/src/mesa/state_tracker/st_texture.h @@ -78,6 +78,12 @@ struct st_sampler_views struct st_sampler_view views[0]; }; +struct st_compressed_data +{ + struct pipe_reference reference; + GLubyte *ptr; +}; + /** * Subclass of gl_texure_image. @@ -101,7 +107,7 @@ struct st_texture_image * the original data. This is necessary for mapping/unmapping, * as well as image copies. */ - GLubyte *compressed_data; + struct st_compressed_data* compressed_data; };