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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user