From 29c6d79a5f984b1f87735e603da34132ac5e67d4 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=utf8 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: (cherry picked from commit 36ef75b6eb924cf5ebfb09834067d2519d080ca8) --- .pick_status.json | 2 +- src/broadcom/vulkan/v3dv_event.c | 84 +++++++++++++++++++++------------------- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 9b50768..6c1acaa 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1552,7 +1552,7 @@ "description": "v3dv: vkCmdWaitEvents2 takes an array of VkDependencyInfo", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "e6884df088a1e172cd87956fe9afdac63069eb2c" }, diff --git a/src/broadcom/vulkan/v3dv_event.c b/src/broadcom/vulkan/v3dv_event.c index 8d57849..628f757 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, + }; - 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; - } + v3dv_cmd_buffer_emit_pipeline_barrier(cmd_buffer, &new_info); - 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; + if (memory_barriers) + free(memory_barriers); + if (buffer_barriers) + free(buffer_barriers); + if (image_barriers) + free(image_barriers); } - - 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); } -- 2.7.4