--- /dev/null
+#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;
+}