diff options
author | Ian Romanick <[email protected]> | 2016-07-12 16:42:57 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2016-08-30 16:28:03 -0700 |
commit | f3fcfe001f8e6d3abaa62eb73ab95d0ba88b628d (patch) | |
tree | 6b61c10b629add23463317437323b2e254ae1fb2 /src/compiler/glsl/ir_expression_operation.py | |
parent | 2761190baa7c0b99dfe29366dd6a88449bd6d5bb (diff) |
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 <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
Acked-by: Dylan Baker <[email protected]>
Diffstat (limited to 'src/compiler/glsl/ir_expression_operation.py')
-rw-r--r-- | src/compiler/glsl/ir_expression_operation.py | 24 |
1 files changed, 23 insertions, 1 deletions
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)), |