radv: add radv_render_pass_add_subpass_dep() helper

To share common code that handles subpass dependencies.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
Samuel Pitoiset 2019-01-29 22:18:57 +01:00
parent 2472907563
commit 1e810f1c53
1 changed files with 38 additions and 40 deletions

View File

@ -28,6 +28,31 @@
#include "vk_util.h" #include "vk_util.h"
static void
radv_render_pass_add_subpass_dep(struct radv_render_pass *pass,
const VkSubpassDependency2KHR *dep)
{
uint32_t src = dep->srcSubpass;
uint32_t dst = dep->dstSubpass;
/* Ignore subpass self-dependencies as they allow the app to call
* vkCmdPipelineBarrier() inside the render pass and the driver should
* only do the barrier when called, not when starting the render pass.
*/
if (src == dst)
return;
if (dst == VK_SUBPASS_EXTERNAL) {
pass->end_barrier.src_stage_mask = dep->srcStageMask;
pass->end_barrier.src_access_mask = dep->srcAccessMask;
pass->end_barrier.dst_access_mask = dep->dstAccessMask;
} else {
pass->subpasses[dst].start_barrier.src_stage_mask = dep->srcStageMask;
pass->subpasses[dst].start_barrier.src_access_mask = dep->srcAccessMask;
pass->subpasses[dst].start_barrier.dst_access_mask = dep->dstAccessMask;
}
}
static void static void
radv_render_pass_compile(struct radv_render_pass *pass) radv_render_pass_compile(struct radv_render_pass *pass)
{ {
@ -235,26 +260,17 @@ VkResult radv_CreateRenderPass(
} }
for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) { for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
uint32_t src = pCreateInfo->pDependencies[i].srcSubpass; /* Convert to a Dependency2KHR */
uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass; struct VkSubpassDependency2KHR dep2 = {
.srcSubpass = pCreateInfo->pDependencies[i].srcSubpass,
/* Ignore subpass self-dependencies as they allow the app to .dstSubpass = pCreateInfo->pDependencies[i].dstSubpass,
* call vkCmdPipelineBarrier() inside the render pass and the .srcStageMask = pCreateInfo->pDependencies[i].srcStageMask,
* driver should only do the barrier when called, not when .dstStageMask = pCreateInfo->pDependencies[i].dstStageMask,
* starting the render pass. .srcAccessMask = pCreateInfo->pDependencies[i].srcAccessMask,
*/ .dstAccessMask = pCreateInfo->pDependencies[i].dstAccessMask,
if (src == dst) .dependencyFlags = pCreateInfo->pDependencies[i].dependencyFlags,
continue; };
radv_render_pass_add_subpass_dep(pass, &dep2);
if (dst == VK_SUBPASS_EXTERNAL) {
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;
pass->subpasses[dst].start_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->subpasses[dst].start_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
}
} }
radv_render_pass_compile(pass); radv_render_pass_compile(pass);
@ -391,26 +407,8 @@ VkResult radv_CreateRenderPass2KHR(
} }
for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) { for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
uint32_t src = pCreateInfo->pDependencies[i].srcSubpass; radv_render_pass_add_subpass_dep(pass,
uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass; &pCreateInfo->pDependencies[i]);
/* Ignore subpass self-dependencies as they allow the app to
* call vkCmdPipelineBarrier() inside the render pass and the
* driver should only do the barrier when called, not when
* starting the render pass.
*/
if (src == dst)
continue;
if (dst == VK_SUBPASS_EXTERNAL) {
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;
pass->subpasses[dst].start_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
pass->subpasses[dst].start_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
}
} }
radv_render_pass_compile(pass); radv_render_pass_compile(pass);