summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Gmeiner <[email protected]>2017-03-21 20:00:31 +0100
committerChristian Gmeiner <[email protected]>2017-04-05 19:58:22 +0200
commit7f62ffb68ad1002b6ce7727ce7202de792d53653 (patch)
treef7d70f5199ca3dfcf73974b12a2925918cc6b9fe
parent8d9a31ef9726192ff8e97f36bc05bb15c037ed27 (diff)
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 <[email protected]>
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_compiler.c17
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c8
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_context.c7
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_shader.h6
4 files changed, 38 insertions, 0 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.c b/src/gallium/drivers/etnaviv/etnaviv_compiler.c
index ce8a651982a..eafb511bb81 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 1fea2d1a48b..bdaa78efe17 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 d6734401029..555aa127651 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 e56f1fa9f53..121d5815ba0 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;
};