anv: Create fences from the batch BO pool
Applications may create a *lot* of fences, perhaps as much as one per vkQueueSubmit. Really, they're supposed to use ResetFence, but it's easy enough for us to make them crazy-cheap so we might as well.
This commit is contained in:
@@ -1387,8 +1387,6 @@ VkResult anv_CreateFence(
|
|||||||
struct anv_batch batch;
|
struct anv_batch batch;
|
||||||
VkResult result;
|
VkResult result;
|
||||||
|
|
||||||
const uint32_t fence_size = 128;
|
|
||||||
|
|
||||||
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_FENCE_CREATE_INFO);
|
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_FENCE_CREATE_INFO);
|
||||||
|
|
||||||
fence = anv_alloc2(&device->alloc, pAllocator, sizeof(*fence), 8,
|
fence = anv_alloc2(&device->alloc, pAllocator, sizeof(*fence), 8,
|
||||||
@@ -1396,12 +1394,10 @@ VkResult anv_CreateFence(
|
|||||||
if (fence == NULL)
|
if (fence == NULL)
|
||||||
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
|
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||||
|
|
||||||
result = anv_bo_init_new(&fence->bo, device, fence_size);
|
result = anv_bo_pool_alloc(&device->batch_bo_pool, &fence->bo);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
fence->bo.map =
|
|
||||||
anv_gem_mmap(device, fence->bo.gem_handle, 0, fence->bo.size, 0);
|
|
||||||
batch.next = batch.start = fence->bo.map;
|
batch.next = batch.start = fence->bo.map;
|
||||||
batch.end = fence->bo.map + fence->bo.size;
|
batch.end = fence->bo.map + fence->bo.size;
|
||||||
anv_batch_emit(&batch, GEN7_MI_BATCH_BUFFER_END);
|
anv_batch_emit(&batch, GEN7_MI_BATCH_BUFFER_END);
|
||||||
@@ -1457,9 +1453,7 @@ void anv_DestroyFence(
|
|||||||
ANV_FROM_HANDLE(anv_device, device, _device);
|
ANV_FROM_HANDLE(anv_device, device, _device);
|
||||||
ANV_FROM_HANDLE(anv_fence, fence, _fence);
|
ANV_FROM_HANDLE(anv_fence, fence, _fence);
|
||||||
|
|
||||||
anv_gem_munmap(fence->bo.map, fence->bo.size);
|
anv_bo_pool_free(&device->batch_bo_pool, &fence->bo);
|
||||||
anv_gem_close(device, fence->bo.gem_handle);
|
|
||||||
anv_free2(&device->alloc, pAllocator, fence);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VkResult anv_ResetFences(
|
VkResult anv_ResetFences(
|
||||||
|
Reference in New Issue
Block a user