diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/intel/vulkan/anv_allocator.c | 13 | ||||
-rw-r--r-- | src/intel/vulkan/anv_descriptor_set.c | 1 | ||||
-rw-r--r-- | src/intel/vulkan/anv_device.c | 9 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 6 | ||||
-rw-r--r-- | src/intel/vulkan/anv_queue.c | 3 | ||||
-rw-r--r-- | src/intel/vulkan/genX_query.c | 1 |
6 files changed, 26 insertions, 7 deletions
diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c index f939a0c7c0e..eed6a194dd7 100644 --- a/src/intel/vulkan/anv_allocator.c +++ b/src/intel/vulkan/anv_allocator.c @@ -498,18 +498,17 @@ anv_block_pool_expand_range(struct anv_block_pool *pool, if (pool->use_softpin) { uint32_t new_bo_size = size - pool->size; struct anv_bo *new_bo; + assert(center_bo_offset == 0); VkResult result = anv_device_alloc_bo(pool->device, new_bo_size, bo_alloc_flags | ANV_BO_ALLOC_FIXED_ADDRESS | ANV_BO_ALLOC_MAPPED | ANV_BO_ALLOC_SNOOPED, + pool->start_address + pool->size, &new_bo); if (result != VK_SUCCESS) return result; - assert(center_bo_offset == 0); - - new_bo->offset = pool->start_address + pool->size; pool->bos[pool->nbos++] = new_bo; /* This pointer will always point to the first BO in the list */ @@ -1316,6 +1315,7 @@ anv_bo_pool_alloc(struct anv_bo_pool *pool, uint32_t size, pow2_size, ANV_BO_ALLOC_MAPPED | ANV_BO_ALLOC_SNOOPED, + 0 /* explicit_address */, &bo); if (result != VK_SUCCESS) return result; @@ -1454,7 +1454,9 @@ anv_scratch_pool_alloc(struct anv_device *device, struct anv_scratch_pool *pool, * so nothing will ever touch the top page. */ VkResult result = anv_device_alloc_bo(device, size, - ANV_BO_ALLOC_32BIT_ADDRESS, &bo); + ANV_BO_ALLOC_32BIT_ADDRESS, + 0 /* explicit_address */, + &bo); if (result != VK_SUCCESS) return NULL; /* TODO */ @@ -1528,6 +1530,7 @@ VkResult anv_device_alloc_bo(struct anv_device *device, uint64_t size, enum anv_bo_alloc_flags alloc_flags, + uint64_t explicit_address, struct anv_bo **bo_out) { const uint32_t bo_flags = @@ -1580,7 +1583,9 @@ anv_device_alloc_bo(struct anv_device *device, if (alloc_flags & ANV_BO_ALLOC_FIXED_ADDRESS) { new_bo.has_fixed_address = true; + new_bo.offset = explicit_address; } else { + assert(explicit_address == 0); if (!anv_vma_alloc(device, &new_bo)) { if (new_bo.map) anv_gem_munmap(new_bo.map, size); diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c index af8fa40a0a9..020b6abd5ed 100644 --- a/src/intel/vulkan/anv_descriptor_set.c +++ b/src/intel/vulkan/anv_descriptor_set.c @@ -746,6 +746,7 @@ VkResult anv_CreateDescriptorPool( descriptor_bo_size, ANV_BO_ALLOC_MAPPED | ANV_BO_ALLOC_SNOOPED, + 0 /* explicit_address */, &pool->bo); if (result != VK_SUCCESS) { vk_free2(&device->alloc, pAllocator, pool); diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 6a2c25478d1..d300350b789 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -2158,6 +2158,7 @@ anv_device_init_trivial_batch(struct anv_device *device) { VkResult result = anv_device_alloc_bo(device, 4096, ANV_BO_ALLOC_MAPPED, + 0 /* explicit_address */, &device->trivial_batch_bo); if (result != VK_SUCCESS) return result; @@ -2266,6 +2267,7 @@ anv_device_init_hiz_clear_value_bo(struct anv_device *device) { VkResult result = anv_device_alloc_bo(device, 4096, ANV_BO_ALLOC_MAPPED, + 0 /* explicit_address */, &device->hiz_clear_bo); if (result != VK_SUCCESS) return result; @@ -2597,7 +2599,9 @@ VkResult anv_CreateDevice( goto fail_binding_table_pool; } - result = anv_device_alloc_bo(device, 4096, 0, &device->workaround_bo); + result = anv_device_alloc_bo(device, 4096, 0 /* flags */, + 0 /* explicit_address */, + &device->workaround_bo); if (result != VK_SUCCESS) goto fail_surface_aux_map_pool; @@ -3184,7 +3188,8 @@ VkResult anv_AllocateMemory( alloc_flags |= ANV_BO_ALLOC_EXTERNAL; result = anv_device_alloc_bo(device, pAllocateInfo->allocationSize, - alloc_flags, &mem->bo); + alloc_flags, 0 /* explicit_address */, + &mem->bo); if (result != VK_SUCCESS) goto fail; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 127af8b01fd..3e168f2b66d 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1331,7 +1331,10 @@ enum anv_bo_alloc_flags { /** Specifies that the BO should be captured in error states */ ANV_BO_ALLOC_CAPTURE = (1 << 4), - /** Specifies that the BO will have an address assigned by the caller */ + /** Specifies that the BO will have an address assigned by the caller + * + * Such BOs do not exist in any VMA heap. + */ ANV_BO_ALLOC_FIXED_ADDRESS = (1 << 5), /** Enables implicit synchronization on the BO @@ -1349,6 +1352,7 @@ enum anv_bo_alloc_flags { VkResult anv_device_alloc_bo(struct anv_device *device, uint64_t size, enum anv_bo_alloc_flags alloc_flags, + uint64_t explicit_address, struct anv_bo **bo); VkResult anv_device_import_bo_from_host_ptr(struct anv_device *device, void *host_ptr, uint32_t size, diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c index 3dedbcade46..86010dbba0f 100644 --- a/src/intel/vulkan/anv_queue.c +++ b/src/intel/vulkan/anv_queue.c @@ -167,6 +167,7 @@ anv_timeline_add_point_locked(struct anv_device *device, result = anv_device_alloc_bo(device, 4096, ANV_BO_ALLOC_EXTERNAL | ANV_BO_ALLOC_IMPLICIT_SYNC, + 0 /* explicit_address */, &(*point)->bo); if (result != VK_SUCCESS) vk_free(&device->alloc, *point); @@ -573,6 +574,7 @@ anv_queue_submit_simple_batch(struct anv_queue *queue, result = anv_device_alloc_bo(device, 4096, ANV_BO_ALLOC_EXTERNAL | ANV_BO_ALLOC_IMPLICIT_SYNC, + 0 /* explicit_address */, &sync_bo); if (result != VK_SUCCESS) goto err_free_submit; @@ -1669,6 +1671,7 @@ binary_semaphore_create(struct anv_device *device, anv_device_alloc_bo(device, 4096, ANV_BO_ALLOC_EXTERNAL | ANV_BO_ALLOC_IMPLICIT_SYNC, + 0 /* explicit_address */, &impl->bo); /* If we're going to use this as a fence, we need to *not* have the * EXEC_OBJECT_ASYNC bit set. diff --git a/src/intel/vulkan/genX_query.c b/src/intel/vulkan/genX_query.c index 0a295cebb87..6a512d3ea7b 100644 --- a/src/intel/vulkan/genX_query.c +++ b/src/intel/vulkan/genX_query.c @@ -125,6 +125,7 @@ VkResult genX(CreateQueryPool)( result = anv_device_alloc_bo(device, size, ANV_BO_ALLOC_MAPPED | ANV_BO_ALLOC_SNOOPED, + 0 /* explicit_address */, &pool->bo); if (result != VK_SUCCESS) goto fail; |