/* 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);
}