v3dv: vkCmdWaitEvents2 takes an array of VkDependencyInfo

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 <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19518>
This commit is contained in:
Iago Toral Quiroga 2022-11-04 09:01:01 +01:00 committed by Marge Bot
parent dc08875415
commit 36ef75b6eb

View file

@ -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);
}