rewriting swapchain/image/allocation parts
[demo] / src / vulkan / image.cc
1 #include <stdio.h>
2 #include <string.h>
3
4 #include "allocator.h"
5 #include "image.h"
6 #include "vk.h"
7 #include "vkutil.h"
8
9 bool vk_image_set_layout(VkCommandBuffer cmd_buf, VkImage img, VkImageAspectFlags aspect_flags,
10                 VkImageLayout old_layout, VkImageLayout new_layout, VkAccessFlagBits access_mask)
11 {
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;
18         imb.image = img;
19         imb.subresourceRange = {aspect_flags, 0, 1, 0, 1};
20
21         if(new_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
22                 imb.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
23         } else if (new_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
24                 imb.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
25         } else if (new_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
26                 imb.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
27         } else if (new_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
28                 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
29         }
30
31         VkPipelineStageFlags src_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
32         VkPipelineStageFlags dst_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
33
34         vkCmdPipelineBarrier(cmd_buf, src_stages, dst_stages, 0, 0, 0, 0, 0, 1, &imb);
35         return true;
36 }