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:
parent
2472907563
commit
1e810f1c53
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue