diff options
author | Lynne <dev@lynne.ee> | 2020-05-11 23:27:01 +0100 |
---|---|---|
committer | Lynne <dev@lynne.ee> | 2020-05-11 23:48:26 +0100 |
commit | 70d396c8afa4275dbd54e79805ab2c34124c1b65 (patch) | |
tree | 603c2ea94aeba885ce268f969b444c466ab4933e /libavfilter/vulkan.c | |
parent | 2932905255995cd615fe01126e233e26112b9e5e (diff) | |
download | ffmpeg-70d396c8afa4275dbd54e79805ab2c34124c1b65.tar.gz |
Revert "hwcontext_vulkan: only use one semaphore per image"
This reverts commit 97b526c192add6f252b327245fd9223546867352.
It broke the API, and assumed no other APIs used multiple semaphores.
This also disallowed certain optimizations to happen.
Dealing with APIs that give or expect single semaphores is easier when
we use per-image semaphores.
Diffstat (limited to 'libavfilter/vulkan.c')
-rw-r--r-- | libavfilter/vulkan.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/libavfilter/vulkan.c b/libavfilter/vulkan.c index c103440529..ff76ab15e9 100644 --- a/libavfilter/vulkan.c +++ b/libavfilter/vulkan.c @@ -390,28 +390,32 @@ int ff_vk_add_exec_dep(AVFilterContext *avctx, FFVkExecContext *e, AVFrame *frame, VkPipelineStageFlagBits in_wait_dst_flag) { AVVkFrame *f = (AVVkFrame *)frame->data[0]; + AVHWFramesContext *fc = (AVHWFramesContext *)frame->hw_frames_ctx->data; + int planes = av_pix_fmt_count_planes(fc->sw_format); - e->sem_wait = av_fast_realloc(e->sem_wait, &e->sem_wait_alloc, - (e->sem_wait_cnt + 1)*sizeof(*e->sem_wait)); - if (!e->sem_wait) - return AVERROR(ENOMEM); + for (int i = 0; i < planes; i++) { + e->sem_wait = av_fast_realloc(e->sem_wait, &e->sem_wait_alloc, + (e->sem_wait_cnt + 1)*sizeof(*e->sem_wait)); + if (!e->sem_wait) + return AVERROR(ENOMEM); - e->sem_wait_dst = av_fast_realloc(e->sem_wait_dst, &e->sem_wait_dst_alloc, - (e->sem_wait_cnt + 1)*sizeof(*e->sem_wait_dst)); - if (!e->sem_wait_dst) - return AVERROR(ENOMEM); + e->sem_wait_dst = av_fast_realloc(e->sem_wait_dst, &e->sem_wait_dst_alloc, + (e->sem_wait_cnt + 1)*sizeof(*e->sem_wait_dst)); + if (!e->sem_wait_dst) + return AVERROR(ENOMEM); - e->sem_sig = av_fast_realloc(e->sem_sig, &e->sem_sig_alloc, - (e->sem_sig_cnt + 1)*sizeof(*e->sem_sig)); - if (!e->sem_sig) - return AVERROR(ENOMEM); + e->sem_sig = av_fast_realloc(e->sem_sig, &e->sem_sig_alloc, + (e->sem_sig_cnt + 1)*sizeof(*e->sem_sig)); + if (!e->sem_sig) + return AVERROR(ENOMEM); - e->sem_wait[e->sem_wait_cnt] = f->sem; - e->sem_wait_dst[e->sem_wait_cnt] = in_wait_dst_flag; - e->sem_wait_cnt++; + e->sem_wait[e->sem_wait_cnt] = f->sem[i]; + e->sem_wait_dst[e->sem_wait_cnt] = in_wait_dst_flag; + e->sem_wait_cnt++; - e->sem_sig[e->sem_sig_cnt] = f->sem; - e->sem_sig_cnt++; + e->sem_sig[e->sem_sig_cnt] = f->sem[i]; + e->sem_sig_cnt++; + } return 0; } |