[PATCH 10/11] etnaviv: add support for rb swap

Christian Gmeiner christian.gmeiner at gmail.com
Sun Mar 26 14:13:14 UTC 2017


If we render to rb swapped format we will create a shader variant doing
the involved swizzing in the pixel shader.

Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
---
 src/gallium/drivers/etnaviv/etnaviv_compiler.c         | 17 +++++++++++++++++
 src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c |  8 ++++++++
 src/gallium/drivers/etnaviv/etnaviv_context.c          |  7 +++++++
 src/gallium/drivers/etnaviv/etnaviv_shader.h           |  6 ++++++
 4 files changed, 38 insertions(+)

diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.c b/src/gallium/drivers/etnaviv/etnaviv_compiler.c
index ce8a651..eafb511 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_compiler.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.c
@@ -1910,6 +1910,22 @@ etna_compile_add_z_div_if_needed(struct etna_compile *c)
    }
 }
 
+static void
+etna_compile_frag_rb_swap(struct etna_compile *c)
+{
+   if (c->info.processor == PIPE_SHADER_FRAGMENT && c->key->frag_rb_swap) {
+      /* find color out */
+      struct etna_reg_desc *color_reg =
+         find_decl_by_semantic(c, TGSI_FILE_OUTPUT, TGSI_SEMANTIC_COLOR, 0);
+
+      emit_inst(c, &(struct etna_inst) {
+         .opcode = INST_OPCODE_MOV,
+         .dst = etna_native_to_dst(color_reg->native, INST_COMPS_X | INST_COMPS_Y | INST_COMPS_Z | INST_COMPS_W),
+         .src[2] = etna_native_to_src(color_reg->native, SWIZZLE(Z, Y, X, W)),
+      });
+   }
+}
+
 /** add a NOP to the shader if
  * a) the shader is empty
  * or
@@ -2412,6 +2428,7 @@ etna_compile_shader(struct etna_shader_variant *v)
    /* pass 3: generate instructions */
    etna_compile_pass_generate_code(c);
    etna_compile_add_z_div_if_needed(c);
+   etna_compile_frag_rb_swap(c);
    etna_compile_add_nop_if_needed(c);
    etna_compile_fill_in_labels(c);
 
diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c b/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c
index 1fea2d1..bdaa78e 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c
@@ -91,6 +91,7 @@ print_usage(void)
 {
    printf("Usage: etnaviv_compiler [OPTIONS]... FILE\n");
    printf("    --verbose         - verbose compiler/debug messages\n");
+   printf("    --frag-rb-swap    - swap rb in color output (FRAG)\n");
    printf("    --help            - show this message\n");
 }
 
@@ -121,6 +122,13 @@ main(int argc, char **argv)
          continue;
       }
 
+      if (!strcmp(argv[n], "--frag-rb-swap")) {
+         debug_printf(" %s", argv[n]);
+         key.frag_rb_swap = true;
+         n++;
+         continue;
+      }
+
       if (!strcmp(argv[n], "--help")) {
          print_usage();
          return 0;
diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c
index d673440..555aa12 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_context.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_context.c
@@ -184,6 +184,13 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
    }
 
    struct etna_shader_key key = {};
+   struct etna_surface *cbuf = etna_surface(pfb->cbufs[0]);
+
+   if (cbuf) {
+      struct etna_resource *res = etna_resource(cbuf->base.texture);
+
+      key.frag_rb_swap = !!translate_rs_format_rb_swap(res->base.format);
+   }
 
    if (!etna_get_vs(ctx, key) || !etna_get_fs(ctx, key)) {
       BUG("compiled shaders are not okay");
diff --git a/src/gallium/drivers/etnaviv/etnaviv_shader.h b/src/gallium/drivers/etnaviv/etnaviv_shader.h
index b0d97a7..2b8618f 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_shader.h
+++ b/src/gallium/drivers/etnaviv/etnaviv_shader.h
@@ -36,6 +36,12 @@ struct etna_shader_key
 {
    union {
       struct {
+         /*
+          * Combined Vertex/Fragment shader parameters:
+          */
+
+         /* do we need to swap rb in frag color? */
+         unsigned frag_rb_swap : 1;
       };
       uint32_t global;
    };
-- 
2.9.3



More information about the etnaviv mailing list