From 7f62ffb68ad1002b6ce7727ce7202de792d53653 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Tue, 21 Mar 2017 20:00:31 +0100 Subject: [PATCH] etnaviv: add support for rb swap 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 --- 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 e56f1fa..121d581 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.7.4