70 VkImageMemoryBarrier image_memory_barrier = {};
71 image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
72 image_memory_barrier.pNext =
nullptr;
73 image_memory_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
74 image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
75 image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
76 image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
77 image_memory_barrier.image = data.vk_image;
78 image_memory_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
79 image_memory_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
80 image_memory_barrier.subresourceRange.aspectMask = data.vk_image_aspect;
81 image_memory_barrier.subresourceRange.baseArrayLayer = 0;
82 image_memory_barrier.subresourceRange.layerCount = data.layer_count;
83 image_memory_barrier.subresourceRange.baseMipLevel = 0;
84 image_memory_barrier.subresourceRange.levelCount = 1;
86 VkImageBlit image_blit = {};
87 image_blit.srcSubresource.aspectMask = data.vk_image_aspect;
88 image_blit.srcSubresource.layerCount = data.layer_count;
89 image_blit.srcSubresource.mipLevel = 1;
90 image_blit.dstSubresource.aspectMask = data.vk_image_aspect;
91 image_blit.dstSubresource.layerCount = data.layer_count;
92 image_blit.dstSubresource.mipLevel = 1;
94 int3 dst_size = data.l0_size;
95 for (
int src_mipmap :
IndexRange(data.mipmaps - 1)) {
96 int dst_mipmap = src_mipmap + 1;
97 int3 src_size = dst_size;
101 image_memory_barrier.subresourceRange.baseMipLevel = src_mipmap;
103 VK_PIPELINE_STAGE_TRANSFER_BIT,
104 VK_DEPENDENCY_BY_REGION_BIT,
110 &image_memory_barrier);
113 image_blit.srcSubresource.mipLevel = src_mipmap;
114 image_blit.srcOffsets[1] = {src_size.x, src_size.y, src_size.z};
115 image_blit.dstSubresource.mipLevel = dst_mipmap;
116 image_blit.dstOffsets[1] = {dst_size.x, dst_size.y, dst_size.z};
118 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
120 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
128 image_memory_barrier.subresourceRange.baseMipLevel = 0;
129 image_memory_barrier.subresourceRange.levelCount = data.mipmaps - 1;
130 image_memory_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
131 image_memory_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
133 VK_PIPELINE_STAGE_TRANSFER_BIT,
134 VK_DEPENDENCY_BY_REGION_BIT,
140 &image_memory_barrier);