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 );
}
return &mFence;
}
+bool Fence::OnDestroy()
+{
+ mGraphics->RemoveFence( *this );
+
+ mGraphics->DiscardResource( [this]() {
+ mGraphics->GetDevice().destroyFence( mFence, mGraphics->GetAllocator() );
+ } );
+
+ return false;
+}
+
} // namespace Vulkan
} // namespace Graphics
operator vk::Fence*();
+ bool OnDestroy() override;
+
private:
explicit Fence( Graphics& graphics );
VkAssert( mDevice.createFence( &fenceCreateInfo, mAllocator.get(), refCountedFence->Ref()));
+ AddFence( refCountedFence );
+
return refCountedFence;
}
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 };
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 };
void AddSampler( RefCountedSampler sampler );
+ void AddFence( RefCountedFence fence );
+
RefCountedShader FindShader( vk::ShaderModule shaderModule );
RefCountedImage FindImage( vk::Image image );
void RemoveSampler( Sampler& sampler );
+ void RemoveFence( Fence& fence );
+
void CollectGarbage();
void DiscardResource( std::function< void() > deleter );
#include <dali/graphics/vulkan/vulkan-framebuffer.h>
#include <dali/graphics/vulkan/vulkan-command-pool.h>
#include <dali/graphics/vulkan/vulkan-sampler.h>
+#include <dali/graphics/vulkan/vulkan-fence.h>
#include <algorithm>
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;
}
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(),
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 )
*/
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
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
*/
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<void()> deleter );
std::vector< RefCountedDescriptorPool > mDescriptorPools;
std::vector< RefCountedFramebuffer > mFramebuffers;
std::vector< RefCountedSampler > mSamplers;
+ std::vector< RefCountedFence > mFences;
std::vector< std::function< void() > > mDiscardQueue;
};
{
}
+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
*/
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
std::unique_ptr<Impl> mImpl;
};
-using RefCountedShader = Handle<Shader>;
-
} // Namespace Vulkan
} // Namespace Graphics