diff options
author | Wladimir J. van der Laan <[email protected]> | 2017-07-18 12:01:14 +0200 |
---|---|---|
committer | Lucas Stach <[email protected]> | 2017-07-21 12:18:35 +0200 |
commit | 322b34e57ecebb59ba9d847c58a0351e76b9d691 (patch) | |
tree | 1a0b1e9d5280e25db847e67f5c48f18575e4a4ea /src/gallium/drivers/etnaviv | |
parent | c8fe372a158e419a8ad808e5e026350547fac5a3 (diff) |
etnaviv: Add support for ETC2 texture compression
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 <[email protected]>
Signed-off-by: Lucas Stach <[email protected]>
Diffstat (limited to 'src/gallium/drivers/etnaviv')
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_format.c | 11 | ||||
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_screen.c | 12 |
2 files changed, 22 insertions, 1 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_format.c b/src/gallium/drivers/etnaviv/etnaviv_format.c index 354dc2026ca..492499a0d30 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_format.c +++ b/src/gallium/drivers/etnaviv/etnaviv_format.c @@ -233,6 +233,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 */ + _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 0781fec5881..129b0cd6c77 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c @@ -472,9 +472,19 @@ gpu_supports_texure_format(struct etna_screen *screen, uint32_t fmt, if (fmt >= TEXTURE_FORMAT_DXT1 && fmt <= TEXTURE_FORMAT_DXT4_DXT5) supported = VIV_FEATURE(screen, chipFeatures, DXT_TEXTURE_COMPRESSION); - if (fmt & EXT_FORMAT) + if (fmt & EXT_FORMAT) { supported = VIV_FEATURE(screen, chipMinorFeatures1, HALTI0); + /* ETC1 is checked above, as it has its own feature bit. ETC2 is + * supported with 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_etc(format)) + supported = VIV_FEATURE(screen, chipMinorFeatures2, HALTI1); + } + if (!supported) return false; |