From: Vasily Khoruzhick Date: Fri, 30 Aug 2019 04:28:36 +0000 (-0700) Subject: lima/ppir: don't lower vector {b,f}csel to scalar if condition is scalar X-Git-Tag: upstream/19.3.0~2195 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=517b60dc13f1d3fcffee2564b7ad7aed34b83068;p=platform%2Fupstream%2Fmesa.git 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 Reviewed-by: Eric Anholt Signed-off-by: Vasily Khoruzhick --- diff --git a/src/gallium/drivers/lima/lima_program.c b/src/gallium/drivers/lima/lima_program.c index c0683b8..4bfcd7e 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; }