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(),
90 if (dst.IsSwapchainImage()) {
96 barrier.
new_layout = vk::ImageLayout::eShaderReadOnlyOptimal;
98 barrier.
src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
99 barrier.
dst_access = vk::AccessFlagBits::eShaderRead;
100 barrier.
dst_stage = vk::PipelineStageFlagBits::eFragmentShader;
102 return dst.SetLayout(barrier);
127 barrier.
new_layout = vk::ImageLayout::eTransferSrcOptimal;
128 barrier.
src_access = vk::AccessFlagBits::eShaderWrite |
129 vk::AccessFlagBits::eTransferWrite |
130 vk::AccessFlagBits::eColorAttachmentWrite;
131 barrier.
src_stage = vk::PipelineStageFlagBits::eFragmentShader |
132 vk::PipelineStageFlagBits::eTransfer |
133 vk::PipelineStageFlagBits::eColorAttachmentOutput;
134 barrier.
dst_access = vk::AccessFlagBits::eShaderRead;
135 barrier.
dst_stage = vk::PipelineStageFlagBits::eVertexShader |
136 vk::PipelineStageFlagBits::eFragmentShader;
140 vk::BufferImageCopy image_copy;
142 image_copy.setBufferRowLength(0);
143 image_copy.setBufferImageHeight(0);
144 image_copy.setImageSubresource(
145 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
146 image_copy.setImageOffset(
148 image_copy.setImageExtent(
151 if (!src.SetLayout(barrier)) {
156 cmd_buffer.copyImageToBuffer(src.GetImage(),
164 if (
destination->GetDeviceBufferDescriptor().readback) {
165 vk::MemoryBarrier barrier;
166 barrier.srcAccessMask = vk::AccessFlagBits::eTransferWrite;
167 barrier.dstAccessMask = vk::AccessFlagBits::eHostRead;
169 cmd_buffer.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer,
170 vk::PipelineStageFlagBits::eHost, {}, 1,
171 &barrier, 0, {}, 0, {});
200 dst_barrier.
new_layout = vk::ImageLayout::eTransferDstOptimal;
202 dst_barrier.
src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
204 vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferWrite;
205 dst_barrier.
dst_stage = vk::PipelineStageFlagBits::eFragmentShader |
206 vk::PipelineStageFlagBits::eTransfer;
208 vk::BufferImageCopy image_copy;
210 image_copy.setBufferRowLength(0);
211 image_copy.setBufferImageHeight(0);
212 image_copy.setImageSubresource(
213 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
214 image_copy.setImageOffset(
216 image_copy.setImageExtent(vk::Extent3D(
destination->GetSize().width,
219 if (!dst.SetLayout(dst_barrier)) {
224 cmd_buffer.copyBufferToImage(src.GetBuffer(),
244 const vk::Image& image,
245 vk::AccessFlags src_access_mask,
246 vk::AccessFlags dst_access_mask,
247 vk::ImageLayout old_layout,
248 vk::ImageLayout new_layout,
249 vk::PipelineStageFlags src_stage,
250 vk::PipelineStageFlags dst_stage,
251 uint32_t base_mip_level,
252 uint32_t mip_level_count = 1u) {
253 if (old_layout == new_layout) {
257 vk::ImageMemoryBarrier barrier;
258 barrier.srcAccessMask = src_access_mask;
259 barrier.dstAccessMask = dst_access_mask;
260 barrier.oldLayout = old_layout;
261 barrier.newLayout = new_layout;
262 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
263 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
264 barrier.image = image;
265 barrier.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
266 barrier.subresourceRange.baseMipLevel = base_mip_level;
267 barrier.subresourceRange.levelCount = mip_level_count;
268 barrier.subresourceRange.baseArrayLayer = 0u;
269 barrier.subresourceRange.layerCount = 1u;
271 cmd.pipelineBarrier(src_stage, dst_stage, {},
nullptr,
nullptr, barrier);
277 const auto size = src.GetTextureDescriptor().size;
278 uint32_t mip_count = src.GetTextureDescriptor().mip_count;
280 if (mip_count < 2u) {
284 const auto& image = src.GetImage();
297 vk::AccessFlagBits::eTransferWrite,
298 vk::AccessFlagBits::eTransferRead,
300 vk::ImageLayout::eTransferSrcOptimal,
301 vk::PipelineStageFlagBits::eTransfer,
302 vk::PipelineStageFlagBits::eTransfer,
309 vk::AccessFlagBits::eTransferWrite,
310 vk::ImageLayout::eUndefined,
311 vk::ImageLayout::eTransferDstOptimal,
312 vk::PipelineStageFlagBits::eTransfer,
313 vk::PipelineStageFlagBits::eTransfer,
319 for (
size_t mip_level = 1u; mip_level < mip_count; mip_level++) {
322 blit.srcSubresource.aspectMask = vk::ImageAspectFlagBits::eColor;
323 blit.srcSubresource.baseArrayLayer = 0u;
324 blit.srcSubresource.layerCount = 1u;
325 blit.srcSubresource.mipLevel = 0u;
327 blit.dstSubresource.aspectMask = vk::ImageAspectFlagBits::eColor;
328 blit.dstSubresource.baseArrayLayer = 0u;
329 blit.dstSubresource.layerCount = 1u;
330 blit.dstSubresource.mipLevel = mip_level;
333 blit.srcOffsets[1].x = size.width;
334 blit.srcOffsets[1].y = size.height;
335 blit.srcOffsets[1].z = 1u;
338 blit.dstOffsets[1].x = std::max<int32_t>(size.width >> mip_level, 1u);
339 blit.dstOffsets[1].y = std::max<int32_t>(size.height >> mip_level, 1u);
340 blit.dstOffsets[1].z = 1u;
343 vk::ImageLayout::eTransferSrcOptimal,
345 vk::ImageLayout::eTransferDstOptimal,
357 vk::AccessFlagBits::eTransferWrite,
358 vk::AccessFlagBits::eShaderRead,
359 vk::ImageLayout::eTransferSrcOptimal,
360 vk::ImageLayout::eShaderReadOnlyOptimal,
361 vk::PipelineStageFlagBits::eTransfer,
362 vk::PipelineStageFlagBits::eFragmentShader,
368 vk::AccessFlagBits::eTransferWrite,
369 vk::AccessFlagBits::eShaderRead,
370 vk::ImageLayout::eTransferDstOptimal,
371 vk::ImageLayout::eShaderReadOnlyOptimal,
372 vk::PipelineStageFlagBits::eTransfer,
373 vk::PipelineStageFlagBits::eFragmentShader,
380 src.SetLayoutWithoutEncoding(vk::ImageLayout::eShaderReadOnlyOptimal);
381 src.SetMipMapGenerated();