[Mesa-dev] [PATCH v2] etnaviv: Add support for ETC2 texture compression

Ilia Mirkin imirkin at alum.mit.edu
Mon Jul 17 17:14:39 UTC 2017


;On Mon, Jul 17, 2017 at 12:56 PM, Wladimir J. van der Laan
<laanwj at gmail.com> wrote:
> Add support for ETC2 compressed textures in the etnaviv driver.
>
> One step closer towards GL ES 3 support.
>
> For now, treat SRGB and RGB formats the same. It looks like these are
> distinguished using a different bit in sampler state, and not part of
> the format, but I have not yet been able to confirm this for sure.
>
> (Only enabled on GC3000+ for now, as the GC2000 ETC2 decoder
> implementation is buggy and we don't work around that)
>
> Signed-off-by: Wladimir J. van der Laan <laanwj at gmail.com>
> ---
>  src/gallium/drivers/etnaviv/etnaviv_format.c | 11 +++++++++++
>  src/gallium/drivers/etnaviv/etnaviv_screen.c | 27 ++++++++++++++++++++++++++-
>  2 files changed, 37 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_format.c b/src/gallium/drivers/etnaviv/etnaviv_format.c
> index c7c032a..cb67060 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_format.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_format.c
> @@ -234,6 +234,17 @@ static struct etna_format formats[PIPE_FORMAT_COUNT] = {
>     _T(DXT3_RGBA, DXT2_DXT3, SWIZ(X, Y, Z, W), NONE),
>     _T(DXT5_RGBA, DXT4_DXT5, SWIZ(X, Y, Z, W), NONE),
>
> +   _T(ETC2_RGB8,       EXT_NONE | EXT_FORMAT,                          SWIZ(X, Y, Z, W), NONE), /* Extd. format NONE doubles as ETC2_RGB8 */

Note that ETC1_RGB8 is a subset of the ETC2 format.

> +   _T(ETC2_SRGB8,      EXT_NONE | EXT_FORMAT,                          SWIZ(X, Y, Z, W), NONE),
> +   _T(ETC2_RGB8A1,     EXT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 | EXT_FORMAT, SWIZ(X, Y, Z, W), NONE),
> +   _T(ETC2_SRGB8A1,    EXT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 | EXT_FORMAT, SWIZ(X, Y, Z, W), NONE),
> +   _T(ETC2_RGBA8,      EXT_RGBA8_ETC2_EAC | EXT_FORMAT,                SWIZ(X, Y, Z, W), NONE),
> +   _T(ETC2_SRGBA8,     EXT_RGBA8_ETC2_EAC | EXT_FORMAT,                SWIZ(X, Y, Z, W), NONE),
> +   _T(ETC2_R11_UNORM,  EXT_R11_EAC | EXT_FORMAT,                       SWIZ(X, Y, Z, W), NONE),
> +   _T(ETC2_R11_SNORM,  EXT_SIGNED_R11_EAC | EXT_FORMAT,                SWIZ(X, Y, Z, W), NONE),
> +   _T(ETC2_RG11_UNORM, EXT_RG11_EAC | EXT_FORMAT,                      SWIZ(X, Y, Z, W), NONE),
> +   _T(ETC2_RG11_SNORM, EXT_SIGNED_RG11_EAC | EXT_FORMAT,               SWIZ(X, Y, Z, W), NONE),
> +
>     /* YUV */
>     _T(YUYV, YUY2, SWIZ(X, Y, Z, W), YUY2),
>     _T(UYVY, UYVY, SWIZ(X, Y, Z, W), NONE),
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> index ec8de96..3cae16d 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> @@ -460,6 +460,26 @@ etna_screen_get_timestamp(struct pipe_screen *pscreen)
>  }
>
>  static bool
> +etna_format_is_etc2(enum pipe_format format)
> +{
> +   switch (format) {

How about

const struct util_format_description *desc = util_format_description(format);
return desc->layout == UTIL_FORMAT_LAYOUT_ETC;

There's already a util_format_is_s3tc helper, I don't think it'd be
way out of line to add one for etc as well.

> +      case PIPE_FORMAT_ETC2_RGB8:
> +      case PIPE_FORMAT_ETC2_SRGB8:
> +      case PIPE_FORMAT_ETC2_RGB8A1:
> +      case PIPE_FORMAT_ETC2_SRGB8A1:
> +      case PIPE_FORMAT_ETC2_RGBA8:
> +      case PIPE_FORMAT_ETC2_SRGBA8:
> +      case PIPE_FORMAT_ETC2_R11_UNORM:
> +      case PIPE_FORMAT_ETC2_R11_SNORM:
> +      case PIPE_FORMAT_ETC2_RG11_UNORM:
> +      case PIPE_FORMAT_ETC2_RG11_SNORM:
> +         return true;
> +      default:
> +         return false;
> +   }
> +}
> +
> +static bool
>  gpu_supports_texure_format(struct etna_screen *screen, uint32_t fmt,
>                             enum pipe_format format)
>  {
> @@ -474,7 +494,12 @@ gpu_supports_texure_format(struct etna_screen *screen, uint32_t fmt,
>     if (fmt & EXT_FORMAT)
>        supported = VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
>
> -   if (util_format_is_snorm(format))
> +   /* ETC2 is supported on HALTI0, however that implementation is buggy in
> +    * hardware. The blob driver does per-block patching to work around this.
> +    * As this is currently not implemented by etnaviv, enable it for HALTI1
> +    * (GC3000) only.
> +    */
> +   if (util_format_is_snorm(format) || etna_format_is_etc2(format))
>        supported = VIV_FEATURE(screen, chipMinorFeatures2, HALTI1);
>
>     if (!supported)
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list