rewriting swapchain/image/allocation parts
[demo] / src / vulkan / image.cc
diff --git a/src/vulkan/image.cc b/src/vulkan/image.cc
new file mode 100644 (file)
index 0000000..780bfa0
--- /dev/null
@@ -0,0 +1,36 @@
+#include <stdio.h>
+#include <string.h>
+
+#include "allocator.h"
+#include "image.h"
+#include "vk.h"
+#include "vkutil.h"
+
+bool vk_image_set_layout(VkCommandBuffer cmd_buf, VkImage img, VkImageAspectFlags aspect_flags,
+               VkImageLayout old_layout, VkImageLayout new_layout, VkAccessFlagBits access_mask)
+{
+       VkImageMemoryBarrier imb;
+       memset(&imb, 0, sizeof imb);
+       imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+       imb.srcAccessMask = access_mask;
+       imb.oldLayout = old_layout;
+       imb.newLayout = new_layout;
+       imb.image = img;
+       imb.subresourceRange = {aspect_flags, 0, 1, 0, 1};
+
+       if(new_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
+               imb.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+       } else if (new_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
+               imb.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+       } else if (new_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
+               imb.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+       } else if (new_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
+               imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
+       }
+
+       VkPipelineStageFlags src_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
+       VkPipelineStageFlags dst_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
+
+       vkCmdPipelineBarrier(cmd_buf, src_stages, dst_stages, 0, 0, 0, 0, 0, 1, &imb);
+       return true;
+}