void CreateSampler()
{
- // mutable sampler creation will be deferred until it's used
- mSampler = Sampler::New( mGraphics );
- mSampler->SetAddressMode( vk::SamplerAddressMode::eClampToEdge,
- vk::SamplerAddressMode::eClampToEdge,
- vk::SamplerAddressMode::eClampToEdge );
- mSampler->SetBorderColor( vk::BorderColor::eFloatOpaqueBlack );
- mSampler->SetCompareOp( vk::CompareOp::eNever );
- mSampler->SetFilter( vk::Filter::eLinear, vk::Filter::eLinear );
- mSampler->SetMipmapMode( vk::SamplerMipmapMode::eLinear );
-
- mSampler->GetVkHandle();
+ auto samplerCreateInfo = vk::SamplerCreateInfo()
+ .setAddressModeU( vk::SamplerAddressMode::eClampToEdge )
+ .setAddressModeV( vk::SamplerAddressMode::eClampToEdge )
+ .setAddressModeW( vk::SamplerAddressMode::eClampToEdge )
+ .setBorderColor( vk::BorderColor::eFloatOpaqueBlack )
+ .setCompareOp( vk::CompareOp::eNever )
+ .setMinFilter( vk::Filter::eLinear )
+ .setMagFilter( vk::Filter::eLinear )
+ .setMipmapMode( vk::SamplerMipmapMode::eLinear );
+
+ mSampler = mGraphics.CreateSampler( samplerCreateInfo );
}
RefCountedSampler GetSampler() const
NotImplemented()
}
-RefCountedSampler Graphics::CreateSampler()
+RefCountedSampler Graphics::CreateSampler( const vk::SamplerCreateInfo& samplerCreateInfo )
{
- NotImplemented()
+ auto refCountedSampler = Sampler::New( *this, samplerCreateInfo );
+
+ VkAssert( mDevice.createSampler( &samplerCreateInfo, mAllocator.get(), refCountedSampler->Ref() ) );
+
+ AddSampler( refCountedSampler );
+
+ return refCountedSampler;
+
}
// --------------------------------------------------------------------------------------------------------------
mResourceCache->AddFramebuffer( std::move( framebuffer ));
}
+void Graphics::AddSampler( RefCountedSampler sampler )
+{
+ std::lock_guard< std::mutex > lock{ mMutex };
+ mResourceCache->AddSampler( std::move( sampler ) );
+}
+
RefCountedShader Graphics::FindShader( vk::ShaderModule shaderModule )
{
std::lock_guard< std::mutex > lock{ mMutex };
RefCountedDescriptorSet CreateDescriptorSet();
- RefCountedSampler CreateSampler();
+ RefCountedSampler CreateSampler( const vk::SamplerCreateInfo& samplerCreateInfo );
public: // Actions
vk::Result WaitForFence( RefCountedFence fence, uint32_t timeout = 0 );
void AddFramebuffer( RefCountedFramebuffer framebuffer );
+ void AddSampler( RefCountedSampler sampler );
+
RefCountedShader FindShader( vk::ShaderModule shaderModule );
RefCountedImage FindImage( vk::Image image );
operator vk::ImageView*();
bool OnDestroy() override;
-//TODO: Use the graphics class to manage lifetime.
private:
ImageView( Graphics& graphics,
namespace Vulkan
{
-struct Sampler::Impl
-{
- Impl( Sampler& owner, Graphics& graphics, vk::SamplerCreateInfo info, bool immutable )
- : mOwner( owner ), mGraphics( graphics ), mCreateInfo( info ), mImmutable( immutable ), mModified( true )
- {
-
- }
-
- ~Impl()
- {
- DestroySafe();
- }
-
- bool CreateSampler()
- {
- if( !mModified )
- {
- return true;
- }
-
- if( mVkSampler )
- {
- DestroySafe();
- }
- mVkSampler = VkAssert( mGraphics.GetDevice().createSampler( mCreateInfo, mGraphics.GetAllocator()));
-
- // push to the resource list in graphics
-
- mModified = false;
-
- return true;
- }
-
- void DestroySafe()
- {
- // fixme: push sampler to the destroy queue, will be destroyed with the end of the frame
- mGraphics.GetDevice().destroySampler( mVkSampler );
- }
-
- Impl( const Impl& ) = delete;
- Impl& operator=( const Impl& ) = delete;
-
- Sampler& mOwner;
- Graphics& mGraphics;
- vk::SamplerCreateInfo mCreateInfo;
- vk::Sampler mVkSampler;
- bool mImmutable;
- bool mModified;
-};
-
-
-
/**
* Sampler
*/
* @param graphics
* @return
*/
-RefCountedSampler Sampler::New( Graphics& graphics )
+RefCountedSampler Sampler::New( Graphics& graphics, const vk::SamplerCreateInfo& createInfo )
{
- return RefCountedSampler(new Sampler(graphics, vk::SamplerCreateInfo{}, false));
+ return RefCountedSampler( new Sampler( graphics, createInfo ) );
}
-/**
- * Creates new immutable sampler
- * @param graphics
- * @param createInfo
- * @return
- */
-RefCountedSampler Sampler::NewImmutable( Graphics& graphics, vk::SamplerCreateInfo createInfo )
+Sampler::Sampler( Graphics& graphics, const vk::SamplerCreateInfo& createInfo )
+ : mGraphics(&graphics),
+ mCreateInfo(createInfo)
{
- auto retval = RefCountedSampler(new Sampler(graphics, createInfo, true));
- if( retval->mImpl->CreateSampler() )
- {
- return retval;
- }
- return RefCountedSampler();
-}
-
-Sampler::Sampler( Graphics& graphics, vk::SamplerCreateInfo createInfo, bool immutable )
-{
- mImpl.reset(new Impl( *this, graphics, createInfo, immutable ));
}
Sampler::~Sampler() = default;
-/**
- * Sets minification and magnifcation filters
- * @param minFilter
- * @param magFilter
- */
-void Sampler::SetFilter( vk::Filter minFilter, vk::Filter magFilter )
-{
- mImpl->mCreateInfo.setMinFilter( minFilter );
- mImpl->mCreateInfo.setMagFilter( magFilter );
- mImpl->mModified = true;
-}
-
-/**
- * Sets UVW address mode
- * @param addressModeU
- * @param addressModeV
- * @param addressModeW
- */
-void Sampler::SetAddressMode( vk::SamplerAddressMode addressModeU,
- vk::SamplerAddressMode addressModeV,
- vk::SamplerAddressMode addressModeW )
-{
- mImpl->mCreateInfo.setAddressModeU( addressModeU );
- mImpl->mCreateInfo.setAddressModeV( addressModeV );
- mImpl->mCreateInfo.setAddressModeW( addressModeW );
- mImpl->mModified = true;
-}
-
-void Sampler::SetLod( float minLod, float maxLod )
-{
- mImpl->mCreateInfo.setMinLod( minLod ).setMaxLod( maxLod );
- mImpl->mModified = true;
-}
-
-void Sampler::EnableAnisotropy( bool enabled )
-{
- mImpl->mCreateInfo.setAnisotropyEnable( enabled );
- mImpl->mModified = true;
-}
-
-void Sampler::SetMipmapMode( vk::SamplerMipmapMode mode )
+vk::Sampler Sampler::GetVkHandle() const
{
- mImpl->mCreateInfo.setMipmapMode( mode );
- mImpl->mModified = true;
+ return mSampler;
}
-void Sampler::SetMaxAnisotropy( float maxAnisotropy )
+const Sampler& Sampler::ConstRef()
{
- mImpl->mCreateInfo.setMaxAnisotropy( maxAnisotropy );
- mImpl->mModified = true;
+ return *this;
}
-void Sampler::EnableCompare( bool enabled )
+Sampler& Sampler::Ref()
{
- mImpl->mCreateInfo.setCompareEnable( enabled );
- mImpl->mModified = true;
+ return *this;
}
-void Sampler::SetBorderColor( vk::BorderColor color )
+Sampler::operator vk::Sampler*()
{
- mImpl->mCreateInfo.setBorderColor( color );
- mImpl->mModified = true;
+ return &mSampler;
}
-void Sampler::UseUnnormalizedCoordinates( bool enabled )
+bool Sampler::OnDestroy()
{
- mImpl->mCreateInfo.setUnnormalizedCoordinates( enabled );
- mImpl->mModified = true;
-}
+ mGraphics->RemoveSampler( *this );
-void Sampler::SetCompareOp( vk::CompareOp compareOp )
-{
- mImpl->mCreateInfo.setCompareOp( compareOp );
- mImpl->mModified = true;
-}
+ mGraphics->DiscardResource( [this]() {
+ mGraphics->GetDevice().destroySampler( mSampler, mGraphics->GetAllocator() );
+ } );
-vk::Sampler Sampler::GetVkHandle() const
-{
- // if no sampler yet, create it now
- if( mImpl->mModified )
- {
- mImpl->CreateSampler();
- }
- return mImpl->mVkSampler;
+ return false;
}
} // namespace Vulkan
{
namespace Vulkan
{
+
class Graphics;
+
class Sampler : public VkManaged
{
public:
/**
- * Creates new mutable sampler
+ * Creates a new Sampler
* @param graphics
* @return
*/
- static RefCountedSampler New( Graphics& graphics );
+ static RefCountedSampler New( Graphics& graphics, const vk::SamplerCreateInfo& createInfo );
/**
- * Creates new immutable sampler
- * @param graphics
- * @param createInfo
+ * Returns VkSampler object
* @return
*/
- static RefCountedSampler NewImmutable( Graphics& graphics, vk::SamplerCreateInfo createInfo );
-
- /**
- * Sets minification and magnifcation filters
- * @param minFilter
- * @param magFilter
- */
- void SetFilter( vk::Filter minFilter, vk::Filter magFilter );
-
- /**
- * Sets UVW address mode
- * @param addressModeU
- * @param addressModeV
- * @param addressModeW
- */
- void SetAddressMode( vk::SamplerAddressMode addressModeU,
- vk::SamplerAddressMode addressModeV,
- vk::SamplerAddressMode addressModeW );
-
- /**
- * Sets minimum and maximum LOD
- * @param minLod
- * @param maxLod
- */
- void SetLod( float minLod, float maxLod );
-
- /**
- * Enables anisotropy
- * @param enabled
- */
- void EnableAnisotropy( bool enabled );
-
- /**
- * Sets mipmap mode
- * @param mode
- */
- void SetMipmapMode( vk::SamplerMipmapMode mode );
-
- /**
- * Sets maximum anisotropy
- * @param maxAnisotropy
- */
- void SetMaxAnisotropy( float maxAnisotropy );
+ vk::Sampler GetVkHandle() const;
- /**
- * Turns on/off comparison with reference value when sampling
- * @param enabled
- */
- void EnableCompare( bool enabled );
+ const Sampler& ConstRef();
- /**
- * Specifies predefined border color to use
- * @param color
- */
- void SetBorderColor( vk::BorderColor color );
+ Sampler& Ref();
- /**
- * Enables/disables use of unnormalized texture coordinates
- * @param enabled
- */
- void UseUnnormalizedCoordinates( bool enabled );
+ operator vk::Sampler*();
- /**
- * Specifies comparison function used when comparing with reference value
- * @param compareOp
- */
- void SetCompareOp( vk::CompareOp compareOp );
-
- /**
- * Returns VkSampler object
- * @return
- */
- vk::Sampler GetVkHandle() const;
+ bool OnDestroy() override;
private:
- explicit Sampler( Graphics& graphics, vk::SamplerCreateInfo createInfo, bool immutable );
+ explicit Sampler( Graphics& graphics, const vk::SamplerCreateInfo& createInfo );
~Sampler() override;
- struct Impl;
- std::unique_ptr<Impl> mImpl;
+private:
+ Graphics* mGraphics;
+ vk::SamplerCreateInfo mCreateInfo;
+ vk::Sampler mSampler;
};
+
} // namespace Vulkan
} // namespace Graphics
} // namespace Dali