On 18 June 2018 at 23:19, Marek Olšák <mar...@gmail.com> wrote: > What about non-sRGB formats?
Only sRGB formats get unpacked to BGRA currently, so I don't need to do anything about the others. Thanks, Tomeu > Marek > > On Wed, May 23, 2018 at 4:54 AM, Tomeu Vizoso <tomeu.viz...@collabora.com> > wrote: >> >> 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. >> >> Signed-off-by: Tomeu Vizoso <tomeu.viz...@collabora.com> >> --- >> src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 2 +- >> src/mesa/main/texcompress_etc.c | 56 +++++++++++-------- >> src/mesa/main/texcompress_etc.h | 4 +- >> src/mesa/state_tracker/st_cb_texture.c | 4 +- >> 4 files changed, 41 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 67086ee6c0e8..4d9019ebf4ea 100644 >> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c >> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c >> @@ -3370,7 +3370,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 099787b7f407..ce50ba32f9d4 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 319b7bea7154..650467ce1f32 100644 >> --- a/src/mesa/main/texcompress_etc.h >> +++ b/src/mesa/main/texcompress_etc.h >> @@ -28,6 +28,7 @@ >> #include "glheader.h" >> #include "texcompress.h" >> #include "texstore.h" >> +#include "pipe/p_format.h" >> >> >> GLboolean >> @@ -77,7 +78,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 8cc8e08a623e..7c0879084ab6 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.17.0 >> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/mesa-dev > > > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev