[Mesa-dev] [PATCH 1/8] glsl: Group all of the constant_referenced functions together
Connor Abbott
cwabbott0 at gmail.com
Wed Mar 12 16:11:45 PDT 2014
On Wed, Mar 12, 2014 at 6:49 PM, Ian Romanick <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
> src/glsl/ir_clone.cpp | 10 +-
> src/glsl/ir_constant_expression.cpp | 195 +++++++++++++++++++-----------------
> 2 files changed, 109 insertions(+), 96 deletions(-)
>
> diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
> index 311c992..167b80c 100644
> --- a/src/glsl/ir_clone.cpp
> +++ b/src/glsl/ir_clone.cpp
> @@ -265,10 +265,12 @@ ir_assignment::clone(void *mem_ctx, struct hash_table *ht) const
> if (this->condition)
> new_condition = this->condition->clone(mem_ctx, ht);
>
> - return new(mem_ctx) ir_assignment(this->lhs->clone(mem_ctx, ht),
> - this->rhs->clone(mem_ctx, ht),
> - new_condition,
> - this->write_mask);
> + ir_assignment *cloned =
> + new(mem_ctx) ir_assignment(this->lhs->clone(mem_ctx, ht),
> + this->rhs->clone(mem_ctx, ht),
> + new_condition);
> + cloned->write_mask = this->write_mask;
> + return cloned;
Looks like this is leftover from something else...
> }
>
> ir_function *
> diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp
> index 7fa5a09..a31e579 100644
> --- a/src/glsl/ir_constant_expression.cpp
> +++ b/src/glsl/ir_constant_expression.cpp
> @@ -386,6 +386,109 @@ unpack_half_1x16(uint16_t u)
> return _mesa_half_to_float(u);
> }
>
> +/**
> + * \name Functions to get the constant referenced by an r-value
> + *
> + * Get the constant that is ultimately referenced by an r-value, in a constant
> + * expression evaluation context.
> + *
> + * The offset is used when the reference is to a specific column of a matrix.
> + */
> +/*@{*/
> +void
> +ir_dereference_variable::constant_referenced(struct hash_table *variable_context,
> + ir_constant *&store, int &offset) const
> +{
> + if (variable_context) {
> + store = (ir_constant *)hash_table_find(variable_context, var);
> + offset = 0;
> + } else {
> + store = NULL;
> + offset = 0;
> + }
> +}
> +
> +void
> +ir_dereference_array::constant_referenced(struct hash_table *variable_context,
> + ir_constant *&store, int &offset) const
> +{
> + ir_constant *index_c = array_index->constant_expression_value(variable_context);
> +
> + if (!index_c || !index_c->type->is_scalar() || !index_c->type->is_integer()) {
> + store = 0;
> + offset = 0;
> + return;
> + }
> +
> + int index = index_c->type->base_type == GLSL_TYPE_INT ?
> + index_c->get_int_component(0) :
> + index_c->get_uint_component(0);
> +
> + ir_constant *substore;
> + int suboffset;
> + const ir_dereference *deref = array->as_dereference();
> + if (!deref) {
> + store = 0;
> + offset = 0;
> + return;
> + }
> +
> + deref->constant_referenced(variable_context, substore, suboffset);
> +
> + if (!substore) {
> + store = 0;
> + offset = 0;
> + return;
> + }
> +
> + const glsl_type *vt = array->type;
> + if (vt->is_array()) {
> + store = substore->get_array_element(index);
> + offset = 0;
> + return;
> + }
> + if (vt->is_matrix()) {
> + store = substore;
> + offset = index * vt->vector_elements;
> + return;
> + }
> + if (vt->is_vector()) {
> + store = substore;
> + offset = suboffset + index;
> + return;
> + }
> +
> + store = 0;
> + offset = 0;
> +}
> +
> +void
> +ir_dereference_record::constant_referenced(struct hash_table *variable_context,
> + ir_constant *&store, int &offset) const
> +{
> + ir_constant *substore;
> + int suboffset;
> + const ir_dereference *deref = record->as_dereference();
> + if (!deref) {
> + store = 0;
> + offset = 0;
> + return;
> + }
> +
> + deref->constant_referenced(variable_context, substore, suboffset);
> +
> + if (!substore) {
> + store = 0;
> + offset = 0;
> + return;
> + }
> +
> + store = substore->get_record_field(field);
> + offset = 0;
> +}
> +/*@}*/
> +
> +
> ir_constant *
> ir_rvalue::constant_expression_value(struct hash_table *variable_context)
> {
> @@ -1570,19 +1673,6 @@ ir_swizzle::constant_expression_value(struct hash_table *variable_context)
> }
>
>
> -void
> -ir_dereference_variable::constant_referenced(struct hash_table *variable_context,
> - ir_constant *&store, int &offset) const
> -{
> - if (variable_context) {
> - store = (ir_constant *)hash_table_find(variable_context, var);
> - offset = 0;
> - } else {
> - store = NULL;
> - offset = 0;
> - }
> -}
> -
> ir_constant *
> ir_dereference_variable::constant_expression_value(struct hash_table *variable_context)
> {
> @@ -1610,60 +1700,6 @@ ir_dereference_variable::constant_expression_value(struct hash_table *variable_c
> }
>
>
> -void
> -ir_dereference_array::constant_referenced(struct hash_table *variable_context,
> - ir_constant *&store, int &offset) const
> -{
> - ir_constant *index_c = array_index->constant_expression_value(variable_context);
> -
> - if (!index_c || !index_c->type->is_scalar() || !index_c->type->is_integer()) {
> - store = 0;
> - offset = 0;
> - return;
> - }
> -
> - int index = index_c->type->base_type == GLSL_TYPE_INT ?
> - index_c->get_int_component(0) :
> - index_c->get_uint_component(0);
> -
> - ir_constant *substore;
> - int suboffset;
> - const ir_dereference *deref = array->as_dereference();
> - if (!deref) {
> - store = 0;
> - offset = 0;
> - return;
> - }
> -
> - deref->constant_referenced(variable_context, substore, suboffset);
> -
> - if (!substore) {
> - store = 0;
> - offset = 0;
> - return;
> - }
> -
> - const glsl_type *vt = array->type;
> - if (vt->is_array()) {
> - store = substore->get_array_element(index);
> - offset = 0;
> - return;
> - }
> - if (vt->is_matrix()) {
> - store = substore;
> - offset = index * vt->vector_elements;
> - return;
> - }
> - if (vt->is_vector()) {
> - store = substore;
> - offset = suboffset + index;
> - return;
> - }
> -
> - store = 0;
> - offset = 0;
> -}
> -
> ir_constant *
> ir_dereference_array::constant_expression_value(struct hash_table *variable_context)
> {
> @@ -1719,31 +1755,6 @@ ir_dereference_array::constant_expression_value(struct hash_table *variable_cont
> }
>
>
> -void
> -ir_dereference_record::constant_referenced(struct hash_table *variable_context,
> - ir_constant *&store, int &offset) const
> -{
> - ir_constant *substore;
> - int suboffset;
> - const ir_dereference *deref = record->as_dereference();
> - if (!deref) {
> - store = 0;
> - offset = 0;
> - return;
> - }
> -
> - deref->constant_referenced(variable_context, substore, suboffset);
> -
> - if (!substore) {
> - store = 0;
> - offset = 0;
> - return;
> - }
> -
> - store = substore->get_record_field(field);
> - offset = 0;
> -}
> -
> ir_constant *
> ir_dereference_record::constant_expression_value(struct hash_table *variable_context)
> {
> --
> 1.8.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list