summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Seurer <konstantin.seurer@gmail.com>2024-04-24 11:25:46 +0200
committerEric Engestrom <eric@engestrom.ch>2024-04-30 18:47:28 +0200
commit39e6ab2483fe33836089ef5300bf6b9c68a087f6 (patch)
treea29f98f35d4f172a5261bde682980cbfdb32cbea
parent7ed240c627621820c2f1fb3f7cf1b46c3d75e877 (diff)
radv: Handle all dependencies of CmdWaitEvents2
The spec describes pDependencyInfos as an array with eventCount elements. cc: mesa-stable Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10579 Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28896> (cherry picked from commit d6c9b1d03fd80935131dd93968312eec11a2f38e)
-rw-r--r--.pick_status.json2
-rw-r--r--src/amd/vulkan/radv_cmd_buffer.c86
2 files changed, 49 insertions, 39 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 1cee26aff54..d89d082445a 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1514,7 +1514,7 @@
"description": "radv: Handle all dependencies of CmdWaitEvents2",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": null,
"notes": null
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index ffa1719ba43..fce095af99b 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -10595,7 +10595,8 @@ radv_cp_dma_wait_for_stages(struct radv_cmd_buffer *cmd_buffer, VkPipelineStageF
}
static void
-radv_barrier(struct radv_cmd_buffer *cmd_buffer, const VkDependencyInfo *dep_info, enum rgp_barrier_reason reason)
+radv_barrier(struct radv_cmd_buffer *cmd_buffer, uint32_t dep_count, const VkDependencyInfo *dep_infos,
+ enum rgp_barrier_reason reason)
{
enum radv_cmd_flush_bits src_flush_bits = 0;
enum radv_cmd_flush_bits dst_flush_bits = 0;
@@ -10607,27 +10608,31 @@ radv_barrier(struct radv_cmd_buffer *cmd_buffer, const VkDependencyInfo *dep_inf
radv_describe_barrier_start(cmd_buffer, reason);
- for (uint32_t i = 0; i < dep_info->memoryBarrierCount; i++) {
- src_stage_mask |= dep_info->pMemoryBarriers[i].srcStageMask;
- src_flush_bits |= radv_src_access_flush(cmd_buffer, dep_info->pMemoryBarriers[i].srcAccessMask, NULL);
- dst_stage_mask |= dep_info->pMemoryBarriers[i].dstStageMask;
- dst_flush_bits |= radv_dst_access_flush(cmd_buffer, dep_info->pMemoryBarriers[i].dstAccessMask, NULL);
- }
+ for (uint32_t dep_idx = 0; dep_idx < dep_count; dep_idx++) {
+ const VkDependencyInfo *dep_info = &dep_infos[dep_idx];
- for (uint32_t i = 0; i < dep_info->bufferMemoryBarrierCount; i++) {
- src_stage_mask |= dep_info->pBufferMemoryBarriers[i].srcStageMask;
- src_flush_bits |= radv_src_access_flush(cmd_buffer, dep_info->pBufferMemoryBarriers[i].srcAccessMask, NULL);
- dst_stage_mask |= dep_info->pBufferMemoryBarriers[i].dstStageMask;
- dst_flush_bits |= radv_dst_access_flush(cmd_buffer, dep_info->pBufferMemoryBarriers[i].dstAccessMask, NULL);
- }
+ for (uint32_t i = 0; i < dep_info->memoryBarrierCount; i++) {
+ src_stage_mask |= dep_info->pMemoryBarriers[i].srcStageMask;
+ src_flush_bits |= radv_src_access_flush(cmd_buffer, dep_info->pMemoryBarriers[i].srcAccessMask, NULL);
+ dst_stage_mask |= dep_info->pMemoryBarriers[i].dstStageMask;
+ dst_flush_bits |= radv_dst_access_flush(cmd_buffer, dep_info->pMemoryBarriers[i].dstAccessMask, NULL);
+ }
+
+ for (uint32_t i = 0; i < dep_info->bufferMemoryBarrierCount; i++) {
+ src_stage_mask |= dep_info->pBufferMemoryBarriers[i].srcStageMask;
+ src_flush_bits |= radv_src_access_flush(cmd_buffer, dep_info->pBufferMemoryBarriers[i].srcAccessMask, NULL);
+ dst_stage_mask |= dep_info->pBufferMemoryBarriers[i].dstStageMask;
+ dst_flush_bits |= radv_dst_access_flush(cmd_buffer, dep_info->pBufferMemoryBarriers[i].dstAccessMask, NULL);
+ }
- for (uint32_t i = 0; i < dep_info->imageMemoryBarrierCount; i++) {
- RADV_FROM_HANDLE(radv_image, image, dep_info->pImageMemoryBarriers[i].image);
+ for (uint32_t i = 0; i < dep_info->imageMemoryBarrierCount; i++) {
+ VK_FROM_HANDLE(radv_image, image, dep_info->pImageMemoryBarriers[i].image);
- src_stage_mask |= dep_info->pImageMemoryBarriers[i].srcStageMask;
- src_flush_bits |= radv_src_access_flush(cmd_buffer, dep_info->pImageMemoryBarriers[i].srcAccessMask, image);
- dst_stage_mask |= dep_info->pImageMemoryBarriers[i].dstStageMask;
- dst_flush_bits |= radv_dst_access_flush(cmd_buffer, dep_info->pImageMemoryBarriers[i].dstAccessMask, image);
+ src_stage_mask |= dep_info->pImageMemoryBarriers[i].srcStageMask;
+ src_flush_bits |= radv_src_access_flush(cmd_buffer, dep_info->pImageMemoryBarriers[i].srcAccessMask, image);
+ dst_stage_mask |= dep_info->pImageMemoryBarriers[i].dstStageMask;
+ dst_flush_bits |= radv_dst_access_flush(cmd_buffer, dep_info->pImageMemoryBarriers[i].dstAccessMask, image);
+ }
}
/* The Vulkan spec 1.1.98 says:
@@ -10647,26 +10652,31 @@ radv_barrier(struct radv_cmd_buffer *cmd_buffer, const VkDependencyInfo *dep_inf
radv_gang_barrier(cmd_buffer, src_stage_mask, 0);
- for (uint32_t i = 0; i < dep_info->imageMemoryBarrierCount; i++) {
- RADV_FROM_HANDLE(radv_image, image, dep_info->pImageMemoryBarriers[i].image);
+ for (uint32_t dep_idx = 0; dep_idx < dep_count; dep_idx++) {
+ const VkDependencyInfo *dep_info = &dep_infos[dep_idx];
- const struct VkSampleLocationsInfoEXT *sample_locs_info =
- vk_find_struct_const(dep_info->pImageMemoryBarriers[i].pNext, SAMPLE_LOCATIONS_INFO_EXT);
- struct radv_sample_locations_state sample_locations;
+ for (uint32_t i = 0; i < dep_info->imageMemoryBarrierCount; i++) {
+ VK_FROM_HANDLE(radv_image, image, dep_info->pImageMemoryBarriers[i].image);
- if (sample_locs_info) {
- assert(image->vk.create_flags & VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT);
- sample_locations.per_pixel = sample_locs_info->sampleLocationsPerPixel;
- sample_locations.grid_size = sample_locs_info->sampleLocationGridSize;
- sample_locations.count = sample_locs_info->sampleLocationsCount;
- typed_memcpy(&sample_locations.locations[0], sample_locs_info->pSampleLocations,
- sample_locs_info->sampleLocationsCount);
- }
+ const struct VkSampleLocationsInfoEXT *sample_locs_info =
+ vk_find_struct_const(dep_info->pImageMemoryBarriers[i].pNext, SAMPLE_LOCATIONS_INFO_EXT);
+ struct radv_sample_locations_state sample_locations;
- radv_handle_image_transition(
- cmd_buffer, image, dep_info->pImageMemoryBarriers[i].oldLayout, dep_info->pImageMemoryBarriers[i].newLayout,
- dep_info->pImageMemoryBarriers[i].srcQueueFamilyIndex, dep_info->pImageMemoryBarriers[i].dstQueueFamilyIndex,
- &dep_info->pImageMemoryBarriers[i].subresourceRange, sample_locs_info ? &sample_locations : NULL);
+ if (sample_locs_info) {
+ assert(image->vk.create_flags & VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT);
+ sample_locations.per_pixel = sample_locs_info->sampleLocationsPerPixel;
+ sample_locations.grid_size = sample_locs_info->sampleLocationGridSize;
+ sample_locations.count = sample_locs_info->sampleLocationsCount;
+ typed_memcpy(&sample_locations.locations[0], sample_locs_info->pSampleLocations,
+ sample_locs_info->sampleLocationsCount);
+ }
+
+ radv_handle_image_transition(
+ cmd_buffer, image, dep_info->pImageMemoryBarriers[i].oldLayout, dep_info->pImageMemoryBarriers[i].newLayout,
+ dep_info->pImageMemoryBarriers[i].srcQueueFamilyIndex,
+ dep_info->pImageMemoryBarriers[i].dstQueueFamilyIndex, &dep_info->pImageMemoryBarriers[i].subresourceRange,
+ sample_locs_info ? &sample_locations : NULL);
+ }
}
radv_gang_barrier(cmd_buffer, 0, dst_stage_mask);
@@ -10701,7 +10711,7 @@ radv_CmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *
barrier_reason = RGP_BARRIER_EXTERNAL_CMD_PIPELINE_BARRIER;
}
- radv_barrier(cmd_buffer, pDependencyInfo, barrier_reason);
+ radv_barrier(cmd_buffer, 1, pDependencyInfo, barrier_reason);
}
static void
@@ -10823,7 +10833,7 @@ radv_CmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const Vk
assert(cmd_buffer->cs->cdw <= cdw_max);
}
- radv_barrier(cmd_buffer, pDependencyInfos, RGP_BARRIER_EXTERNAL_CMD_WAIT_EVENTS);
+ radv_barrier(cmd_buffer, eventCount, pDependencyInfos, RGP_BARRIER_EXTERNAL_CMD_WAIT_EVENTS);
}
void