/* * 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 OpenVulkano::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::Init(const Device* device, const vk::Extent3D& resolution) { this->device = device->device; vk::ImageCreateInfo imgCreateInfo; imgCreateInfo.imageType = vk::ImageType::e2D; imgCreateInfo.extent = resolution; imgCreateInfo.mipLevels = 1; imgCreateInfo.arrayLayers = 1; imgCreateInfo.format = vk::Format::eR8G8B8Srgb; imgCreateInfo.tiling = vk::ImageTiling::eOptimal; imgCreateInfo.initialLayout = vk::ImageLayout::eUndefined; imgCreateInfo.usage = vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eSampled; imgCreateInfo.sharingMode = vk::SharingMode::eExclusive; imgCreateInfo.samples = vk::SampleCountFlagBits::e1; vk::ImageViewCreateInfo imgViewCreateInfo; imgViewCreateInfo.image = image; imgViewCreateInfo.format = imgCreateInfo.format; imgViewCreateInfo.viewType = vk::ImageViewType::e2D; imgViewCreateInfo.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor; imgViewCreateInfo.subresourceRange.baseMipLevel = 0; imgViewCreateInfo.subresourceRange.levelCount = 1; imgViewCreateInfo.subresourceRange.baseArrayLayer = 0; imgViewCreateInfo.subresourceRange.levelCount = 1; Init(device, imgCreateInfo, imgViewCreateInfo); CreateSampler(); } void Image::CreateSampler() { vk::SamplerCreateInfo samplerCreateInfo; samplerCreateInfo.magFilter = vk::Filter::eLinear; samplerCreateInfo.minFilter = vk::Filter::eLinear; samplerCreateInfo.mipmapMode = vk::SamplerMipmapMode::eLinear; samplerCreateInfo.addressModeU = vk::SamplerAddressMode::eClampToEdge; samplerCreateInfo.addressModeV = vk::SamplerAddressMode::eClampToEdge; samplerCreateInfo.addressModeW = vk::SamplerAddressMode::eClampToEdge; samplerCreateInfo.borderColor = vk::BorderColor::eFloatTransparentBlack; samplerCreateInfo.unnormalizedCoordinates = false; samplerCreateInfo.compareEnable = false; sampler = this->device.createSampler(samplerCreateInfo); } 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(); } }