Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* -*- c++ -*- */
  2. /*
  3.  * Copyright © 2010-2014 Intel Corporation
  4.  *
  5.  * Permission is hereby granted, free of charge, to any person obtaining a
  6.  * copy of this software and associated documentation files (the "Software"),
  7.  * to deal in the Software without restriction, including without limitation
  8.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9.  * and/or sell copies of the Software, and to permit persons to whom the
  10.  * Software is furnished to do so, subject to the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice (including the next
  13.  * paragraph) shall be included in all copies or substantial portions of the
  14.  * Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  22.  * IN THE SOFTWARE.
  23.  */
  24.  
  25. #ifndef BRW_IR_ALLOCATOR_H
  26. #define BRW_IR_ALLOCATOR_H
  27.  
  28. #include "main/macros.h"
  29.  
  30. namespace brw {
  31.    /**
  32.     * Simple allocator used to keep track of virtual GRFs.
  33.     */
  34.    class simple_allocator {
  35.    public:
  36.       simple_allocator() :
  37.          sizes(NULL), offsets(NULL), count(0), total_size(0), capacity(0)
  38.       {
  39.       }
  40.  
  41.       ~simple_allocator()
  42.       {
  43.          free(offsets);
  44.          free(sizes);
  45.       }
  46.  
  47.       unsigned
  48.       allocate(unsigned size)
  49.       {
  50.          if (capacity <= count) {
  51.             capacity = MAX2(16, capacity * 2);
  52.             sizes = (unsigned *)realloc(sizes, capacity * sizeof(unsigned));
  53.             offsets = (unsigned *)realloc(offsets, capacity * sizeof(unsigned));
  54.          }
  55.  
  56.          sizes[count] = size;
  57.          offsets[count] = total_size;
  58.          total_size += size;
  59.  
  60.          return count++;
  61.       }
  62.  
  63.       /**
  64.        * Array of sizes for each allocation.  The allocation unit is up to the
  65.        * back-end, but it's expected to be one scalar value in the FS back-end
  66.        * and one vec4 in the VEC4 back-end.
  67.        */
  68.       unsigned *sizes;
  69.  
  70.       /**
  71.        * Array of offsets from the start of the VGRF space in allocation
  72.        * units.
  73.        */
  74.       unsigned *offsets;
  75.  
  76.       /** Total number of VGRFs allocated. */
  77.       unsigned count;
  78.  
  79.       /** Cumulative size in allocation units. */
  80.       unsigned total_size;
  81.  
  82.    private:
  83.       unsigned capacity;
  84.    };
  85. }
  86.  
  87. #endif
  88.