From e5604ef78bd56fc136f00ee39003e3996bf23c80 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Fri, 22 Jun 2018 15:59:08 +0200 Subject: [PATCH] st/mesa/i965: Allow decompressing ETC2 to GL_RGBA MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Marek Olšák --- src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 2 +- src/mesa/main/texcompress_etc.c | 56 +++++++++++-------- src/mesa/main/texcompress_etc.h | 3 +- src/mesa/state_tracker/st_cb_texture.c | 4 +- 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c index 6b89bf6848a..4a61cee08b5 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c @@ -3356,7 +3356,7 @@ intel_miptree_unmap_etc(struct brw_context *brw, else _mesa_unpack_etc2_format(dst, mt->surf.row_pitch, map->ptr, map->stride, - map->w, map->h, mt->etc_format); + map->w, map->h, mt->etc_format, true); intel_miptree_unmap_raw(mt); free(map->buffer); diff --git a/src/mesa/main/texcompress_etc.c b/src/mesa/main/texcompress_etc.c index 099787b7f40..b39ab33d36f 100644 --- a/src/mesa/main/texcompress_etc.c +++ b/src/mesa/main/texcompress_etc.c @@ -719,7 +719,8 @@ etc2_unpack_srgb8(uint8_t *dst_row, const uint8_t *src_row, unsigned src_stride, unsigned width, - unsigned height) + unsigned height, + bool bgra) { const unsigned bw = 4, bh = 4, bs = 8, comps = 4; struct etc2_block block; @@ -741,11 +742,14 @@ etc2_unpack_srgb8(uint8_t *dst_row, for (i = 0; i < w; i++) { etc2_rgb8_fetch_texel(&block, i, j, dst, false /* punchthrough_alpha */); - /* Convert to MESA_FORMAT_B8G8R8A8_SRGB */ - tmp = dst[0]; - dst[0] = dst[2]; - dst[2] = tmp; - dst[3] = 255; + + if (bgra) { + /* Convert to MESA_FORMAT_B8G8R8A8_SRGB */ + tmp = dst[0]; + dst[0] = dst[2]; + dst[2] = tmp; + dst[3] = 255; + } dst += comps; } @@ -801,7 +805,8 @@ etc2_unpack_srgb8_alpha8(uint8_t *dst_row, const uint8_t *src_row, unsigned src_stride, unsigned width, - unsigned height) + unsigned height, + bool bgra) { /* 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 @@ -825,11 +830,13 @@ etc2_unpack_srgb8_alpha8(uint8_t *dst_row, for (i = 0; i < w; i++) { etc2_rgba8_fetch_texel(&block, i, j, dst); - /* Convert to MESA_FORMAT_B8G8R8A8_SRGB */ - tmp = dst[0]; - dst[0] = dst[2]; - dst[2] = tmp; - dst[3] = dst[3]; + if (bgra) { + /* Convert to MESA_FORMAT_B8G8R8A8_SRGB */ + tmp = dst[0]; + dst[0] = dst[2]; + dst[2] = tmp; + dst[3] = dst[3]; + } dst += comps; } @@ -1058,7 +1065,8 @@ etc2_unpack_srgb8_punchthrough_alpha1(uint8_t *dst_row, const uint8_t *src_row, unsigned src_stride, unsigned width, - unsigned height) + unsigned height, + bool bgra) { const unsigned bw = 4, bh = 4, bs = 8, comps = 4; struct etc2_block block; @@ -1078,11 +1086,14 @@ etc2_unpack_srgb8_punchthrough_alpha1(uint8_t *dst_row, for (i = 0; i < w; i++) { etc2_rgb8_fetch_texel(&block, i, j, dst, true /* punchthrough_alpha */); - /* Convert to MESA_FORMAT_B8G8R8A8_SRGB */ - tmp = dst[0]; - dst[0] = dst[2]; - dst[2] = tmp; - dst[3] = dst[3]; + + if (bgra) { + /* Convert to MESA_FORMAT_B8G8R8A8_SRGB */ + tmp = dst[0]; + dst[0] = dst[2]; + dst[2] = tmp; + dst[3] = dst[3]; + } dst += comps; } @@ -1206,7 +1217,8 @@ _mesa_unpack_etc2_format(uint8_t *dst_row, unsigned src_stride, unsigned src_width, unsigned src_height, - mesa_format format) + mesa_format format, + bool bgra) { if (format == MESA_FORMAT_ETC2_RGB8) 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) etc2_unpack_srgb8(dst_row, dst_stride, src_row, src_stride, - src_width, src_height); + src_width, src_height, bgra); else if (format == MESA_FORMAT_ETC2_RGBA8_EAC) etc2_unpack_rgba8(dst_row, dst_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) etc2_unpack_srgb8_alpha8(dst_row, dst_stride, src_row, src_stride, - src_width, src_height); + src_width, src_height, bgra); else if (format == MESA_FORMAT_ETC2_R11_EAC) etc2_unpack_r11(dst_row, dst_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) etc2_unpack_srgb8_punchthrough_alpha1(dst_row, dst_stride, src_row, src_stride, - src_width, src_height); + src_width, src_height, bgra); } diff --git a/src/mesa/main/texcompress_etc.h b/src/mesa/main/texcompress_etc.h index 319b7bea715..2c764b88b09 100644 --- a/src/mesa/main/texcompress_etc.h +++ b/src/mesa/main/texcompress_etc.h @@ -77,7 +77,8 @@ _mesa_unpack_etc2_format(uint8_t *dst_row, unsigned src_stride, unsigned src_width, unsigned src_height, - mesa_format format); + mesa_format format, + bool bgra); compressed_fetch_func _mesa_get_etc_fetch_func(mesa_format format); diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 40a1ce11087..99209abcd62 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -326,10 +326,12 @@ st_UnmapTextureImage(struct gl_context *ctx, transfer->box.width, transfer->box.height); } else { + bool bgra = stImage->pt->format == PIPE_FORMAT_B8G8R8A8_SRGB; _mesa_unpack_etc2_format(itransfer->map, transfer->stride, itransfer->temp_data, itransfer->temp_stride, transfer->box.width, transfer->box.height, - texImage->TexFormat); + texImage->TexFormat, + bgra); } } -- 2.30.2