// 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_RENDERIMAGE_HPP #define NAZARA_RENDERER_RENDERIMAGE_HPP #include #include #include #include #include #include namespace Nz { class CommandBuffer; class CommandBufferBuilder; class UploadPool; class NAZARA_RENDERER_API RenderImage { public: class Releasable; template class ReleasableLambda; virtual ~RenderImage(); virtual void Execute(const FunctionRef& callback, QueueTypeFlags queueTypeFlags) = 0; inline void FlushReleaseQueue(); virtual UploadPool& GetUploadPool() = 0; virtual void Present() = 0; template void PushReleaseCallback(F&& callback); virtual void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) = 0; protected: RenderImage() = default; RenderImage(const RenderImage&) = delete; RenderImage(RenderImage&&) = 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 RenderImage::Releasable { public: virtual ~Releasable(); virtual void Release() = 0; }; template class RenderImage::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_RENDERIMAGE_HPP