panvk: Take VK_DEPENDENCY_ASYMMETRIC_EVENT_BIT_KHR into account

VK_DEPENDENCY_ASYMMETRIC_EVENT_BIT_KHR makes vkCmdSetEvent2 behaves like
vkCmdSetEvent, let's handle that appropriately.

This fixes failures on VKCTS main with
"dEQP-VK.synchronization2.op.single_queue.event.*_maintenance9".

Signed-off-by: Mary Guillemard <mary.guillemard@collabora.com>
Fixes: b8ccbc414a ("panvk: enable KHR_maintenance9")
Reviewed-by: Christoph Pillmayer <christoph.pillmayer@arm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37396>
This commit is contained in:
Mary Guillemard
2025-09-15 16:43:08 +00:00
committed by Marge Bot
parent 9dcc7c0d0a
commit 6d00e95b2e
3 changed files with 28 additions and 11 deletions
+2 -1
View File
@@ -483,7 +483,8 @@ void panvk_per_arch(add_cs_deps)(
struct panvk_cmd_buffer *cmdbuf,
enum panvk_barrier_stage barrier_stage,
const VkDependencyInfo *in,
struct panvk_cs_deps *out);
struct panvk_cs_deps *out,
bool is_set_event);
VkResult panvk_per_arch(cmd_prepare_exec_cmd_for_draws)(
struct panvk_cmd_buffer *primary, struct panvk_cmd_buffer *secondary);
+19 -3
View File
@@ -553,12 +553,28 @@ void
panvk_per_arch(add_cs_deps)(struct panvk_cmd_buffer *cmdbuf,
enum panvk_barrier_stage barrier_stage,
const VkDependencyInfo *in,
struct panvk_cs_deps *out)
struct panvk_cs_deps *out,
bool is_set_event)
{
bool is_asymmetric_event =
is_set_event &&
in->dependencyFlags & VK_DEPENDENCY_ASYMMETRIC_EVENT_BIT_KHR;
/* As per Vulkan spec, this should look like a vkCmdSetEvent */
assert(!is_asymmetric_event ||
(in->memoryBarrierCount == 1 && in->bufferMemoryBarrierCount == 0 &&
in->imageMemoryBarrierCount == 0));
for (uint32_t i = 0; i < in->memoryBarrierCount; i++) {
const VkMemoryBarrier2 *barrier = &in->pMemoryBarriers[i];
struct panvk_sync_scope src = {barrier->srcStageMask, barrier->srcAccessMask};
struct panvk_sync_scope dst = {barrier->dstStageMask, barrier->dstAccessMask};
/* In case of asymmetric event, we need to use the src stages mask just
* like vkCmdSetEvent */
if (is_asymmetric_event)
dst.stages = src.stages;
normalize_dependency(&src, &dst, (struct panvk_sync_scope){0},
VK_QUEUE_FAMILY_IGNORED,
VK_QUEUE_FAMILY_IGNORED,
@@ -728,7 +744,7 @@ panvk_per_arch(CmdPipelineBarrier2)(VkCommandBuffer commandBuffer,
struct panvk_cs_deps deps = {0};
panvk_per_arch(add_cs_deps)(cmdbuf, PANVK_BARRIER_STAGE_FIRST, pDependencyInfo, &deps);
panvk_per_arch(add_cs_deps)(cmdbuf, PANVK_BARRIER_STAGE_FIRST, pDependencyInfo, &deps, false);
if (deps.needs_draw_flush)
panvk_per_arch(cmd_flush_draws)(cmdbuf);
@@ -746,7 +762,7 @@ panvk_per_arch(CmdPipelineBarrier2)(VkCommandBuffer commandBuffer,
panvk_per_arch(add_cs_deps)(
cmdbuf, PANVK_BARRIER_STAGE_AFTER_LAYOUT_TRANSITION,
pDependencyInfo, &trans_deps);
pDependencyInfo, &trans_deps, false);
assert(!trans_deps.needs_draw_flush);
+7 -7
View File
@@ -29,7 +29,7 @@ panvk_per_arch(CmdResetEvent2)(VkCommandBuffer commandBuffer, VkEvent _event,
};
struct panvk_cs_deps deps = {0};
panvk_per_arch(add_cs_deps)(cmdbuf, PANVK_BARRIER_STAGE_FIRST, &info, &deps);
panvk_per_arch(add_cs_deps)(cmdbuf, PANVK_BARRIER_STAGE_FIRST, &info, &deps, false);
for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) {
struct cs_builder *b = panvk_get_cs_builder(cmdbuf, i);
@@ -67,7 +67,7 @@ panvk_per_arch(CmdSetEvent2)(VkCommandBuffer commandBuffer, VkEvent _event,
VK_FROM_HANDLE(panvk_event, event, _event);
struct panvk_cs_deps deps = {0};
panvk_per_arch(add_cs_deps)(cmdbuf, PANVK_BARRIER_STAGE_FIRST, pDependencyInfo, &deps);
panvk_per_arch(add_cs_deps)(cmdbuf, PANVK_BARRIER_STAGE_FIRST, pDependencyInfo, &deps, true);
if (deps.needs_draw_flush)
panvk_per_arch(cmd_flush_draws)(cmdbuf);
@@ -107,13 +107,13 @@ panvk_per_arch(CmdSetEvent2)(VkCommandBuffer commandBuffer, VkEvent _event,
}
static void
cmd_wait_event(struct panvk_cmd_buffer *cmdbuf,
struct panvk_event *event, const VkDependencyInfo *info,
struct panvk_cs_deps *trans_deps, bool *needs_trans_barrier)
cmd_wait_event(struct panvk_cmd_buffer *cmdbuf, struct panvk_event *event,
const VkDependencyInfo *info, struct panvk_cs_deps *trans_deps,
bool *needs_trans_barrier)
{
struct panvk_cs_deps deps = {0};
panvk_per_arch(add_cs_deps)(cmdbuf, PANVK_BARRIER_STAGE_FIRST, info, &deps);
panvk_per_arch(add_cs_deps)(cmdbuf, PANVK_BARRIER_STAGE_FIRST, info, &deps, false);
for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) {
struct cs_builder *b = panvk_get_cs_builder(cmdbuf, i);
@@ -142,7 +142,7 @@ cmd_wait_event(struct panvk_cmd_buffer *cmdbuf,
panvk_per_arch(add_cs_deps)(
cmdbuf, PANVK_BARRIER_STAGE_AFTER_LAYOUT_TRANSITION,
info, trans_deps);
info, trans_deps, false);
*needs_trans_barrier = true;
}
}