mirror of
				https://github.com/PancakeTAS/lsfg-vk.git
				synced 2025-10-30 07:01:10 +00:00 
			
		
		
		
	refactor: remaining pools
This commit is contained in:
		
							parent
							
								
									24f7b66e99
								
							
						
					
					
						commit
						dd91eebb6d
					
				
					 6 changed files with 85 additions and 5 deletions
				
			
		| 
						 | 
					@ -3,6 +3,8 @@
 | 
				
			||||||
#include "vk/core/descriptorpool.hpp"
 | 
					#include "vk/core/descriptorpool.hpp"
 | 
				
			||||||
#include "vk/core/device.hpp"
 | 
					#include "vk/core/device.hpp"
 | 
				
			||||||
#include "vk/core/instance.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/pool/shader_pool.hpp"
 | 
				
			||||||
#include "vk/registry/shader_registry.hpp"
 | 
					#include "vk/registry/shader_registry.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,9 +23,12 @@ namespace LSFG {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        VK::Registry::ShaderRegistry registry;
 | 
					        VK::Registry::ShaderRegistry registry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        VK::Pool::BufferPool bpool;
 | 
				
			||||||
 | 
					        VK::Pool::SamplerPool apool;
 | 
				
			||||||
        VK::Pool::ShaderPool spool;
 | 
					        VK::Pool::ShaderPool spool;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        float flow{1.0F};
 | 
					        float flow{1.0F};
 | 
				
			||||||
 | 
					        bool hdr{false};
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@ namespace VK::Pool {
 | 
				
			||||||
        ///
 | 
					        ///
 | 
				
			||||||
        /// Get or create a buffer.
 | 
					        /// Get or create a buffer.
 | 
				
			||||||
        ///
 | 
					        ///
 | 
				
			||||||
 | 
					        /// @param device Vulkan device.
 | 
				
			||||||
        /// @param flow Flow scale
 | 
					        /// @param flow Flow scale
 | 
				
			||||||
        /// @param hdr Whether HDR is enabled
 | 
					        /// @param hdr Whether HDR is enabled
 | 
				
			||||||
        /// @param timestamp Timestamp of the frame
 | 
					        /// @param timestamp Timestamp of the frame
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										42
									
								
								framegen/include/vk/pool/sampler_pool.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								framegen/include/vk/pool/sampler_pool.hpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "vk/core/sampler.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <vulkan/vulkan_core.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <unordered_map>
 | 
				
			||||||
 | 
					#include <cstdint>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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<uint64_t, Core::Sampler> samplers;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,8 @@ Instance::Instance(const std::filesystem::path& dll) {
 | 
				
			||||||
        .device = Core::Device(vkd.instance, 0, false),
 | 
					        .device = Core::Device(vkd.instance, 0, false),
 | 
				
			||||||
        .dpool = Core::DescriptorPool(vkd.device),
 | 
					        .dpool = Core::DescriptorPool(vkd.device),
 | 
				
			||||||
        .registry = Registry::ShaderRegistry(),
 | 
					        .registry = Registry::ShaderRegistry(),
 | 
				
			||||||
 | 
					        .bpool = Pool::BufferPool(),
 | 
				
			||||||
 | 
					        .apool = Pool::SamplerPool(),
 | 
				
			||||||
        .spool = Pool::ShaderPool()
 | 
					        .spool = Pool::ShaderPool()
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    this->vkd = std::make_unique<VKD>(std::move(vkd));
 | 
					    this->vkd = std::make_unique<VKD>(std::move(vkd));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,12 +13,12 @@ using namespace LSFG::V31N::Shaderchain;
 | 
				
			||||||
using namespace VK;
 | 
					using namespace VK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Mipmaps::Mipmaps(LSFG::VKD& vkd, const Core::Image& in1, const Core::Image& in2) {
 | 
					Mipmaps::Mipmaps(LSFG::VKD& vkd, const Core::Image& in1, const Core::Image& in2) {
 | 
				
			||||||
    // TODO: logic for buffer and sampler
 | 
					    auto sampler = vkd.apool.getOrCreate(vkd.device,
 | 
				
			||||||
    Core::Sampler sampler{vkd.device,
 | 
					 | 
				
			||||||
        VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,
 | 
					        VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,
 | 
				
			||||||
        VK_COMPARE_OP_NEVER,
 | 
					        VK_COMPARE_OP_NEVER, false);
 | 
				
			||||||
        false};
 | 
					    auto buffer = vkd.bpool.getOrCreate(vkd.device,
 | 
				
			||||||
    Core::Buffer buffer{vkd.device, nullptr, 0, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT};
 | 
					        vkd.flow, vkd.hdr, 0.0F, false, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // create output images
 | 
					    // create output images
 | 
				
			||||||
    const VkExtent2D extent{
 | 
					    const VkExtent2D extent{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										30
									
								
								framegen/src/vk/pool/sampler_pool.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								framegen/src/vk/pool/sampler_pool.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,30 @@
 | 
				
			||||||
 | 
					#include "vk/pool/sampler_pool.hpp"
 | 
				
			||||||
 | 
					#include "vk/core/sampler.hpp"
 | 
				
			||||||
 | 
					#include "vk/core/device.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <vulkan/vulkan_core.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <cstdint>
 | 
				
			||||||
 | 
					#include <utility>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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<uint64_t>(type) << 0;
 | 
				
			||||||
 | 
					    hash |= static_cast<uint64_t>(compare) << 8;
 | 
				
			||||||
 | 
					    hash |= static_cast<uint64_t>(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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue