From 80cab3408874ccbb52f81f0427b9278ff352527d Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 21 Nov 2023 22:06:44 +0100 Subject: [PATCH] Graphics: Add RenderTextureBlit --- include/Nazara/Graphics.hpp | 1 + include/Nazara/Graphics/RenderTextureBlit.hpp | 48 +++++++++++++++++++ include/Nazara/Graphics/RenderTextureBlit.inl | 25 ++++++++++ src/Nazara/Graphics/RenderTextureBlit.cpp | 47 ++++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 include/Nazara/Graphics/RenderTextureBlit.hpp create mode 100644 include/Nazara/Graphics/RenderTextureBlit.inl create mode 100644 src/Nazara/Graphics/RenderTextureBlit.cpp diff --git a/include/Nazara/Graphics.hpp b/include/Nazara/Graphics.hpp index 370edf148..f2417732f 100644 --- a/include/Nazara/Graphics.hpp +++ b/include/Nazara/Graphics.hpp @@ -82,6 +82,7 @@ #include #include #include +#include #include #include #include diff --git a/include/Nazara/Graphics/RenderTextureBlit.hpp b/include/Nazara/Graphics/RenderTextureBlit.hpp new file mode 100644 index 000000000..4c7724714 --- /dev/null +++ b/include/Nazara/Graphics/RenderTextureBlit.hpp @@ -0,0 +1,48 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Graphics module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_GRAPHICS_RENDERTEXTUREBLIT_HPP +#define NAZARA_GRAPHICS_RENDERTEXTUREBLIT_HPP + +#include +#include +#include +#include + +namespace Nz +{ + class Texture; + + class NAZARA_GRAPHICS_API RenderTextureBlit : public RenderTarget + { + public: + inline RenderTextureBlit(const Vector2ui& textureSize, std::shared_ptr targetTexture, SamplerFilter filter = SamplerFilter::Linear); + inline RenderTextureBlit(const Vector2ui& textureSize, std::shared_ptr targetTexture, SamplerFilter filter, PipelineStage targetPipelineStage, MemoryAccessFlags targetMemoryFlags, TextureLayout targetLayout); + RenderTextureBlit(const RenderTextureBlit&) = delete; + RenderTextureBlit(RenderTextureBlit&&) = delete; + ~RenderTextureBlit() = default; + + void OnBuildGraph(FrameGraph& graph, std::size_t attachmentIndex) const override; + void OnRenderEnd(RenderFrame& renderFrame, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const override; + + const Vector2ui& GetSize() const override; + + RenderTextureBlit& operator=(const RenderTextureBlit&) = delete; + RenderTextureBlit& operator=(RenderTextureBlit&&) = delete; + + private: + std::shared_ptr m_targetTexture; + MemoryAccessFlags m_targetMemoryFlags; + PipelineStage m_targetPipelineStage; + SamplerFilter m_samplerFilter; + TextureLayout m_targetLayout; + Vector2ui m_textureSize; + }; +} + +#include + +#endif // NAZARA_GRAPHICS_RENDERTEXTUREBLIT_HPP diff --git a/include/Nazara/Graphics/RenderTextureBlit.inl b/include/Nazara/Graphics/RenderTextureBlit.inl new file mode 100644 index 000000000..e8810996c --- /dev/null +++ b/include/Nazara/Graphics/RenderTextureBlit.inl @@ -0,0 +1,25 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Graphics module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include + +namespace Nz +{ + inline RenderTextureBlit::RenderTextureBlit(const Vector2ui& textureSize, std::shared_ptr targetTexture, SamplerFilter filter) : + RenderTextureBlit(textureSize, std::move(targetTexture), filter, PipelineStage::FragmentShader, MemoryAccess::ColorRead, TextureLayout::ColorInput) + { + } + + RenderTextureBlit::RenderTextureBlit(const Vector2ui& textureSize, std::shared_ptr texture, SamplerFilter filter, PipelineStage targetPipelineStage, MemoryAccessFlags targetMemoryFlags, TextureLayout targetLayout) : + m_targetTexture(std::move(texture)), + m_targetMemoryFlags(targetMemoryFlags), + m_targetPipelineStage(targetPipelineStage), + m_samplerFilter(filter), + m_targetLayout(targetLayout), + m_textureSize(textureSize) + { + } +} + +#include diff --git a/src/Nazara/Graphics/RenderTextureBlit.cpp b/src/Nazara/Graphics/RenderTextureBlit.cpp new file mode 100644 index 000000000..3bdd63a64 --- /dev/null +++ b/src/Nazara/Graphics/RenderTextureBlit.cpp @@ -0,0 +1,47 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Graphics module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include +#include +#include + +namespace Nz +{ + void RenderTextureBlit::OnBuildGraph(FrameGraph& graph, std::size_t attachmentIndex) const + { + graph.AddOutput(attachmentIndex); + } + + void RenderTextureBlit::OnRenderEnd(RenderFrame& renderFrame, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const + { + const std::shared_ptr& sourceTexture = frameGraph.GetAttachmentTexture(finalAttachment); + + Vector2ui sourceTextureSize = Vector2ui(sourceTexture->GetSize()); + Vector2ui targetTextureSize = Vector2ui(m_targetTexture->GetSize()); + + renderFrame.Execute([&](CommandBufferBuilder& builder) + { + builder.BeginDebugRegion("Blit to texture", Color::Blue()); + { + builder.TextureBarrier(PipelineStage::ColorOutput, PipelineStage::Transfer, MemoryAccess::ColorWrite, MemoryAccess::TransferRead, TextureLayout::ColorOutput, TextureLayout::TransferSource, *sourceTexture); + builder.TextureBarrier(PipelineStage::TopOfPipe, PipelineStage::Transfer, {}, MemoryAccess::TransferWrite, TextureLayout::Undefined, TextureLayout::TransferDestination, *m_targetTexture); + + Boxui fromBox(0, 0, 0, sourceTextureSize.x, sourceTextureSize.y, 1); + Boxui toBox(0, 0, 0, targetTextureSize.x, targetTextureSize.y, 1); + + builder.BlitTexture(*sourceTexture, fromBox, TextureLayout::TransferSource, *m_targetTexture, toBox, TextureLayout::TransferDestination, m_samplerFilter); + builder.TextureBarrier(PipelineStage::Transfer, m_targetPipelineStage, MemoryAccess::TransferWrite, m_targetMemoryFlags, TextureLayout::TransferDestination, m_targetLayout, *m_targetTexture); + } + builder.EndDebugRegion(); + }, QueueType::Graphics); + } + + const Vector2ui& RenderTextureBlit::GetSize() const + { + return m_textureSize; + } +}