Mesa (staging/20.1): st/mesa: make texture views inherit compressed_data storage
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Jun 19 20:07:11 UTC 2020
Module: Mesa
Branch: staging/20.1
Commit: 1602ffbdb067223511e8073bbdded4452da39b50
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1602ffbdb067223511e8073bbdded4452da39b50
Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Date: Fri Jun 5 11:20:55 2020 +0200
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 <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5492>
(cherry picked from commit b6db703e0f007fbcf4389ec607ae4c3e8fc9ee0d)
---
.pick_status.json | 2 +-
src/mesa/state_tracker/st_cb_texture.c | 25 ++++++++++++++++++++-----
src/mesa/state_tracker/st_texture.h | 8 +++++++-
3 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/.pick_status.json b/.pick_status.json
index f4394c358ab..c50df8864be 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -256,7 +256,7 @@
"description": "st/mesa: make texture views inherit compressed_data storage",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"master_sha": null,
"because_sha": "c3fafa127a01ef6d46c976bbf2c5be94350c0667"
},
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 1cb85b8b406..66f1bf15e95 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -215,9 +215,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
@@ -264,16 +265,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);
}
@@ -320,8 +326,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;
@@ -3100,7 +3107,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;
};
More information about the mesa-commit
mailing list