clear color works
[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         }
24         else if(new_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
25                 imb.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
26         }
27         else if(new_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
28                 imb.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
29         }
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;
32         }
33
34         VkPipelineStageFlags src_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
35         VkPipelineStageFlags dst_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
36
37         vkCmdPipelineBarrier(cmd_buf, src_stages, dst_stages, 0, 0, 0, 0, 0, 1, &imb);
38         return true;
39 }