From c7c1162bd364047ae5535beb6f15a7014f9797ab Mon Sep 17 00:00:00 2001 From: Henrique Gemignani Passos Lima Date: Tue, 29 Jun 2021 23:05:48 +0300 Subject: [PATCH 1/2] Add lazyCommitTransaction and implement for Vulkan --- .../boo/graphicsdev/IGraphicsDataFactory.hpp | 3 ++ include/boo/graphicsdev/Vulkan.hpp | 4 +- lib/graphicsdev/Vulkan.cpp | 44 ++++++++++++++----- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/include/boo/graphicsdev/IGraphicsDataFactory.hpp b/include/boo/graphicsdev/IGraphicsDataFactory.hpp index ba49fa0..69c241f 100644 --- a/include/boo/graphicsdev/IGraphicsDataFactory.hpp +++ b/include/boo/graphicsdev/IGraphicsDataFactory.hpp @@ -277,6 +277,9 @@ struct IGraphicsDataFactory { }; virtual void commitTransaction(const std::function& __BooTraceArgs) = 0; + virtual void lazyCommitTransaction(const std::function& f __BooTraceArgs) { + commitTransaction(f __BooTraceArgsUse); + } virtual ObjToken newPoolBuffer(BufferUse use, size_t stride, size_t count __BooTraceArgs) = 0; virtual void setDisplayGamma(float gamma) = 0; virtual bool isTessellationSupported(uint32_t& maxPatchSizeOut) = 0; diff --git a/include/boo/graphicsdev/Vulkan.hpp b/include/boo/graphicsdev/Vulkan.hpp index 95f0455..beaaa78 100644 --- a/include/boo/graphicsdev/Vulkan.hpp +++ b/include/boo/graphicsdev/Vulkan.hpp @@ -130,10 +130,10 @@ public: friend class VulkanDataFactoryImpl; VulkanDataFactory& m_parent; boo::ObjToken m_data; - Context(VulkanDataFactory& parent __BooTraceArgs); - ~Context(); public: + Context(VulkanDataFactory& parent __BooTraceArgs); + ~Context(); Platform platform() const { return Platform::Vulkan; } const SystemChar* platformName() const { return _SYS_STR("Vulkan"); } diff --git a/lib/graphicsdev/Vulkan.cpp b/lib/graphicsdev/Vulkan.cpp index a58d68e..b2c394f 100644 --- a/lib/graphicsdev/Vulkan.cpp +++ b/lib/graphicsdev/Vulkan.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -82,6 +83,8 @@ class VulkanDataFactoryImpl final : public VulkanDataFactory, public GraphicsDat VulkanDescriptorPool* m_descPoolHead = nullptr; PipelineCompileQueue m_pipelineQueue; + std::optional m_lazyContext; + void flushContext(Context&); float m_gamma = 1.f; ObjToken m_gammaShader; @@ -126,21 +129,22 @@ public: VulkanDataFactoryImpl(IGraphicsContext* parent, VulkanContext* ctx); ~VulkanDataFactoryImpl() { assert(m_descPoolHead == nullptr && "Dangling descriptor pools detected"); } - Platform platform() const { return Platform::Vulkan; } - const SystemChar* platformName() const { return _SYS_STR("Vulkan"); } + Platform platform() const override { return Platform::Vulkan; } + const SystemChar* platformName() const override { return _SYS_STR("Vulkan"); } boo::ObjToken allocateDescriptorSets(VkDescriptorSet* out); - void commitTransaction(const FactoryCommitFunc& __BooTraceArgs); + void commitTransaction(const FactoryCommitFunc& __BooTraceArgs) override; + void lazyCommitTransaction(const FactoryCommitFunc& __BooTraceArgs) override; - boo::ObjToken newPoolBuffer(BufferUse use, size_t stride, size_t count __BooTraceArgs); + boo::ObjToken newPoolBuffer(BufferUse use, size_t stride, size_t count __BooTraceArgs) override; - void setDisplayGamma(float gamma) { + void setDisplayGamma(float gamma) override { m_gamma = gamma; UpdateGammaLUT(m_gammaLUT.get(), gamma); } - bool isTessellationSupported(uint32_t& maxPatchSizeOut) { + bool isTessellationSupported(uint32_t& maxPatchSizeOut) override { maxPatchSizeOut = 0; if (!m_ctx->m_features.tessellationShader) return false; @@ -148,11 +152,11 @@ public: return true; } - void waitUntilShadersReady() { + void waitUntilShadersReady() override { m_pipelineQueue.waitUntilReady(); } - bool areShadersReady() { + bool areShadersReady() override { return m_pipelineQueue.isReady(); } }; @@ -3791,10 +3795,28 @@ boo::ObjToken VulkanDataFactory::Context::newShaderDataBindi void VulkanDataFactoryImpl::commitTransaction( const std::function& trans __BooTraceArgs) { - Context ctx(*this __BooTraceArgsUse); - if (!trans(ctx)) - return; + Context ctx(*this __BooTraceArgsUse); + if (!trans(ctx)) { + return; + } + if (m_lazyContext) { + flushContext(*m_lazyContext); + m_lazyContext.reset(); + } + flushContext(ctx); +} + +void VulkanDataFactoryImpl::lazyCommitTransaction( + const std::function& trans __BooTraceArgs) { + + if (!m_lazyContext) { + m_lazyContext.emplace(*this __BooTraceArgsUse); + } + trans(*m_lazyContext); +} + +void VulkanDataFactoryImpl::flushContext(Context& ctx) { VulkanData* data = ctx.m_data.cast(); /* Start asynchronous shader compiles */ From c6aed360e6bb0537afc4f597104810f76e1340fc Mon Sep 17 00:00:00 2001 From: Henrique Gemignani Passos Lima Date: Thu, 1 Jul 2021 18:30:50 +0300 Subject: [PATCH 2/2] Add commitPendingTransaction --- include/boo/graphicsdev/IGraphicsDataFactory.hpp | 1 + lib/graphicsdev/Vulkan.cpp | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/boo/graphicsdev/IGraphicsDataFactory.hpp b/include/boo/graphicsdev/IGraphicsDataFactory.hpp index 69c241f..45c0a8b 100644 --- a/include/boo/graphicsdev/IGraphicsDataFactory.hpp +++ b/include/boo/graphicsdev/IGraphicsDataFactory.hpp @@ -280,6 +280,7 @@ struct IGraphicsDataFactory { virtual void lazyCommitTransaction(const std::function& f __BooTraceArgs) { commitTransaction(f __BooTraceArgsUse); } + virtual void commitPendingTransaction() {} virtual ObjToken newPoolBuffer(BufferUse use, size_t stride, size_t count __BooTraceArgs) = 0; virtual void setDisplayGamma(float gamma) = 0; virtual bool isTessellationSupported(uint32_t& maxPatchSizeOut) = 0; diff --git a/lib/graphicsdev/Vulkan.cpp b/lib/graphicsdev/Vulkan.cpp index b2c394f..e26ebbc 100644 --- a/lib/graphicsdev/Vulkan.cpp +++ b/lib/graphicsdev/Vulkan.cpp @@ -136,6 +136,7 @@ public: void commitTransaction(const FactoryCommitFunc& __BooTraceArgs) override; void lazyCommitTransaction(const FactoryCommitFunc& __BooTraceArgs) override; + void commitPendingTransaction() override; boo::ObjToken newPoolBuffer(BufferUse use, size_t stride, size_t count __BooTraceArgs) override; @@ -3800,10 +3801,7 @@ void VulkanDataFactoryImpl::commitTransaction( if (!trans(ctx)) { return; } - if (m_lazyContext) { - flushContext(*m_lazyContext); - m_lazyContext.reset(); - } + commitPendingTransaction(); flushContext(ctx); } @@ -3816,7 +3814,15 @@ void VulkanDataFactoryImpl::lazyCommitTransaction( trans(*m_lazyContext); } +void VulkanDataFactoryImpl::commitPendingTransaction() { + if (m_lazyContext) { + flushContext(*m_lazyContext); + m_lazyContext.reset(); + } +} + void VulkanDataFactoryImpl::flushContext(Context& ctx) { + OPTICK_EVENT(); VulkanData* data = ctx.m_data.cast(); /* Start asynchronous shader compiles */