[Mesa-dev] [PATCH 4/7] nir: add couple array length fields

Jason Ekstrand jason at jlekstrand.net
Mon Oct 26 11:57:04 PDT 2015


On Mon, Oct 26, 2015 at 11:06 AM, Rob Clark <robdclark at gmail.com> wrote:
> On Mon, Oct 26, 2015 at 1:52 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
>> On Sat, Oct 24, 2015 at 10:07 AM, Rob Clark <robdclark at gmail.com> wrote:
>>> From: Rob Clark <robclark at freedesktop.org>
>>>
>>> This will simplify things somewhat in clone.
>>>
>>> Signed-off-by: Rob Clark <robclark at freedesktop.org>
>>> ---
>>>  src/glsl/nir/glsl_to_nir.cpp |  6 ++++++
>>>  src/glsl/nir/nir.h           | 11 +++++++++++
>>>  2 files changed, 17 insertions(+)
>>>
>>> diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp
>>> index 9b50a93..8f83012 100644
>>> --- a/src/glsl/nir/glsl_to_nir.cpp
>>> +++ b/src/glsl/nir/glsl_to_nir.cpp
>>> @@ -238,6 +238,8 @@ constant_copy(ir_constant *ir, void *mem_ctx)
>>>
>>>     unsigned total_elems = ir->type->components();
>>>     unsigned i;
>>> +
>>> +   ret->num_elements = 0;
>>>     switch (ir->type->base_type) {
>>>     case GLSL_TYPE_UINT:
>>>        for (i = 0; i < total_elems; i++)
>>> @@ -262,6 +264,8 @@ constant_copy(ir_constant *ir, void *mem_ctx)
>>>     case GLSL_TYPE_STRUCT:
>>>        ret->elements = ralloc_array(mem_ctx, nir_constant *,
>>>                                     ir->type->length);
>>> +      ret->num_elements = ir->type->length;
>>> +
>>>        i = 0;
>>>        foreach_in_list(ir_constant, field, &ir->components) {
>>>           ret->elements[i] = constant_copy(field, mem_ctx);
>>> @@ -272,6 +276,7 @@ constant_copy(ir_constant *ir, void *mem_ctx)
>>>     case GLSL_TYPE_ARRAY:
>>>        ret->elements = ralloc_array(mem_ctx, nir_constant *,
>>>                                     ir->type->length);
>>> +      ret->num_elements = ir->type->length;
>>>
>>>        for (i = 0; i < ir->type->length; i++)
>>>           ret->elements[i] = constant_copy(ir->array_elements[i], mem_ctx);
>>> @@ -293,6 +298,7 @@ nir_visitor::visit(ir_variable *ir)
>>>
>>>     if (ir->is_interface_instance() && ir->get_max_ifc_array_access() != NULL) {
>>>        unsigned size = ir->get_interface_type()->length;
>>> +      var->num_max_ifc_array_access = size;
>>>        var->max_ifc_array_access = ralloc_array(var, unsigned, size);
>>>        memcpy(var->max_ifc_array_access, ir->get_max_ifc_array_access(),
>>>               size * sizeof(unsigned));
>>> diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
>>> index a09c2a6..2d9c94c 100644
>>> --- a/src/glsl/nir/nir.h
>>> +++ b/src/glsl/nir/nir.h
>>> @@ -112,6 +112,11 @@ typedef struct nir_constant {
>>>      */
>>>     union nir_constant_data value;
>>>
>>> +   /* we could get this from the var->type but makes clone *much* easier to
>>> +    * not have to care about the type.
>>> +    */
>>> +   unsigned num_elements;
>>> +
>>>     /* Array elements / Structure Fields */
>>>     struct nir_constant **elements;
>>>  } nir_constant;
>>> @@ -148,6 +153,12 @@ typedef struct {
>>>      */
>>>     char *name;
>>>
>>> +   /* we could figure this out from interface_type but it isn't exposed
>>> +    * cleanly outside of c++ and just having the length here simplifies
>>> +    * clone:
>>> +    */
>>> +   unsigned num_max_ifc_array_access;
>>
>> Can we just get rid of max_ifc_array_access instead?  It's something
>> that GLSL uses for some optimizations somewhere but NIR has never made
>> any use of it whatsoever and none of the backends care.  The only
>> reason it's here is because Connor copied and pasted ir_variable into
>> NIR variable.
>
> I only kept it because I assumed at some point someone would want it
> (ie. porting opt's done in IR over to NIR, etc).  But no problem for
> me to drop it.

That's a really bad reason to keep dead code... We'll add something
back in if/when we need it.

> BR,
> -R
>
>> --Jason
>>
>>> +
>>>     /**
>>>      * For variables which satisfy the is_interface_instance() predicate, this
>>>      * points to an array of integers such that if the ith member of the
>>> --
>>> 2.5.0
>>>


More information about the mesa-dev mailing list