Create a render pass with the specified creation info.
44{
45 if (create_info.attachments.empty()) {
47 "Cannot create render pass with no attachments");
48 return false;
49 }
50
51 if (create_info.subpasses.empty()) {
53 "Cannot create render pass with no subpasses");
54 return false;
55 }
56
58
59 std::vector<vk::AttachmentDescription> vk_attachments;
60 vk_attachments.reserve(create_info.attachments.size());
61
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;
72
73 vk_attachments.push_back(vk_attachment);
74 }
75
76 std::vector<vk::SubpassDescription> vk_subpasses;
77 vk_subpasses.reserve(create_info.subpasses.size());
78
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();
90
91 vk_subpasses.push_back(vk_subpass);
92 }
93
94 std::vector<vk::SubpassDependency> vk_dependencies;
95 vk_dependencies.reserve(create_info.dependencies.size());
96
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;
105
106 vk_dependencies.push_back(vk_dependency);
107 }
108
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();
116
117 try {
120 "Render pass created with {} attachments, {} subpasses, {} dependencies",
121 vk_attachments.size(), vk_subpasses.size(), vk_dependencies.size());
122 return true;
123 } catch (const vk::SystemError& e) {
125 "Failed to create render pass: {}", e.what());
126 return false;
127 }
128}
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
vk::RenderPass m_render_pass
std::vector< AttachmentDescription > m_attachments
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.