From 36ef75b6eb924cf5ebfb09834067d2519d080ca8 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Fri, 4 Nov 2022 09:01:01 +0100 Subject: [PATCH] v3dv: vkCmdWaitEvents2 takes an array of VkDependencyInfo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We have been incorrectly assuming there was just one for all the events, apparently CTS never uses more than one event. Fixes: e6884df088 ('v3dv: fix event synchronization') Reviewed-by: Alejandro PiƱeiro Part-of: --- src/broadcom/vulkan/v3dv_event.c | 88 +++++++++++++++++--------------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_event.c b/src/broadcom/vulkan/v3dv_event.c index 8d578495b39..628f7579292 100644 --- a/src/broadcom/vulkan/v3dv_event.c +++ b/src/broadcom/vulkan/v3dv_event.c @@ -685,47 +685,51 @@ v3dv_CmdWaitEvents2(VkCommandBuffer commandBuffer, /* We need to add the compute stage to the srcStageMask of all dependencies, * so let's go ahead and patch the dependency info we receive. */ - uint32_t memory_barrier_count = pDependencyInfo->memoryBarrierCount; - VkMemoryBarrier2 *memory_barriers = memory_barrier_count ? - malloc(memory_barrier_count * sizeof(memory_barriers[0])): NULL; - for (int i = 0; i < memory_barrier_count; i++) { - memory_barriers[i] = pDependencyInfo->pMemoryBarriers[i]; - memory_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT; + for (int e = 0; e < eventCount; e++) { + const VkDependencyInfo *info = &pDependencyInfo[e]; + + uint32_t memory_barrier_count = info->memoryBarrierCount; + VkMemoryBarrier2 *memory_barriers = memory_barrier_count ? + malloc(memory_barrier_count * sizeof(memory_barriers[0])): NULL; + for (int i = 0; i < memory_barrier_count; i++) { + memory_barriers[i] = info->pMemoryBarriers[i]; + memory_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT; + } + + uint32_t buffer_barrier_count = info->bufferMemoryBarrierCount; + VkBufferMemoryBarrier2 *buffer_barriers = buffer_barrier_count ? + malloc(buffer_barrier_count * sizeof(buffer_barriers[0])): NULL; + for (int i = 0; i < buffer_barrier_count; i++) { + buffer_barriers[i] = info->pBufferMemoryBarriers[i]; + buffer_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT; + } + + uint32_t image_barrier_count = info->imageMemoryBarrierCount; + VkImageMemoryBarrier2 *image_barriers = image_barrier_count ? + malloc(image_barrier_count * sizeof(image_barriers[0])): NULL; + for (int i = 0; i < image_barrier_count; i++) { + image_barriers[i] = info->pImageMemoryBarriers[i]; + image_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT; + } + + VkDependencyInfo new_info = { + .sType = info->sType, + .dependencyFlags = info->dependencyFlags, + .memoryBarrierCount = memory_barrier_count, + .pMemoryBarriers = memory_barriers, + .bufferMemoryBarrierCount = buffer_barrier_count, + .pBufferMemoryBarriers = buffer_barriers, + .imageMemoryBarrierCount = image_barrier_count, + .pImageMemoryBarriers = image_barriers, + }; + + v3dv_cmd_buffer_emit_pipeline_barrier(cmd_buffer, &new_info); + + if (memory_barriers) + free(memory_barriers); + if (buffer_barriers) + free(buffer_barriers); + if (image_barriers) + free(image_barriers); } - - uint32_t buffer_barrier_count = pDependencyInfo->bufferMemoryBarrierCount; - VkBufferMemoryBarrier2 *buffer_barriers = buffer_barrier_count ? - malloc(buffer_barrier_count * sizeof(buffer_barriers[0])): NULL; - for (int i = 0; i < buffer_barrier_count; i++) { - buffer_barriers[i] = pDependencyInfo->pBufferMemoryBarriers[i]; - buffer_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT; - } - - uint32_t image_barrier_count = pDependencyInfo->imageMemoryBarrierCount; - VkImageMemoryBarrier2 *image_barriers = image_barrier_count ? - malloc(image_barrier_count * sizeof(image_barriers[0])): NULL; - for (int i = 0; i < image_barrier_count; i++) { - image_barriers[i] = pDependencyInfo->pImageMemoryBarriers[i]; - image_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT; - } - - VkDependencyInfo info = { - .sType = pDependencyInfo->sType, - .dependencyFlags = pDependencyInfo->dependencyFlags, - .memoryBarrierCount = memory_barrier_count, - .pMemoryBarriers = memory_barriers, - .bufferMemoryBarrierCount = buffer_barrier_count, - .pBufferMemoryBarriers = buffer_barriers, - .imageMemoryBarrierCount = image_barrier_count, - .pImageMemoryBarriers = image_barriers, - }; - - v3dv_cmd_buffer_emit_pipeline_barrier(cmd_buffer, &info); - - if (memory_barriers) - free(memory_barriers); - if (buffer_barriers) - free(buffer_barriers); - if (image_barriers) - free(image_barriers); }