On Sat, Nov 14, 2015 at 9:30 AM, Jason Ekstrand <ja...@jlekstrand.net> wrote: > 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
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 <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