|
|
|
@ -241,6 +241,7 @@ void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool) |
|
|
|
|
vk->WaitForFences(s->hwctx->act_dev, 1, &e->fence, VK_TRUE, UINT64_MAX); |
|
|
|
|
vk->DestroyFence(s->hwctx->act_dev, e->fence, s->hwctx->alloc); |
|
|
|
|
} |
|
|
|
|
pthread_mutex_destroy(&e->lock); |
|
|
|
|
|
|
|
|
|
ff_vk_exec_discard_deps(s, e); |
|
|
|
|
|
|
|
|
@ -379,12 +380,17 @@ int ff_vk_exec_pool_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, |
|
|
|
|
/* Init contexts */ |
|
|
|
|
for (int i = 0; i < pool->pool_size; i++) { |
|
|
|
|
FFVkExecContext *e = &pool->contexts[i]; |
|
|
|
|
|
|
|
|
|
/* Fence */ |
|
|
|
|
VkFenceCreateInfo fence_create = { |
|
|
|
|
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, |
|
|
|
|
.flags = VK_FENCE_CREATE_SIGNALED_BIT, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/* Mutex */ |
|
|
|
|
err = pthread_mutex_init(&e->lock, NULL); |
|
|
|
|
if (err != 0) |
|
|
|
|
return AVERROR(err); |
|
|
|
|
|
|
|
|
|
/* Fence */ |
|
|
|
|
ret = vk->CreateFence(s->hwctx->act_dev, &fence_create, s->hwctx->alloc, |
|
|
|
|
&e->fence); |
|
|
|
|
if (ret != VK_SUCCESS) { |
|
|
|
@ -488,9 +494,13 @@ int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e) |
|
|
|
|
.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/* Create the fence and don't wait for it initially */ |
|
|
|
|
/* Wait for the fence to be signalled */ |
|
|
|
|
vk->WaitForFences(s->hwctx->act_dev, 1, &e->fence, VK_TRUE, UINT64_MAX); |
|
|
|
|
|
|
|
|
|
/* vkResetFences is defined as being host-synchronized */ |
|
|
|
|
pthread_mutex_lock(&e->lock); |
|
|
|
|
vk->ResetFences(s->hwctx->act_dev, 1, &e->fence); |
|
|
|
|
pthread_mutex_unlock(&e->lock); |
|
|
|
|
|
|
|
|
|
/* Discard queue dependencies */ |
|
|
|
|
ff_vk_exec_discard_deps(s, e); |
|
|
|
|