From 7f1ab834d7aa901ce0e12f40db23d7d9891eae59 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Wed, 9 Jun 2010 17:11:50 -0700 Subject: [PATCH] ir_constant: Add storage for multiple constants for arrays and records --- ir.cpp | 20 ++++++++++++++++++-- ir.h | 2 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/ir.cpp b/ir.cpp index 759bf9f804a..b60d1b468aa 100644 --- a/ir.cpp +++ b/ir.cpp @@ -244,8 +244,24 @@ ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list) { this->type = type; - /* FINISHME: Support structure and array types. */ - assert(type->is_scalar() || type->is_vector() || type->is_matrix()); + /* FINISHME: Support array types. */ + assert(type->is_scalar() || type->is_vector() || type->is_matrix() + || type->is_record()); + + /* If the constant is a record, the types of each of the entries in + * value_list must be a 1-for-1 match with the structure components. Each + * entry must also be a constant. Just move the nodes from the value_list + * to the list in the ir_constant. + */ + /* FINISHME: Should there be some type checking and / or assertions here? */ + /* FINISHME: Should the new constant take ownership of the nodes from + * FINISHME: value_list, or should it make copies? + */ + if (type->is_record()) { + value_list->move_nodes_to(& this->components); + return; + } + ir_constant *value = (ir_constant *) (value_list->head); diff --git a/ir.h b/ir.h index 60164a5ab1c..8fd823db09c 100644 --- a/ir.h +++ b/ir.h @@ -1087,6 +1087,8 @@ public: float f[16]; bool b[16]; } value; + + exec_list components; }; void -- 2.30.2