/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "Image.hpp" namespace openVulkanoCpp::Vulkan { void Image::Init(const Device* device, const vk::ImageCreateInfo& imageCreateInfo, vk::ImageViewCreateInfo imageViewCreateInfo, const vk::MemoryPropertyFlags& memoryPropertyFlags) { this->device = device->device; image = device->device.createImage(imageCreateInfo); format = imageCreateInfo.format; extent = imageCreateInfo.extent; const vk::MemoryRequirements memRequirements = device->device.getImageMemoryRequirements(image); size = allocSize = memRequirements.size; const vk::MemoryAllocateInfo memAllocInfo = { allocSize, device->GetMemoryType(memRequirements.memoryTypeBits, memoryPropertyFlags) }; memory = device->device.allocateMemory(memAllocInfo); device->device.bindImageMemory(image, memory, 0); imageViewCreateInfo.image = image; view = device->device.createImageView(imageViewCreateInfo); } void Image::SetLayout(vk::CommandBuffer& cmdBuffer, vk::ImageSubresourceRange subResourceRange, vk::ImageLayout newLayout, vk::ImageLayout oldLayout) const { const vk::ImageMemoryBarrier imgMemBarrier(VulkanUtils::GetAccessFlagsForLayout(oldLayout), VulkanUtils::GetAccessFlagsForLayout(newLayout), oldLayout, newLayout, 0, 0, image, subResourceRange); cmdBuffer.pipelineBarrier(VulkanUtils::GetPipelineStageForLayout(oldLayout), VulkanUtils::GetPipelineStageForLayout(newLayout), {}, nullptr, nullptr, imgMemBarrier); } void Image::Close() { if(sampler) { device.destroySampler(sampler); sampler = vk::Sampler(); } if(view) { device.destroyImageView(view); view = vk::ImageView(); } if(image) { device.destroyImage(image); image = vk::Image(); } Buffer::Close(); } }