etnaviv: add support for rb swap
authorChristian Gmeiner <christian.gmeiner@gmail.com>
Tue, 21 Mar 2017 19:00:31 +0000 (20:00 +0100)
committerChristian Gmeiner <christian.gmeiner@gmail.com>
Wed, 5 Apr 2017 17:58:22 +0000 (19:58 +0200)
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@gmail.com>
src/gallium/drivers/etnaviv/etnaviv_compiler.c
src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c
src/gallium/drivers/etnaviv/etnaviv_context.c
src/gallium/drivers/etnaviv/etnaviv_shader.h

index ce8a651982a47d51961fff35a20c57f8aef50d9c..eafb511bb81364c97bd9a05e6856c7644a9c0613 100644 (file)
@@ -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);
 
index 1fea2d1a48b20ae4b446b48a17994116be1be039..bdaa78efe178de9957f7381cd2637d9760c6f161 100644 (file)
@@ -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;
index d67344010295f3a42d8e86328d8c219b0932b517..555aa12765180d3b5223ba559b397b733b7d690a 100644 (file)
@@ -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");
index e56f1fa9f534369b5afe71368b675c3fa3fb0dc0..121d5815ba0b751409b4141381982ca8a9e8ef29 100644 (file)
@@ -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;
    };