Discussion:
[Mesa-dev] [PATCH 1/8] radv: don't flush src stages when dstStageMask == BOTTOM_OF_PIPE
Fredrik Höglund
2018-06-26 21:49:29 UTC
Permalink
The Vulkan specification says:

"An execution dependency with only VK_PIPELINE_STAGE_BOTTOM_OF_-
PIPE_BIT in the destination stage mask [...] does not delay
processing of subsequent commands."

Cc: <mesa-***@lists.freedesktop.org>
Signed-off-by: Fredrik Höglund <***@kde.org>
---
src/amd/vulkan/radv_cmd_buffer.c | 3 ++-
src/amd/vulkan/radv_pass.c | 6 ++++--
2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 110a9a960a9..5bfcba28d83 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -4197,7 +4197,8 @@ void radv_CmdPipelineBarrier(
image);
}

- radv_stage_flush(cmd_buffer, srcStageMask);
+ if (destStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ radv_stage_flush(cmd_buffer, srcStageMask);
cmd_buffer->state.flush_bits |= src_flush_bits;

for (uint32_t i = 0; i < imageMemoryBarrierCount; i++) {
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 15fee444cdc..7a0dca09496 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -174,11 +174,13 @@ VkResult radv_CreateRenderPass(
for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass;
if (dst == VK_SUBPASS_EXTERNAL) {
- pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
+ if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
pass->end_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->end_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
} else {
- pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
+ if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
pass->subpasses[dst].start_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->subpasses[dst].start_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
}
--
2.17.0
Fredrik Höglund
2018-06-26 21:49:30 UTC
Permalink
A subpass can have dependencies from multiple sources, and more
than one subpass can have a dependency to external.

Cc: <mesa-***@lists.freedesktop.org>
Signed-off-by: Fredrik Höglund <***@kde.org>
---
src/amd/vulkan/radv_pass.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 7a0dca09496..c41d4c2ba92 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -175,14 +175,14 @@ VkResult radv_CreateRenderPass(
uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass;
if (dst == VK_SUBPASS_EXTERNAL) {
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
- pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
- pass->end_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
- pass->end_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
+ pass->end_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
+ pass->end_barrier.src_access_mask |= pCreateInfo->pDependencies[i].srcAccessMask;
+ pass->end_barrier.dst_access_mask |= pCreateInfo->pDependencies[i].dstAccessMask;
} else {
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
- pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
- pass->subpasses[dst].start_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
- pass->subpasses[dst].start_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
+ pass->subpasses[dst].start_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
+ pass->subpasses[dst].start_barrier.src_access_mask |= pCreateInfo->pDependencies[i].srcAccessMask;
+ pass->subpasses[dst].start_barrier.dst_access_mask |= pCreateInfo->pDependencies[i].dstAccessMask;
}
}
--
2.17.0
Bas Nieuwenhuizen
2018-06-26 23:10:38 UTC
Permalink
Post by Fredrik Höglund
A subpass can have dependencies from multiple sources, and more
than one subpass can have a dependency to external.
---
src/amd/vulkan/radv_pass.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 7a0dca09496..c41d4c2ba92 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -175,14 +175,14 @@ VkResult radv_CreateRenderPass(
uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass;
if (dst == VK_SUBPASS_EXTERNAL) {
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
- pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
- pass->end_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
- pass->end_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
+ pass->end_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
+ pass->end_barrier.src_access_mask |= pCreateInfo->pDependencies[i].srcAccessMask;
+ pass->end_barrier.dst_access_mask |= pCreateInfo->pDependencies[i].dstAccessMask;
} else {
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
- pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
- pass->subpasses[dst].start_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
- pass->subpasses[dst].start_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
+ pass->subpasses[dst].start_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
+ pass->subpasses[dst].start_barrier.src_access_mask |= pCreateInfo->pDependencies[i].srcAccessMask;
+ pass->subpasses[dst].start_barrier.dst_access_mask |= pCreateInfo->pDependencies[i].dstAccessMask;
}
}
--
2.17.0
_______________________________________________
mesa-dev mailing list
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Fredrik Höglund
2018-06-26 21:49:31 UTC
Permalink
These are not automatically performed during a render pass instance.

Cc: <mesa-***@lists.freedesktop.org>
Signed-off-by: Fredrik Höglund <***@kde.org>
---
src/amd/vulkan/radv_pass.c | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index c41d4c2ba92..2827f5f1a8d 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -172,7 +172,13 @@ VkResult radv_CreateRenderPass(
}

for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
+ uint32_t src = pCreateInfo->pDependencies[i].srcSubpass;
uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass;
+
+ /* Ignore subpass self-dependencies */
+ if (src == dst)
+ continue;
+
if (dst == VK_SUBPASS_EXTERNAL) {
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
pass->end_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
--
2.17.0
Juan A. Suarez Romero
2018-12-10 11:43:09 UTC
Permalink
Post by Fredrik Höglund
These are not automatically performed during a render pass instance.
A similar patch like this, 457ac6ce1e2 ("radv: ignore subpass self-
dependencies"), is on master, but without the @stable CC.


Unless told the contrary, I'll keep it out of 18.2 stable branch.


J.A.
Post by Fredrik Höglund
---
src/amd/vulkan/radv_pass.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index c41d4c2ba92..2827f5f1a8d 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -172,7 +172,13 @@ VkResult radv_CreateRenderPass(
}
for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
+ uint32_t src = pCreateInfo->pDependencies[i].srcSubpass;
uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass;
+
+ /* Ignore subpass self-dependencies */
+ if (src == dst)
+ continue;
+
if (dst == VK_SUBPASS_EXTERNAL) {
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
pass->end_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
Fredrik Höglund
2018-06-26 21:49:33 UTC
Permalink
Allocate the render pass with a single call to vk_zalloc2.

Signed-off-by: Fredrik Höglund <***@kde.org>
---
src/amd/vulkan/radv_pass.c | 45 +++++++++++++----------------------
src/amd/vulkan/radv_private.h | 1 -
2 files changed, 17 insertions(+), 29 deletions(-)

diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 7e6fd84af55..17dafaca071 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -38,6 +38,7 @@ VkResult radv_CreateRenderPass(
struct radv_render_pass *pass;
size_t size;
size_t attachments_offset;
+ size_t subpass_attachments_offset;
VkRenderPassMultiviewCreateInfoKHR *multiview_info = NULL;

assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO);
@@ -46,13 +47,25 @@ VkResult radv_CreateRenderPass(
size += pCreateInfo->subpassCount * sizeof(pass->subpasses[0]);
attachments_offset = size;
size += pCreateInfo->attachmentCount * sizeof(pass->attachments[0]);
+ subpass_attachments_offset = size;

- pass = vk_alloc2(&device->alloc, pAllocator, size, 8,
- VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+ uint32_t subpass_attachment_count = 0;
+ for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {
+ const VkSubpassDescription *desc = &pCreateInfo->pSubpasses[i];
+
+ subpass_attachment_count +=
+ desc->inputAttachmentCount +
+ desc->colorAttachmentCount +
+ (desc->pResolveAttachments ? desc->colorAttachmentCount : 0) +
+ (desc->pDepthStencilAttachment != NULL);
+ }
+ size += subpass_attachment_count * sizeof(VkAttachmentReference);
+
+ pass = vk_zalloc2(&device->alloc, pAllocator, size, 8,
+ VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
if (pass == NULL)
return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);

- memset(pass, 0, size);
pass->attachment_count = pCreateInfo->attachmentCount;
pass->subpass_count = pCreateInfo->subpassCount;
pass->attachments = (void *) pass + attachments_offset;
@@ -79,31 +92,8 @@ VkResult radv_CreateRenderPass(
// att->store_op = pCreateInfo->pAttachments[i].storeOp;
// att->stencil_store_op = pCreateInfo->pAttachments[i].stencilStoreOp;
}
- uint32_t subpass_attachment_count = 0;
- VkAttachmentReference *p;
- for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {
- const VkSubpassDescription *desc = &pCreateInfo->pSubpasses[i];
-
- subpass_attachment_count +=
- desc->inputAttachmentCount +
- desc->colorAttachmentCount +
- (desc->pResolveAttachments ? desc->colorAttachmentCount : 0) +
- (desc->pDepthStencilAttachment != NULL);
- }
-
- if (subpass_attachment_count) {
- pass->subpass_attachments =
- vk_alloc2(&device->alloc, pAllocator,
- subpass_attachment_count * sizeof(VkAttachmentReference), 8,
- VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
- if (pass->subpass_attachments == NULL) {
- vk_free2(&device->alloc, pAllocator, pass);
- return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
- }
- } else
- pass->subpass_attachments = NULL;

- p = pass->subpass_attachments;
+ VkAttachmentReference *p = (void *) pass + subpass_attachments_offset;
for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {
const VkSubpassDescription *desc = &pCreateInfo->pSubpasses[i];
uint32_t color_sample_count = 1, depth_sample_count = 1;
@@ -211,7 +201,6 @@ void radv_DestroyRenderPass(

if (!_pass)
return;
- vk_free2(&device->alloc, pAllocator, pass->subpass_attachments);
vk_free2(&device->alloc, pAllocator, pass);
}

diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index a202697e935..8627b3c7696 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1726,7 +1726,6 @@ struct radv_render_pass_attachment {
struct radv_render_pass {
uint32_t attachment_count;
uint32_t subpass_count;
- VkAttachmentReference * subpass_attachments;
struct radv_render_pass_attachment * attachments;
struct radv_subpass_barrier end_barrier;
struct radv_subpass subpasses[0];
--
2.17.0
Fredrik Höglund
2018-06-26 21:49:34 UTC
Permalink
No functional change.

Cc: <mesa-***@lists.freedesktop.org>
Signed-off-by: Fredrik Höglund <***@kde.org>
---
src/amd/vulkan/radv_meta_blit.c | 66 +++++++++++++++++++++++++--
src/amd/vulkan/radv_meta_blit2d.c | 66 +++++++++++++++++++++++++--
src/amd/vulkan/radv_meta_clear.c | 45 +++++++++++++++++-
src/amd/vulkan/radv_meta_decompress.c | 22 ++++++++-
src/amd/vulkan/radv_meta_fast_clear.c | 22 ++++++++-
src/amd/vulkan/radv_meta_resolve.c | 22 ++++++++-
src/amd/vulkan/radv_meta_resolve_fs.c | 22 ++++++++-
7 files changed, 253 insertions(+), 12 deletions(-)

diff --git a/src/amd/vulkan/radv_meta_blit.c b/src/amd/vulkan/radv_meta_blit.c
index a6ee0cb7e93..c8aad8b38c8 100644
--- a/src/amd/vulkan/radv_meta_blit.c
+++ b/src/amd/vulkan/radv_meta_blit.c
@@ -762,7 +762,27 @@ radv_device_init_meta_blit_color(struct radv_device *device,
.preserveAttachmentCount = 1,
.pPreserveAttachments = (uint32_t[]) { 0 },
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ },
}, &device->meta_state.alloc, &device->meta_state.blit.render_pass[key][j]);
if (result != VK_SUCCESS)
goto fail;
@@ -921,7 +941,27 @@ radv_device_init_meta_blit_depth(struct radv_device *device,
.preserveAttachmentCount = 1,
.pPreserveAttachments = (uint32_t[]) { 0 },
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ },
}, &device->meta_state.alloc, &device->meta_state.blit.depth_only_rp[ds_layout]);
if (result != VK_SUCCESS)
goto fail;
@@ -1082,7 +1122,27 @@ radv_device_init_meta_blit_stencil(struct radv_device *device,
.preserveAttachmentCount = 1,
.pPreserveAttachments = (uint32_t[]) { 0 },
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ },
}, &device->meta_state.alloc, &device->meta_state.blit.stencil_only_rp[ds_layout]);
}
if (result != VK_SUCCESS)
diff --git a/src/amd/vulkan/radv_meta_blit2d.c b/src/amd/vulkan/radv_meta_blit2d.c
index 85e2d4678e9..eed5c62b4de 100644
--- a/src/amd/vulkan/radv_meta_blit2d.c
+++ b/src/amd/vulkan/radv_meta_blit2d.c
@@ -818,7 +818,27 @@ blit2d_init_color_pipeline(struct radv_device *device,
.preserveAttachmentCount = 1,
.pPreserveAttachments = (uint32_t[]) { 0 },
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ }
}, &device->meta_state.alloc, &device->meta_state.blit2d_render_passes[fs_key][dst_layout]);
}
}
@@ -981,7 +1001,27 @@ blit2d_init_depth_only_pipeline(struct radv_device *device,
.preserveAttachmentCount = 1,
.pPreserveAttachments = (uint32_t[]) { 0 },
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ }
}, &device->meta_state.alloc, &device->meta_state.blit2d_depth_only_rp[ds_layout]);
}
}
@@ -1144,7 +1184,27 @@ blit2d_init_stencil_only_pipeline(struct radv_device *device,
.preserveAttachmentCount = 1,
.pPreserveAttachments = (uint32_t[]) { 0 },
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ }
}, &device->meta_state.alloc, &device->meta_state.blit2d_stencil_only_rp[ds_layout]);
}
}
diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c
index 2c0bb373873..6d1bcd2650a 100644
--- a/src/amd/vulkan/radv_meta_clear.c
+++ b/src/amd/vulkan/radv_meta_clear.c
@@ -229,7 +229,27 @@ create_color_renderpass(struct radv_device *device,
.preserveAttachmentCount = 1,
.pPreserveAttachments = (uint32_t[]) { 0 },
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ },
}, &device->meta_state.alloc, pass);
}

@@ -475,7 +495,28 @@ create_depthstencil_renderpass(struct radv_device *device,
.preserveAttachmentCount = 1,
.pPreserveAttachments = (uint32_t[]) { 0 },
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ },
+
}, &device->meta_state.alloc, render_pass);
}

diff --git a/src/amd/vulkan/radv_meta_decompress.c b/src/amd/vulkan/radv_meta_decompress.c
index 1a8058c7cc5..87432ded4e9 100644
--- a/src/amd/vulkan/radv_meta_decompress.c
+++ b/src/amd/vulkan/radv_meta_decompress.c
@@ -67,7 +67,27 @@ create_pass(struct radv_device *device,
.preserveAttachmentCount = 0,
.pPreserveAttachments = NULL,
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ }
},
alloc,
pass);
diff --git a/src/amd/vulkan/radv_meta_fast_clear.c b/src/amd/vulkan/radv_meta_fast_clear.c
index 041c9e44c45..c309b7f2bfa 100644
--- a/src/amd/vulkan/radv_meta_fast_clear.c
+++ b/src/amd/vulkan/radv_meta_fast_clear.c
@@ -221,7 +221,27 @@ create_pass(struct radv_device *device)
.preserveAttachmentCount = 0,
.pPreserveAttachments = NULL,
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ }
},
alloc,
&device->meta_state.fast_clear_flush.pass);
diff --git a/src/amd/vulkan/radv_meta_resolve.c b/src/amd/vulkan/radv_meta_resolve.c
index d4d3552f317..5ae8d34e95d 100644
--- a/src/amd/vulkan/radv_meta_resolve.c
+++ b/src/amd/vulkan/radv_meta_resolve.c
@@ -97,7 +97,27 @@ create_pass(struct radv_device *device, VkFormat vk_format, VkRenderPass *pass)
.preserveAttachmentCount = 0,
.pPreserveAttachments = NULL,
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ }
},
alloc,
pass);
diff --git a/src/amd/vulkan/radv_meta_resolve_fs.c b/src/amd/vulkan/radv_meta_resolve_fs.c
index ef8c1d8b1da..e4c82d29cb8 100644
--- a/src/amd/vulkan/radv_meta_resolve_fs.c
+++ b/src/amd/vulkan/radv_meta_resolve_fs.c
@@ -245,7 +245,27 @@ create_resolve_pipeline(struct radv_device *device,
.preserveAttachmentCount = 1,
.pPreserveAttachments = (uint32_t[]) { 0 },
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ },
}, &device->meta_state.alloc, rp + dst_layout);
}
--
2.17.0
Fredrik Höglund
2018-06-26 21:49:36 UTC
Permalink
Limit implicit external dependencies to accesses performed on the
attachments in a render pass instance.

Cc: <mesa-***@lists.freedesktop.org>
Signed-off-by: Fredrik Höglund <***@kde.org>
---
src/amd/vulkan/radv_pass.c | 19 +++++++------------
src/amd/vulkan/radv_private.h | 1 +
2 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 5bdaa7fd554..2f783f8b3f4 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -118,6 +118,7 @@ VkResult radv_CreateRenderPass(
pass->attachments[a].view_mask |= subpass->view_mask;
pass->attachments[a].first_subpass = MIN2(pass->attachments[a].first_subpass, i);
pass->attachments[a].last_subpass = i;
+ pass->attachments[a].access_mask |= VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
}
}
}
@@ -134,6 +135,8 @@ VkResult radv_CreateRenderPass(
pass->attachments[a].view_mask |= subpass->view_mask;
pass->attachments[a].first_subpass = MIN2(pass->attachments[a].first_subpass, i);
pass->attachments[a].last_subpass = i;
+ pass->attachments[a].access_mask |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
color_sample_count = pCreateInfo->pAttachments[a].samples;
}
}
@@ -165,6 +168,8 @@ VkResult radv_CreateRenderPass(
pass->attachments[a].view_mask |= subpass->view_mask;
pass->attachments[a].first_subpass = MIN2(pass->attachments[a].first_subpass, i);
pass->attachments[a].last_subpass = i;
+ pass->attachments[a].access_mask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
depth_sample_count = pCreateInfo->pAttachments[a].samples;
}
} else {
@@ -256,22 +261,12 @@ VkResult radv_CreateRenderPass(
/* Implicit dependency from external */
if (first_subpass != UINT32_MAX && !pass->subpasses[first_subpass].explicit_dependency_from_external) {
/* We always add the dependency to the first subpass to avoid repeating dependencies */
- pass->subpasses[0].start_barrier.dst_access_mask |=
- VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
- VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ pass->subpasses[0].start_barrier.dst_access_mask |= pass->attachments[i].access_mask;
}

/* Implicit dependency to external */
if (last_subpass != UINT32_MAX && !pass->subpasses[last_subpass].explicit_dependency_to_external) {
- pass->end_barrier.src_access_mask |=
- VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
- VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ pass->end_barrier.src_access_mask |= pass->attachments[i].access_mask;
}
}

diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index adf259981f1..faeb618292f 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1727,6 +1727,7 @@ struct radv_render_pass_attachment {
uint32_t view_mask;
uint32_t first_subpass;
uint32_t last_subpass;
+ VkAccessFlags access_mask;
};

struct radv_render_pass {
--
2.17.0
Fredrik Höglund
2018-06-26 21:56:34 UTC
Permalink
Post by Fredrik Höglund
Limit implicit external dependencies to accesses performed on the
attachments in a render pass instance.
Note that I'm not sure if we are supposed to optimize implicit dependencies
in this way. I have a similar patch that takes load/store ops into account,
and that patch causes some CTS tests to fail.
Post by Fredrik Höglund
---
src/amd/vulkan/radv_pass.c | 19 +++++++------------
src/amd/vulkan/radv_private.h | 1 +
2 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 5bdaa7fd554..2f783f8b3f4 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -118,6 +118,7 @@ VkResult radv_CreateRenderPass(
pass->attachments[a].view_mask |= subpass->view_mask;
pass->attachments[a].first_subpass = MIN2(pass->attachments[a].first_subpass, i);
pass->attachments[a].last_subpass = i;
+ pass->attachments[a].access_mask |= VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
}
}
}
@@ -134,6 +135,8 @@ VkResult radv_CreateRenderPass(
pass->attachments[a].view_mask |= subpass->view_mask;
pass->attachments[a].first_subpass = MIN2(pass->attachments[a].first_subpass, i);
pass->attachments[a].last_subpass = i;
+ pass->attachments[a].access_mask |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
color_sample_count = pCreateInfo->pAttachments[a].samples;
}
}
@@ -165,6 +168,8 @@ VkResult radv_CreateRenderPass(
pass->attachments[a].view_mask |= subpass->view_mask;
pass->attachments[a].first_subpass = MIN2(pass->attachments[a].first_subpass, i);
pass->attachments[a].last_subpass = i;
+ pass->attachments[a].access_mask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
depth_sample_count = pCreateInfo->pAttachments[a].samples;
}
} else {
@@ -256,22 +261,12 @@ VkResult radv_CreateRenderPass(
/* Implicit dependency from external */
if (first_subpass != UINT32_MAX && !pass->subpasses[first_subpass].explicit_dependency_from_external) {
/* We always add the dependency to the first subpass to avoid repeating dependencies */
- pass->subpasses[0].start_barrier.dst_access_mask |=
- VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
- VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ pass->subpasses[0].start_barrier.dst_access_mask |= pass->attachments[i].access_mask;
}
/* Implicit dependency to external */
if (last_subpass != UINT32_MAX && !pass->subpasses[last_subpass].explicit_dependency_to_external) {
- pass->end_barrier.src_access_mask |=
- VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
- VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ pass->end_barrier.src_access_mask |= pass->attachments[i].access_mask;
}
}
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index adf259981f1..faeb618292f 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1727,6 +1727,7 @@ struct radv_render_pass_attachment {
uint32_t view_mask;
uint32_t first_subpass;
uint32_t last_subpass;
+ VkAccessFlags access_mask;
};
struct radv_render_pass {
Fredrik Höglund
2018-06-26 21:49:32 UTC
Permalink
This is to avoid repeating dependencies when more than one subpass
has a dependency from external.

Cc: <mesa-***@lists.freedesktop.org>
Signed-off-by: Fredrik Höglund <***@kde.org>
---
src/amd/vulkan/radv_pass.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 2827f5f1a8d..7e6fd84af55 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -179,6 +179,10 @@ VkResult radv_CreateRenderPass(
if (src == dst)
continue;

+ if (src == VK_SUBPASS_EXTERNAL) {
+ /* Add all dependencies from external to the first subpass */
+ dst = 0;
+ }
if (dst == VK_SUBPASS_EXTERNAL) {
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
pass->end_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
--
2.17.0
Bas Nieuwenhuizen
2018-06-27 00:12:33 UTC
Permalink
Reviewed-by: Bas Nieuwenhuizen <***@basnieuwenhuizen.nl>

for patch 3-4. Not sure they should go to stable though, since they
are optimizations?
Post by Fredrik Höglund
This is to avoid repeating dependencies when more than one subpass
has a dependency from external.
---
src/amd/vulkan/radv_pass.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 2827f5f1a8d..7e6fd84af55 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -179,6 +179,10 @@ VkResult radv_CreateRenderPass(
if (src == dst)
continue;
+ if (src == VK_SUBPASS_EXTERNAL) {
+ /* Add all dependencies from external to the first subpass */
+ dst = 0;
+ }
if (dst == VK_SUBPASS_EXTERNAL) {
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
pass->end_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
--
2.17.0
_______________________________________________
mesa-dev mailing list
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Samuel Pitoiset
2018-06-27 07:46:02 UTC
Permalink
Post by Bas Nieuwenhuizen
for patch 3-4. Not sure they should go to stable though, since they
are optimizations?
Isn't the whole series for optimization purposes?
Post by Bas Nieuwenhuizen
Post by Fredrik Höglund
This is to avoid repeating dependencies when more than one subpass
has a dependency from external.
---
src/amd/vulkan/radv_pass.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 2827f5f1a8d..7e6fd84af55 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -179,6 +179,10 @@ VkResult radv_CreateRenderPass(
if (src == dst)
continue;
+ if (src == VK_SUBPASS_EXTERNAL) {
+ /* Add all dependencies from external to the first subpass */
+ dst = 0;
+ }
if (dst == VK_SUBPASS_EXTERNAL) {
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
pass->end_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
--
2.17.0
_______________________________________________
mesa-dev mailing list
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Bas Nieuwenhuizen
2018-06-27 10:05:26 UTC
Permalink
On Wed, Jun 27, 2018 at 9:46 AM, Samuel Pitoiset
Post by Samuel Pitoiset
Post by Bas Nieuwenhuizen
for patch 3-4. Not sure they should go to stable though, since they
are optimizations?
Isn't the whole series for optimization purposes?
Well, patch 2 seems like a genuine fix to me?
Post by Samuel Pitoiset
Post by Bas Nieuwenhuizen
Post by Fredrik Höglund
This is to avoid repeating dependencies when more than one subpass
has a dependency from external.
---
src/amd/vulkan/radv_pass.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 2827f5f1a8d..7e6fd84af55 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -179,6 +179,10 @@ VkResult radv_CreateRenderPass(
if (src == dst)
continue;
+ if (src == VK_SUBPASS_EXTERNAL) {
+ /* Add all dependencies from external to the first subpass */
+ dst = 0;
+ }
if (dst == VK_SUBPASS_EXTERNAL) {
if (pCreateInfo->pDependencies[i].dstStageMask
!= VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
pass->end_barrier.src_stage_mask |=
pCreateInfo->pDependencies[i].srcStageMask;
--
2.17.0
_______________________________________________
mesa-dev mailing list
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Fredrik Höglund
2018-06-28 22:25:57 UTC
Permalink
Post by Samuel Pitoiset
Post by Bas Nieuwenhuizen
for patch 3-4. Not sure they should go to stable though, since they
are optimizations?
Isn't the whole series for optimization purposes?
No, patches 2 and 7 are bugfixes. Patch 7 will cause additional flushes
in the meta code paths without patch 6, so that patch is also marked
for stable. Patch 8 is an optimization of patch 7 that I decided to keep
separate for bisectibility.

That being said, these patches don't fix any issues in any real applications
as far as I'm aware.

Patches 1, 3 and 4 are just optimizations, so those should indeed not go
to stable.
Post by Samuel Pitoiset
Post by Bas Nieuwenhuizen
Post by Fredrik Höglund
This is to avoid repeating dependencies when more than one subpass
has a dependency from external.
---
src/amd/vulkan/radv_pass.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 2827f5f1a8d..7e6fd84af55 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -179,6 +179,10 @@ VkResult radv_CreateRenderPass(
if (src == dst)
continue;
+ if (src == VK_SUBPASS_EXTERNAL) {
+ /* Add all dependencies from external to the first subpass */
+ dst = 0;
+ }
if (dst == VK_SUBPASS_EXTERNAL) {
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
pass->end_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
--
2.17.0
_______________________________________________
mesa-dev mailing list
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Fredrik Höglund
2018-06-26 21:49:35 UTC
Permalink
Cc: <mesa-***@lists.freedesktop.org>
Signed-off-by: Fredrik Höglund <***@kde.org>
---
src/amd/vulkan/radv_pass.c | 107 +++++++++++++++++++++++++++++++---
src/amd/vulkan/radv_private.h | 8 ++-
2 files changed, 105 insertions(+), 10 deletions(-)

diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 17dafaca071..5bdaa7fd554 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -91,6 +91,8 @@ VkResult radv_CreateRenderPass(
att->final_layout = pCreateInfo->pAttachments[i].finalLayout;
// att->store_op = pCreateInfo->pAttachments[i].storeOp;
// att->stencil_store_op = pCreateInfo->pAttachments[i].stencilStoreOp;
+ att->first_subpass = UINT32_MAX;
+ att->last_subpass = UINT32_MAX;
}

VkAttachmentReference *p = (void *) pass + subpass_attachments_offset;
@@ -109,10 +111,14 @@ VkResult radv_CreateRenderPass(
p += desc->inputAttachmentCount;

for (uint32_t j = 0; j < desc->inputAttachmentCount; j++) {
+ uint32_t a = desc->pInputAttachments[j].attachment;
subpass->input_attachments[j]
= desc->pInputAttachments[j];
- if (desc->pInputAttachments[j].attachment != VK_ATTACHMENT_UNUSED)
- pass->attachments[desc->pInputAttachments[j].attachment].view_mask |= subpass->view_mask;
+ if (a != VK_ATTACHMENT_UNUSED) {
+ pass->attachments[a].view_mask |= subpass->view_mask;
+ pass->attachments[a].first_subpass = MIN2(pass->attachments[a].first_subpass, i);
+ pass->attachments[a].last_subpass = i;
+ }
}
}

@@ -121,11 +127,14 @@ VkResult radv_CreateRenderPass(
p += desc->colorAttachmentCount;

for (uint32_t j = 0; j < desc->colorAttachmentCount; j++) {
+ uint32_t a = desc->pColorAttachments[j].attachment;
subpass->color_attachments[j]
= desc->pColorAttachments[j];
- if (desc->pColorAttachments[j].attachment != VK_ATTACHMENT_UNUSED) {
- pass->attachments[desc->pColorAttachments[j].attachment].view_mask |= subpass->view_mask;
- color_sample_count = pCreateInfo->pAttachments[desc->pColorAttachments[j].attachment].samples;
+ if (a != VK_ATTACHMENT_UNUSED) {
+ pass->attachments[a].view_mask |= subpass->view_mask;
+ pass->attachments[a].first_subpass = MIN2(pass->attachments[a].first_subpass, i);
+ pass->attachments[a].last_subpass = i;
+ color_sample_count = pCreateInfo->pAttachments[a].samples;
}
}
}
@@ -141,17 +150,22 @@ VkResult radv_CreateRenderPass(
= desc->pResolveAttachments[j];
if (a != VK_ATTACHMENT_UNUSED) {
subpass->has_resolve = true;
- pass->attachments[desc->pResolveAttachments[j].attachment].view_mask |= subpass->view_mask;
+ pass->attachments[a].view_mask |= subpass->view_mask;
+ pass->attachments[a].first_subpass = MIN2(pass->attachments[a].first_subpass, i);
+ pass->attachments[a].last_subpass = i;
}
}
}

if (desc->pDepthStencilAttachment) {
+ uint32_t a = desc->pDepthStencilAttachment->attachment;
subpass->depth_stencil_attachment =
*desc->pDepthStencilAttachment;
- if (desc->pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
- pass->attachments[desc->pDepthStencilAttachment->attachment].view_mask |= subpass->view_mask;
- depth_sample_count = pCreateInfo->pAttachments[desc->pDepthStencilAttachment->attachment].samples;
+ if (a != VK_ATTACHMENT_UNUSED) {
+ pass->attachments[a].view_mask |= subpass->view_mask;
+ pass->attachments[a].first_subpass = MIN2(pass->attachments[a].first_subpass, i);
+ pass->attachments[a].last_subpass = i;
+ depth_sample_count = pCreateInfo->pAttachments[a].samples;
}
} else {
subpass->depth_stencil_attachment.attachment = VK_ATTACHMENT_UNUSED;
@@ -170,15 +184,21 @@ VkResult radv_CreateRenderPass(
continue;

if (src == VK_SUBPASS_EXTERNAL) {
+ assert(dst != VK_SUBPASS_EXTERNAL && dst < pCreateInfo->subpassCount);
+ pass->subpasses[dst].explicit_dependency_from_external = true;
+
/* Add all dependencies from external to the first subpass */
dst = 0;
}
if (dst == VK_SUBPASS_EXTERNAL) {
+ assert(src != VK_SUBPASS_EXTERNAL && src < pCreateInfo->subpassCount);
+ pass->subpasses[src].explicit_dependency_to_external = true;
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
pass->end_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
pass->end_barrier.src_access_mask |= pCreateInfo->pDependencies[i].srcAccessMask;
pass->end_barrier.dst_access_mask |= pCreateInfo->pDependencies[i].dstAccessMask;
} else {
+ assert(dst < pCreateInfo->subpassCount);
if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
pass->subpasses[dst].start_barrier.src_stage_mask |= pCreateInfo->pDependencies[i].srcStageMask;
pass->subpasses[dst].start_barrier.src_access_mask |= pCreateInfo->pDependencies[i].srcAccessMask;
@@ -186,6 +206,75 @@ VkResult radv_CreateRenderPass(
}
}

+ /* The Vulkan specification says:
+ *
+ * "If there is no subpass dependency from VK_SUBPASS_EXTERNAL
+ * to the first subpass that uses an attachment, then an implicit
+ * subpass dependency exists from VK_SUBPASS_EXTERNAL to the first
+ * subpass it is used in. The subpass dependency operates as if
+ * defined with the following parameters:
+ *
+ * VkSubpassDependency implicitDependency = {
+ * .srcSubpass = VK_SUBPASS_EXTERNAL;
+ * .dstSubpass = firstSubpass; // First subpass attachment is used in
+ * .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
+ * .dstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
+ * .srcAccessMask = 0;
+ * .dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
+ * VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
+ * VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
+ * VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ * VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ * .dependencyFlags = 0;
+ * };"
+ *
+ * Similarly, if there is no subpass dependency from the last
+ * subpass that uses an attachment to VK_SUBPASS_EXTERNAL,
+ * then an implicit subpass dependency exists from the last
+ * subpass it is used in to VK_SUBPASS_EXTERNAL. The subpass
+ * dependency operates as if defined with the following
+ * parameters:
+ *
+ * VkSubpassDependency implicitDependency = {
+ * .srcSubpass = lastSubpass; // Last subpass attachment is used in
+ * .dstSubpass = VK_SUBPASS_EXTERNAL;
+ * .srcStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
+ * .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
+ * .srcAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
+ * VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
+ * VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
+ * VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ * VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ * .dstAccessMask = 0;
+ * .dependencyFlags = 0;
+ * };"
+ */
+ for (uint32_t i = 0; i < pCreateInfo->attachmentCount; i++) {
+ const uint32_t first_subpass = pass->attachments[i].first_subpass;
+ const uint32_t last_subpass = pass->attachments[i].last_subpass;
+
+ /* Implicit dependency from external */
+ if (first_subpass != UINT32_MAX && !pass->subpasses[first_subpass].explicit_dependency_from_external) {
+ /* We always add the dependency to the first subpass to avoid repeating dependencies */
+ pass->subpasses[0].start_barrier.dst_access_mask |=
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
+ VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ }
+
+ /* Implicit dependency to external */
+ if (last_subpass != UINT32_MAX && !pass->subpasses[last_subpass].explicit_dependency_to_external) {
+ pass->end_barrier.src_access_mask |=
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
+ VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ }
+ }
+
*pRenderPass = radv_render_pass_to_handle(pass);

return VK_SUCCESS;
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 8627b3c7696..adf259981f1 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1705,7 +1705,11 @@ struct radv_subpass {
VkAttachmentReference depth_stencil_attachment;

/** Subpass has at least one resolve attachment */
- bool has_resolve;
+ bool has_resolve:1;
+
+ /** Used during renderpass creation */
+ bool explicit_dependency_from_external:1;
+ bool explicit_dependency_to_external:1;

struct radv_subpass_barrier start_barrier;

@@ -1721,6 +1725,8 @@ struct radv_render_pass_attachment {
VkImageLayout initial_layout;
VkImageLayout final_layout;
uint32_t view_mask;
+ uint32_t first_subpass;
+ uint32_t last_subpass;
};

struct radv_render_pass {
--
2.17.0
Bas Nieuwenhuizen
2018-06-27 00:11:12 UTC
Permalink
Don't we still need this when having layout transitions?
Post by Fredrik Höglund
"An execution dependency with only VK_PIPELINE_STAGE_BOTTOM_OF_-
PIPE_BIT in the destination stage mask [...] does not delay
processing of subsequent commands."
---
src/amd/vulkan/radv_cmd_buffer.c | 3 ++-
src/amd/vulkan/radv_pass.c | 6 ++++--
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 110a9a960a9..5bfcba28d83 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -4197,7 +4197,8 @@ void radv_CmdPipelineBarrier(
image);
}
- radv_stage_flush(cmd_buffer, srcStageMask);
+ if (destStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ radv_stage_flush(cmd_buffer, srcStageMask);
cmd_buffer->state.flush_bits |= src_flush_bits;
for (uint32_t i = 0; i < imageMemoryBarrierCount; i++) {
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 15fee444cdc..7a0dca09496 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -174,11 +174,13 @@ VkResult radv_CreateRenderPass(
for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass;
if (dst == VK_SUBPASS_EXTERNAL) {
- pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
+ if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
pass->end_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->end_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
} else {
- pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
+ if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
pass->subpasses[dst].start_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->subpasses[dst].start_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
}
--
2.17.0
_______________________________________________
mesa-dev mailing list
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Fredrik Höglund
2018-06-28 22:23:11 UTC
Permalink
Post by Bas Nieuwenhuizen
Don't we still need this when having layout transitions?
I think the answer is probably yes, though I haven't noticed any
regressions with this patch.

I'll post an updated version that takes transitions into account.
Post by Bas Nieuwenhuizen
Post by Fredrik Höglund
"An execution dependency with only VK_PIPELINE_STAGE_BOTTOM_OF_-
PIPE_BIT in the destination stage mask [...] does not delay
processing of subsequent commands."
---
src/amd/vulkan/radv_cmd_buffer.c | 3 ++-
src/amd/vulkan/radv_pass.c | 6 ++++--
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 110a9a960a9..5bfcba28d83 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -4197,7 +4197,8 @@ void radv_CmdPipelineBarrier(
image);
}
- radv_stage_flush(cmd_buffer, srcStageMask);
+ if (destStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ radv_stage_flush(cmd_buffer, srcStageMask);
cmd_buffer->state.flush_bits |= src_flush_bits;
for (uint32_t i = 0; i < imageMemoryBarrierCount; i++) {
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 15fee444cdc..7a0dca09496 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -174,11 +174,13 @@ VkResult radv_CreateRenderPass(
for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass;
if (dst == VK_SUBPASS_EXTERNAL) {
- pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
+ if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
pass->end_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->end_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
} else {
- pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
+ if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
pass->subpasses[dst].start_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->subpasses[dst].start_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
}
--
2.17.0
_______________________________________________
mesa-dev mailing list
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Andres Gomez
2018-08-09 12:58:54 UTC
Permalink
Fredrik, which is the status of this series? Several patches got R-b
but nothing has landed so far. Are you in need of more reviews for the
rest of the patches in the series?
Post by Fredrik Höglund
"An execution dependency with only VK_PIPELINE_STAGE_BOTTOM_OF_-
PIPE_BIT in the destination stage mask [...] does not delay
processing of subsequent commands."
---
src/amd/vulkan/radv_cmd_buffer.c | 3 ++-
src/amd/vulkan/radv_pass.c | 6 ++++--
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 110a9a960a9..5bfcba28d83 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -4197,7 +4197,8 @@ void radv_CmdPipelineBarrier(
image);
}
- radv_stage_flush(cmd_buffer, srcStageMask);
+ if (destStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ radv_stage_flush(cmd_buffer, srcStageMask);
cmd_buffer->state.flush_bits |= src_flush_bits;
for (uint32_t i = 0; i < imageMemoryBarrierCount; i++) {
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 15fee444cdc..7a0dca09496 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -174,11 +174,13 @@ VkResult radv_CreateRenderPass(
for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass;
if (dst == VK_SUBPASS_EXTERNAL) {
- pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
+ if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
pass->end_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->end_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
} else {
- pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
+ if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
pass->subpasses[dst].start_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->subpasses[dst].start_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
}
--
Br,

Andres
Fredrik Höglund
2018-08-15 21:36:01 UTC
Permalink
Post by Andres Gomez
Fredrik, which is the status of this series? Several patches got R-b
but nothing has landed so far. Are you in need of more reviews for the
rest of the patches in the series?
The master branch has diverged quite a bit as a result of the
VK_KHR_create_renderpass2 support, so most of the patches
need to be reworked (and re-tested).

I hope to get to that in the next couple of days.
Post by Andres Gomez
Post by Fredrik Höglund
"An execution dependency with only VK_PIPELINE_STAGE_BOTTOM_OF_-
PIPE_BIT in the destination stage mask [...] does not delay
processing of subsequent commands."
---
src/amd/vulkan/radv_cmd_buffer.c | 3 ++-
src/amd/vulkan/radv_pass.c | 6 ++++--
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 110a9a960a9..5bfcba28d83 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -4197,7 +4197,8 @@ void radv_CmdPipelineBarrier(
image);
}
- radv_stage_flush(cmd_buffer, srcStageMask);
+ if (destStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ radv_stage_flush(cmd_buffer, srcStageMask);
cmd_buffer->state.flush_bits |= src_flush_bits;
for (uint32_t i = 0; i < imageMemoryBarrierCount; i++) {
diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
index 15fee444cdc..7a0dca09496 100644
--- a/src/amd/vulkan/radv_pass.c
+++ b/src/amd/vulkan/radv_pass.c
@@ -174,11 +174,13 @@ VkResult radv_CreateRenderPass(
for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass;
if (dst == VK_SUBPASS_EXTERNAL) {
- pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
+ if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
pass->end_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->end_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
} else {
- pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
+ if (pCreateInfo->pDependencies[i].dstStageMask != VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
+ pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
pass->subpasses[dst].start_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->subpasses[dst].start_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
}
Loading...