From: Ian Romanick Date: Tue, 12 Jul 2016 23:42:57 +0000 (-0700) Subject: glsl: Generate code for constant ir_triop_csel expressions X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f3fcfe001f8e6d3abaa62eb73ab95d0ba88b628d;p=mesa.git glsl: Generate code for constant ir_triop_csel expressions v2: 'for (a, b) in d' => 'for a, b in d'. Suggested by Dylan. Signed-off-by: Ian Romanick Reviewed-by: Matt Turner Acked-by: Dylan Baker --- diff --git a/src/compiler/glsl/ir_expression_operation.py b/src/compiler/glsl/ir_expression_operation.py index 0bca59c7ecc..4d799003c95 100644 --- a/src/compiler/glsl/ir_expression_operation.py +++ b/src/compiler/glsl/ir_expression_operation.py @@ -357,6 +357,24 @@ constant_template_lrp = mako.template.Template("""\ break; }""") +# This template is for ir_triop_csel. This expression is really unique +# because not all of the operands are the same type, and the second operand +# determines the type of the expression (instead of the first). +constant_template_csel = mako.template.Template("""\ + case ${op.get_enum_name()}: + for (unsigned c = 0; c < components; c++) { + switch (this->type->base_type) { + % for dst_type, src_types in op.signatures(): + case ${src_types[1].glsl_type}: + data.${dst_type.union_field}[c] = ${op.get_c_expression(src_types)}; + break; + % endfor + default: + assert(0); + } + } + break;""") + vector_scalar_operation = "vector-scalar" horizontal_operation = "horizontal" @@ -443,6 +461,8 @@ class operation(object): return constant_template_vector_insert.render(op=self) elif self.name == "lrp": return constant_template_lrp.render(op=self) + elif self.name == "csel": + return constant_template_csel.render(op=self) else: return constant_template3.render(op=self) elif self.num_operands == 4: @@ -700,7 +720,9 @@ ir_expression_operation = [ # component on vectors). # # See also lower_instructions_visitor::ldexp_to_arith - operation("csel", 3), + operation("csel", 3, + all_signatures=zip(all_types, zip(len(all_types) * (bool_type,), all_types, all_types)), + c_expression="{src0} ? {src1} : {src2}"), operation("bitfield_extract", 3, all_signatures=((int_type, (uint_type, int_type, int_type)),