74 lines
2.1 KiB
C++
74 lines
2.1 KiB
C++
#include "vk_images.h"
|
|
#include "vk_initializers.h"
|
|
|
|
void vkutil::transition_image(VkCommandBuffer cmd, VkImage image, VkImageLayout currentLayout, VkImageLayout newLayout)
|
|
{
|
|
VkImageAspectFlags aspectMask = (newLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL) ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
|
|
|
|
VkImageMemoryBarrier2 imageBarrier{
|
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
|
|
.srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
|
|
.srcAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT,
|
|
.dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
|
|
.dstAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT | VK_ACCESS_2_MEMORY_READ_BIT,
|
|
.oldLayout = currentLayout,
|
|
.newLayout = newLayout,
|
|
.image = image,
|
|
.subresourceRange = vkinit::image_subresource_range(aspectMask),
|
|
};
|
|
|
|
VkDependencyInfo depInfo{
|
|
.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
|
|
.imageMemoryBarrierCount = 1,
|
|
.pImageMemoryBarriers = &imageBarrier,
|
|
};
|
|
|
|
vkCmdPipelineBarrier2(cmd, &depInfo);
|
|
}
|
|
|
|
void vkutil::copy_image_to_image(VkCommandBuffer cmd, VkImage source, VkImage destination, VkExtent2D srcSize, VkExtent2D dstSize)
|
|
{
|
|
VkImageBlit2 blitRegion{
|
|
.sType = VK_STRUCTURE_TYPE_IMAGE_BLIT_2,
|
|
};
|
|
|
|
blitRegion.srcSubresource = {
|
|
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
|
.mipLevel = 0,
|
|
.baseArrayLayer = 0,
|
|
.layerCount = 1,
|
|
};
|
|
|
|
blitRegion.dstSubresource = {
|
|
.aspectMask=VK_IMAGE_ASPECT_COLOR_BIT,
|
|
.mipLevel=0,
|
|
.baseArrayLayer=0,
|
|
.layerCount=1,
|
|
};
|
|
|
|
blitRegion.srcOffsets[1] = {
|
|
.x = int32_t(srcSize.width),
|
|
.y = int32_t(srcSize.height),
|
|
.z = 1,
|
|
};
|
|
|
|
blitRegion.dstOffsets[1] = {
|
|
.x = int32_t(dstSize.width),
|
|
.y = int32_t(dstSize.height),
|
|
.z = 1,
|
|
};
|
|
|
|
VkBlitImageInfo2 blitInfo{
|
|
.sType = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2,
|
|
.srcImage = source,
|
|
.srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
|
.dstImage = destination,
|
|
.dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
|
.regionCount = 1,
|
|
.pRegions = &blitRegion,
|
|
.filter = VK_FILTER_LINEAR,
|
|
};
|
|
|
|
vkCmdBlitImage2(cmd, &blitInfo);
|
|
}
|
|
|