diff --git a/framegen/include/lsfg.hpp b/framegen/include/lsfg.hpp index 5b56ecb..57de25f 100644 --- a/framegen/include/lsfg.hpp +++ b/framegen/include/lsfg.hpp @@ -3,6 +3,8 @@ #include "vk/core/descriptorpool.hpp" #include "vk/core/device.hpp" #include "vk/core/instance.hpp" +#include "vk/pool/buffer_pool.hpp" +#include "vk/pool/sampler_pool.hpp" #include "vk/pool/shader_pool.hpp" #include "vk/registry/shader_registry.hpp" @@ -21,9 +23,12 @@ namespace LSFG { VK::Registry::ShaderRegistry registry; + VK::Pool::BufferPool bpool; + VK::Pool::SamplerPool apool; VK::Pool::ShaderPool spool; float flow{1.0F}; + bool hdr{false}; }; /// diff --git a/framegen/include/vk/pool/buffer_pool.hpp b/framegen/include/vk/pool/buffer_pool.hpp index d1ff9be..96de5d6 100644 --- a/framegen/include/vk/pool/buffer_pool.hpp +++ b/framegen/include/vk/pool/buffer_pool.hpp @@ -20,6 +20,7 @@ namespace VK::Pool { /// /// Get or create a buffer. /// + /// @param device Vulkan device. /// @param flow Flow scale /// @param hdr Whether HDR is enabled /// @param timestamp Timestamp of the frame diff --git a/framegen/include/vk/pool/sampler_pool.hpp b/framegen/include/vk/pool/sampler_pool.hpp new file mode 100644 index 0000000..66116ec --- /dev/null +++ b/framegen/include/vk/pool/sampler_pool.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include "vk/core/sampler.hpp" + +#include + +#include +#include + +namespace VK::Pool { + + /// + /// Pool of initialized samplers. + /// + class SamplerPool { + public: + /// + /// Create a sampler pool. + /// + SamplerPool() noexcept = default; + + /// + /// Get or create a sampler. + /// + /// @param device Vulkan device. + /// @param type Address mode + /// @param compare Compare operation + /// @param white Whether to use a white border color + /// @return Preallocated sampler + /// + /// @throws VK::vulkan_error if sampler creation fails. + /// + [[nodiscard]] const Core::Sampler& getOrCreate( + const Core::Device& device, + VkSamplerAddressMode type = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, + VkCompareOp compare = VK_COMPARE_OP_NEVER, + bool white = false); + private: + std::unordered_map samplers; + }; + +} diff --git a/framegen/src/lsfg.cpp b/framegen/src/lsfg.cpp index fafe316..b6ae2ec 100644 --- a/framegen/src/lsfg.cpp +++ b/framegen/src/lsfg.cpp @@ -19,6 +19,8 @@ Instance::Instance(const std::filesystem::path& dll) { .device = Core::Device(vkd.instance, 0, false), .dpool = Core::DescriptorPool(vkd.device), .registry = Registry::ShaderRegistry(), + .bpool = Pool::BufferPool(), + .apool = Pool::SamplerPool(), .spool = Pool::ShaderPool() }; this->vkd = std::make_unique(std::move(vkd)); diff --git a/framegen/src/v31n/shaderchain/mipmaps.cpp b/framegen/src/v31n/shaderchain/mipmaps.cpp index ac6a854..fae738c 100644 --- a/framegen/src/v31n/shaderchain/mipmaps.cpp +++ b/framegen/src/v31n/shaderchain/mipmaps.cpp @@ -13,12 +13,12 @@ using namespace LSFG::V31N::Shaderchain; using namespace VK; Mipmaps::Mipmaps(LSFG::VKD& vkd, const Core::Image& in1, const Core::Image& in2) { - // TODO: logic for buffer and sampler - Core::Sampler sampler{vkd.device, + auto sampler = vkd.apool.getOrCreate(vkd.device, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, - VK_COMPARE_OP_NEVER, - false}; - Core::Buffer buffer{vkd.device, nullptr, 0, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT}; + VK_COMPARE_OP_NEVER, false); + auto buffer = vkd.bpool.getOrCreate(vkd.device, + vkd.flow, vkd.hdr, 0.0F, false, false); + // create output images const VkExtent2D extent{ diff --git a/framegen/src/vk/pool/sampler_pool.cpp b/framegen/src/vk/pool/sampler_pool.cpp new file mode 100644 index 0000000..6a523d5 --- /dev/null +++ b/framegen/src/vk/pool/sampler_pool.cpp @@ -0,0 +1,30 @@ +#include "vk/pool/sampler_pool.hpp" +#include "vk/core/sampler.hpp" +#include "vk/core/device.hpp" + +#include + +#include +#include + +using namespace VK::Pool; + +const VK::Core::Sampler& SamplerPool::getOrCreate( + const Core::Device& device, VkSamplerAddressMode type, + VkCompareOp compare, bool white) { + uint64_t hash = 0; + hash |= static_cast(type) << 0; + hash |= static_cast(compare) << 8; + hash |= static_cast(white) << 16; + + const auto it = samplers.find(hash); + if (it != samplers.end()) { + return it->second; + } + + // create sampler + Core::Sampler sampler(device, type, compare, white); + + const auto i = samplers.emplace(hash, std::move(sampler)); + return i.first->second; +}