From 75aa36c0249c0236c5e1bbad90df1eea659c9cf6 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Tue, 23 Jul 2024 01:21:27 +0200 Subject: [PATCH] Experimental shared memory texture handling --- openVulkanoCpp/Base/Render/IRenderer.hpp | 3 +++ .../Base/Render/IResourceManager.hpp | 25 +++++++++++++++++++ openVulkanoCpp/Vulkan/Device.cpp | 2 +- openVulkanoCpp/Vulkan/Image.cpp | 16 +++++++++--- openVulkanoCpp/Vulkan/Image.hpp | 2 +- openVulkanoCpp/Vulkan/Renderer.hpp | 2 ++ .../Vulkan/Resources/ResourceManager.cpp | 15 +++++++++++ .../Vulkan/Resources/ResourceManager.hpp | 5 +++- openVulkanoCpp/Vulkan/Scene/VulkanTexture.hpp | 13 ++++++++++ 9 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 openVulkanoCpp/Base/Render/IResourceManager.hpp diff --git a/openVulkanoCpp/Base/Render/IRenderer.hpp b/openVulkanoCpp/Base/Render/IRenderer.hpp index de12732..3c01ef3 100644 --- a/openVulkanoCpp/Base/Render/IRenderer.hpp +++ b/openVulkanoCpp/Base/Render/IRenderer.hpp @@ -6,6 +6,7 @@ #pragma once +#include "IResourceManager.hpp" #include "Base/ITickable.hpp" #include "Base/ICloseable.hpp" #include "Scene/Scene.hpp" @@ -32,5 +33,7 @@ namespace OpenVulkano virtual void SetActiveUi(Scene::UI::Ui* ui) = 0; virtual Scene::UI::Ui* GetActiveUi() = 0; + + virtual IResourceManager* GetIResourceManager() = 0; }; } diff --git a/openVulkanoCpp/Base/Render/IResourceManager.hpp b/openVulkanoCpp/Base/Render/IResourceManager.hpp new file mode 100644 index 0000000..afecdb2 --- /dev/null +++ b/openVulkanoCpp/Base/Render/IResourceManager.hpp @@ -0,0 +1,25 @@ +/* + * 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/. + */ + +#pragma once + +#include "Base/Wrapper.hpp" +#include "Math/Math.hpp" +#include "Scene/DataFormat.hpp" + +namespace OpenVulkano +{ + namespace Scene + { + class Texture; + } + + class IResourceManager + { + public: + [[nodiscard]] virtual Unique CreateSharedMemoryTexture(const Math::Vector3ui& resolution, DataFormat format) = 0; + }; +} diff --git a/openVulkanoCpp/Vulkan/Device.cpp b/openVulkanoCpp/Vulkan/Device.cpp index deb58a1..76d22d4 100644 --- a/openVulkanoCpp/Vulkan/Device.cpp +++ b/openVulkanoCpp/Vulkan/Device.cpp @@ -202,7 +202,7 @@ namespace OpenVulkano::Vulkan bool Device::GetMemoryType(uint32_t typeBits, const vk::MemoryPropertyFlags& properties, uint32_t* typeIndex) const { - for (uint32_t i = 0; i < 32; i++) + for (uint32_t i = 0; i < 32 && typeBits; i++) { if ((typeBits & 1) == 1) { diff --git a/openVulkanoCpp/Vulkan/Image.cpp b/openVulkanoCpp/Vulkan/Image.cpp index 21e738f..26b94e8 100644 --- a/openVulkanoCpp/Vulkan/Image.cpp +++ b/openVulkanoCpp/Vulkan/Image.cpp @@ -35,14 +35,22 @@ namespace OpenVulkano::Vulkan cmdBuffer.pipelineBarrier(/*VulkanUtils::GetPipelineStageForLayout(oldLayout)*/vk::PipelineStageFlagBits::eTopOfPipe, /*VulkanUtils::GetPipelineStageForLayout(newLayout)*/ vk::PipelineStageFlagBits::eTransfer, {}, nullptr, nullptr, imgMemBarrier); } - void Image::Init(const Device* device, const DataFormat& format, const vk::Extent3D& resolution) + void Image::Init(const Device* device, const DataFormat& format, const vk::Extent3D& resolution, const vk::MemoryPropertyFlags& memoryPropertyFlags) { vk::ImageCreateInfo imgCreateInfo { {}, vk::ImageType::e2D, format, resolution, 1, 1 }; imgCreateInfo.usage = vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eSampled; - imgCreateInfo.tiling = vk::ImageTiling::eOptimal; + if (memoryPropertyFlags & vk::MemoryPropertyFlagBits::eHostVisible) + { + imgCreateInfo.tiling = vk::ImageTiling::eLinear; + imgCreateInfo.initialLayout = vk::ImageLayout::ePreinitialized; + } + else + { + imgCreateInfo.tiling = vk::ImageTiling::eOptimal; + imgCreateInfo.initialLayout = vk::ImageLayout::eUndefined; + } imgCreateInfo.sharingMode = vk::SharingMode::eExclusive; - imgCreateInfo.initialLayout = vk::ImageLayout::eUndefined; vk::ImageViewCreateInfo imgViewCreateInfo { {}, image, vk::ImageViewType::e2D, imgCreateInfo.format }; imgViewCreateInfo.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor; @@ -51,7 +59,7 @@ namespace OpenVulkano::Vulkan imgViewCreateInfo.subresourceRange.baseArrayLayer = 0; imgViewCreateInfo.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - Init(device, imgCreateInfo, imgViewCreateInfo); + Init(device, imgCreateInfo, imgViewCreateInfo, true, memoryPropertyFlags); } void Image::Close() diff --git a/openVulkanoCpp/Vulkan/Image.hpp b/openVulkanoCpp/Vulkan/Image.hpp index ee684bb..40d8ad1 100644 --- a/openVulkanoCpp/Vulkan/Image.hpp +++ b/openVulkanoCpp/Vulkan/Image.hpp @@ -38,7 +38,7 @@ namespace OpenVulkano::Vulkan */ void Init(const Device* device, const vk::ImageCreateInfo& imageCreateInfo, vk::ImageViewCreateInfo imageViewCreateInfo, bool allocateMem = true, const vk::MemoryPropertyFlags& memoryPropertyFlags = vk::MemoryPropertyFlagBits::eDeviceLocal); - void Init(const Device* device, const DataFormat& format, const vk::Extent3D& resolution); + void Init(const Device* device, const DataFormat& format, const vk::Extent3D& resolution, const vk::MemoryPropertyFlags& memoryPropertyFlags = vk::MemoryPropertyFlagBits::eDeviceLocal); void SetLayout(vk::CommandBuffer& cmdBuffer, const vk::ImageSubresourceRange& subResourceRange, vk::ImageLayout newLayout, vk::ImageLayout oldLayout = vk::ImageLayout::eUndefined) const; diff --git a/openVulkanoCpp/Vulkan/Renderer.hpp b/openVulkanoCpp/Vulkan/Renderer.hpp index 2ff4d36..5740256 100644 --- a/openVulkanoCpp/Vulkan/Renderer.hpp +++ b/openVulkanoCpp/Vulkan/Renderer.hpp @@ -84,5 +84,7 @@ namespace OpenVulkano::Vulkan void RegisterCloseable(ICloseable* closeable) { closeables.push_back(closeable); } void UnregisterCloseable(ICloseable* closeable) { Utils::Remove(closeables, closeable); } + + IResourceManager* GetIResourceManager() override { return &resourceManager; } }; } diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index 2fc8b8d..47a9d9e 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -365,4 +365,19 @@ namespace OpenVulkano::Vulkan if (!sampler) sampler = device.createSampler(samplerConfig); return sampler; } + + Unique ResourceManager::CreateSharedMemoryTexture(const Math::Vector3ui& resolution, DataFormat format) + { + const std::unique_lock lock(mutex); + Unique texture = std::make_unique(); + texture->resolution = resolution; + texture->format = format; + texture->size = resolution.x * resolution.y * resolution.z * format.GetBytesPerPixel(); + + VulkanTexture* vkTexture = new VulkanTexture(); + vkTexture->InitSharedMem(this, texture.get(), GetDescriptorLayoutSet(Scene::Texture::DESCRIPTOR_SET_LAYOUT_BINDING), Scene::Texture::DESCRIPTOR_SET_LAYOUT_BINDING); + textures.emplace_back(vkTexture); + + return texture; + } } diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp index 3910542..b347f73 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp @@ -14,6 +14,7 @@ #include "IShaderOwner.hpp" #include "MemoryPool.hpp" #include "Base/Wrapper.hpp" +#include "Base/Render/IResourceManager.hpp" #include "Vulkan/Image.hpp" #include "Scene/Shader/DescriptorInputDescription.hpp" #include @@ -47,7 +48,7 @@ namespace OpenVulkano class ManagedBuffer; class MemoryAllocation; - class ResourceManager : public IShaderOwner + class ResourceManager : public IShaderOwner, public IResourceManager { friend UniformBuffer; friend VulkanTexture; @@ -118,6 +119,8 @@ namespace OpenVulkano vk::Sampler CreateSampler(const vk::SamplerCreateInfo& samplerConfig); + [[nodiscard]] Unique CreateSharedMemoryTexture(const Math::Vector3ui& resolution, DataFormat format) override; + protected: // Allocation management MemoryPool::ManagedBufferPtr CreateDeviceOnlyBufferWithData(vk::DeviceSize size, vk::BufferUsageFlagBits usage, const void* data); diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanTexture.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanTexture.hpp index 1442434..c47f37e 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanTexture.hpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanTexture.hpp @@ -37,6 +37,19 @@ namespace OpenVulkano::Vulkan texture->renderTexture = this; } + void InitSharedMem(ResourceManager* resManager, Scene::Texture* texture, vk::DescriptorSetLayout* descriptorSetLayout, const DescriptorSetLayoutBinding& binding) + { + m_texture = texture; + Image::Init(resManager->GetContext()->device.get(), texture->format, { texture->resolution.x, texture->resolution.y, texture->resolution.z }, vk::MemoryPropertyFlagBits::eDeviceLocal | vk::MemoryPropertyFlagBits::eHostVisible); + texture->updated = false; + texture->textureBuffer = Map(); + + m_sampler = resManager->CreateSampler(DEFAULT_SAMPLER_CONFIG); + SetDescriptorSet(resManager, descriptorSetLayout, binding); + + texture->renderTexture = this; + } + virtual ~VulkanTexture() override { if (m_texture) Close();