You've already forked FFmpeg
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:
@ -375,31 +375,29 @@ static int vk_ffv1_end_frame(AVCodecContext *avctx)
|
|||||||
fp->tmp_data = NULL;
|
fp->tmp_data = NULL;
|
||||||
|
|
||||||
/* Entry barrier for the slice state */
|
/* Entry barrier for the slice state */
|
||||||
if (!(f->picture.f->flags & AV_FRAME_FLAG_KEY)) {
|
|
||||||
buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
|
buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
|
||||||
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
|
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
|
||||||
.srcStageMask = slice_state->stage,
|
.srcStageMask = slice_state->stage,
|
||||||
.dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
|
.dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
|
||||||
.srcAccessMask = slice_state->access,
|
.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,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.buffer = slice_state->buf,
|
.buffer = slice_state->buf,
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = VK_WHOLE_SIZE,
|
.size = fp->slice_data_size*f->slice_count,
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
|
vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
|
||||||
.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
|
.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
|
||||||
.pBufferMemoryBarriers = buf_bar,
|
.pBufferMemoryBarriers = buf_bar,
|
||||||
.bufferMemoryBarrierCount = nb_buf_bar,
|
.bufferMemoryBarrierCount = nb_buf_bar,
|
||||||
});
|
});
|
||||||
if (nb_buf_bar) {
|
slice_state->stage = buf_bar[0].dstStageMask;
|
||||||
slice_state->stage = buf_bar[1].dstStageMask;
|
slice_state->access = buf_bar[0].dstAccessMask;
|
||||||
slice_state->access = buf_bar[1].dstAccessMask;
|
|
||||||
nb_buf_bar = 0;
|
nb_buf_bar = 0;
|
||||||
}
|
nb_img_bar = 0;
|
||||||
|
|
||||||
/* Setup shader */
|
/* Setup shader */
|
||||||
ff_vk_shader_update_desc_buffer(&ctx->s, exec, &fv->setup,
|
ff_vk_shader_update_desc_buffer(&ctx->s, exec, &fv->setup,
|
||||||
|
Reference in New Issue
Block a user