1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

vulkan_ffv1: fix reset shader dependencies

Without a barrier upfront, the reset shader may read data fields not
yet set by the setup shader.
This commit is contained in:
Lynne
2025-04-05 18:17:29 +00:00
parent b72ada0a96
commit 6111aef533

View File

@ -375,31 +375,29 @@ static int vk_ffv1_end_frame(AVCodecContext *avctx)
fp->tmp_data = NULL;
/* Entry barrier for the slice state */
if (!(f->picture.f->flags & AV_FRAME_FLAG_KEY)) {
buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
.srcStageMask = slice_state->stage,
.dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
.srcAccessMask = slice_state->access,
.dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
.dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.buffer = slice_state->buf,
.offset = 0,
.size = VK_WHOLE_SIZE,
.size = fp->slice_data_size*f->slice_count,
};
}
vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
.pBufferMemoryBarriers = buf_bar,
.bufferMemoryBarrierCount = nb_buf_bar,
});
if (nb_buf_bar) {
slice_state->stage = buf_bar[1].dstStageMask;
slice_state->access = buf_bar[1].dstAccessMask;
slice_state->stage = buf_bar[0].dstStageMask;
slice_state->access = buf_bar[0].dstAccessMask;
nb_buf_bar = 0;
}
nb_img_bar = 0;
/* Setup shader */
ff_vk_shader_update_desc_buffer(&ctx->s, exec, &fv->setup,