panvk/csf: change get_cs_deps to be add_cs_deps

Make get_cs_deps accumulate the dependencies. This is useful when
implementing layout transitions. Layout transitions away from
UNDEFINED are implemented with a compute dispatch sandwiched
in-between src and dst, specified in the image barrier. When
implementing device event wait and the event dependency needs a
layout transition, we can defer emitting the barrier that syncs
layout transition dispatches with dst until after we have emitted
all dispatches, avoiding sync between the said transition
dispatches.

Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36176>
This commit is contained in:
Caterina Shablia
2025-07-29 19:50:57 +00:00
parent e6d2a426e6
commit 8e3fb838ac
3 changed files with 11 additions and 13 deletions
+1 -1
View File
@@ -468,7 +468,7 @@ void panvk_per_arch(cs_next_iter_sb)(struct panvk_cmd_buffer *cmdbuf,
enum panvk_subqueue_id subqueue,
struct cs_index scratch_regs);
void panvk_per_arch(get_cs_deps)(struct panvk_cmd_buffer *cmdbuf,
void panvk_per_arch(add_cs_deps)(struct panvk_cmd_buffer *cmdbuf,
const VkDependencyInfo *in,
struct panvk_cs_deps *out);
@@ -526,12 +526,10 @@ normalize_dependency(VkPipelineStageFlags2 *src_stages,
}
void
panvk_per_arch(get_cs_deps)(struct panvk_cmd_buffer *cmdbuf,
panvk_per_arch(add_cs_deps)(struct panvk_cmd_buffer *cmdbuf,
const VkDependencyInfo *in,
struct panvk_cs_deps *out)
{
memset(out, 0, sizeof(*out));
for (uint32_t i = 0; i < in->memoryBarrierCount; i++) {
const VkMemoryBarrier2 *barrier = &in->pMemoryBarriers[i];
VkPipelineStageFlags2 src_stages = barrier->srcStageMask;
@@ -695,7 +693,7 @@ panvk_per_arch(CmdPipelineBarrier2)(VkCommandBuffer commandBuffer,
const VkDependencyInfo *pDependencyInfo)
{
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
struct panvk_cs_deps deps;
struct panvk_cs_deps deps = {0};
/* Intra render pass barriers can be skipped iff we're inside a render
* pass. */
@@ -703,7 +701,7 @@ panvk_per_arch(CmdPipelineBarrier2)(VkCommandBuffer commandBuffer,
(pDependencyInfo->dependencyFlags & VK_DEPENDENCY_BY_REGION_BIT))
return;
panvk_per_arch(get_cs_deps)(cmdbuf, pDependencyInfo, &deps);
panvk_per_arch(add_cs_deps)(cmdbuf, pDependencyInfo, &deps);
if (deps.needs_draw_flush)
panvk_per_arch(cmd_flush_draws)(cmdbuf);
+7 -7
View File
@@ -18,7 +18,7 @@ panvk_per_arch(CmdResetEvent2)(VkCommandBuffer commandBuffer, VkEvent _event,
VK_FROM_HANDLE(panvk_event, event, _event);
/* Wrap stageMask with a VkDependencyInfo object so we can re-use
* get_cs_deps(). */
* add_cs_deps(). */
const VkMemoryBarrier2 barrier = {
.srcStageMask = stageMask,
};
@@ -26,9 +26,9 @@ panvk_per_arch(CmdResetEvent2)(VkCommandBuffer commandBuffer, VkEvent _event,
.memoryBarrierCount = 1,
.pMemoryBarriers = &barrier,
};
struct panvk_cs_deps deps;
struct panvk_cs_deps deps = {0};
panvk_per_arch(get_cs_deps)(cmdbuf, &info, &deps);
panvk_per_arch(add_cs_deps)(cmdbuf, &info, &deps);
for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) {
struct cs_builder *b = panvk_get_cs_builder(cmdbuf, i);
@@ -64,9 +64,9 @@ panvk_per_arch(CmdSetEvent2)(VkCommandBuffer commandBuffer, VkEvent _event,
{
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
VK_FROM_HANDLE(panvk_event, event, _event);
struct panvk_cs_deps deps;
struct panvk_cs_deps deps = {0};
panvk_per_arch(get_cs_deps)(cmdbuf, pDependencyInfo, &deps);
panvk_per_arch(add_cs_deps)(cmdbuf, pDependencyInfo, &deps);
if (deps.needs_draw_flush)
panvk_per_arch(cmd_flush_draws)(cmdbuf);
@@ -109,9 +109,9 @@ static void
cmd_wait_event(struct panvk_cmd_buffer *cmdbuf, struct panvk_event *event,
const VkDependencyInfo *info)
{
struct panvk_cs_deps deps;
struct panvk_cs_deps deps = {0};
panvk_per_arch(get_cs_deps)(cmdbuf, info, &deps);
panvk_per_arch(add_cs_deps)(cmdbuf, info, &deps);
for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) {
struct cs_builder *b = panvk_get_cs_builder(cmdbuf, i);