[Mesa-dev] [PATCH 02/11] nir: add array length field

Jason Ekstrand jason at jlekstrand.net
Sat Nov 14 11:45:01 PST 2015


On Sat, Nov 14, 2015 at 9:30 AM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> On Sat, Nov 14, 2015 at 9:25 AM, Connor Abbott <cwabbott0 at gmail.com> wrote:
>> On Sat, Nov 14, 2015 at 11:55 AM, Rob Clark <robdclark at gmail.com> wrote:
>>> well, clone just needs to know the number of elements, so this is the
>>> simplest possible solution.. not against tracking the type as well, if
>>> that is needed elsewhere.. or if there was a helper to map type to #
>>> of elements, I suppose, but for now this makes clone possible.
>>
>> glsl_get_array_length() will do the right thing for everything except
>> matrices and vectors/scalars, so it should be possible to get the
>> number of elements in only a few lines.
>
> Actually, it works for matrices too so it should "just work"
> --Jason

Here's what it looks like if we use a type instead:

http://cgit.freedesktop.org/~jekstrand/mesa/commit/?h=wip/i965-nir-variants&id=508f58cedb130a3726ec2c1c7ed892cce2bfd08d

I kicked it off to CI but I'm pretty sure that's sufficient.
--Jason

>>>
>>> BR,
>>> -R
>>>
>>> On Sat, Nov 14, 2015 at 11:19 AM, Connor Abbott <cwabbott0 at gmail.com> wrote:
>>>> I think it would be better if we kept track of the type of the
>>>> constant instead. That would also allow us to simplify the constant
>>>> construction code in, err, something else...
>>>>
>>>> On Wed, Nov 11, 2015 at 8:23 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
>>>>> From: Rob Clark <robclark at freedesktop.org>
>>>>>
>>>>> This will simplify things somewhat in clone.
>>>>>
>>>>> Signed-off-by: Rob Clark <robclark at freedesktop.org>
>>>>> Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>
>>>>> ---
>>>>>  src/glsl/nir/glsl_to_nir.cpp | 5 +++++
>>>>>  src/glsl/nir/nir.h           | 5 +++++
>>>>>  2 files changed, 10 insertions(+)
>>>>>
>>>>> diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp
>>>>> index 8e53e22..13fa987 100644
>>>>> --- a/src/glsl/nir/glsl_to_nir.cpp
>>>>> +++ b/src/glsl/nir/glsl_to_nir.cpp
>>>>> @@ -241,6 +241,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++)
>>>>> @@ -265,6 +267,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);
>>>>> @@ -275,6 +279,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);
>>>>> diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
>>>>> index 6ffa60b..f99af4e 100644
>>>>> --- a/src/glsl/nir/nir.h
>>>>> +++ b/src/glsl/nir/nir.h
>>>>> @@ -111,6 +111,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;
>>>>> --
>>>>> 2.5.0.400.gff86faf
>>>>>
>>>>> _______________________________________________
>>>>> 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