qetnaviv: nir: use new immediates when possible
authorJonathan Marek <jonathan@marek.ca>
Thu, 12 Sep 2019 20:07:14 +0000 (16:07 -0400)
committerJonathan Marek <jonathan@marek.ca>
Sat, 28 Sep 2019 04:33:42 +0000 (00:33 -0400)
Note it can still be improved a bit:
* Use alu swizzle to determine if src is scalar
* Take into account new immediates in the multiple uniform src lowering

Signed-off-by: Jonathan Marek <jonathan@marek.ca>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
src/gallium/drivers/etnaviv/etnaviv_compiler_nir_emit.h

index 20e6bb2d26c773fbea78c08de20aa11acb3c3275..b58ecd721b239651f33d6cff60387d81f0c4e6b2 100644 (file)
@@ -75,7 +75,9 @@ struct state {
 static inline hw_src
 src_swizzle(hw_src src, unsigned swizzle)
 {
-   src.swiz = inst_swiz_compose(src.swiz, swizzle);
+   if (src.rgroup != INST_RGROUP_IMMEDIATE)
+      src.swiz = inst_swiz_compose(src.swiz, swizzle);
+
    return src;
 }
 
@@ -114,6 +116,24 @@ const_add(uint64_t *c, uint64_t value)
 static hw_src
 const_src(struct state *state, nir_const_value *value, unsigned num_components)
 {
+   /* use inline immediates if possible */
+   if (state->c->specs->halti >= 2 && num_components == 1 &&
+       value[0].u64 >> 32 == ETNA_IMMEDIATE_CONSTANT) {
+      uint32_t bits = value[0].u32;
+
+      /* "float" - shifted by 12 */
+      if ((bits & 0xfff) == 0)
+         return etna_immediate_src(0, bits >> 12);
+
+      /* "unsigned" - raw 20 bit value */
+      if (bits < (1 << 20))
+         return etna_immediate_src(2, bits);
+
+      /* "signed" - sign extended 20-bit (sign included) value */
+      if (bits >= 0xfff80000)
+         return etna_immediate_src(1, bits);
+   }
+
    unsigned i;
    int swiz = -1;
    for (i = 0; swiz < 0; i++) {