#include "flutter/vulkan/vulkan_image.h"
#include "flutter/vulkan/vulkan_command_buffer.h"
#include "flutter/vulkan/vulkan_proc_table.h"
namespace vulkan {
VulkanImage::VulkanImage(VulkanHandle<VkImage> image)
: handle_(std::move(image)),
layout_(VK_IMAGE_LAYOUT_UNDEFINED),
access_flags_(0),
valid_(false) {
if (!handle_) {
return;
}
valid_ = true;
}
VulkanImage::~VulkanImage() = default;
bool VulkanImage::IsValid() const {
return valid_;
}
bool VulkanImage::InsertImageMemoryBarrier(
const VulkanCommandBuffer& command_buffer,
VkPipelineStageFlagBits src_pipline_bits,
VkPipelineStageFlagBits dest_pipline_bits,
VkAccessFlagBits dest_access_flags,
VkImageLayout dest_layout) {
const VkImageMemoryBarrier image_memory_barrier = {
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
.pNext = nullptr,
.srcAccessMask = access_flags_,
.dstAccessMask = dest_access_flags,
.oldLayout = layout_,
.newLayout = dest_layout,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = handle_,
.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
};
bool success = command_buffer.InsertPipelineBarrier(
src_pipline_bits,
dest_pipline_bits,
0,
0,
nullptr,
0,
nullptr,
1,
&image_memory_barrier
);
if (success) {
access_flags_ = dest_access_flags;
layout_ = dest_layout;
}
return success;
}
}