On Sat, Nov 14, 2015 at 9:25 AM, Connor Abbott <cwabbo...@gmail.com> wrote: > On Sat, Nov 14, 2015 at 11:55 AM, Rob Clark <robdcl...@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 >> >> BR, >> -R >> >> On Sat, Nov 14, 2015 at 11:19 AM, Connor Abbott <cwabbo...@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 <ja...@jlekstrand.net> >>> wrote: >>>> From: Rob Clark <robcl...@freedesktop.org> >>>> >>>> This will simplify things somewhat in clone. >>>> >>>> Signed-off-by: Rob Clark <robcl...@freedesktop.org> >>>> Reviewed-by: Jason Ekstrand <jason.ekstr...@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@lists.freedesktop.org >>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev