diff options
author | Ian Romanick <[email protected]> | 2016-07-12 16:02:02 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2016-08-30 16:28:02 -0700 |
commit | 4d8ac28b20858faf612983f1652538380f9bd211 (patch) | |
tree | a43f0e9245233bee4a1c6819ca8f1efd5e6a835c | |
parent | 9f1d7c52354d7ffbd58467bb4a91b9c9ffd31785 (diff) |
glsl: Generate code for constant ir_triop_vector_insert 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]>
-rw-r--r-- | src/compiler/glsl/ir_expression_operation.py | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/compiler/glsl/ir_expression_operation.py b/src/compiler/glsl/ir_expression_operation.py index b2bdb45cf34..ec58fd3ff6a 100644 --- a/src/compiler/glsl/ir_expression_operation.py +++ b/src/compiler/glsl/ir_expression_operation.py @@ -288,6 +288,26 @@ constant_template_vector_extract = mako.template.Template("""\ break; }""") +# This template is for ir_triop_vector_insert. +constant_template_vector_insert = mako.template.Template("""\ + case ${op.get_enum_name()}: { + const unsigned idx = op[2]->value.u[0]; + + memcpy(&data, &op[0]->value, sizeof(data)); + + switch (this->type->base_type) { + % for dst_type, src_types in op.signatures(): + case ${src_types[0].glsl_type}: + data.${dst_type.union_field}[idx] = op[1]->value.${src_types[0].union_field}[0]; + break; + % endfor + default: + assert(!"Should not get here."); + break; + } + break; + }""") + vector_scalar_operation = "vector-scalar" horizontal_operation = "horizontal" @@ -370,7 +390,10 @@ class operation(object): else: return constant_template3.render(op=self) elif self.num_operands == 3: - return constant_template3.render(op=self) + if self.name == "vector_insert": + return constant_template_vector_insert.render(op=self) + else: + return constant_template3.render(op=self) return None @@ -632,7 +655,7 @@ ir_expression_operation = [ # operand0 is the vector # operand1 is the value to write into the vector result # operand2 is the index in operand0 to be modified - operation("vector_insert", 3), + operation("vector_insert", 3, source_types=all_types, c_expression="anything-except-None"), operation("bitfield_insert", 4), |