From ba7f0e6d62207ca0a49cda59cde462102e265948 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Wed, 10 Jul 2024 16:11:36 +0200 Subject: [PATCH] Restructure some files regarding resource management --- .../Vulkan/Resources/IShaderOwner.hpp | 2 +- ...{ManagedResource.hpp => ManagedBuffer.hpp} | 87 +---------------- ...nagedResource.cpp => MemoryAllocation.cpp} | 2 +- .../Vulkan/Resources/MemoryAllocation.hpp | 97 +++++++++++++++++++ .../Vulkan/Resources/ResourceManager.cpp | 5 +- .../Vulkan/Resources/ResourceManager.hpp | 12 ++- .../Vulkan/Resources/UniformBuffer.cpp | 2 +- .../Vulkan/Scene/VulkanGeometry.hpp | 2 +- openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp | 3 +- 9 files changed, 114 insertions(+), 98 deletions(-) rename openVulkanoCpp/Vulkan/Resources/{ManagedResource.hpp => ManagedBuffer.hpp} (61%) rename openVulkanoCpp/Vulkan/Resources/{ManagedResource.cpp => MemoryAllocation.cpp} (95%) create mode 100644 openVulkanoCpp/Vulkan/Resources/MemoryAllocation.hpp diff --git a/openVulkanoCpp/Vulkan/Resources/IShaderOwner.hpp b/openVulkanoCpp/Vulkan/Resources/IShaderOwner.hpp index 01824f0..782e001 100644 --- a/openVulkanoCpp/Vulkan/Resources/IShaderOwner.hpp +++ b/openVulkanoCpp/Vulkan/Resources/IShaderOwner.hpp @@ -8,7 +8,7 @@ namespace OpenVulkano::Vulkan { - struct VulkanShader; + class VulkanShader; class IShaderOwner { diff --git a/openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp b/openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp similarity index 61% rename from openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp rename to openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp index 1142614..fa0f9a6 100644 --- a/openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp @@ -8,97 +8,12 @@ #define CRASH_ON_MULTIPLE_MAPPINGS_TO_SAME_ALLOCATION +#include "MemoryAllocation.hpp" #include -#include #include -#include "Base/Utils.hpp" namespace OpenVulkano::Vulkan { - struct MemoryAllocation - { - vk::DeviceMemory memory; - size_t used; - const size_t size; - const uint32_t type; - const vk::Device device; - void* mapped; - - private: - uint32_t mappedCount; - static constexpr uint32_t CHILD_MAPPED_FLAG = 1u << 31; - - public: - MemoryAllocation(size_t size, uint32_t type, vk::Device device): - memory(nullptr), used(0), size(size), type(type), device(device), mapped(nullptr), mappedCount(0) - { - } - - ~MemoryAllocation() - { - if (device && memory) - device.free(memory); - } - - [[nodiscard]] size_t FreeSpace() const - { - return size - used; - } - - [[nodiscard]] size_t FreeSpace(size_t alignment) const - { - return size - Utils::Align(used, alignment); - } - - void HandleChildMappingValidation() const; - - void* Map() - { - HandleChildMappingValidation(); - if (!mapped) - { - mapped = device.mapMemory(memory, 0, size, vk::MemoryMapFlags()); - } - mappedCount++; - return mapped; - } - - void UnMap() - { - if (mappedCount > 0) - { - mappedCount--; - if (mappedCount == 0) - { - device.unmapMemory(memory); - } - } - } - - [[nodiscard]] bool IsChildMapped() const - { - return mappedCount & CHILD_MAPPED_FLAG; - } - - void* MapChild(size_t offset, vk::DeviceSize size) - { - HandleChildMappingValidation(); - mappedCount |= CHILD_MAPPED_FLAG; - mappedCount++; - return device.mapMemory(memory, offset, size, vk::MemoryMapFlags()); - } - - void UnMapChild() - { - mappedCount &= ~CHILD_MAPPED_FLAG; - mappedCount--; - if (mappedCount == 0) - { - device.unmapMemory(memory); - } - } - }; - struct ManagedBuffer { using Ptr = std::unique_ptr>; diff --git a/openVulkanoCpp/Vulkan/Resources/ManagedResource.cpp b/openVulkanoCpp/Vulkan/Resources/MemoryAllocation.cpp similarity index 95% rename from openVulkanoCpp/Vulkan/Resources/ManagedResource.cpp rename to openVulkanoCpp/Vulkan/Resources/MemoryAllocation.cpp index 871f266..0930694 100644 --- a/openVulkanoCpp/Vulkan/Resources/ManagedResource.cpp +++ b/openVulkanoCpp/Vulkan/Resources/MemoryAllocation.cpp @@ -4,7 +4,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#include "ManagedResource.hpp" +#include "ManagedBuffer.hpp" #include "Base/Logger.hpp" namespace OpenVulkano::Vulkan diff --git a/openVulkanoCpp/Vulkan/Resources/MemoryAllocation.hpp b/openVulkanoCpp/Vulkan/Resources/MemoryAllocation.hpp new file mode 100644 index 0000000..428766d --- /dev/null +++ b/openVulkanoCpp/Vulkan/Resources/MemoryAllocation.hpp @@ -0,0 +1,97 @@ +/* + * 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/Utils.hpp" +#include + +namespace OpenVulkano::Vulkan +{ + struct MemoryAllocation + { + vk::DeviceMemory memory; + size_t used; + const size_t size; + const uint32_t type; + const vk::Device device; + void* mapped; + + private: + uint32_t mappedCount; + static constexpr uint32_t CHILD_MAPPED_FLAG = 1u << 31; + + public: + MemoryAllocation(size_t size, uint32_t type, vk::Device device): + memory(nullptr), used(0), size(size), type(type), device(device), mapped(nullptr), mappedCount(0) + { + } + + ~MemoryAllocation() + { + if (device && memory) + device.free(memory); + } + + [[nodiscard]] size_t FreeSpace() const + { + return size - used; + } + + [[nodiscard]] size_t FreeSpace(size_t alignment) const + { + return size - Utils::Align(used, alignment); + } + + void HandleChildMappingValidation() const; + + void* Map() + { + HandleChildMappingValidation(); + if (!mapped) + { + mapped = device.mapMemory(memory, 0, size, vk::MemoryMapFlags()); + } + mappedCount++; + return mapped; + } + + void UnMap() + { + if (mappedCount > 0) + { + mappedCount--; + if (mappedCount == 0) + { + device.unmapMemory(memory); + } + } + } + + [[nodiscard]] bool IsChildMapped() const + { + return mappedCount & CHILD_MAPPED_FLAG; + } + + void* MapChild(size_t offset, vk::DeviceSize size) + { + HandleChildMappingValidation(); + mappedCount |= CHILD_MAPPED_FLAG; + mappedCount++; + return device.mapMemory(memory, offset, size, vk::MemoryMapFlags()); + } + + void UnMapChild() + { + mappedCount &= ~CHILD_MAPPED_FLAG; + mappedCount--; + if (mappedCount == 0) + { + device.unmapMemory(memory); + } + } + }; +} \ No newline at end of file diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index 326d2aa..8fbb8cb 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -5,10 +5,13 @@ */ #include "ResourceManager.hpp" +#include "ManagedBuffer.hpp" +#include "MemoryAllocation.hpp" #include "Scene/Vertex.hpp" #include "Scene/Geometry.hpp" #include "Scene/Material.hpp" #include "Scene/UniformBuffer.hpp" +#include "Scene/Camera.hpp" #include "Math/ByteSize.hpp" #include "Vulkan/Context.hpp" #include "Vulkan/Image.hpp" @@ -91,7 +94,6 @@ namespace OpenVulkano::Vulkan nodes.clear(); device.destroyDescriptorPool(descriptorPool); allocations.clear(); - lastAllocation = nullptr; toFree.clear(); recycleBuffers.clear(); descriptorSetLayoutCache.clear(); @@ -372,7 +374,6 @@ namespace OpenVulkano::Vulkan } } if(!alloc && createIfAllFull) alloc = CreateMemoryAllocation(64_MiB, type, true); - if(alloc) lastAllocation = alloc; return alloc; } diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp index 0286d57..0aa985b 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp @@ -9,16 +9,15 @@ // Workaround for libc++ #define __cpp_lib_three_way_comparison 201907 -#include "vulkan/vulkan.hpp" #include "Base/ICloseable.hpp" #include "IShaderOwner.hpp" -#include "ManagedResource.hpp" #include "Vulkan/Image.hpp" #include "Scene/Shader/DescriptorInputDescription.hpp" -#include "Scene/Camera.hpp" -#include +#include #include #include +#include +#include namespace OpenVulkano { @@ -29,6 +28,7 @@ namespace OpenVulkano class Material; class Texture; class Shader; + class Camera; class UniformBuffer; } @@ -39,8 +39,11 @@ namespace OpenVulkano class VulkanTexture; class VulkanCamera; class VulkanNode; + class VulkanShader; class VulkanUniformBuffer; class UniformBuffer; + class ManagedBuffer; + class MemoryAllocation; class ResourceManager : public ICloseable, public IShaderOwner { @@ -57,7 +60,6 @@ namespace OpenVulkano std::vector> shaders; std::vector> geometries; std::vector> nodes; - MemoryAllocation* lastAllocation = nullptr; std::mutex mutex; vk::DeviceSize uniformBufferAlignment; std::vector> toFree; diff --git a/openVulkanoCpp/Vulkan/Resources/UniformBuffer.cpp b/openVulkanoCpp/Vulkan/Resources/UniformBuffer.cpp index 4255f96..cbfbd1f 100644 --- a/openVulkanoCpp/Vulkan/Resources/UniformBuffer.cpp +++ b/openVulkanoCpp/Vulkan/Resources/UniformBuffer.cpp @@ -5,7 +5,7 @@ */ #include "UniformBuffer.hpp" -#include "ManagedResource.hpp" +#include "ManagedBuffer.hpp" #include "ResourceManager.hpp" #include "Vulkan/VulkanDrawContext.hpp" #include "Vulkan/Scene/VulkanShader.hpp" diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp index a2f2363..db34fab 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp @@ -9,7 +9,7 @@ #include "IRecordable.hpp" #include "Scene/Scene.hpp" #include "Scene/Geometry.hpp" -#include "Vulkan/Resources/ManagedResource.hpp" +#include "Vulkan/Resources/ManagedBuffer.hpp" namespace OpenVulkano::Vulkan { diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp index 02cb77a..af41830 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp @@ -23,8 +23,9 @@ namespace OpenVulkano class Context; class IShaderOwner; - struct VulkanShader final : public ICloseable, public IRecordable + class VulkanShader final : public ICloseable, public IRecordable { + public: Scene::Shader* shader = nullptr; vk::Device device; std::vector shaderModules; // TODO manage live time somewhere else to allow sharing of shader programs