etnaviv: add support for extended texture formats
authorChristian Gmeiner <christian.gmeiner@gmail.com>
Wed, 21 Jun 2017 20:36:45 +0000 (22:36 +0200)
committerChristian Gmeiner <christian.gmeiner@gmail.com>
Mon, 26 Jun 2017 17:49:30 +0000 (19:49 +0200)
Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>
src/gallium/drivers/etnaviv/etnaviv_format.c
src/gallium/drivers/etnaviv/etnaviv_format.h
src/gallium/drivers/etnaviv/etnaviv_screen.c
src/gallium/drivers/etnaviv/etnaviv_texture.c

index 7c243861c0d582decb29496644e087d11c184f6e..e9cd1040b5a966c4739fd3ffd507dd6737f4ae63 100644 (file)
@@ -231,7 +231,7 @@ static struct etna_format formats[PIPE_FORMAT_COUNT] = {
 uint32_t
 translate_texture_format(enum pipe_format fmt)
 {
-   /* XXX with TEXTURE_FORMAT_EXT and swizzle on newer chips we can
+   /* XXX with swizzle on newer chips we can
     * support much more */
    if (!formats[fmt].present)
       return ETNA_NO_MATCH;
index 549dfda6897f1cfc4b079d9e7123c0e0190f8f9e..1170d79a6c180e536af42e418d6052f9dae536af 100644 (file)
@@ -31,6 +31,7 @@
 #include <stdint.h>
 
 #define ETNA_NO_MATCH (~0)
+#define EXT_FORMAT (1 << 31)
 
 uint32_t
 translate_texture_format(enum pipe_format fmt);
index 6c0735e0fbf2ff4c67b7c2c0bb74b9c468f18222..a69aef09cdd7c9e4543f442180109de2d51a4d43 100644 (file)
@@ -467,6 +467,9 @@ gpu_supports_texure_format(struct etna_screen *screen, uint32_t fmt)
    if (fmt >= TEXTURE_FORMAT_DXT1 && fmt <= TEXTURE_FORMAT_DXT4_DXT5)
       return VIV_FEATURE(screen, chipFeatures, DXT_TEXTURE_COMPRESSION);
 
+   if (fmt & EXT_FORMAT)
+      return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
+
    return true;
 }
 
index df77829078c0428d4be2d7a6bdb743b463f8b62a..f973bcb77eb76a0164946ea53af4aa2c2b605d17 100644 (file)
@@ -161,6 +161,8 @@ etna_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc,
    struct etna_sampler_view *sv = CALLOC_STRUCT(etna_sampler_view);
    struct etna_resource *res = etna_resource(prsc);
    struct etna_context *ctx = etna_context(pctx);
+   const uint32_t format = translate_texture_format(so->format);
+   const bool ext = !!(format & EXT_FORMAT);
 
    if (!sv)
       return NULL;
@@ -191,8 +193,7 @@ etna_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc,
    sv->base.context = pctx;
 
    /* merged with sampler state */
-   sv->TE_SAMPLER_CONFIG0 =
-      VIVS_TE_SAMPLER_CONFIG0_FORMAT(translate_texture_format(sv->base.format));
+   sv->TE_SAMPLER_CONFIG0 = COND(!ext, VIVS_TE_SAMPLER_CONFIG0_FORMAT(format));
    sv->TE_SAMPLER_CONFIG0_MASK = 0xffffffff;
 
    switch (sv->base.target) {
@@ -215,7 +216,8 @@ etna_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc,
       return NULL;
    }
 
-   sv->TE_SAMPLER_CONFIG1 = VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_R(so->swizzle_r) |
+   sv->TE_SAMPLER_CONFIG1 = COND(ext, VIVS_TE_SAMPLER_CONFIG1_FORMAT_EXT(format)) |
+                            VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_R(so->swizzle_r) |
                             VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_G(so->swizzle_g) |
                             VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_B(so->swizzle_b) |
                             VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_A(so->swizzle_a) |