38 src_barrier.
new_layout = vk::ImageLayout::eTransferSrcOptimal;
39 src_barrier.
src_access = vk::AccessFlagBits::eTransferWrite |
40 vk::AccessFlagBits::eShaderWrite |
41 vk::AccessFlagBits::eColorAttachmentWrite;
42 src_barrier.
src_stage = vk::PipelineStageFlagBits::eTransfer |
43 vk::PipelineStageFlagBits::eFragmentShader |
44 vk::PipelineStageFlagBits::eColorAttachmentOutput;
45 src_barrier.
dst_access = vk::AccessFlagBits::eTransferRead;
46 src_barrier.
dst_stage = vk::PipelineStageFlagBits::eTransfer;
50 dst_barrier.
new_layout = vk::ImageLayout::eTransferDstOptimal;
52 dst_barrier.
src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
54 vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferWrite;
55 dst_barrier.
dst_stage = vk::PipelineStageFlagBits::eFragmentShader |
56 vk::PipelineStageFlagBits::eTransfer;
58 if (!src.SetLayout(src_barrier) || !dst.SetLayout(dst_barrier)) {
63 vk::ImageCopy image_copy;
65 image_copy.setSrcSubresource(
66 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
67 image_copy.setDstSubresource(
68 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
70 image_copy.srcOffset =
72 image_copy.dstOffset =
79 cmd_buffer.copyImage(src.GetImage(),
111 barrier.
new_layout = vk::ImageLayout::eTransferSrcOptimal;
112 barrier.
src_access = vk::AccessFlagBits::eShaderWrite |
113 vk::AccessFlagBits::eTransferWrite |
114 vk::AccessFlagBits::eColorAttachmentWrite;
115 barrier.
src_stage = vk::PipelineStageFlagBits::eFragmentShader |
116 vk::PipelineStageFlagBits::eTransfer |
117 vk::PipelineStageFlagBits::eColorAttachmentOutput;
118 barrier.
dst_access = vk::AccessFlagBits::eShaderRead;
119 barrier.
dst_stage = vk::PipelineStageFlagBits::eVertexShader |
120 vk::PipelineStageFlagBits::eFragmentShader;
124 vk::BufferImageCopy image_copy;
126 image_copy.setBufferRowLength(0);
127 image_copy.setBufferImageHeight(0);
128 image_copy.setImageSubresource(
129 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
130 image_copy.setImageOffset(
132 image_copy.setImageExtent(
135 if (!src.SetLayout(barrier)) {
140 cmd_buffer.copyImageToBuffer(src.GetImage(),
172 dst_barrier.
new_layout = vk::ImageLayout::eTransferDstOptimal;
174 dst_barrier.
src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
176 vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferWrite;
177 dst_barrier.
dst_stage = vk::PipelineStageFlagBits::eFragmentShader |
178 vk::PipelineStageFlagBits::eTransfer;
180 vk::BufferImageCopy image_copy;
182 image_copy.setBufferRowLength(0);
183 image_copy.setBufferImageHeight(0);
184 image_copy.setImageSubresource(
185 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
186 image_copy.setImageOffset(
188 image_copy.setImageExtent(vk::Extent3D(
destination->GetSize().width,
191 if (!dst.SetLayout(dst_barrier)) {
196 cmd_buffer.copyBufferToImage(src.GetBuffer(),
216 const vk::Image& image,
217 vk::AccessFlags src_access_mask,
218 vk::AccessFlags dst_access_mask,
219 vk::ImageLayout old_layout,
220 vk::ImageLayout new_layout,
221 vk::PipelineStageFlags src_stage,
222 vk::PipelineStageFlags dst_stage,
223 uint32_t base_mip_level,
224 uint32_t mip_level_count = 1u) {
225 if (old_layout == new_layout) {
229 vk::ImageMemoryBarrier barrier;
230 barrier.srcAccessMask = src_access_mask;
231 barrier.dstAccessMask = dst_access_mask;
232 barrier.oldLayout = old_layout;
233 barrier.newLayout = new_layout;
234 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
235 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
236 barrier.image = image;
237 barrier.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
238 barrier.subresourceRange.baseMipLevel = base_mip_level;
239 barrier.subresourceRange.levelCount = mip_level_count;
240 barrier.subresourceRange.baseArrayLayer = 0u;
241 barrier.subresourceRange.layerCount = 1u;
243 cmd.pipelineBarrier(src_stage, dst_stage, {},
nullptr,
nullptr, barrier);
249 const auto size = src.GetTextureDescriptor().size;
250 uint32_t mip_count = src.GetTextureDescriptor().mip_count;
252 if (mip_count < 2u) {
256 const auto& image = src.GetImage();
269 vk::AccessFlagBits::eTransferWrite,
270 vk::AccessFlagBits::eTransferRead,
272 vk::ImageLayout::eTransferSrcOptimal,
273 vk::PipelineStageFlagBits::eTransfer,
274 vk::PipelineStageFlagBits::eTransfer,
281 vk::AccessFlagBits::eTransferWrite,
282 vk::ImageLayout::eUndefined,
283 vk::ImageLayout::eTransferDstOptimal,
284 vk::PipelineStageFlagBits::eTransfer,
285 vk::PipelineStageFlagBits::eTransfer,
291 for (
size_t mip_level = 1u; mip_level < mip_count; mip_level++) {
294 blit.srcSubresource.aspectMask = vk::ImageAspectFlagBits::eColor;
295 blit.srcSubresource.baseArrayLayer = 0u;
296 blit.srcSubresource.layerCount = 1u;
297 blit.srcSubresource.mipLevel = 0u;
299 blit.dstSubresource.aspectMask = vk::ImageAspectFlagBits::eColor;
300 blit.dstSubresource.baseArrayLayer = 0u;
301 blit.dstSubresource.layerCount = 1u;
302 blit.dstSubresource.mipLevel = mip_level;
305 blit.srcOffsets[1].x = size.width;
306 blit.srcOffsets[1].y = size.height;
307 blit.srcOffsets[1].z = 1u;
310 blit.dstOffsets[1].x = std::max<int32_t>(size.width >> mip_level, 1u);
311 blit.dstOffsets[1].y = std::max<int32_t>(size.height >> mip_level, 1u);
312 blit.dstOffsets[1].z = 1u;
315 vk::ImageLayout::eTransferSrcOptimal,
317 vk::ImageLayout::eTransferDstOptimal,
329 vk::AccessFlagBits::eTransferWrite,
330 vk::AccessFlagBits::eShaderRead,
331 vk::ImageLayout::eTransferSrcOptimal,
332 vk::ImageLayout::eShaderReadOnlyOptimal,
333 vk::PipelineStageFlagBits::eTransfer,
334 vk::PipelineStageFlagBits::eFragmentShader,
340 vk::AccessFlagBits::eTransferWrite,
341 vk::AccessFlagBits::eShaderRead,
342 vk::ImageLayout::eTransferDstOptimal,
343 vk::ImageLayout::eShaderReadOnlyOptimal,
344 vk::PipelineStageFlagBits::eTransfer,
345 vk::PipelineStageFlagBits::eFragmentShader,
352 src.SetLayoutWithoutEncoding(vk::ImageLayout::eShaderReadOnlyOptimal);