summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVasily Khoruzhick <[email protected]>2019-08-29 21:28:36 -0700
committerVasily Khoruzhick <[email protected]>2019-09-06 01:51:28 +0000
commit517b60dc13f1d3fcffee2564b7ad7aed34b83068 (patch)
treedce5f59c2be1d02a01417f95dc38417d5f8cbac3
parent9367d2ca37a3b8108ecb74e2875a600b5543c163 (diff)
lima/ppir: don't lower vector {b,f}csel to scalar if condition is scalar
Utgard PP has vector fcsel operation, but its condition is scalar. Add filtering callback that checks whether {b,f}csel condition is not scalar to lower {b,f}csel to scalar only in this case. Reviewed-by: Qiang Yu <[email protected]> Reviewed-by: Eric Anholt <[email protected]> Signed-off-by: Vasily Khoruzhick <[email protected]>
-rw-r--r--src/gallium/drivers/lima/lima_program.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/gallium/drivers/lima/lima_program.c b/src/gallium/drivers/lima/lima_program.c
index c0683b88600..4bfcd7e87dc 100644
--- a/src/gallium/drivers/lima/lima_program.c
+++ b/src/gallium/drivers/lima/lima_program.c
@@ -160,16 +160,32 @@ lima_alu_to_scalar_filter_cb(const nir_instr *instr, const void *data)
case nir_op_fsqrt:
case nir_op_fsin:
case nir_op_fcos:
- /* nir vec4 fcsel assumes that each component of the condition will be
- * used to select the same component from the two options, but lima
- * can't implement that since we only have 1 component condition */
- case nir_op_fcsel:
- case nir_op_bcsel:
return true;
default:
break;
}
+ /* nir vec4 fcsel assumes that each component of the condition will be
+ * used to select the same component from the two options, but Utgard PP
+ * has only 1 component condition. If all condition components are not the
+ * same we need to lower it to scalar.
+ */
+ switch (alu->op) {
+ case nir_op_bcsel:
+ case nir_op_fcsel:
+ break;
+ default:
+ return false;
+ }
+
+ int num_components = nir_dest_num_components(alu->dest.dest);
+
+ uint8_t swizzle = alu->src[0].swizzle[0];
+
+ for (int i = 1; i < num_components; i++)
+ if (alu->src[0].swizzle[i] != swizzle)
+ return true;
+
return false;
}