9 bool vk_image_set_layout(VkCommandBuffer cmd_buf, VkImage img, VkImageAspectFlags aspect_flags,
10 VkImageLayout old_layout, VkImageLayout new_layout, VkAccessFlagBits access_mask)
12 VkImageMemoryBarrier imb;
13 memset(&imb, 0, sizeof imb);
14 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
15 imb.srcAccessMask = access_mask;
16 imb.oldLayout = old_layout;
17 imb.newLayout = new_layout;
19 imb.subresourceRange = {aspect_flags, 0, 1, 0, 1};
21 if(new_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
22 imb.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
24 else if(new_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
25 imb.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
27 else if(new_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
28 imb.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
30 else if(new_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
31 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
34 VkPipelineStageFlags src_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
35 VkPipelineStageFlags dst_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
37 vkCmdPipelineBarrier(cmd_buf, src_stages, dst_stages, 0, 0, 0, 0, 0, 1, &imb);