mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 15:38:09 +02:00
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> (cherry picked from commit36ef75b6eb)
This commit is contained in:
parent
5a5c33ee95
commit
29c6d79a5f
2 changed files with 47 additions and 43 deletions
|
|
@ -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"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue