14 vk::PipelineStageFlagBits::eColorAttachmentOutput;
16 vk::AccessFlagBits::eColorAttachmentWrite;
19 vk::PipelineStageFlagBits::eFragmentShader;
21 vk::AccessFlagBits::eInputAttachmentRead;
35 vk::AttachmentDescription desc;
40 desc.stencilLoadOp = vk::AttachmentLoadOp::eDontCare;
41 desc.stencilStoreOp = vk::AttachmentStoreOp::eDontCare;
42 desc.initialLayout = vk::ImageLayout::eGeneral;
43 desc.finalLayout = vk::ImageLayout::eGeneral;
44 colors_[index] = desc;
48 desc.samples = vk::SampleCountFlagBits::e1;
49 resolves_[index] = desc;
51 resolves_.erase(index);
61 vk::AttachmentDescription desc;
66 desc.stencilLoadOp = desc.loadOp;
67 desc.stencilStoreOp = desc.storeOp;
68 desc.initialLayout = vk::ImageLayout::eUndefined;
69 desc.finalLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal;
70 depth_stencil_ = desc;
79 vk::AttachmentDescription desc;
82 desc.loadOp = vk::AttachmentLoadOp::eDontCare;
83 desc.storeOp = vk::AttachmentStoreOp::eDontCare;
86 desc.initialLayout = vk::ImageLayout::eUndefined;
87 desc.finalLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal;
88 depth_stencil_ = desc;
93 const vk::Device& device)
const {
96 const auto color_attachments_count =
97 colors_.empty() ? 0u : colors_.rbegin()->first + 1u;
99 std::vector<vk::AttachmentDescription> attachments;
101 std::vector<vk::AttachmentReference> color_refs(color_attachments_count,
103 std::vector<vk::AttachmentReference> resolve_refs(color_attachments_count,
107 for (
const auto& color : colors_) {
108 vk::AttachmentReference color_ref;
109 color_ref.attachment = attachments.size();
110 color_ref.layout = vk::ImageLayout::eGeneral;
111 color_refs[color.first] = color_ref;
112 attachments.push_back(color.second);
114 if (
auto found = resolves_.find(color.first); found != resolves_.end()) {
115 vk::AttachmentReference resolve_ref;
116 resolve_ref.attachment = attachments.size();
117 resolve_ref.layout = vk::ImageLayout::eGeneral;
118 resolve_refs[color.first] = resolve_ref;
119 attachments.push_back(found->second);
123 if (depth_stencil_.has_value()) {
124 depth_stencil_ref.attachment = attachments.size();
125 depth_stencil_ref.layout = vk::ImageLayout::eGeneral;
126 attachments.push_back(depth_stencil_.value());
129 vk::SubpassDescription subpass0;
130 subpass0.pipelineBindPoint = vk::PipelineBindPoint::eGraphics;
131 subpass0.setInputAttachments(color_refs);
132 subpass0.setColorAttachments(color_refs);
133 subpass0.setResolveAttachments(resolve_refs);
134 subpass0.setPDepthStencilAttachment(&depth_stencil_ref);
136 vk::SubpassDependency self_dep;
137 self_dep.srcSubpass = 0u;
138 self_dep.dstSubpass = 0u;
145 vk::RenderPassCreateInfo render_pass_desc;
146 render_pass_desc.setAttachments(attachments);
147 render_pass_desc.setSubpasses(subpass0);
148 render_pass_desc.setDependencies(self_dep);
150 auto [result, pass] = device.createRenderPassUnique(render_pass_desc);
151 if (result != vk::Result::eSuccess) {
152 VALIDATION_LOG <<
"Failed to create render pass: " << vk::to_string(result);
155 return std::move(pass);
159 const vk::Image& image) {
162 vk::ImageMemoryBarrier barrier;
165 barrier.oldLayout = vk::ImageLayout::eGeneral;
166 barrier.newLayout = vk::ImageLayout::eGeneral;
167 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
168 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
169 barrier.image = image;
171 vk::ImageSubresourceRange image_levels;
172 image_levels.aspectMask = vk::ImageAspectFlagBits::eColor;
173 image_levels.baseArrayLayer = 0u;
174 image_levels.baseMipLevel = 0u;
175 image_levels.layerCount = VK_REMAINING_ARRAY_LAYERS;
176 image_levels.levelCount = VK_REMAINING_MIP_LEVELS;
177 barrier.subresourceRange = image_levels;
188 const std::map<size_t, vk::AttachmentDescription>&
193 const std::map<size_t, vk::AttachmentDescription>&
198 const std::optional<vk::AttachmentDescription>&
200 return depth_stencil_;