9 vk::AttachmentDescription color_attachment {};
10 color_attachment.format = color_format;
11 color_attachment.samples = vk::SampleCountFlagBits::e1;
12 color_attachment.loadOp = vk::AttachmentLoadOp::eClear;
13 color_attachment.storeOp = vk::AttachmentStoreOp::eStore;
14 color_attachment.stencilLoadOp = vk::AttachmentLoadOp::eDontCare;
15 color_attachment.stencilStoreOp = vk::AttachmentStoreOp::eDontCare;
16 color_attachment.initialLayout = vk::ImageLayout::eUndefined;
17 color_attachment.finalLayout = vk::ImageLayout::ePresentSrcKHR;
19 vk::AttachmentReference color_attachment_ref {};
20 color_attachment_ref.attachment = 0;
21 color_attachment_ref.layout = vk::ImageLayout::eColorAttachmentOptimal;
23 vk::SubpassDescription subpass {};
24 subpass.pipelineBindPoint = vk::PipelineBindPoint::eGraphics;
25 subpass.colorAttachmentCount = 1;
26 subpass.pColorAttachments = &color_attachment_ref;
28 vk::RenderPassCreateInfo render_pass_info {};
29 render_pass_info.attachmentCount = 1;
30 render_pass_info.pAttachments = &color_attachment;
31 render_pass_info.subpassCount = 1;
32 render_pass_info.pSubpasses = &subpass;
37 }
catch (
const vk::SystemError& e) {
47 "Cannot create render pass with no attachments");
53 "Cannot create render pass with no subpasses");
59 std::vector<vk::AttachmentDescription> vk_attachments;
60 vk_attachments.reserve(create_info.
attachments.size());
62 for (
const auto& attachment : create_info.
attachments) {
63 vk::AttachmentDescription vk_attachment;
64 vk_attachment.format = attachment.format;
65 vk_attachment.samples = attachment.samples;
66 vk_attachment.loadOp = attachment.load_op;
67 vk_attachment.storeOp = attachment.store_op;
68 vk_attachment.stencilLoadOp = attachment.stencil_load_op;
69 vk_attachment.stencilStoreOp = attachment.stencil_store_op;
70 vk_attachment.initialLayout = attachment.initial_layout;
71 vk_attachment.finalLayout = attachment.final_layout;
73 vk_attachments.push_back(vk_attachment);
76 std::vector<vk::SubpassDescription> vk_subpasses;
77 vk_subpasses.reserve(create_info.
subpasses.size());
79 for (
const auto& subpass : create_info.
subpasses) {
80 vk::SubpassDescription vk_subpass;
81 vk_subpass.pipelineBindPoint = subpass.bind_point;
82 vk_subpass.colorAttachmentCount =
static_cast<uint32_t
>(subpass.color_attachments.size());
83 vk_subpass.pColorAttachments = subpass.color_attachments.empty() ? nullptr : subpass.color_attachments.data();
84 vk_subpass.pDepthStencilAttachment = subpass.depth_stencil_attachment.has_value() ? &subpass.depth_stencil_attachment.value() :
nullptr;
85 vk_subpass.inputAttachmentCount =
static_cast<uint32_t
>(subpass.input_attachments.size());
86 vk_subpass.pInputAttachments = subpass.input_attachments.empty() ? nullptr : subpass.input_attachments.data();
87 vk_subpass.pResolveAttachments = subpass.resolve_attachments.empty() ? nullptr : subpass.resolve_attachments.data();
88 vk_subpass.preserveAttachmentCount =
static_cast<uint32_t
>(subpass.preserve_attachments.size());
89 vk_subpass.pPreserveAttachments = subpass.preserve_attachments.empty() ? nullptr : subpass.preserve_attachments.data();
91 vk_subpasses.push_back(vk_subpass);
94 std::vector<vk::SubpassDependency> vk_dependencies;
95 vk_dependencies.reserve(create_info.
dependencies.size());
97 for (
const auto& dependency : create_info.
dependencies) {
98 vk::SubpassDependency vk_dependency;
99 vk_dependency.srcSubpass = dependency.src_subpass;
100 vk_dependency.dstSubpass = dependency.dst_subpass;
101 vk_dependency.srcStageMask = dependency.src_stage_mask;
102 vk_dependency.dstStageMask = dependency.dst_stage_mask;
103 vk_dependency.srcAccessMask = dependency.src_access_mask;
104 vk_dependency.dstAccessMask = dependency.dst_access_mask;
106 vk_dependencies.push_back(vk_dependency);
109 vk::RenderPassCreateInfo render_pass_info;
110 render_pass_info.attachmentCount =
static_cast<uint32_t
>(vk_attachments.size());
111 render_pass_info.pAttachments = vk_attachments.data();
112 render_pass_info.subpassCount =
static_cast<uint32_t
>(vk_subpasses.size());
113 render_pass_info.pSubpasses = vk_subpasses.data();
114 render_pass_info.dependencyCount =
static_cast<uint32_t
>(vk_dependencies.size());
115 render_pass_info.pDependencies = vk_dependencies.data();
120 "Render pass created with {} attachments, {} subpasses, {} dependencies",
121 vk_attachments.size(), vk_subpasses.size(), vk_dependencies.size());
123 }
catch (
const vk::SystemError& e) {
125 "Failed to create render pass: {}", e.what());
144 color_attachment.
format = color_format;
145 color_attachment.
load_op = vk::AttachmentLoadOp::eClear;
146 color_attachment.
store_op = vk::AttachmentStoreOp::eStore;
148 color_attachment.
final_layout = vk::ImageLayout::ePresentSrcKHR;
149 create_info.
attachments.push_back(color_attachment);
152 subpass.
color_attachments.emplace_back(0, vk::ImageLayout::eColorAttachmentOptimal);
153 create_info.
subpasses.push_back(subpass);
158 dependency.
src_stage_mask = vk::PipelineStageFlagBits::eColorAttachmentOutput;
159 dependency.
dst_stage_mask = vk::PipelineStageFlagBits::eColorAttachmentOutput;
160 dependency.
dst_access_mask = vk::AccessFlagBits::eColorAttachmentWrite;
171 color_attachment.
format = color_format;
172 color_attachment.
load_op = vk::AttachmentLoadOp::eClear;
173 color_attachment.
store_op = vk::AttachmentStoreOp::eStore;
175 color_attachment.
final_layout = vk::ImageLayout::ePresentSrcKHR;
176 create_info.
attachments.push_back(color_attachment);
179 depth_attachment.
format = depth_format;
180 depth_attachment.
load_op = vk::AttachmentLoadOp::eClear;
181 depth_attachment.
store_op = vk::AttachmentStoreOp::eDontCare;
185 depth_attachment.
final_layout = vk::ImageLayout::eDepthStencilAttachmentOptimal;
186 create_info.
attachments.push_back(depth_attachment);
189 subpass.
color_attachments.emplace_back(0, vk::ImageLayout::eColorAttachmentOptimal);
191 create_info.
subpasses.push_back(subpass);
196 dependency.
src_stage_mask = vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests;
197 dependency.
dst_stage_mask = vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests;
198 dependency.
dst_access_mask = vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentWrite;