etnaviv: separate PE and RS formats, use only RS only for tiling
authorJonathan Marek <jonathan@marek.ca>
Fri, 9 Aug 2019 20:27:47 +0000 (16:27 -0400)
committerChristian Gmeiner <christian.gmeiner@gmail.com>
Mon, 18 Nov 2019 19:58:14 +0000 (20:58 +0100)
There are PE formats not supported by RS, so we can't have a single
to translate both.

Use RS only for same formats until we have a translate_rs_format and test
the possible different format blits.

Signed-off-by: Jonathan Marek <jonathan@marek.ca>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
src/gallium/drivers/etnaviv/etnaviv_blend.c
src/gallium/drivers/etnaviv/etnaviv_context.c
src/gallium/drivers/etnaviv/etnaviv_format.c
src/gallium/drivers/etnaviv/etnaviv_format.h
src/gallium/drivers/etnaviv/etnaviv_rs.c
src/gallium/drivers/etnaviv/etnaviv_screen.c
src/gallium/drivers/etnaviv/etnaviv_state.c
src/gallium/drivers/etnaviv/etnaviv_translate.h

index 1f57499e454f05ffeb8add7b05cad8aa8ef2f40b..b9a7c0373d5debe834045b8ad54e3dcdb004f564 100644 (file)
@@ -123,7 +123,7 @@ etna_update_blend(struct etna_context *ctx)
    uint32_t colormask;
 
    if (pfb->cbufs[0] &&
-       translate_rs_format_rb_swap(pfb->cbufs[0]->format)) {
+       translate_pe_format_rb_swap(pfb->cbufs[0]->format)) {
       colormask = rt0->colormask & (PIPE_MASK_A | PIPE_MASK_G);
       if (rt0->colormask & PIPE_MASK_R)
          colormask |= PIPE_MASK_B;
@@ -164,7 +164,7 @@ etna_update_blend_color(struct etna_context *ctx)
 {
    struct pipe_framebuffer_state *pfb = &ctx->framebuffer_s;
    struct compiled_blend_color *cs = &ctx->blend_color;
-   bool rb_swap = (pfb->cbufs[0] && translate_rs_format_rb_swap(pfb->cbufs[0]->format));
+   bool rb_swap = (pfb->cbufs[0] && translate_pe_format_rb_swap(pfb->cbufs[0]->format));
 
    cs->PE_ALPHA_BLEND_COLOR =
       VIVS_PE_ALPHA_BLEND_COLOR_R(etna_cfloat_to_uint8(cs->color[rb_swap ? 2 : 0])) |
index 06b634d096641fee1c342fc36f86b031c9fae122..97eab014b56561f1e376c7269483e430a2a17d3d 100644 (file)
@@ -255,7 +255,7 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
    };
 
    if (pfb->cbufs[0])
-      key.frag_rb_swap = !!translate_rs_format_rb_swap(pfb->cbufs[0]->format);
+      key.frag_rb_swap = !!translate_pe_format_rb_swap(pfb->cbufs[0]->format);
 
    if (!etna_get_vs(ctx, key) || !etna_get_fs(ctx, key)) {
       BUG("compiled shaders are not okay");
index de3121e568aed05b2ae39ecadcf811723bb17b6d..d95302de8ef62c8b36e80a2a86ea847ef26b4a2f 100644 (file)
 struct etna_format {
    unsigned vtx;
    unsigned tex;
-   unsigned rs;
+   unsigned pe;
    bool present;
    const unsigned char tex_swiz[4];
 };
 
-#define RS_FORMAT_NONE ~0
+#define PE_FORMAT_NONE ~0
 
-#define RS_FORMAT_MASK        0xf
-#define RS_FORMAT(x)          ((x) & RS_FORMAT_MASK)
-#define RS_FORMAT_RB_SWAP     0x10
+#define PE_FORMAT_MASK        0x7f
+#define PE_FORMAT(x)          ((x) & PE_FORMAT_MASK)
+#define PE_FORMAT_RB_SWAP     0x80
 
-#define RS_FORMAT_X8B8G8R8    (RS_FORMAT_X8R8G8B8 | RS_FORMAT_RB_SWAP)
-#define RS_FORMAT_A8B8G8R8    (RS_FORMAT_A8R8G8B8 | RS_FORMAT_RB_SWAP)
+#define PE_FORMAT_X8B8G8R8    (PE_FORMAT_X8R8G8B8 | PE_FORMAT_RB_SWAP)
+#define PE_FORMAT_A8B8G8R8    (PE_FORMAT_A8R8G8B8 | PE_FORMAT_RB_SWAP)
 
 #define TS_SAMPLER_FORMAT_NONE      ETNA_NO_MATCH
 
@@ -67,7 +67,7 @@ struct etna_format {
    [PIPE_FORMAT_##pipe] = {                               \
       .vtx = FE_DATA_TYPE_##vtxfmt, \
       .tex = TEXTURE_FORMAT_##texfmt,                     \
-      .rs = RS_FORMAT_##rsfmt,                            \
+      .pe = PE_FORMAT_##rsfmt,                            \
       .present = 1,                                       \
       .tex_swiz = texswiz,                                \
    }
@@ -77,7 +77,7 @@ struct etna_format {
    [PIPE_FORMAT_##pipe] = {        \
       .vtx = ETNA_NO_MATCH,        \
       .tex = TEXTURE_FORMAT_##fmt, \
-      .rs = RS_FORMAT_##rsfmt,     \
+      .pe = PE_FORMAT_##rsfmt,     \
       .present = 1,                \
       .tex_swiz = swiz,            \
    }
@@ -87,7 +87,7 @@ struct etna_format {
    [PIPE_FORMAT_##pipe] = {                            \
       .vtx = FE_DATA_TYPE_##fmt, \
       .tex = ETNA_NO_MATCH,                            \
-      .rs = RS_FORMAT_##rsfmt,                         \
+      .pe = PE_FORMAT_##rsfmt,                         \
       .present = 1,                                    \
    }
 
@@ -118,7 +118,7 @@ static struct etna_format formats[PIPE_FORMAT_COUNT] = {
 
    _T(L8A8_UNORM, A8L8, SWIZ(X, Y, Z, W), NONE),
 
-   _T(Z16_UNORM,      D16,      SWIZ(X, Y, Z, W), A4R4G4B4),
+   _T(Z16_UNORM,      D16,      SWIZ(X, Y, Z, W), NONE),
    _T(B5G6R5_UNORM,   R5G6B5,   SWIZ(X, Y, Z, W), R5G6B5),
    _T(B5G5R5A1_UNORM, A1R5G5B5, SWIZ(X, Y, Z, W), A1R5G5B5),
    _T(B5G5R5X1_UNORM, X1R5G5B5, SWIZ(X, Y, Z, W), X1R5G5B5),
@@ -176,8 +176,8 @@ static struct etna_format formats[PIPE_FORMAT_COUNT] = {
    V_(R10G10B10A2_USCALED, UNSIGNED_INT_10_10_10_2, NONE),
    V_(R10G10B10A2_SSCALED, INT_10_10_10_2,          NONE),
 
-   _T(X8Z24_UNORM,       D24X8, SWIZ(X, Y, Z, W), A8R8G8B8),
-   _T(S8_UINT_Z24_UNORM, D24X8, SWIZ(X, Y, Z, W), A8R8G8B8),
+   _T(X8Z24_UNORM,       D24X8, SWIZ(X, Y, Z, W), NONE),
+   _T(S8_UINT_Z24_UNORM, D24X8, SWIZ(X, Y, Z, W), NONE),
 
    /* 48-bit */
    V_(R16G16B16_UNORM,   UNSIGNED_SHORT, NONE),
@@ -330,23 +330,23 @@ get_texture_swiz(enum pipe_format fmt, unsigned swizzle_r,
 }
 
 uint32_t
-translate_rs_format(enum pipe_format fmt)
+translate_pe_format(enum pipe_format fmt)
 {
    if (!formats[fmt].present)
       return ETNA_NO_MATCH;
 
-   if (formats[fmt].rs == ETNA_NO_MATCH)
+   if (formats[fmt].pe == ETNA_NO_MATCH)
       return ETNA_NO_MATCH;
 
-   return RS_FORMAT(formats[fmt].rs);
+   return PE_FORMAT(formats[fmt].pe);
 }
 
 int
-translate_rs_format_rb_swap(enum pipe_format fmt)
+translate_pe_format_rb_swap(enum pipe_format fmt)
 {
    assert(formats[fmt].present);
 
-   return formats[fmt].rs & RS_FORMAT_RB_SWAP;
+   return formats[fmt].pe & PE_FORMAT_RB_SWAP;
 }
 
 /* Return type flags for vertex element format */
index 45b15370812b904f2778359679bc20a0ddeb6b16..db3d8b970d1e87816b333b9551e9840f857f6374 100644 (file)
@@ -45,10 +45,10 @@ get_texture_swiz(enum pipe_format fmt, unsigned swizzle_r,
                  unsigned swizzle_g, unsigned swizzle_b, unsigned swizzle_a);
 
 uint32_t
-translate_rs_format(enum pipe_format fmt);
+translate_pe_format(enum pipe_format fmt);
 
 int
-translate_rs_format_rb_swap(enum pipe_format fmt);
+translate_pe_format_rb_swap(enum pipe_format fmt);
 
 uint32_t
 translate_vertex_format_type(enum pipe_format fmt);
index 55ff80dbcd9e68ed574a1e950d2bf77b2c14bc5a..52251150787671d7303fcf48ccdb50377c98a98c 100644 (file)
 
 #include <assert.h>
 
+/* return a RS "compatible" format for use when copying */
+static uint32_t
+etna_compatible_rs_format(enum pipe_format fmt)
+{
+   /* YUYV and UYVY are blocksize 4, but 2 bytes per pixel */
+   if (fmt == PIPE_FORMAT_YUYV || fmt == PIPE_FORMAT_UYVY)
+      return RS_FORMAT_A4R4G4B4;
+
+   switch (util_format_get_blocksize(fmt)) {
+   case 2: return RS_FORMAT_A4R4G4B4;
+   case 4: return RS_FORMAT_A8R8G8B8;
+   default: return ETNA_NO_MATCH;
+   }
+}
+
 void
 etna_compile_rs_state(struct etna_context *ctx, struct compiled_rs_state *cs,
                       const struct rs_state *rs)
@@ -602,18 +617,19 @@ etna_try_rs_blit(struct pipe_context *pctx,
       return false;
    }
 
-   unsigned src_format = blit_info->src.format;
-   unsigned dst_format = blit_info->dst.format;
+   /* Only support same format (used tiling/detiling) blits for now.
+    * TODO: figure out which different-format blits are possible and test them
+    *  - fail if swizzle needed
+    *  - avoid trying to convert between float/int formats?
+    */
+   if (blit_info->src.format != blit_info->dst.format)
+      return false;
 
-   /* for a copy with same dst/src format, we can use a different format */
-   if (translate_rs_format(src_format) == ETNA_NO_MATCH &&
-       src_format == dst_format) {
-      src_format = dst_format = etna_compatible_rs_format(src_format);
-   }
+   uint32_t format = etna_compatible_rs_format(blit_info->dst.format);
+   if (format == ETNA_NO_MATCH)
+      return false;
 
-   if (translate_rs_format(src_format) == ETNA_NO_MATCH ||
-       translate_rs_format(dst_format) == ETNA_NO_MATCH ||
-       blit_info->scissor_enable ||
+   if (blit_info->scissor_enable ||
        blit_info->dst.box.depth != blit_info->src.box.depth ||
        blit_info->dst.box.depth != 1) {
       return false;
@@ -740,7 +756,7 @@ etna_try_rs_blit(struct pipe_context *pctx,
 
    /* Kick off RS here */
    etna_compile_rs_state(ctx, &copy_to_screen, &(struct rs_state) {
-      .source_format = translate_rs_format(src_format),
+      .source_format = format,
       .source_tiling = src->layout,
       .source = src->bo,
       .source_offset = src_offset,
@@ -749,7 +765,7 @@ etna_try_rs_blit(struct pipe_context *pctx,
       .source_padded_height = src_lev->padded_height,
       .source_ts_valid = source_ts_valid,
       .source_ts_compressed = src_lev->ts_compress_fmt >= 0,
-      .dest_format = translate_rs_format(dst_format),
+      .dest_format = format,
       .dest_tiling = dst->layout,
       .dest = dst->bo,
       .dest_offset = dst_offset,
index 7c7d1d32e54a19229428ad72291284ecb9f4eb6e..a7d7ce72205734330bc61f2ed1736613d1a6fcd7 100644 (file)
@@ -431,7 +431,7 @@ etna_screen_is_format_supported(struct pipe_screen *pscreen,
 
    if (usage & PIPE_BIND_RENDER_TARGET) {
       /* if render target, must be RS-supported format */
-      if (translate_rs_format(format) != ETNA_NO_MATCH) {
+      if (translate_pe_format(format) != ETNA_NO_MATCH) {
          /* Validate MSAA; number of samples must be allowed, and render target
           * must have MSAA'able format. */
          if (sample_count > 1) {
index e3c2345cb327158e9844dc57ef7874ee52944633..f5eba1c99437c82129e397e087b0f1442f5b89a2 100644 (file)
@@ -146,7 +146,7 @@ etna_set_framebuffer_state(struct pipe_context *pctx,
       etna_update_render_resource(pctx, etna_resource(cbuf->prsc));
 
       cs->PE_COLOR_FORMAT =
-         VIVS_PE_COLOR_FORMAT_FORMAT(translate_rs_format(cbuf->base.format)) |
+         VIVS_PE_COLOR_FORMAT_FORMAT(translate_pe_format(cbuf->base.format)) |
          VIVS_PE_COLOR_FORMAT_COMPONENTS__MASK |
          VIVS_PE_COLOR_FORMAT_OVERWRITE |
          COND(color_supertiled, VIVS_PE_COLOR_FORMAT_SUPER_TILED) |
index 3c2aa3f79d2df02ae901f5cc30f779cf6e04bf4a..fea7328456e1f08a567c9c51cf1d913a49a6420f 100644 (file)
@@ -234,28 +234,10 @@ translate_texture_filter(unsigned filter)
    }
 }
 
-/* return a RS "compatible" format for use when copying */
-static inline enum pipe_format
-etna_compatible_rs_format(enum pipe_format fmt)
-{
-   /* YUYV and UYVY are blocksize 4, but 2 bytes per pixel */
-   if (fmt == PIPE_FORMAT_YUYV || fmt == PIPE_FORMAT_UYVY)
-      return PIPE_FORMAT_B4G4R4A4_UNORM;
-
-   switch (util_format_get_blocksize(fmt)) {
-   case 2:
-      return PIPE_FORMAT_B4G4R4A4_UNORM;
-   case 4:
-      return PIPE_FORMAT_B8G8R8A8_UNORM;
-   default:
-      return fmt;
-   }
-}
-
 static inline int
 translate_rb_src_dst_swap(enum pipe_format src, enum pipe_format dst)
 {
-   return translate_rs_format_rb_swap(src) ^ translate_rs_format_rb_swap(dst);
+   return translate_pe_format_rb_swap(src) ^ translate_pe_format_rb_swap(dst);
 }
 
 static inline uint32_t