etnaviv: Add support for DP2 instruction
authorWladimir J. van der Laan <laanwj@gmail.com>
Sun, 1 Oct 2017 09:21:20 +0000 (11:21 +0200)
committerChristian Gmeiner <christian.gmeiner@gmail.com>
Tue, 3 Oct 2017 17:49:47 +0000 (19:49 +0200)
A two-component dot product instruction is supported with HALTI2, use it
on hardware that supports it.

Signed-off-by: Wladimir J. van der Laan <laanwj@gmail.com>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
src/gallium/drivers/etnaviv/etnaviv_compiler.c
src/gallium/drivers/etnaviv/etnaviv_disasm.c
src/gallium/drivers/etnaviv/etnaviv_internal.h
src/gallium/drivers/etnaviv/etnaviv_screen.c

index c4ca80fe190cd36d80853c69326c505ff5500a88..2bca2dda70c1ee4cec8782ace853e9d45c558049 100644 (file)
@@ -1752,6 +1752,7 @@ static const struct instr_translater translaters[TGSI_OPCODE_LAST] = {
    INSTR(RSQ, trans_instr, .opc = INST_OPCODE_RSQ, .src = {2, -1, -1}),
    INSTR(MUL, trans_instr, .opc = INST_OPCODE_MUL, .src = {0, 1, -1}),
    INSTR(ADD, trans_instr, .opc = INST_OPCODE_ADD, .src = {0, 2, -1}),
+   INSTR(DP2, trans_instr, .opc = INST_OPCODE_DP2, .src = {0, 1, -1}),
    INSTR(DP3, trans_instr, .opc = INST_OPCODE_DP3, .src = {0, 1, -1}),
    INSTR(DP4, trans_instr, .opc = INST_OPCODE_DP4, .src = {0, 1, -1}),
    INSTR(DST, trans_instr, .opc = INST_OPCODE_DST, .src = {0, 1, -1}),
@@ -2293,7 +2294,7 @@ etna_compile_shader(struct etna_shader_variant *v)
       .lower_POW = true,
       .lower_EXP = true,
       .lower_LOG = true,
-      .lower_DP2 = true,
+      .lower_DP2 = !specs->has_halti2_instructions,
       .lower_TRUNC = true,
    };
 
index 918d24eb46e98196a2942941143c7d536871da45..9ae99daf6df5cde19512e91c85130214102e8bb6 100644 (file)
@@ -513,6 +513,7 @@ static const struct opc_info {
    OPC(AND),
    OPC(XOR),
    OPC(NOT),
+   OPC(DP2),
 };
 
 static void
index a6544f62199e53c0d0eb27b7ae89e18b7147e83d..896bbf5654743903b2c1e6aa6983afc281ee4315 100644 (file)
@@ -72,6 +72,8 @@ struct etna_specs {
    unsigned has_shader_range_registers : 1;
    /* has the new sin/cos/log functions */
    unsigned has_new_transcendentals : 1;
+   /* has the new dp2/dpX_norm instructions, among others */
+   unsigned has_halti2_instructions : 1;
    /* supports single-buffer rendering with multiple pixel pipes */
    unsigned single_buffer : 1;
    /* has unified uniforms memory */
index 42905ab06206b298e84a0bc3c2203dbd0d82c6db..ffc23c77726dc5e59f50dfdb2a9528291aad5a58 100644 (file)
@@ -700,6 +700,8 @@ etna_get_specs(struct etna_screen *screen)
       VIV_FEATURE(screen, chipMinorFeatures1, NON_POWER_OF_TWO);
    screen->specs.has_new_transcendentals =
       VIV_FEATURE(screen, chipMinorFeatures3, HAS_FAST_TRANSCENDENTALS);
+   screen->specs.has_halti2_instructions =
+      VIV_FEATURE(screen, chipMinorFeatures4, HALTI2);
 
    if (VIV_FEATURE(screen, chipMinorFeatures3, INSTRUCTION_CACHE)) {
       /* GC3000 - this core is capable of loading shaders from