diff options
-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), |