[Mesa-dev] [PATCH 09/12] nir: Add a simple growing array data structure

Jason Ekstrand jason at jlekstrand.net
Sun Apr 12 18:38:49 PDT 2015


On Apr 12, 2015 3:24 PM, "Thomas Helland" <thomashelland90 at gmail.com> wrote:
>
> Hi,
>
> This looks correct as far as I can tell.
> I have some comments inline, but I don't feel strongly about
> either of them, so do as you please.
>
> Also, maybe this is a candidate for /src/util ?

Maybe. If so I'm OK leaving it here until there are other users.

> 2015-04-11 2:48 GMT+02:00 Jason Ekstrand <jason at jlekstrand.net>:
> > ---
> >  src/glsl/nir/nir_array.h | 96
++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 96 insertions(+)
> >  create mode 100644 src/glsl/nir/nir_array.h
> >
> > diff --git a/src/glsl/nir/nir_array.h b/src/glsl/nir/nir_array.h
> > new file mode 100644
> > index 0000000..1db4e8c
> > --- /dev/null
> > +++ b/src/glsl/nir/nir_array.h
> > @@ -0,0 +1,96 @@
> > +/*
> > + * Copyright © 2015 Intel Corporation
> > + *
> > + * Permission is hereby granted, free of charge, to any person
obtaining a
> > + * copy of this software and associated documentation files (the
"Software"),
> > + * to deal in the Software without restriction, including without
limitation
> > + * the rights to use, copy, modify, merge, publish, distribute,
sublicense,
> > + * and/or sell copies of the Software, and to permit persons to whom
the
> > + * Software is furnished to do so, subject to the following conditions:
> > + *
> > + * The above copyright notice and this permission notice (including
the next
> > + * paragraph) shall be included in all copies or substantial portions
of the
> > + * Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR
> > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY,
> > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT
SHALL
> > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
OR OTHER
> > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING
> > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS
> > + * IN THE SOFTWARE.
> > + *
> > + * Authors:
> > + *    Jason Ekstrand (jason at jlekstrand.net)
> > + *
> > + */
> > +
> > +#pragma once
> > +
> > +#ifdef __cplusplus
> > +extern "C" {
> > +#endif
> > +
> > +typedef struct {
> > +   void *mem_ctx;
> > +   size_t size;
> > +   size_t alloc;
>
> Maybe "alloced" or "alloced_mem" instead?
> I was a bit puzzled initially about its purpose.

Sure

> > +   void *data;
> > +} nir_array;
> > +
> > +static inline void
> > +nir_array_init(nir_array *arr, void *mem_ctx)
> > +{
> > +   arr->mem_ctx = mem_ctx;
> > +   arr->size = 0;
> > +   arr->alloc = 0;
> > +   arr->data = NULL;
> > +}
> > +
> > +static inline void
> > +nir_array_fini(nir_array *arr)
> > +{
> > +   if (arr->mem_ctx)
> > +      ralloc_free(arr->data);
> > +   else
> > +      free(arr->data);
> > +}
> > +
> > +#define NIR_ARRAY_INITIAL_SIZE 64
> > +
> > +/* Increments the size of the array by the given ammount and returns a
> > + * pointer to the beginning of the newly added space.
> > + */
>
> A nit, but s/ammount/amount.

Yup

> Maybe also mention that we allocate memory in 2^n increments?

Meh.  I do that because I happen to think it's nice but it's not at all a
requirement.

> > +static inline void *
> > +nir_array_grow(nir_array *arr, size_t additional)
> > +{
> > +   size_t new_size = arr->size + additional;
> > +   if (new_size > arr->alloc) {
> > +      if (arr->alloc == 0)
> > +         arr->alloc = NIR_ARRAY_INITIAL_SIZE;
> > +
> > +      while (new_size > arr->alloc)
> > +         arr->alloc *= 2;
> > +
> > +      if (arr->mem_ctx)
> > +         arr->data = reralloc_size(arr->mem_ctx, arr->data,
arr->alloc);
> > +      else
> > +         arr->data = realloc(arr->data, arr->alloc);
>
> Probably should handle failure to allocate and return NULL?

Doesn't hurt. I can do that.

> > +   }
> > +
> > +   void *ptr = (void *)((char *)arr->data + arr->size);
> > +   arr->size = new_size;
> > +
> > +   return ptr;
> > +}
> > +
> > +#define nir_array_add(arr, type, elem) \
> > +   *(type *)nir_array_grow(arr, sizeof(type)) = (elem)
> > +
> > +#define nir_array_foreach(arr, type, elem) \
> > +   for (type *elem = (type *)(arr)->data; \
> > +        elem < (type *)((char *)(arr)->data + (arr)->size); elem++)
> > +
> > +#ifdef __cplusplus
> > +} /* extern "C" */
> > +#endif
> > --
> > 2.3.5
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150412/ba42cc56/attachment-0001.html>


More information about the mesa-dev mailing list