// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Renderer module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_RENDERER_TRANSIENTRESOURCES_HPP #define NAZARA_RENDERER_TRANSIENTRESOURCES_HPP #include #include #include #include #include #include #include namespace Nz { class CommandBuffer; class CommandBufferBuilder; class UploadPool; class NAZARA_RENDERER_API TransientResources { public: class Releasable; template class ReleasableLambda; virtual ~TransientResources(); virtual void Execute(const FunctionRef& callback, QueueTypeFlags queueTypeFlags) = 0; inline void FlushReleaseQueue(); virtual UploadPool& GetUploadPool() = 0; template void PushForRelease(const T& value) = delete; template void PushForRelease(T&& value); template void PushReleaseCallback(F&& callback); virtual void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) = 0; protected: TransientResources() = default; TransientResources(const TransientResources&) = delete; TransientResources(TransientResources&&) = delete; private: static constexpr std::size_t BlockSize = 4 * 1024 * 1024; using Block = std::vector; std::vector m_releaseQueue; std::vector m_releaseMemoryPool; }; class NAZARA_RENDERER_API TransientResources::Releasable { public: virtual ~Releasable(); virtual void Release() = 0; }; template class TransientResources::ReleasableLambda : public Releasable { public: template ReleasableLambda(U&& lambda); ReleasableLambda(const ReleasableLambda&) = delete; ReleasableLambda(ReleasableLambda&&) = delete; ~ReleasableLambda() = default; void Release() override; ReleasableLambda& operator=(const ReleasableLambda&) = delete; ReleasableLambda& operator=(ReleasableLambda&&) = delete; private: T m_lambda; }; } #include #endif // NAZARA_RENDERER_TRANSIENTRESOURCES_HPP