40 src_barrier.
new_layout = vk::ImageLayout::eTransferSrcOptimal;
41 src_barrier.
src_access = vk::AccessFlagBits::eTransferWrite |
42 vk::AccessFlagBits::eShaderWrite |
43 vk::AccessFlagBits::eColorAttachmentWrite;
44 src_barrier.
src_stage = vk::PipelineStageFlagBits::eTransfer |
45 vk::PipelineStageFlagBits::eFragmentShader |
46 vk::PipelineStageFlagBits::eColorAttachmentOutput;
47 src_barrier.
dst_access = vk::AccessFlagBits::eTransferRead;
48 src_barrier.
dst_stage = vk::PipelineStageFlagBits::eTransfer;
52 dst_barrier.
new_layout = vk::ImageLayout::eTransferDstOptimal;
54 dst_barrier.
src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
56 vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferWrite;
57 dst_barrier.
dst_stage = vk::PipelineStageFlagBits::eFragmentShader |
58 vk::PipelineStageFlagBits::eTransfer;
60 if (!src.SetLayout(src_barrier) || !dst.SetLayout(dst_barrier)) {
65 vk::ImageCopy image_copy;
67 image_copy.setSrcSubresource(
68 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
69 image_copy.setDstSubresource(
70 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
72 image_copy.srcOffset =
74 image_copy.dstOffset =
81 cmd_buffer.copyImage(src.GetImage(),
113 barrier.
new_layout = vk::ImageLayout::eTransferSrcOptimal;
114 barrier.
src_access = vk::AccessFlagBits::eShaderWrite |
115 vk::AccessFlagBits::eTransferWrite |
116 vk::AccessFlagBits::eColorAttachmentWrite;
117 barrier.
src_stage = vk::PipelineStageFlagBits::eFragmentShader |
118 vk::PipelineStageFlagBits::eTransfer |
119 vk::PipelineStageFlagBits::eColorAttachmentOutput;
120 barrier.
dst_access = vk::AccessFlagBits::eShaderRead;
121 barrier.
dst_stage = vk::PipelineStageFlagBits::eVertexShader |
122 vk::PipelineStageFlagBits::eFragmentShader;
126 vk::BufferImageCopy image_copy;
128 image_copy.setBufferRowLength(0);
129 image_copy.setBufferImageHeight(0);
130 image_copy.setImageSubresource(
131 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
132 image_copy.setImageOffset(
134 image_copy.setImageExtent(
137 if (!src.SetLayout(barrier)) {
142 cmd_buffer.copyImageToBuffer(src.GetImage(),
174 dst_barrier.
new_layout = vk::ImageLayout::eTransferDstOptimal;
176 dst_barrier.
src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
178 vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferWrite;
179 dst_barrier.
dst_stage = vk::PipelineStageFlagBits::eFragmentShader |
180 vk::PipelineStageFlagBits::eTransfer;
182 vk::BufferImageCopy image_copy;
184 image_copy.setBufferRowLength(0);
185 image_copy.setBufferImageHeight(0);
186 image_copy.setImageSubresource(
187 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
188 image_copy.setImageOffset(
190 image_copy.setImageExtent(vk::Extent3D(
destination->GetSize().width,
193 if (!dst.SetLayout(dst_barrier)) {
198 cmd_buffer.copyBufferToImage(src.GetBuffer(),
218 const vk::Image& image,
219 vk::AccessFlags src_access_mask,
220 vk::AccessFlags dst_access_mask,
221 vk::ImageLayout old_layout,
222 vk::ImageLayout new_layout,
223 vk::PipelineStageFlags src_stage,
224 vk::PipelineStageFlags dst_stage,
225 uint32_t base_mip_level,
226 uint32_t mip_level_count = 1u) {
227 if (old_layout == new_layout) {
231 vk::ImageMemoryBarrier barrier;
232 barrier.srcAccessMask = src_access_mask;
233 barrier.dstAccessMask = dst_access_mask;
234 barrier.oldLayout = old_layout;
235 barrier.newLayout = new_layout;
236 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
237 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
238 barrier.image = image;
239 barrier.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
240 barrier.subresourceRange.baseMipLevel = base_mip_level;
241 barrier.subresourceRange.levelCount = mip_level_count;
242 barrier.subresourceRange.baseArrayLayer = 0u;
243 barrier.subresourceRange.layerCount = 1u;
245 cmd.pipelineBarrier(src_stage, dst_stage, {},
nullptr,
nullptr, barrier);
251 const auto size = src.GetTextureDescriptor().size;
252 uint32_t mip_count = src.GetTextureDescriptor().mip_count;
254 if (mip_count < 2u) {
258 const auto& image = src.GetImage();
271 vk::AccessFlagBits::eTransferWrite,
272 vk::AccessFlagBits::eTransferRead,
274 vk::ImageLayout::eTransferSrcOptimal,
275 vk::PipelineStageFlagBits::eTransfer,
276 vk::PipelineStageFlagBits::eTransfer,
283 vk::AccessFlagBits::eTransferWrite,
284 vk::ImageLayout::eUndefined,
285 vk::ImageLayout::eTransferDstOptimal,
286 vk::PipelineStageFlagBits::eTransfer,
287 vk::PipelineStageFlagBits::eTransfer,
293 for (
size_t mip_level = 1u; mip_level < mip_count; mip_level++) {
296 blit.srcSubresource.aspectMask = vk::ImageAspectFlagBits::eColor;
297 blit.srcSubresource.baseArrayLayer = 0u;
298 blit.srcSubresource.layerCount = 1u;
299 blit.srcSubresource.mipLevel = 0u;
301 blit.dstSubresource.aspectMask = vk::ImageAspectFlagBits::eColor;
302 blit.dstSubresource.baseArrayLayer = 0u;
303 blit.dstSubresource.layerCount = 1u;
304 blit.dstSubresource.mipLevel = mip_level;
307 blit.srcOffsets[1].x = size.width;
308 blit.srcOffsets[1].y = size.height;
309 blit.srcOffsets[1].z = 1u;
312 blit.dstOffsets[1].x = std::max<int32_t>(size.width >> mip_level, 1u);
313 blit.dstOffsets[1].y = std::max<int32_t>(size.height >> mip_level, 1u);
314 blit.dstOffsets[1].z = 1u;
317 vk::ImageLayout::eTransferSrcOptimal,
319 vk::ImageLayout::eTransferDstOptimal,
331 vk::AccessFlagBits::eTransferWrite,
332 vk::AccessFlagBits::eShaderRead,
333 vk::ImageLayout::eTransferSrcOptimal,
334 vk::ImageLayout::eShaderReadOnlyOptimal,
335 vk::PipelineStageFlagBits::eTransfer,
336 vk::PipelineStageFlagBits::eFragmentShader,
342 vk::AccessFlagBits::eTransferWrite,
343 vk::AccessFlagBits::eShaderRead,
344 vk::ImageLayout::eTransferDstOptimal,
345 vk::ImageLayout::eShaderReadOnlyOptimal,
346 vk::PipelineStageFlagBits::eTransfer,
347 vk::PipelineStageFlagBits::eFragmentShader,
354 src.SetLayoutWithoutEncoding(vk::ImageLayout::eShaderReadOnlyOptimal);