From 2284ff7fed222e787e77e0c840e489da52b74e10 Mon Sep 17 00:00:00 2001 From: Angelos Gkountis Date: Thu, 31 May 2018 13:54:43 +0100 Subject: [PATCH] Vulkan::Fence lifetime changes > Vulkan::Fence lifetimes are now managed by the Vulkan::Graphics class > Added getter functions to the Vulkan::Sampler class Change-Id: Id963a72eca2a2eeaceaecaf30655b07e9d6baf16 --- dali/graphics/vulkan/vulkan-command-buffer.cpp | 1 + dali/graphics/vulkan/vulkan-fence.cpp | 11 ++++ dali/graphics/vulkan/vulkan-fence.h | 2 + dali/graphics/vulkan/vulkan-graphics.cpp | 14 +++++ dali/graphics/vulkan/vulkan-graphics.h | 4 ++ dali/graphics/vulkan/vulkan-resource-cache.cpp | 33 ++++++++++- dali/graphics/vulkan/vulkan-resource-cache.h | 21 +++++++ dali/graphics/vulkan/vulkan-sampler.cpp | 80 ++++++++++++++++++++++++++ dali/graphics/vulkan/vulkan-sampler.h | 32 +++++++++++ dali/graphics/vulkan/vulkan-shader.h | 2 - 10 files changed, 197 insertions(+), 3 deletions(-) diff --git a/dali/graphics/vulkan/vulkan-command-buffer.cpp b/dali/graphics/vulkan/vulkan-command-buffer.cpp index e0701bb..800d868 100644 --- a/dali/graphics/vulkan/vulkan-command-buffer.cpp +++ b/dali/graphics/vulkan/vulkan-command-buffer.cpp @@ -270,6 +270,7 @@ struct CommandBuffer::Impl vkBuffers.reserve( commandBuffers.size() ); for( auto&& buf : commandBuffers ) { + assert( mAllocateInfo.level == vk::CommandBufferLevel::eSecondary && "Cannot Execute Commands. Command buffer level not secondary" ); vkBuffers.emplace_back( buf->GetVkCommandBuffer() ); PushResource( buf ); } diff --git a/dali/graphics/vulkan/vulkan-fence.cpp b/dali/graphics/vulkan/vulkan-fence.cpp index b083e3a..87f527e 100644 --- a/dali/graphics/vulkan/vulkan-fence.cpp +++ b/dali/graphics/vulkan/vulkan-fence.cpp @@ -67,6 +67,17 @@ Fence::operator vk::Fence*() return &mFence; } +bool Fence::OnDestroy() +{ + mGraphics->RemoveFence( *this ); + + mGraphics->DiscardResource( [this]() { + mGraphics->GetDevice().destroyFence( mFence, mGraphics->GetAllocator() ); + } ); + + return false; +} + } // namespace Vulkan } // namespace Graphics diff --git a/dali/graphics/vulkan/vulkan-fence.h b/dali/graphics/vulkan/vulkan-fence.h index 9e7ca86..4544542 100644 --- a/dali/graphics/vulkan/vulkan-fence.h +++ b/dali/graphics/vulkan/vulkan-fence.h @@ -45,6 +45,8 @@ public: operator vk::Fence*(); + bool OnDestroy() override; + private: explicit Fence( Graphics& graphics ); diff --git a/dali/graphics/vulkan/vulkan-graphics.cpp b/dali/graphics/vulkan/vulkan-graphics.cpp index 1bbf006..cd6495c 100644 --- a/dali/graphics/vulkan/vulkan-graphics.cpp +++ b/dali/graphics/vulkan/vulkan-graphics.cpp @@ -229,6 +229,8 @@ RefCountedFence Graphics::CreateFence( const vk::FenceCreateInfo& fenceCreateInf VkAssert( mDevice.createFence( &fenceCreateInfo, mAllocator.get(), refCountedFence->Ref())); + AddFence( refCountedFence ); + return refCountedFence; } @@ -633,6 +635,12 @@ void Graphics::AddSampler( RefCountedSampler sampler ) mResourceCache->AddSampler( std::move( sampler ) ); } +void Graphics::AddFence( RefCountedFence fence ) +{ + std::lock_guard< std::mutex > lock{ mMutex }; + mResourceCache->AddFence( std::move(fence) ); +} + RefCountedShader Graphics::FindShader( vk::ShaderModule shaderModule ) { std::lock_guard< std::mutex > lock{ mMutex }; @@ -693,6 +701,12 @@ void Graphics::RemoveSampler( Sampler& sampler ) mResourceCache->RemoveSampler( sampler ); } +void Graphics::RemoveFence( Fence& fence ) +{ + std::lock_guard< std::mutex > lock{ mMutex }; + mResourceCache->RemoveFence( fence ); +} + void Graphics::CollectGarbage() { std::lock_guard< std::mutex > lock{ mMutex }; diff --git a/dali/graphics/vulkan/vulkan-graphics.h b/dali/graphics/vulkan/vulkan-graphics.h index 54c7995..ae3dcf0 100644 --- a/dali/graphics/vulkan/vulkan-graphics.h +++ b/dali/graphics/vulkan/vulkan-graphics.h @@ -200,6 +200,8 @@ public: //Cache management methods void AddSampler( RefCountedSampler sampler ); + void AddFence( RefCountedFence fence ); + RefCountedShader FindShader( vk::ShaderModule shaderModule ); RefCountedImage FindImage( vk::Image image ); @@ -220,6 +222,8 @@ public: //Cache management methods void RemoveSampler( Sampler& sampler ); + void RemoveFence( Fence& fence ); + void CollectGarbage(); void DiscardResource( std::function< void() > deleter ); diff --git a/dali/graphics/vulkan/vulkan-resource-cache.cpp b/dali/graphics/vulkan/vulkan-resource-cache.cpp index fc72232..199fee7 100644 --- a/dali/graphics/vulkan/vulkan-resource-cache.cpp +++ b/dali/graphics/vulkan/vulkan-resource-cache.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -80,7 +81,13 @@ ResourceCache& ResourceCache::AddFramebuffer( RefCountedFramebuffer framebuffer ResourceCache& ResourceCache::AddSampler( RefCountedSampler sampler ) { - mSamplers.push_back(sampler); + mSamplers.push_back( sampler ); + return *this; +} + +ResourceCache& ResourceCache::AddFence( RefCountedFence fence ) +{ + mFences.push_back( fence ); return *this; } @@ -129,6 +136,15 @@ RefCountedSampler ResourceCache::FindSampler( vk::Sampler sampler ) return iterator == mSamplers.end() ? RefCountedSampler() : RefCountedSampler(&**iterator); } +RefCountedFence ResourceCache::FindFence( vk::Fence fence ) +{ + auto iterator = std::find_if(mFences.begin(), + mFences.end(), + [&](const RefCountedFence entry) { return entry->GetVkHandle() == fence; }); + + return iterator == mFences.end() ? RefCountedFence() : RefCountedFence(&**iterator); +} + RefCountedBuffer ResourceCache::FindBuffer( vk::Buffer buffer ) { auto iterator = std::find_if(mBuffers.begin(), @@ -276,6 +292,21 @@ ResourceCache& ResourceCache::RemoveSampler( Sampler &sampler ) return *this; } +ResourceCache& ResourceCache::RemoveFence( Fence& fence ) +{ + if( !mFences.empty() ) + { + auto iterator = std::find_if(mFences.begin(), + mFences.end(), + [&](const RefCountedFence entry) { return &*entry == &fence; }); + + std::iter_swap(iterator, std::prev(mFences.end())); + mFences.back().Reset(); + mFences.pop_back(); + } + return *this; +} + void ResourceCache::CollectGarbage() { for( const auto& deleter : mDiscardQueue ) diff --git a/dali/graphics/vulkan/vulkan-resource-cache.h b/dali/graphics/vulkan/vulkan-resource-cache.h index ad1c752..d99dc10 100644 --- a/dali/graphics/vulkan/vulkan-resource-cache.h +++ b/dali/graphics/vulkan/vulkan-resource-cache.h @@ -95,6 +95,12 @@ public: */ ResourceCache& AddSampler( RefCountedSampler sampler ); + /** + * Adds the provided fence object to the fence cache + * @param fence The fence object to be added to the cache + * @return A reference to the ResourceCache + */ + ResourceCache& AddFence( RefCountedFence fence ); /** * Finds the buffer object using the specified Vulkan handle in the cache @@ -153,6 +159,13 @@ public: RefCountedSampler FindSampler( vk::Sampler sampler ); /** + * Finds the Fence object using the specified Vulkan handle + * @param fence The Vulkan handle of the Fence object to be found + * @return A Handle to the Sampler object if found. An empty Handle otherwise + */ + RefCountedFence FindFence( vk::Fence fence ); + + /** * Removes the specified Buffer from the cache * @param buffer The Buffer to be removed * @return A reference to the ResourceCache @@ -208,6 +221,13 @@ public: */ ResourceCache& RemoveSampler( Sampler& sampler ); + /** + * Removes the specified Fence from the cache + * @param fence The Fence to be removed + * @return A reference to the ResourceCache + */ + ResourceCache& RemoveFence( Fence& fence ); + void CollectGarbage(); void EnqueueDiscardOperation( std::function deleter ); @@ -233,6 +253,7 @@ private: std::vector< RefCountedDescriptorPool > mDescriptorPools; std::vector< RefCountedFramebuffer > mFramebuffers; std::vector< RefCountedSampler > mSamplers; + std::vector< RefCountedFence > mFences; std::vector< std::function< void() > > mDiscardQueue; }; diff --git a/dali/graphics/vulkan/vulkan-sampler.cpp b/dali/graphics/vulkan/vulkan-sampler.cpp index daafadf..0b99df9 100644 --- a/dali/graphics/vulkan/vulkan-sampler.cpp +++ b/dali/graphics/vulkan/vulkan-sampler.cpp @@ -46,6 +46,86 @@ Sampler::Sampler( Graphics& graphics, const vk::SamplerCreateInfo& createInfo ) { } +vk::SamplerCreateFlags Sampler::GetCreateFlags() const +{ + return mCreateInfo.flags; +} + +vk::Filter Sampler::GetMinFilter() const +{ + return mCreateInfo.minFilter; +} + +vk::Filter Sampler::GetMagFilter() const +{ + return mCreateInfo.magFilter; +} + +vk::SamplerMipmapMode Sampler::GetMipMapMode() const +{ + return mCreateInfo.mipmapMode; +} + +vk::SamplerAddressMode Sampler::GetAddressModeU() const +{ + return mCreateInfo.addressModeU; +} + +vk::SamplerAddressMode Sampler::GetAddressModeV() const +{ + return mCreateInfo.addressModeV; +} + +vk::SamplerAddressMode Sampler::GetAddressModeW() const +{ + return mCreateInfo.addressModeW; +} + +float Sampler::GetMipLodBias() const +{ + return mCreateInfo.mipLodBias; +} + +vk::Bool32 Sampler::AnisotropyEnabled() const +{ + return mCreateInfo.anisotropyEnable; +} + +float Sampler::GetMaxAnisotropy() const +{ + return mCreateInfo.maxAnisotropy; +} + +vk::Bool32 Sampler::CompareEnabled() const +{ + return mCreateInfo.compareEnable; +} + +vk::CompareOp Sampler::GetCompareOperation() const +{ + return mCreateInfo.compareOp; +} + +float Sampler::GetMinLod() const +{ + return mCreateInfo.minLod; +} + +float Sampler::GetMaxLod() const +{ + return mCreateInfo.maxLod; +} + +vk::BorderColor Sampler::GetBorderColor() const +{ + return mCreateInfo.borderColor; +} + +vk::Bool32 Sampler::UsesUnnormalizedCoordinates() const +{ + return mCreateInfo.unnormalizedCoordinates; +} + Sampler::~Sampler() = default; vk::Sampler Sampler::GetVkHandle() const diff --git a/dali/graphics/vulkan/vulkan-sampler.h b/dali/graphics/vulkan/vulkan-sampler.h index 89f55b7..ef2e8f8 100644 --- a/dali/graphics/vulkan/vulkan-sampler.h +++ b/dali/graphics/vulkan/vulkan-sampler.h @@ -41,6 +41,38 @@ public: */ static RefCountedSampler New( Graphics& graphics, const vk::SamplerCreateInfo& createInfo ); + vk::SamplerCreateFlags GetCreateFlags() const; + + vk::Filter GetMinFilter() const; + + vk::Filter GetMagFilter() const; + + vk::SamplerMipmapMode GetMipMapMode() const; + + vk::SamplerAddressMode GetAddressModeU() const; + + vk::SamplerAddressMode GetAddressModeV() const; + + vk::SamplerAddressMode GetAddressModeW() const; + + float GetMipLodBias() const; + + vk::Bool32 AnisotropyEnabled() const; + + float GetMaxAnisotropy() const; + + vk::Bool32 CompareEnabled() const; + + vk::CompareOp GetCompareOperation() const; + + float GetMinLod() const; + + float GetMaxLod() const; + + vk::BorderColor GetBorderColor() const; + + vk::Bool32 UsesUnnormalizedCoordinates() const; + /** * Returns VkSampler object * @return diff --git a/dali/graphics/vulkan/vulkan-shader.h b/dali/graphics/vulkan/vulkan-shader.h index 4a88b82..e967d48 100644 --- a/dali/graphics/vulkan/vulkan-shader.h +++ b/dali/graphics/vulkan/vulkan-shader.h @@ -96,8 +96,6 @@ private: std::unique_ptr mImpl; }; -using RefCountedShader = Handle; - } // Namespace Vulkan } // Namespace Graphics -- 2.7.4