From 45740df018815600bb95d7a7aea738f348afd20c Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Sat, 29 May 2021 23:44:13 +0200 Subject: [PATCH] [#31] Added getters, marked todos, formatted code Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- include/vkcv/Image.hpp | 18 ++++++++-- include/vkcv/ImageManager.hpp | 2 ++ src/vkcv/Image.cpp | 22 ++++++++++-- src/vkcv/ImageManager.cpp | 67 ++++++++++++++++++++++++----------- 4 files changed, 83 insertions(+), 26 deletions(-) diff --git a/include/vkcv/Image.hpp b/include/vkcv/Image.hpp index a7de56cf..5ebaf921 100644 --- a/include/vkcv/Image.hpp +++ b/include/vkcv/Image.hpp @@ -7,16 +7,30 @@ #include "vulkan/vulkan.hpp" namespace vkcv { + class ImageManager; class Image { public: static Image create(ImageManager* manager, uint32_t width, uint32_t height); - void switchImageLayout(vk::ImageLayout newLayout); + + [[nodiscard]] + uint32_t getWidth() const; + + [[nodiscard]] + uint32_t getHeight() const; + + [[nodiscard]] + vk::ImageLayout getLayout() const; + + void switchLayout(vk::ImageLayout newLayout); private: ImageManager* const m_manager; const uint64_t m_handle_id; + const uint32_t m_width; + const uint32_t m_height; vk::ImageLayout m_layout; - Image(ImageManager* manager, uint64_t id); + Image(ImageManager* manager, uint64_t id, uint32_t width, uint32_t height); }; + } diff --git a/include/vkcv/ImageManager.hpp b/include/vkcv/ImageManager.hpp index faf974b7..dc38ef08 100644 --- a/include/vkcv/ImageManager.hpp +++ b/include/vkcv/ImageManager.hpp @@ -18,7 +18,9 @@ namespace vkcv { { vk::Image m_handle; vk::DeviceMemory m_memory; + size_t m_size; }; + Core* m_core; vk::Buffer m_stagingBuffer; vk::DeviceMemory m_stagingMemory; diff --git a/src/vkcv/Image.cpp b/src/vkcv/Image.cpp index cd41c0e2..3ba5206d 100644 --- a/src/vkcv/Image.cpp +++ b/src/vkcv/Image.cpp @@ -7,19 +7,35 @@ #include "vkcv/ImageManager.hpp" namespace vkcv{ + Image Image::create(ImageManager* manager, uint32_t width, uint32_t height) { - return Image(manager, manager->createImage(width, height)); + return Image(manager, manager->createImage(width, height), width, height); + } + + uint32_t Image::getWidth() const { + return m_width; + } + + uint32_t Image::getHeight() const { + return m_height; + } + + vk::ImageLayout Image::getLayout() const { + return m_layout; } - void Image::switchImageLayout(vk::ImageLayout newLayout) + void Image::switchLayout(vk::ImageLayout newLayout) { m_manager->switchImageLayout(m_handle_id, m_layout, newLayout); m_layout = newLayout; } - Image::Image(ImageManager* manager, uint64_t id) : + + Image::Image(ImageManager* manager, uint64_t id, uint32_t width, uint32_t height) : m_manager(manager), m_handle_id(id), + m_width(width), + m_height(height), m_layout(vk::ImageLayout::eUndefined) { } diff --git a/src/vkcv/ImageManager.cpp b/src/vkcv/ImageManager.cpp index 38e0b554..7f06edc9 100644 --- a/src/vkcv/ImageManager.cpp +++ b/src/vkcv/ImageManager.cpp @@ -54,22 +54,21 @@ namespace vkcv { } } - - - uint64_t ImageManager::createImage(uint32_t width, uint32_t height) { vk::ImageCreateFlags createFlags; vk::ImageUsageFlags imageUsageFlags = (vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eTransferDst); - vk::Format format = vk::Format::eR8G8B8A8Unorm; // als Argument variabel - + + vk::Format format = vk::Format::eR8G8B8A8Unorm; // TODO + uint32_t channels = 3; // TODO const vk::Device& device = m_core->getContext().getDevice(); vk::ImageCreateInfo imageCreateInfo( createFlags, vk::ImageType::e2D, - format, vk::Extent3D(width, height, 1), + format, + vk::Extent3D(width, height, 1), 1, 1, vk::SampleCountFlagBits::e1, @@ -85,7 +84,7 @@ namespace vkcv { const vk::MemoryRequirements requirements = device.getImageMemoryRequirements(image); const vk::PhysicalDevice& physicalDevice = m_core->getContext().getPhysicalDevice(); - vk::MemoryPropertyFlags memoryTypeFlags = vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent; + vk::MemoryPropertyFlags memoryTypeFlags = vk::MemoryPropertyFlagBits::eDeviceLocal; const uint32_t memoryTypeIndex = searchImageMemoryType( physicalDevice.getMemoryProperties(), @@ -97,7 +96,7 @@ namespace vkcv { device.bindImageMemory(image, memory, 0); const uint64_t id = m_images.size(); - m_images.push_back({ image, memory}); + m_images.push_back({ image, memory, width * height * channels }); return id; } @@ -105,21 +104,36 @@ namespace vkcv { //alternativly we could use switch case for every variable to set vk::AccessFlags sourceAccessMask; vk::PipelineStageFlags sourceStage; + vk::AccessFlags destinationAccessMask; vk::PipelineStageFlags destinationStage; - if (oldLayout == vk::ImageLayout::eUndefined && newLayout == vk::ImageLayout::eTransferDstOptimal) { + + if ((oldLayout == vk::ImageLayout::eUndefined) && + (newLayout == vk::ImageLayout::eTransferDstOptimal)) + { destinationAccessMask = vk::AccessFlagBits::eTransferWrite; sourceStage = vk::PipelineStageFlagBits::eTopOfPipe; destinationStage = vk::PipelineStageFlagBits::eTransfer; } - else if (oldLayout == vk::ImageLayout::eTransferDstOptimal && newLayout == vk::ImageLayout::eShaderReadOnlyOptimal) { + else if ((oldLayout == vk::ImageLayout::eTransferDstOptimal) && + (newLayout == vk::ImageLayout::eShaderReadOnlyOptimal)) + { sourceAccessMask = vk::AccessFlagBits::eTransferWrite; destinationAccessMask = vk::AccessFlagBits::eShaderRead; sourceStage = vk::PipelineStageFlagBits::eTransfer; destinationStage = vk::PipelineStageFlagBits::eFragmentShader; } - vk::ImageSubresourceRange imageSubresourceRange(vk::ImageAspectFlagBits::eColor , 0, 1, 0, 1); + + vk::ImageSubresourceRange imageSubresourceRange( + vk::ImageAspectFlagBits::eColor , + 0, + 1, + 0, + 1 + ); + ImageManager::Image image = m_images[id]; + vk::ImageMemoryBarrier imageMemoryBarrier( sourceAccessMask, destinationAccessMask, @@ -129,9 +143,11 @@ namespace vkcv { VK_QUEUE_FAMILY_IGNORED, image.m_handle, imageSubresourceRange - ); + ); + SubmitInfo submitInfo; - submitInfo.queueType = QueueType::Present; //not sure + submitInfo.queueType = QueueType::Transfer; + m_core->submitCommands( submitInfo, [sourceStage, destinationStage, imageMemoryBarrier](const vk::CommandBuffer& commandBuffer) { @@ -153,7 +169,6 @@ namespace vkcv { size_t size; uint32_t width; uint32_t height; - size_t offset; vk::Image image; vk::Buffer stagingBuffer; @@ -230,22 +245,31 @@ namespace vkcv { } void ImageManager::fillImage(uint64_t id, void* data, size_t size) { - uint64_t width =0, height = 0; // TODO - //Image wird geladen - size_t sizeImage = width * height * 3; //TODO + if (size == 0) { + size = SIZE_MAX; + } + + if (id >= m_images.size()) { + return; + } + + auto& image = m_images[id]; + switchImageLayout(id, vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal); + + const size_t max_size = std::min(size, image.m_size); + //const size_t max_size = std::min(size, image.m_size - offset); ImageStagingStepInfo info; info.data = data; - info.size = size;//TODO - info.offset = 0; + info.size = max_size; - info.image = m_images[id].m_handle; + info.image = image.m_handle; info.stagingBuffer = m_stagingBuffer; info.stagingMemory = m_stagingMemory; const vk::MemoryRequirements stagingRequirements = m_core->getContext().getDevice().getBufferMemoryRequirements(m_stagingBuffer); - info.stagingLimit = stagingRequirements.size; + info.stagingLimit = stagingRequirements.size; //TODO info.stagingPosition = 0; copyStagingToImage(m_core, info); @@ -257,6 +281,7 @@ namespace vkcv { if (id >= m_images.size()) { return; } + auto& image = m_images[id]; const vk::Device& device = m_core->getContext().getDevice(); -- GitLab