[Mesa-dev] [PATCH 1/2] anv: setup BO flags at state_pool/block_pool creation

Lionel Landwerlin lionel.g.landwerlin at intel.com
Sat Nov 18 00:09:21 UTC 2017


On 17/11/17 18:37, Kenneth Graunke wrote:
> On Friday, November 17, 2017 9:47:59 AM PST Lionel Landwerlin wrote:
>> This will allow to set the flags on any anv_bo created/filled from a
>> state pool or block pool later.
>>
>> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>> ---
>>   src/intel/vulkan/anv_allocator.c                   | 24 ++++++++++++----------
>>   src/intel/vulkan/anv_device.c                      | 18 ++++++++++++----
>>   src/intel/vulkan/anv_private.h                     | 13 +++++++++---
>>   src/intel/vulkan/tests/block_pool_no_free.c        |  2 +-
>>   src/intel/vulkan/tests/state_pool.c                |  2 +-
>>   src/intel/vulkan/tests/state_pool_free_list_only.c |  2 +-
>>   src/intel/vulkan/tests/state_pool_no_free.c        |  2 +-
>>   7 files changed, 41 insertions(+), 22 deletions(-)
>>
>> diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c
>> index ce37ccb4881..8ed32b3c673 100644
>> --- a/src/intel/vulkan/anv_allocator.c
>> +++ b/src/intel/vulkan/anv_allocator.c
>> @@ -241,11 +241,13 @@ anv_block_pool_expand_range(struct anv_block_pool *pool,
>>   VkResult
>>   anv_block_pool_init(struct anv_block_pool *pool,
>>                       struct anv_device *device,
>> -                    uint32_t initial_size)
>> +                    uint32_t initial_size,
>> +                    uint64_t bo_flags)
>>   {
>>      VkResult result;
>>   
>>      pool->device = device;
>> +   pool->bo_flags = bo_flags;
>>      anv_bo_init(&pool->bo, 0, 0);
>>   
>>      pool->fd = memfd_create("block pool", MFD_CLOEXEC);
>> @@ -398,6 +400,7 @@ anv_block_pool_expand_range(struct anv_block_pool *pool,
>>       * hard work for us.
>>       */
>>      anv_bo_init(&pool->bo, gem_handle, size);
>> +   pool->bo.flags = pool->bo_flags;
>>      pool->bo.map = map;
>>   
>>      return VK_SUCCESS;
>> @@ -515,8 +518,7 @@ anv_block_pool_grow(struct anv_block_pool *pool, struct anv_block_state *state)
>>   
>>      result = anv_block_pool_expand_range(pool, center_bo_offset, size);
>>   
>> -   if (pool->device->instance->physicalDevice.has_exec_async)
>> -      pool->bo.flags |= EXEC_OBJECT_ASYNC;
>> +   pool->bo.flags = pool->bo_flags;
>>   
>>   done:
>>      pthread_mutex_unlock(&pool->device->mutex);
>> @@ -606,10 +608,12 @@ anv_block_pool_alloc_back(struct anv_block_pool *pool,
>>   VkResult
>>   anv_state_pool_init(struct anv_state_pool *pool,
>>                       struct anv_device *device,
>> -                    uint32_t block_size)
>> +                    uint32_t block_size,
>> +                    uint64_t bo_flags)
>>   {
>>      VkResult result = anv_block_pool_init(&pool->block_pool, device,
>> -                                         block_size * 16);
>> +                                         block_size * 16,
>> +                                         bo_flags);
>>      if (result != VK_SUCCESS)
>>         return result;
>>   
>> @@ -951,9 +955,11 @@ struct bo_pool_bo_link {
>>   };
>>   
>>   void
>> -anv_bo_pool_init(struct anv_bo_pool *pool, struct anv_device *device)
>> +anv_bo_pool_init(struct anv_bo_pool *pool, struct anv_device *device,
>> +                 uint64_t bo_flags)
>>   {
>>      pool->device = device;
>> +   pool->bo_flags = bo_flags;
>>      memset(pool->free_list, 0, sizeof(pool->free_list));
>>   
>>      VG(VALGRIND_CREATE_MEMPOOL(pool, 0, false));
>> @@ -1005,11 +1011,7 @@ anv_bo_pool_alloc(struct anv_bo_pool *pool, struct anv_bo *bo, uint32_t size)
>>      if (result != VK_SUCCESS)
>>         return result;
>>   
>> -   if (pool->device->instance->physicalDevice.supports_48bit_addresses)
>> -      new_bo.flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
>> -
>> -   if (pool->device->instance->physicalDevice.has_exec_async)
>> -      new_bo.flags |= EXEC_OBJECT_ASYNC;
>> +   new_bo.flags = pool->bo_flags;
>>   
>>      assert(new_bo.size == pow2_size);
>>   
>> diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
>> index 3aa213e205b..35bccaee6d2 100644
>> --- a/src/intel/vulkan/anv_device.c
>> +++ b/src/intel/vulkan/anv_device.c
>> @@ -1211,21 +1211,31 @@ VkResult anv_CreateDevice(
>>      }
>>      pthread_condattr_destroy(&condattr);
>>   
>> -   anv_bo_pool_init(&device->batch_bo_pool, device);
>> +   uint64_t bo_flags =
>> +      physical_device->supports_48bit_addresses ? EXEC_OBJECT_SUPPORTS_48B_ADDRESS : 0 |
>> +      physical_device->has_exec_async ? EXEC_OBJECT_ASYNC : 0;
>> +
>> +   anv_bo_pool_init(&device->batch_bo_pool, device, bo_flags);
>>   
>>      result = anv_bo_cache_init(&device->bo_cache);
>>      if (result != VK_SUCCESS)
>>         goto fail_batch_bo_pool;
>>   
>> -   result = anv_state_pool_init(&device->dynamic_state_pool, device, 16384);
>> +   /* For the state pools we explicitly disable 48bit. */
>> +   bo_flags = physical_device->has_exec_async ? EXEC_OBJECT_ASYNC : 0;
> Maybe just do:
>
>     /* For the state pools we explicitly disable 48bit. */
>     bo_flags &= ~EXEC_OBJECT_SUPPORTS_48B_ADDRESS;

The second patch adds the capture flag to the first assignment of 
bo_flags which we won't want for all the state pool. Just the 
instruction one.
I guess I could ~ it as well.

>
> in case you add other flags here in the future?
>
> Otherwise, these are (assuming you fix the bug krh caught):
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
>
>



More information about the mesa-dev mailing list