summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ir.cpp13
-rw-r--r--ir.h12
2 files changed, 25 insertions, 0 deletions
diff --git a/ir.cpp b/ir.cpp
index c5eb94d2d5..f7e03cb58d 100644
--- a/ir.cpp
+++ b/ir.cpp
@@ -227,6 +227,19 @@ ir_constant::ir_constant(bool b)
this->value.b[0] = b;
}
+ir_constant::ir_constant(const ir_constant *c, unsigned i)
+{
+ this->type = c->type->get_base_type();
+
+ switch (this->type->base_type) {
+ case GLSL_TYPE_UINT: this->value.u[0] = c->value.u[i]; break;
+ case GLSL_TYPE_INT: this->value.i[0] = c->value.i[i]; break;
+ case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
+ case GLSL_TYPE_BOOL: this->value.b[0] = c->value.b[i]; break;
+ default: assert(!"Should not get here."); break;
+ }
+}
+
ir_dereference_variable::ir_dereference_variable(ir_variable *var)
{
diff --git a/ir.h b/ir.h
index ea4f549468..102f2f3727 100644
--- a/ir.h
+++ b/ir.h
@@ -1026,6 +1026,18 @@ public:
ir_constant(int i);
ir_constant(float f);
+ /**
+ * Construct an ir_constant from a scalar component of another ir_constant
+ *
+ * The new \c ir_constant inherits the type of the component from the
+ * source constant.
+ *
+ * \note
+ * In the case of a matrix constant, the new constant is a scalar, \b not
+ * a vector.
+ */
+ ir_constant(const ir_constant *c, unsigned i);
+
virtual ir_constant *as_constant()
{
return this;