<p dir="ltr"><br>
On Apr 12, 2015 3:24 PM, "Thomas Helland" <<a href="mailto:thomashelland90@gmail.com">thomashelland90@gmail.com</a>> wrote:<br>
><br>
> Hi,<br>
><br>
> This looks correct as far as I can tell.<br>
> I have some comments inline, but I don't feel strongly about<br>
> either of them, so do as you please.<br>
><br>
> Also, maybe this is a candidate for /src/util ?</p>
<p dir="ltr">Maybe. If so I'm OK leaving it here until there are other users.</p>
<p dir="ltr">> 2015-04-11 2:48 GMT+02:00 Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>>:<br>
> > ---<br>
> >  src/glsl/nir/nir_array.h | 96 ++++++++++++++++++++++++++++++++++++++++++++++++<br>
> >  1 file changed, 96 insertions(+)<br>
> >  create mode 100644 src/glsl/nir/nir_array.h<br>
> ><br>
> > diff --git a/src/glsl/nir/nir_array.h b/src/glsl/nir/nir_array.h<br>
> > new file mode 100644<br>
> > index 0000000..1db4e8c<br>
> > --- /dev/null<br>
> > +++ b/src/glsl/nir/nir_array.h<br>
> > @@ -0,0 +1,96 @@<br>
> > +/*<br>
> > + * Copyright © 2015 Intel Corporation<br>
> > + *<br>
> > + * Permission is hereby granted, free of charge, to any person obtaining a<br>
> > + * copy of this software and associated documentation files (the "Software"),<br>
> > + * to deal in the Software without restriction, including without limitation<br>
> > + * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
> > + * and/or sell copies of the Software, and to permit persons to whom the<br>
> > + * Software is furnished to do so, subject to the following conditions:<br>
> > + *<br>
> > + * The above copyright notice and this permission notice (including the next<br>
> > + * paragraph) shall be included in all copies or substantial portions of the<br>
> > + * Software.<br>
> > + *<br>
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
> > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
> > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
> > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
> > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
> > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS<br>
> > + * IN THE SOFTWARE.<br>
> > + *<br>
> > + * Authors:<br>
> > + *    Jason Ekstrand (<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>)<br>
> > + *<br>
> > + */<br>
> > +<br>
> > +#pragma once<br>
> > +<br>
> > +#ifdef __cplusplus<br>
> > +extern "C" {<br>
> > +#endif<br>
> > +<br>
> > +typedef struct {<br>
> > +   void *mem_ctx;<br>
> > +   size_t size;<br>
> > +   size_t alloc;<br>
><br>
> Maybe "alloced" or "alloced_mem" instead?<br>
> I was a bit puzzled initially about its purpose.</p>
<p dir="ltr">Sure</p>
<p dir="ltr">> > +   void *data;<br>
> > +} nir_array;<br>
> > +<br>
> > +static inline void<br>
> > +nir_array_init(nir_array *arr, void *mem_ctx)<br>
> > +{<br>
> > +   arr->mem_ctx = mem_ctx;<br>
> > +   arr->size = 0;<br>
> > +   arr->alloc = 0;<br>
> > +   arr->data = NULL;<br>
> > +}<br>
> > +<br>
> > +static inline void<br>
> > +nir_array_fini(nir_array *arr)<br>
> > +{<br>
> > +   if (arr->mem_ctx)<br>
> > +      ralloc_free(arr->data);<br>
> > +   else<br>
> > +      free(arr->data);<br>
> > +}<br>
> > +<br>
> > +#define NIR_ARRAY_INITIAL_SIZE 64<br>
> > +<br>
> > +/* Increments the size of the array by the given ammount and returns a<br>
> > + * pointer to the beginning of the newly added space.<br>
> > + */<br>
><br>
> A nit, but s/ammount/amount.</p>
<p dir="ltr">Yup</p>
<p dir="ltr">> Maybe also mention that we allocate memory in 2^n increments?</p>
<p dir="ltr">Meh.  I do that because I happen to think it's nice but it's not at all a requirement.</p>
<p dir="ltr">> > +static inline void *<br>
> > +nir_array_grow(nir_array *arr, size_t additional)<br>
> > +{<br>
> > +   size_t new_size = arr->size + additional;<br>
> > +   if (new_size > arr->alloc) {<br>
> > +      if (arr->alloc == 0)<br>
> > +         arr->alloc = NIR_ARRAY_INITIAL_SIZE;<br>
> > +<br>
> > +      while (new_size > arr->alloc)<br>
> > +         arr->alloc *= 2;<br>
> > +<br>
> > +      if (arr->mem_ctx)<br>
> > +         arr->data = reralloc_size(arr->mem_ctx, arr->data, arr->alloc);<br>
> > +      else<br>
> > +         arr->data = realloc(arr->data, arr->alloc);<br>
><br>
> Probably should handle failure to allocate and return NULL?</p>
<p dir="ltr">Doesn't hurt. I can do that.</p>
<p dir="ltr">> > +   }<br>
> > +<br>
> > +   void *ptr = (void *)((char *)arr->data + arr->size);<br>
> > +   arr->size = new_size;<br>
> > +<br>
> > +   return ptr;<br>
> > +}<br>
> > +<br>
> > +#define nir_array_add(arr, type, elem) \<br>
> > +   *(type *)nir_array_grow(arr, sizeof(type)) = (elem)<br>
> > +<br>
> > +#define nir_array_foreach(arr, type, elem) \<br>
> > +   for (type *elem = (type *)(arr)->data; \<br>
> > +        elem < (type *)((char *)(arr)->data + (arr)->size); elem++)<br>
> > +<br>
> > +#ifdef __cplusplus<br>
> > +} /* extern "C" */<br>
> > +#endif<br>
> > --<br>
> > 2.3.5<br>
> ><br>
> > _______________________________________________<br>
> > mesa-dev mailing list<br>
> > <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> > <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</p>