mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 15:50:11 +01:00
st/mesa: make texture views inherit compressed_data storage
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2775
Fixes: c3fafa127a ("st/mesa: generalize code for the compressed texture map/unmap fallback")
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5492>
This commit is contained in:
parent
993c64e6fe
commit
b6db703e0f
2 changed files with 27 additions and 6 deletions
|
|
@ -231,9 +231,10 @@ st_FreeTextureImageBuffer(struct gl_context *ctx,
|
||||||
stImage->transfer = NULL;
|
stImage->transfer = NULL;
|
||||||
stImage->num_transfers = 0;
|
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);
|
free(stImage->compressed_data);
|
||||||
stImage->compressed_data = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if the texture image is being deallocated, the structure of the
|
/* 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))
|
if (!st_compressed_format_fallback(st, texImage->TexFormat))
|
||||||
return;
|
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);
|
free(stImage->compressed_data);
|
||||||
|
}
|
||||||
|
|
||||||
unsigned data_size = _mesa_format_image_size(texImage->TexFormat,
|
unsigned data_size = _mesa_format_image_size(texImage->TexFormat,
|
||||||
texImage->Width2,
|
texImage->Width2,
|
||||||
texImage->Height2,
|
texImage->Height2,
|
||||||
texImage->Depth2);
|
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));
|
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);
|
_mesa_format_row_stride(texImage->TexFormat, texImage->Width2);
|
||||||
unsigned block_size = _mesa_get_format_bytes(texImage->TexFormat);
|
unsigned block_size = _mesa_get_format_bytes(texImage->TexFormat);
|
||||||
|
|
||||||
|
assert(stImage->compressed_data);
|
||||||
*mapOut = itransfer->temp_data =
|
*mapOut = itransfer->temp_data =
|
||||||
stImage->compressed_data +
|
stImage->compressed_data->ptr +
|
||||||
(z * y_blocks + (y / blk_h)) * stride +
|
(z * y_blocks + (y / blk_h)) * stride +
|
||||||
(x / blk_w) * block_size;
|
(x / blk_w) * block_size;
|
||||||
itransfer->map = map;
|
itransfer->map = map;
|
||||||
|
|
@ -3116,7 +3123,15 @@ st_TextureView(struct gl_context *ctx,
|
||||||
for (face = 0; face < numFaces; face++) {
|
for (face = 0; face < numFaces; face++) {
|
||||||
struct st_texture_image *stImage =
|
struct st_texture_image *stImage =
|
||||||
st_texture_image(texObj->Image[face][level]);
|
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);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,12 @@ struct st_sampler_views
|
||||||
struct st_sampler_view views[0];
|
struct st_sampler_view views[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct st_compressed_data
|
||||||
|
{
|
||||||
|
struct pipe_reference reference;
|
||||||
|
GLubyte *ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subclass of gl_texure_image.
|
* Subclass of gl_texure_image.
|
||||||
|
|
@ -101,7 +107,7 @@ struct st_texture_image
|
||||||
* the original data. This is necessary for mapping/unmapping,
|
* the original data. This is necessary for mapping/unmapping,
|
||||||
* as well as image copies.
|
* as well as image copies.
|
||||||
*/
|
*/
|
||||||
GLubyte *compressed_data;
|
struct st_compressed_data* compressed_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue