vulkan: synchronize access to execution pool fences
vkResetFences is specified as being user-synchronized (yet vkWaitFences, is not).
This commit is contained in:
parent
697382168d
commit
975cd48bb3
@ -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->WaitForFences(s->hwctx->act_dev, 1, &e->fence, VK_TRUE, UINT64_MAX);
|
||||||
vk->DestroyFence(s->hwctx->act_dev, e->fence, s->hwctx->alloc);
|
vk->DestroyFence(s->hwctx->act_dev, e->fence, s->hwctx->alloc);
|
||||||
}
|
}
|
||||||
|
pthread_mutex_destroy(&e->lock);
|
||||||
|
|
||||||
ff_vk_exec_discard_deps(s, e);
|
ff_vk_exec_discard_deps(s, e);
|
||||||
|
|
||||||
@ -379,12 +380,17 @@ int ff_vk_exec_pool_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf,
|
|||||||
/* Init contexts */
|
/* Init contexts */
|
||||||
for (int i = 0; i < pool->pool_size; i++) {
|
for (int i = 0; i < pool->pool_size; i++) {
|
||||||
FFVkExecContext *e = &pool->contexts[i];
|
FFVkExecContext *e = &pool->contexts[i];
|
||||||
|
|
||||||
/* Fence */
|
|
||||||
VkFenceCreateInfo fence_create = {
|
VkFenceCreateInfo fence_create = {
|
||||||
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
|
||||||
.flags = VK_FENCE_CREATE_SIGNALED_BIT,
|
.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,
|
ret = vk->CreateFence(s->hwctx->act_dev, &fence_create, s->hwctx->alloc,
|
||||||
&e->fence);
|
&e->fence);
|
||||||
if (ret != VK_SUCCESS) {
|
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,
|
.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);
|
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);
|
vk->ResetFences(s->hwctx->act_dev, 1, &e->fence);
|
||||||
|
pthread_mutex_unlock(&e->lock);
|
||||||
|
|
||||||
/* Discard queue dependencies */
|
/* Discard queue dependencies */
|
||||||
ff_vk_exec_discard_deps(s, e);
|
ff_vk_exec_discard_deps(s, e);
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include <stdatomic.h>
|
#include <stdatomic.h>
|
||||||
|
|
||||||
|
#include "thread.h"
|
||||||
#include "pixdesc.h"
|
#include "pixdesc.h"
|
||||||
#include "bprint.h"
|
#include "bprint.h"
|
||||||
#include "hwcontext.h"
|
#include "hwcontext.h"
|
||||||
@ -152,6 +153,7 @@ typedef struct FFVulkanPipeline {
|
|||||||
typedef struct FFVkExecContext {
|
typedef struct FFVkExecContext {
|
||||||
int idx;
|
int idx;
|
||||||
const struct FFVkExecPool *parent;
|
const struct FFVkExecPool *parent;
|
||||||
|
pthread_mutex_t lock;
|
||||||
|
|
||||||
/* Queue for the execution context */
|
/* Queue for the execution context */
|
||||||
VkQueue queue;
|
VkQueue queue;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user