anv/allocator: Add support for large stream allocations
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 26 Apr 2017 16:54:41 +0000 (09:54 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 5 May 2017 02:07:54 +0000 (19:07 -0700)
Reviewed-by: Juan A. Suarez Romero <jasuarez@igalia.com>
src/intel/vulkan/anv_allocator.c

index 3988a1ab2b87700c7aee1301840e78a27b4bad6b..a05aaf8fabd9820d35f5d4398b280557523115c8 100644 (file)
@@ -916,10 +916,13 @@ anv_state_stream_alloc(struct anv_state_stream *stream,
    assert(alignment <= PAGE_SIZE);
 
    uint32_t offset = align_u32(stream->next, alignment);
-   if (offset + size > stream->block_size) {
+   if (offset + size > stream->block.alloc_size) {
+      uint32_t block_size = stream->block_size;
+      if (block_size < size)
+         block_size = round_to_power_of_two(size);
+
       stream->block = anv_state_pool_alloc_no_vg(stream->state_pool,
-                                                 stream->block_size,
-                                                 PAGE_SIZE);
+                                                 block_size, PAGE_SIZE);
 
       struct anv_state_stream_block *sb = stream->block.map;
       VG_NOACCESS_WRITE(&sb->block, stream->block);
@@ -933,7 +936,7 @@ anv_state_stream_alloc(struct anv_state_stream *stream,
       stream->next = sizeof(*sb);
 
       offset = align_u32(stream->next, alignment);
-      assert(offset + size <= stream->block_size);
+      assert(offset + size <= stream->block.alloc_size);
    }
 
    struct anv_state state = stream->block;