This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit f956e9817cff123a33e687ce1e203ebe37c5efe5 Author: Lynne <[email protected]> AuthorDate: Wed Dec 24 01:08:53 2025 +0100 Commit: Lynne <[email protected]> CommitDate: Wed Dec 31 15:00:46 2025 +0100 ffv1enc_vulkan: use ff_vk_buf_barrier() --- libavcodec/ffv1enc_vulkan.c | 222 +++++++++++++++++++------------------------- 1 file changed, 94 insertions(+), 128 deletions(-) diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c index 1dc6aa8e90..3f3da6bbae 100644 --- a/libavcodec/ffv1enc_vulkan.c +++ b/libavcodec/ffv1enc_vulkan.c @@ -414,41 +414,16 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx, VK_NULL_HANDLE); /* Add a buffer barrier between previous and current frame */ - if (!f->key_frame) { - buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) { - .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2, - .srcStageMask = slice_data_buf->stage, - .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, - .srcAccessMask = slice_data_buf->access, - .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_data_buf->buf, - .size = VK_WHOLE_SIZE, - .offset = 0, - }; - } - - if (fv->optimize_rct) { - RET(run_rct_search(avctx, exec, - src, src_views, - slice_data_buf, slice_data_size)); - - buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) { - .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2, - .srcStageMask = slice_data_buf->stage, - .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, - .srcAccessMask = slice_data_buf->access, - .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .buffer = slice_data_buf->buf, - .size = slice_data_size*f->slice_count, - .offset = 0, - }; - } - + if (!f->key_frame) + ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf, + ALL_COMMANDS_BIT, NONE_KHR, NONE_KHR, + COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT, + 0, slice_data_size*f->slice_count); + else + ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf, + COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT, + COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT, + 0, slice_data_size*f->slice_count); vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) { .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, .pImageMemoryBarriers = img_bar, @@ -457,9 +432,23 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx, .bufferMemoryBarrierCount = nb_buf_bar, }); nb_img_bar = 0; - if (nb_buf_bar) { - slice_data_buf->stage = buf_bar[0].dstStageMask; - slice_data_buf->access = buf_bar[0].dstAccessMask; + nb_buf_bar = 0; + + if (fv->optimize_rct) { + RET(run_rct_search(avctx, exec, + src, src_views, + slice_data_buf, slice_data_size)); + + /* Make sure the writes are visible to the setup shader */ + ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf, + COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT, + COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT, + 0, slice_data_size*f->slice_count); + vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) { + .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + .pBufferMemoryBarriers = buf_bar, + .bufferMemoryBarrierCount = nb_buf_bar, + }); nb_buf_bar = 0; } @@ -526,87 +515,78 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx, })); } - /* Setup shader modified the slice data buffer */ - buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) { - .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2, - .srcStageMask = slice_data_buf->stage, - .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, - .srcAccessMask = slice_data_buf->access, - .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_data_buf->buf, - .size = slice_data_size*f->slice_count, - .offset = 0, - }; - - if (f->key_frame || f->version > 3) { - FFv1VkResetParameters pd_reset; - - ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->reset, - 1, 0, 0, - slice_data_buf, - 0, slice_data_size*f->slice_count, - VK_FORMAT_UNDEFINED); - - /* Run setup shader */ - ff_vk_exec_bind_shader(&fv->s, exec, &fv->reset); - pd_reset = (FFv1VkResetParameters) { - .slice_state = slice_data_buf->address + f->slice_count*256, - .plane_state_size = plane_state_size, - .codec_planes = f->plane_count, - .key_frame = f->key_frame, - }; - for (int i = 0; i < f->quant_table_count; i++) - pd_reset.context_count[i] = f->context_count[i]; - - ff_vk_shader_update_push_const(&fv->s, exec, &fv->reset, - VK_SHADER_STAGE_COMPUTE_BIT, - 0, sizeof(pd_reset), &pd_reset); - - /* Sync between setup and reset shaders */ - vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) { - .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, - .pBufferMemoryBarriers = buf_bar, - .bufferMemoryBarrierCount = nb_buf_bar, - }); - slice_data_buf->stage = buf_bar[0].dstStageMask; - slice_data_buf->access = buf_bar[0].dstAccessMask; - nb_buf_bar = 0; + /* Sync between setup and reset shaders */ + ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf, + COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT, + COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR, + 0, slice_data_size*f->slice_count); + /* Prepare the probabilities */ + if (!f->key_frame) + ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf, + ALL_COMMANDS_BIT, NONE_KHR, NONE_KHR, + COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR, + slice_data_size*f->slice_count, VK_WHOLE_SIZE); + else + ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf, + COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT, + COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR, + slice_data_size*f->slice_count, VK_WHOLE_SIZE); + vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) { + .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + .pBufferMemoryBarriers = buf_bar, + .bufferMemoryBarrierCount = nb_buf_bar, + }); + nb_buf_bar = 0; - vk->CmdDispatch(exec->buf, fv->ctx.num_h_slices, fv->ctx.num_v_slices, - f->plane_count); - } + /* Run reset shader */ + FFv1VkResetParameters pd_reset; + ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->reset, + 1, 0, 0, + slice_data_buf, + 0, slice_data_size*f->slice_count, + VK_FORMAT_UNDEFINED); + ff_vk_exec_bind_shader(&fv->s, exec, &fv->reset); + pd_reset = (FFv1VkResetParameters) { + .slice_state = slice_data_buf->address + f->slice_count*256, + .plane_state_size = plane_state_size, + .codec_planes = f->plane_count, + .key_frame = f->key_frame, + }; + for (int i = 0; i < f->quant_table_count; i++) + pd_reset.context_count[i] = f->context_count[i]; - /* If the reset shader ran, insert a barrier now. */ - if (f->key_frame || f->version > 3) { - /* Reset shader modified the slice data buffer */ - buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) { - .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2, - .srcStageMask = slice_data_buf->stage, - .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, - .srcAccessMask = slice_data_buf->access, - .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_data_buf->buf, - .size = slice_data_buf->size - slice_data_size*f->slice_count, - .offset = slice_data_size*f->slice_count, - }; - } + ff_vk_shader_update_push_const(&fv->s, exec, &fv->reset, + VK_SHADER_STAGE_COMPUTE_BIT, + 0, sizeof(pd_reset), &pd_reset); + vk->CmdDispatch(exec->buf, fv->ctx.num_h_slices, fv->ctx.num_v_slices, + f->plane_count); + + /* Sync between reset and encode shaders */ + ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf, + COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR, + COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT, + 0, slice_data_size*f->slice_count); + ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf, + COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR, + COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT, + slice_data_size*f->slice_count, VK_WHOLE_SIZE); + ff_vk_buf_barrier(buf_bar[nb_buf_bar++], results_data_buf, + ALL_COMMANDS_BIT, NONE_KHR, NONE_KHR, + COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR, + 0, VK_WHOLE_SIZE); + ff_vk_buf_barrier(buf_bar[nb_buf_bar++], out_data_buf, + ALL_COMMANDS_BIT, NONE_KHR, NONE_KHR, + COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR, + 0, VK_WHOLE_SIZE); - if (fv->is_rgb) { + if (fv->is_rgb) ff_vk_frame_barrier(&fv->s, exec, tmp, img_bar, &nb_img_bar, VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL, VK_QUEUE_FAMILY_IGNORED); - } - /* Final barrier before encoding */ vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) { .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, .pImageMemoryBarriers = img_bar, @@ -615,11 +595,7 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx, .bufferMemoryBarrierCount = nb_buf_bar, }); nb_img_bar = 0; - if (nb_buf_bar) { - slice_data_buf->stage = buf_bar[0].dstStageMask; - slice_data_buf->access = buf_bar[0].dstAccessMask; - nb_buf_bar = 0; - } + nb_buf_bar = 0; /* Main encode shader */ ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->enc, @@ -705,25 +681,15 @@ static int transfer_slices(AVCodecContext *avctx, mapped_ref = NULL; /* Ownership passed */ /* Ensure the output buffer is finished */ - buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) { - .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2, - .srcStageMask = out_data_buf->stage, - .dstStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT, - .srcAccessMask = out_data_buf->access, - .dstAccessMask = VK_ACCESS_2_TRANSFER_READ_BIT, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .buffer = out_data_buf->buf, - .size = VK_WHOLE_SIZE, - .offset = 0, - }; + ff_vk_buf_barrier(buf_bar[nb_buf_bar++], out_data_buf, + COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR, + TRANSFER_BIT, TRANSFER_READ_BIT, NONE_KHR, + 0, VK_WHOLE_SIZE); vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) { .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, .pBufferMemoryBarriers = buf_bar, .bufferMemoryBarrierCount = nb_buf_bar, }); - out_data_buf->stage = buf_bar[0].dstStageMask; - out_data_buf->access = buf_bar[0].dstAccessMask; nb_buf_bar = 0; for (int i = 0; i < nb_regions; i++) _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
