|
|
|
@ -344,7 +344,9 @@ void Scheduler::EndRenderPass() |
|
|
|
|
|
|
|
Record([num_images = num_renderpass_images, |
|
|
|
images = renderpass_images, |
|
|
|
ranges = renderpass_image_ranges](vk::CommandBuffer cmdbuf) { |
|
|
|
ranges = renderpass_image_ranges, |
|
|
|
has_transform_feedback = device.IsExtTransformFeedbackSupported()]( |
|
|
|
vk::CommandBuffer cmdbuf) { |
|
|
|
std::array<VkImageMemoryBarrier, 9> barriers; |
|
|
|
for (size_t i = 0; i < num_images; ++i) { |
|
|
|
const VkImageSubresourceRange& range = ranges[i]; |
|
|
|
@ -384,6 +386,17 @@ void Scheduler::EndRenderPass() |
|
|
|
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | |
|
|
|
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, vk::PIPELINE_STAGE_GRAPHICS_COMPUTE, |
|
|
|
0, nullptr, nullptr, vk::Span(barriers.data(), num_images)); |
|
|
|
if (has_transform_feedback) { |
|
|
|
static constexpr VkMemoryBarrier XFB_OUTPUT_BARRIER{ |
|
|
|
.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, |
|
|
|
.pNext = nullptr, |
|
|
|
.srcAccessMask = VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT, |
|
|
|
.dstAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_TRANSFER_READ_BIT, |
|
|
|
}; |
|
|
|
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, |
|
|
|
VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT, |
|
|
|
0, XFB_OUTPUT_BARRIER); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
state.renderpass = VkRenderPass{}; |
|
|
|
|