Renderer/RenderFrame: Use FunctionRef instead of std::function to avoid allocations

This commit is contained in:
SirLynix 2023-01-01 19:48:51 +01:00
parent 8555b3d6ef
commit a8b6d9cb42
7 changed files with 9 additions and 7 deletions

View File

@ -22,7 +22,7 @@ namespace Nz
public: public:
OpenGLRenderImage(OpenGLRenderWindow& owner); OpenGLRenderImage(OpenGLRenderWindow& owner);
void Execute(const std::function<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) override; void Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) override;
OpenGLUploadPool& GetUploadPool() override; OpenGLUploadPool& GetUploadPool() override;

View File

@ -12,6 +12,7 @@
#include <Nazara/Renderer/Config.hpp> #include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/Enums.hpp> #include <Nazara/Renderer/Enums.hpp>
#include <Nazara/Renderer/RenderImage.hpp> #include <Nazara/Renderer/RenderImage.hpp>
#include <Nazara/Utils/FunctionRef.hpp>
#include <functional> #include <functional>
namespace Nz namespace Nz
@ -29,7 +30,7 @@ namespace Nz
RenderFrame(RenderFrame&&) = delete; RenderFrame(RenderFrame&&) = delete;
~RenderFrame() = default; ~RenderFrame() = default;
void Execute(const std::function<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags); void Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags);
inline std::size_t GetFramebufferIndex() const; inline std::size_t GetFramebufferIndex() const;
const Vector2ui& GetSize() const; const Vector2ui& GetSize() const;

View File

@ -10,6 +10,7 @@
#include <Nazara/Prerequisites.hpp> #include <Nazara/Prerequisites.hpp>
#include <Nazara/Renderer/Config.hpp> #include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/Enums.hpp> #include <Nazara/Renderer/Enums.hpp>
#include <Nazara/Utils/FunctionRef.hpp>
#include <functional> #include <functional>
#include <vector> #include <vector>
@ -27,7 +28,7 @@ namespace Nz
virtual ~RenderImage(); virtual ~RenderImage();
virtual void Execute(const std::function<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) = 0; virtual void Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) = 0;
inline void FlushReleaseQueue(); inline void FlushReleaseQueue();

View File

@ -28,7 +28,7 @@ namespace Nz
VulkanRenderImage(VulkanRenderImage&&) = delete; VulkanRenderImage(VulkanRenderImage&&) = delete;
~VulkanRenderImage(); ~VulkanRenderImage();
void Execute(const std::function<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) override; void Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) override;
inline Vk::Fence& GetInFlightFence(); inline Vk::Fence& GetInFlightFence();
inline Vk::Semaphore& GetImageAvailableSemaphore(); inline Vk::Semaphore& GetImageAvailableSemaphore();

View File

@ -17,7 +17,7 @@ namespace Nz
{ {
} }
void OpenGLRenderImage::Execute(const std::function<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags /*queueTypeFlags*/) void OpenGLRenderImage::Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags /*queueTypeFlags*/)
{ {
OpenGLCommandBuffer commandBuffer; //< TODO: Use a pool and remove default constructor OpenGLCommandBuffer commandBuffer; //< TODO: Use a pool and remove default constructor
OpenGLCommandBufferBuilder builder(commandBuffer); OpenGLCommandBufferBuilder builder(commandBuffer);

View File

@ -9,7 +9,7 @@
namespace Nz namespace Nz
{ {
void RenderFrame::Execute(const std::function<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) void RenderFrame::Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags)
{ {
if (!m_image) if (!m_image)
throw std::runtime_error("frame is either invalid or has already been presented"); throw std::runtime_error("frame is either invalid or has already been presented");

View File

@ -34,7 +34,7 @@ namespace Nz
m_inFlightCommandBuffers.clear(); m_inFlightCommandBuffers.clear();
} }
void VulkanRenderImage::Execute(const std::function<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) void VulkanRenderImage::Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags)
{ {
Vk::CommandBuffer* commandBuffer; Vk::CommandBuffer* commandBuffer;
if (m_currentCommandBuffer >= m_inFlightCommandBuffers.size()) if (m_currentCommandBuffer >= m_inFlightCommandBuffers.size())