anv/pass: Move some dependency setup into a helper

This new helper takes a VkSubpassDependency2KHR for future-proofing.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Jason Ekstrand
2018-04-24 12:57:39 -07:00
parent 6f9485d21f
commit 144626946e

View File

@@ -25,6 +25,29 @@
#include "vk_util.h" #include "vk_util.h"
static void
anv_render_pass_add_subpass_dep(struct anv_render_pass *pass,
const VkSubpassDependency2KHR *dep)
{
if (dep->dstSubpass == VK_SUBPASS_EXTERNAL) {
pass->subpass_flushes[pass->subpass_count] |=
anv_pipe_invalidate_bits_for_access_flags(dep->dstAccessMask);
} else {
assert(dep->dstSubpass < pass->subpass_count);
pass->subpass_flushes[dep->dstSubpass] |=
anv_pipe_invalidate_bits_for_access_flags(dep->dstAccessMask);
}
if (dep->srcSubpass == VK_SUBPASS_EXTERNAL) {
pass->subpass_flushes[0] |=
anv_pipe_flush_bits_for_access_flags(dep->srcAccessMask);
} else {
assert(dep->srcSubpass < pass->subpass_count);
pass->subpass_flushes[dep->srcSubpass + 1] |=
anv_pipe_flush_bits_for_access_flags(dep->srcAccessMask);
}
}
/* Do a second "compile" step on a render pass */ /* Do a second "compile" step on a render pass */
static void static void
anv_render_pass_compile(struct anv_render_pass *pass) anv_render_pass_compile(struct anv_render_pass *pass)
@@ -223,24 +246,17 @@ VkResult anv_CreateRenderPass(
} }
for (uint32_t i = 0; i < pCreateInfo->dependencyCount; i++) { for (uint32_t i = 0; i < pCreateInfo->dependencyCount; i++) {
const VkSubpassDependency *dep = &pCreateInfo->pDependencies[i]; /* Convert to a Dependency2KHR */
if (dep->dstSubpass == VK_SUBPASS_EXTERNAL) { struct VkSubpassDependency2KHR dep2 = {
pass->subpass_flushes[pass->subpass_count] |= .srcSubpass = pCreateInfo->pDependencies[i].srcSubpass,
anv_pipe_invalidate_bits_for_access_flags(dep->dstAccessMask); .dstSubpass = pCreateInfo->pDependencies[i].dstSubpass,
} else { .srcStageMask = pCreateInfo->pDependencies[i].srcStageMask,
assert(dep->dstSubpass < pass->subpass_count); .dstStageMask = pCreateInfo->pDependencies[i].dstStageMask,
pass->subpass_flushes[dep->dstSubpass] |= .srcAccessMask = pCreateInfo->pDependencies[i].srcAccessMask,
anv_pipe_invalidate_bits_for_access_flags(dep->dstAccessMask); .dstAccessMask = pCreateInfo->pDependencies[i].dstAccessMask,
} .dependencyFlags = pCreateInfo->pDependencies[i].dependencyFlags,
};
if (dep->srcSubpass == VK_SUBPASS_EXTERNAL) { anv_render_pass_add_subpass_dep(pass, &dep2);
pass->subpass_flushes[0] |=
anv_pipe_flush_bits_for_access_flags(dep->srcAccessMask);
} else {
assert(dep->srcSubpass < pass->subpass_count);
pass->subpass_flushes[dep->srcSubpass + 1] |=
anv_pipe_flush_bits_for_access_flags(dep->srcAccessMask);
}
} }
/* From the Vulkan 1.0.39 spec: /* From the Vulkan 1.0.39 spec: