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

Connor Abbott cwabbott0 at gmail.com
Wed Apr 22 15:16:13 PDT 2015


On Wed, Apr 22, 2015 at 6:06 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> On Wed, Apr 22, 2015 at 3:03 PM, Connor Abbott <cwabbott0 at gmail.com> wrote:
>> I think it would be better to call this "nir_vector" rather than
>> "nir_array," since this is essentially a poor man's version of
>> std::vector<>. Is this ok with you?
>
> I battled over that one for quite a while.  In the end, I settled on
> nir_array because NIR is a compiler IR for vector architectures and I
> was concerned that a datatype called nir_vector that was not, in fact,
> a vector in the mathematical sense would be troublesome.
> --Jason

Ugh, you're right... I guess nir_array would lead to less confusion,
even if it's not quite the name that everyone else uses.

>
>> On Fri, Apr 10, 2015 at 8:48 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
>>> ---
>>>  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;
>>> +   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.
>>> + */
>>> +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);
>>> +   }
>>> +
>>> +   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


More information about the mesa-dev mailing list