mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 22:00:13 +01:00
st/mesa/i965: Allow decompressing ETC2 to GL_RGBA
When Mesa itself implements ETC2 decompression, it currently decompresses to formats in the GL_BGRA component order. That can be problematic for drivers which cannot upload the texture data as GL_BGRA, such as Virgl when it's backed by GLES on the host. So this commit adds a flag to _mesa_unpack_etc2_format so callers can specify the optimal component order. In Gallium's case, it will be requested if the format isn't in PIPE_FORMAT_B8G8R8A8_SRGB format. For i965, it will remain GL_BGRA, as before. v2: * Remove unnecesary include (Emil Velikov) Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
1b54824687
commit
e5604ef78b
4 changed files with 40 additions and 25 deletions
|
|
@ -3356,7 +3356,7 @@ intel_miptree_unmap_etc(struct brw_context *brw,
|
||||||
else
|
else
|
||||||
_mesa_unpack_etc2_format(dst, mt->surf.row_pitch,
|
_mesa_unpack_etc2_format(dst, mt->surf.row_pitch,
|
||||||
map->ptr, map->stride,
|
map->ptr, map->stride,
|
||||||
map->w, map->h, mt->etc_format);
|
map->w, map->h, mt->etc_format, true);
|
||||||
|
|
||||||
intel_miptree_unmap_raw(mt);
|
intel_miptree_unmap_raw(mt);
|
||||||
free(map->buffer);
|
free(map->buffer);
|
||||||
|
|
|
||||||
|
|
@ -719,7 +719,8 @@ etc2_unpack_srgb8(uint8_t *dst_row,
|
||||||
const uint8_t *src_row,
|
const uint8_t *src_row,
|
||||||
unsigned src_stride,
|
unsigned src_stride,
|
||||||
unsigned width,
|
unsigned width,
|
||||||
unsigned height)
|
unsigned height,
|
||||||
|
bool bgra)
|
||||||
{
|
{
|
||||||
const unsigned bw = 4, bh = 4, bs = 8, comps = 4;
|
const unsigned bw = 4, bh = 4, bs = 8, comps = 4;
|
||||||
struct etc2_block block;
|
struct etc2_block block;
|
||||||
|
|
@ -741,11 +742,14 @@ etc2_unpack_srgb8(uint8_t *dst_row,
|
||||||
for (i = 0; i < w; i++) {
|
for (i = 0; i < w; i++) {
|
||||||
etc2_rgb8_fetch_texel(&block, i, j, dst,
|
etc2_rgb8_fetch_texel(&block, i, j, dst,
|
||||||
false /* punchthrough_alpha */);
|
false /* punchthrough_alpha */);
|
||||||
/* Convert to MESA_FORMAT_B8G8R8A8_SRGB */
|
|
||||||
tmp = dst[0];
|
if (bgra) {
|
||||||
dst[0] = dst[2];
|
/* Convert to MESA_FORMAT_B8G8R8A8_SRGB */
|
||||||
dst[2] = tmp;
|
tmp = dst[0];
|
||||||
dst[3] = 255;
|
dst[0] = dst[2];
|
||||||
|
dst[2] = tmp;
|
||||||
|
dst[3] = 255;
|
||||||
|
}
|
||||||
|
|
||||||
dst += comps;
|
dst += comps;
|
||||||
}
|
}
|
||||||
|
|
@ -801,7 +805,8 @@ etc2_unpack_srgb8_alpha8(uint8_t *dst_row,
|
||||||
const uint8_t *src_row,
|
const uint8_t *src_row,
|
||||||
unsigned src_stride,
|
unsigned src_stride,
|
||||||
unsigned width,
|
unsigned width,
|
||||||
unsigned height)
|
unsigned height,
|
||||||
|
bool bgra)
|
||||||
{
|
{
|
||||||
/* If internalformat is COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, each 4 × 4 block
|
/* If internalformat is COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, each 4 × 4 block
|
||||||
* of RGBA8888 information is compressed to 128 bits. To decode a block, the
|
* of RGBA8888 information is compressed to 128 bits. To decode a block, the
|
||||||
|
|
@ -825,11 +830,13 @@ etc2_unpack_srgb8_alpha8(uint8_t *dst_row,
|
||||||
for (i = 0; i < w; i++) {
|
for (i = 0; i < w; i++) {
|
||||||
etc2_rgba8_fetch_texel(&block, i, j, dst);
|
etc2_rgba8_fetch_texel(&block, i, j, dst);
|
||||||
|
|
||||||
/* Convert to MESA_FORMAT_B8G8R8A8_SRGB */
|
if (bgra) {
|
||||||
tmp = dst[0];
|
/* Convert to MESA_FORMAT_B8G8R8A8_SRGB */
|
||||||
dst[0] = dst[2];
|
tmp = dst[0];
|
||||||
dst[2] = tmp;
|
dst[0] = dst[2];
|
||||||
dst[3] = dst[3];
|
dst[2] = tmp;
|
||||||
|
dst[3] = dst[3];
|
||||||
|
}
|
||||||
|
|
||||||
dst += comps;
|
dst += comps;
|
||||||
}
|
}
|
||||||
|
|
@ -1058,7 +1065,8 @@ etc2_unpack_srgb8_punchthrough_alpha1(uint8_t *dst_row,
|
||||||
const uint8_t *src_row,
|
const uint8_t *src_row,
|
||||||
unsigned src_stride,
|
unsigned src_stride,
|
||||||
unsigned width,
|
unsigned width,
|
||||||
unsigned height)
|
unsigned height,
|
||||||
|
bool bgra)
|
||||||
{
|
{
|
||||||
const unsigned bw = 4, bh = 4, bs = 8, comps = 4;
|
const unsigned bw = 4, bh = 4, bs = 8, comps = 4;
|
||||||
struct etc2_block block;
|
struct etc2_block block;
|
||||||
|
|
@ -1078,11 +1086,14 @@ etc2_unpack_srgb8_punchthrough_alpha1(uint8_t *dst_row,
|
||||||
for (i = 0; i < w; i++) {
|
for (i = 0; i < w; i++) {
|
||||||
etc2_rgb8_fetch_texel(&block, i, j, dst,
|
etc2_rgb8_fetch_texel(&block, i, j, dst,
|
||||||
true /* punchthrough_alpha */);
|
true /* punchthrough_alpha */);
|
||||||
/* Convert to MESA_FORMAT_B8G8R8A8_SRGB */
|
|
||||||
tmp = dst[0];
|
if (bgra) {
|
||||||
dst[0] = dst[2];
|
/* Convert to MESA_FORMAT_B8G8R8A8_SRGB */
|
||||||
dst[2] = tmp;
|
tmp = dst[0];
|
||||||
dst[3] = dst[3];
|
dst[0] = dst[2];
|
||||||
|
dst[2] = tmp;
|
||||||
|
dst[3] = dst[3];
|
||||||
|
}
|
||||||
|
|
||||||
dst += comps;
|
dst += comps;
|
||||||
}
|
}
|
||||||
|
|
@ -1206,7 +1217,8 @@ _mesa_unpack_etc2_format(uint8_t *dst_row,
|
||||||
unsigned src_stride,
|
unsigned src_stride,
|
||||||
unsigned src_width,
|
unsigned src_width,
|
||||||
unsigned src_height,
|
unsigned src_height,
|
||||||
mesa_format format)
|
mesa_format format,
|
||||||
|
bool bgra)
|
||||||
{
|
{
|
||||||
if (format == MESA_FORMAT_ETC2_RGB8)
|
if (format == MESA_FORMAT_ETC2_RGB8)
|
||||||
etc2_unpack_rgb8(dst_row, dst_stride,
|
etc2_unpack_rgb8(dst_row, dst_stride,
|
||||||
|
|
@ -1215,7 +1227,7 @@ _mesa_unpack_etc2_format(uint8_t *dst_row,
|
||||||
else if (format == MESA_FORMAT_ETC2_SRGB8)
|
else if (format == MESA_FORMAT_ETC2_SRGB8)
|
||||||
etc2_unpack_srgb8(dst_row, dst_stride,
|
etc2_unpack_srgb8(dst_row, dst_stride,
|
||||||
src_row, src_stride,
|
src_row, src_stride,
|
||||||
src_width, src_height);
|
src_width, src_height, bgra);
|
||||||
else if (format == MESA_FORMAT_ETC2_RGBA8_EAC)
|
else if (format == MESA_FORMAT_ETC2_RGBA8_EAC)
|
||||||
etc2_unpack_rgba8(dst_row, dst_stride,
|
etc2_unpack_rgba8(dst_row, dst_stride,
|
||||||
src_row, src_stride,
|
src_row, src_stride,
|
||||||
|
|
@ -1223,7 +1235,7 @@ _mesa_unpack_etc2_format(uint8_t *dst_row,
|
||||||
else if (format == MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC)
|
else if (format == MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC)
|
||||||
etc2_unpack_srgb8_alpha8(dst_row, dst_stride,
|
etc2_unpack_srgb8_alpha8(dst_row, dst_stride,
|
||||||
src_row, src_stride,
|
src_row, src_stride,
|
||||||
src_width, src_height);
|
src_width, src_height, bgra);
|
||||||
else if (format == MESA_FORMAT_ETC2_R11_EAC)
|
else if (format == MESA_FORMAT_ETC2_R11_EAC)
|
||||||
etc2_unpack_r11(dst_row, dst_stride,
|
etc2_unpack_r11(dst_row, dst_stride,
|
||||||
src_row, src_stride,
|
src_row, src_stride,
|
||||||
|
|
@ -1247,7 +1259,7 @@ _mesa_unpack_etc2_format(uint8_t *dst_row,
|
||||||
else if (format == MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1)
|
else if (format == MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1)
|
||||||
etc2_unpack_srgb8_punchthrough_alpha1(dst_row, dst_stride,
|
etc2_unpack_srgb8_punchthrough_alpha1(dst_row, dst_stride,
|
||||||
src_row, src_stride,
|
src_row, src_stride,
|
||||||
src_width, src_height);
|
src_width, src_height, bgra);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,8 @@ _mesa_unpack_etc2_format(uint8_t *dst_row,
|
||||||
unsigned src_stride,
|
unsigned src_stride,
|
||||||
unsigned src_width,
|
unsigned src_width,
|
||||||
unsigned src_height,
|
unsigned src_height,
|
||||||
mesa_format format);
|
mesa_format format,
|
||||||
|
bool bgra);
|
||||||
|
|
||||||
compressed_fetch_func
|
compressed_fetch_func
|
||||||
_mesa_get_etc_fetch_func(mesa_format format);
|
_mesa_get_etc_fetch_func(mesa_format format);
|
||||||
|
|
|
||||||
|
|
@ -326,10 +326,12 @@ st_UnmapTextureImage(struct gl_context *ctx,
|
||||||
transfer->box.width, transfer->box.height);
|
transfer->box.width, transfer->box.height);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
bool bgra = stImage->pt->format == PIPE_FORMAT_B8G8R8A8_SRGB;
|
||||||
_mesa_unpack_etc2_format(itransfer->map, transfer->stride,
|
_mesa_unpack_etc2_format(itransfer->map, transfer->stride,
|
||||||
itransfer->temp_data, itransfer->temp_stride,
|
itransfer->temp_data, itransfer->temp_stride,
|
||||||
transfer->box.width, transfer->box.height,
|
transfer->box.width, transfer->box.height,
|
||||||
texImage->TexFormat);
|
texImage->TexFormat,
|
||||||
|
bgra);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue