Skip to content

Commit

Permalink
Implement decoupling between buffers/textures and descriptor layouts …
Browse files Browse the repository at this point in the history
…for Vulkan back-end.

Relates to #52.
This also implements #51 for Vulkan, though generic buffer writes still need to be tested.
  • Loading branch information
crud89 committed Jul 20, 2021
1 parent 4e6cafd commit 1ba474d
Show file tree
Hide file tree
Showing 20 changed files with 162 additions and 440 deletions.
59 changes: 16 additions & 43 deletions src/Backends/Vulkan/include/litefx/backends/vulkan.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ namespace LiteFX::Rendering::Backends {
/// <summary>
/// Implements a Vulkan <see cref="IDescriptorLayout" />
/// </summary>
/// <seealso cref="IVulkanConstantBuffer" />
/// <seealso cref="IVulkanBuffer" />
/// <seealso cref="IVulkanImage" />
/// <seealso cref="IVulkanTexture" />
/// <seealso cref="IVulkanSampler" />
Expand Down Expand Up @@ -214,8 +214,8 @@ namespace LiteFX::Rendering::Backends {
/// Represents the base interface for a Vulkan buffer implementation.
/// </summary>
/// <seealso cref="VulkanDescriptorSet" />
/// <seealso cref="IVulkanConstantBuffer" />
/// <seealso cref="IVulkanConstantTexture" />
/// <seealso cref="IVulkanBuffer" />
/// <seealso cref="IVulkanTexture" />
/// <seealso cref="IVulkanVertexBuffer" />
/// <seealso cref="IVulkanIndexBuffer" />
class LITEFX_VULKAN_API IVulkanBuffer : public virtual ITransferableBuffer<IVulkanBuffer, VulkanCommandBuffer>, public virtual IResource<VkBuffer> {
Expand Down Expand Up @@ -243,18 +243,6 @@ namespace LiteFX::Rendering::Backends {
virtual ~IVulkanIndexBuffer() noexcept = default;
};

/// <summary>
/// Represents a Vulkan uniform or storage buffer.
/// </summary>
/// <seealso cref="VulkanDescriptorLayout" />
/// <seealso cref="VulkanDescriptorSet" />
/// <seealso cref="VulkanDescriptorSetLayout" />
/// <seealso cref="IVulkanBuffer" />
class LITEFX_VULKAN_API IVulkanConstantBuffer : public virtual IConstantBuffer<IVulkanBuffer, VulkanCommandBuffer, VulkanDescriptorLayout>, public IVulkanBuffer {
public:
virtual ~IVulkanConstantBuffer() noexcept = default;
};

/// <summary>
/// Represents a Vulkan sampled image or the base interface for a texture.
/// </summary>
Expand Down Expand Up @@ -285,7 +273,7 @@ namespace LiteFX::Rendering::Backends {
/// <seealso cref="IVulkanImage" />
/// <seealso cref="IVulkanSampler" />
/// <seealso cref="IVulkanBuffer" />
class LITEFX_VULKAN_API IVulkanTexture : public virtual ITexture<VulkanDescriptorLayout, IVulkanBuffer, VulkanCommandBuffer>, public IVulkanImage {
class LITEFX_VULKAN_API IVulkanTexture : public virtual ITexture<IVulkanBuffer, VulkanCommandBuffer>, public IVulkanImage {
public:
virtual ~IVulkanTexture() noexcept = default;

Expand All @@ -305,7 +293,7 @@ namespace LiteFX::Rendering::Backends {
/// <seealso cref="VulkanDescriptorSetLayout" />
/// <seealso cref="IVulkanImage" />
/// <seealso cref="IVulkanTexture" />
class LITEFX_VULKAN_API IVulkanSampler : public ISampler<VulkanDescriptorLayout>, public virtual IResource<VkSampler> {
class LITEFX_VULKAN_API IVulkanSampler : public ISampler, public virtual IResource<VkSampler> {
public:
virtual ~IVulkanSampler() noexcept = default;
};
Expand All @@ -314,7 +302,7 @@ namespace LiteFX::Rendering::Backends {
/// Implements a Vulkan <see cref="IDescriptorSet" />.
/// </summary>
/// <seealso cref="VulkanDescriptorSetLayout" />
class LITEFX_VULKAN_API VulkanDescriptorSet : public virtual VulkanRuntimeObject<VulkanDescriptorSetLayout>, public IDescriptorSet<IVulkanConstantBuffer, IVulkanTexture, IVulkanSampler, IVulkanImage, IVulkanBuffer, VulkanCommandBuffer>, public Resource<VkDescriptorSet> {
class LITEFX_VULKAN_API VulkanDescriptorSet : public virtual VulkanRuntimeObject<VulkanDescriptorSetLayout>, public IDescriptorSet<IVulkanBuffer, IVulkanTexture, IVulkanSampler, IVulkanImage, VulkanCommandBuffer>, public Resource<VkDescriptorSet> {
public:
/// <summary>
/// Initializes a new descriptor set.
Expand All @@ -328,25 +316,16 @@ namespace LiteFX::Rendering::Backends {

public:
/// <inheritdoc />
virtual UniquePtr<IVulkanConstantBuffer> makeBuffer(const UInt32& binding, const BufferUsage& usage, const UInt32& elements = 1) const override;
virtual void update(const UInt32& binding, const IVulkanBuffer& buffer, const UInt32& bufferElement = 0, const UInt32& elements = 1, const UInt32& firstDescriptor = 0) const override;

/// <inheritdoc />
virtual UniquePtr<IVulkanTexture> makeTexture(const UInt32& binding, const Format& format, const Size3d& size, const ImageDimensions& dimensions = ImageDimensions::DIM_2, const UInt32& levels = 1, const UInt32& layers = 1, const MultiSamplingLevel& samples = MultiSamplingLevel::x1) const override;
virtual void update(const UInt32& binding, const IVulkanTexture& texture, const UInt32& descriptor = 0) const override;

/// <inheritdoc />
virtual UniquePtr<IVulkanSampler> makeSampler(const UInt32& binding, const FilterMode& magFilter = FilterMode::Nearest, const FilterMode& minFilter = FilterMode::Nearest, const BorderMode& borderU = BorderMode::Repeat, const BorderMode& borderV = BorderMode::Repeat, const BorderMode& borderW = BorderMode::Repeat, const MipMapMode& mipMapMode = MipMapMode::Nearest, const Float& mipMapBias = 0.f, const Float& minLod = 0.f, const Float& maxLod = std::numeric_limits<Float>::max(), const Float& anisotropy = 0.f) const override;
virtual void update(const UInt32& binding, const IVulkanSampler& sampler, const UInt32& descriptor = 0) const override;

/// <inheritdoc />
virtual void update(const IVulkanConstantBuffer& buffer, const UInt32& bufferElement = 0, const UInt32& elements = 1, const UInt32& firstDescriptor = 0) const noexcept override;

/// <inheritdoc />
virtual void update(const IVulkanTexture& texture, const UInt32& descriptor = 0) const noexcept override;

/// <inheritdoc />
virtual void update(const IVulkanSampler& sampler, const UInt32& descriptor = 0) const noexcept override;

/// <inheritdoc />
virtual void attach(const UInt32& binding, const IVulkanImage& image) const noexcept override;
virtual void attach(const UInt32& binding, const IVulkanImage& image) const override;
};

/// <summary>
Expand Down Expand Up @@ -1605,7 +1584,7 @@ namespace LiteFX::Rendering::Backends {
/// <remarks>
/// Internally this factory implementation is based on <a href="https://gpuopen.com/vulkan-memory-allocator/" target="_blank">Vulkan Memory Allocator</a>.
/// </remarks>
class LITEFX_VULKAN_API VulkanGraphicsFactory : public IGraphicsFactory<VulkanDescriptorLayout, IVulkanImage, IVulkanVertexBuffer, IVulkanIndexBuffer, IVulkanConstantBuffer, IVulkanBuffer, IVulkanTexture, IVulkanSampler> {
class LITEFX_VULKAN_API VulkanGraphicsFactory : public IGraphicsFactory<VulkanDescriptorLayout, IVulkanImage, IVulkanVertexBuffer, IVulkanIndexBuffer, IVulkanBuffer, IVulkanTexture, IVulkanSampler> {
LITEFX_IMPLEMENTATION(VulkanGraphicsFactoryImpl);

public:
Expand All @@ -1619,12 +1598,6 @@ namespace LiteFX::Rendering::Backends {
virtual ~VulkanGraphicsFactory() noexcept;

public:
/// <inheritdoc />
virtual UniquePtr<IVulkanImage> createImage(const Format& format, const Size3d& size, const ImageDimensions& dimensions = ImageDimensions::DIM_2, const UInt32& levels = 1, const UInt32& layers = 1, const MultiSamplingLevel& samples = MultiSamplingLevel::x1) const override;

/// <inheritdoc />
virtual UniquePtr<IVulkanImage> createAttachment(const Format& format, const Size2d& size, const MultiSamplingLevel& samples = MultiSamplingLevel::x1) const override;

/// <inheritdoc />
virtual UniquePtr<IVulkanBuffer> createBuffer(const BufferType& type, const BufferUsage& usage, const size_t& elementSize, const UInt32& elements = 1) const override;

Expand All @@ -1635,19 +1608,19 @@ namespace LiteFX::Rendering::Backends {
virtual UniquePtr<IVulkanIndexBuffer> createIndexBuffer(const VulkanIndexBufferLayout& layout, const BufferUsage& usage, const UInt32& elements) const override;

/// <inheritdoc />
virtual UniquePtr<IVulkanConstantBuffer> createConstantBuffer(const VulkanDescriptorLayout& layout, const BufferUsage& usage, const UInt32& elements = 1) const override;
virtual UniquePtr<IVulkanImage> createAttachment(const Format& format, const Size2d& size, const MultiSamplingLevel& samples = MultiSamplingLevel::x1) const override;

/// <inheritdoc />
virtual UniquePtr<IVulkanTexture> createTexture(const VulkanDescriptorLayout& layout, const Format& format, const Size3d& size, const ImageDimensions& dimension = ImageDimensions::DIM_2, const UInt32& levels = 1, const UInt32& layers = 1, const MultiSamplingLevel& samples = MultiSamplingLevel::x1) const override;
virtual UniquePtr<IVulkanTexture> createTexture(const Format& format, const Size3d& size, const ImageDimensions& dimension = ImageDimensions::DIM_2, const UInt32& levels = 1, const UInt32& layers = 1, const MultiSamplingLevel& samples = MultiSamplingLevel::x1) const override;

/// <inheritdoc />
virtual Array<UniquePtr<IVulkanTexture>> createTextures(const VulkanDescriptorLayout& layout, const UInt32& elements, const Format& format, const Size3d& size, const ImageDimensions& dimension = ImageDimensions::DIM_2, const UInt32& levels = 1, const UInt32& layers = 1, const MultiSamplingLevel& samples = MultiSamplingLevel::x1) const override;
virtual Array<UniquePtr<IVulkanTexture>> createTextures(const UInt32& elements, const Format& format, const Size3d& size, const ImageDimensions& dimension = ImageDimensions::DIM_2, const UInt32& levels = 1, const UInt32& layers = 1, const MultiSamplingLevel& samples = MultiSamplingLevel::x1) const override;

/// <inheritdoc />
virtual UniquePtr<IVulkanSampler> createSampler(const VulkanDescriptorLayout& layout, const FilterMode& magFilter = FilterMode::Nearest, const FilterMode& minFilter = FilterMode::Nearest, const BorderMode& borderU = BorderMode::Repeat, const BorderMode& borderV = BorderMode::Repeat, const BorderMode& borderW = BorderMode::Repeat, const MipMapMode& mipMapMode = MipMapMode::Nearest, const Float& mipMapBias = 0.f, const Float& maxLod = std::numeric_limits<Float>::max(), const Float& minLod = 0.f, const Float& anisotropy = 0.f) const override;
virtual UniquePtr<IVulkanSampler> createSampler(const FilterMode& magFilter = FilterMode::Nearest, const FilterMode& minFilter = FilterMode::Nearest, const BorderMode& borderU = BorderMode::Repeat, const BorderMode& borderV = BorderMode::Repeat, const BorderMode& borderW = BorderMode::Repeat, const MipMapMode& mipMapMode = MipMapMode::Nearest, const Float& mipMapBias = 0.f, const Float& maxLod = std::numeric_limits<Float>::max(), const Float& minLod = 0.f, const Float& anisotropy = 0.f) const override;

/// <inheritdoc />
virtual Array<UniquePtr<IVulkanSampler>> createSamplers(const VulkanDescriptorLayout& layout, const UInt32& elements, const FilterMode& magFilter = FilterMode::Nearest, const FilterMode& minFilter = FilterMode::Nearest, const BorderMode& borderU = BorderMode::Repeat, const BorderMode& borderV = BorderMode::Repeat, const BorderMode& borderW = BorderMode::Repeat, const MipMapMode& mipMapMode = MipMapMode::Nearest, const Float& mipMapBias = 0.f, const Float& maxLod = std::numeric_limits<Float>::max(), const Float& minLod = 0.f, const Float& anisotropy = 0.f) const override;
virtual Array<UniquePtr<IVulkanSampler>> createSamplers(const UInt32& elements, const FilterMode& magFilter = FilterMode::Nearest, const FilterMode& minFilter = FilterMode::Nearest, const BorderMode& borderU = BorderMode::Repeat, const BorderMode& borderV = BorderMode::Repeat, const BorderMode& borderW = BorderMode::Repeat, const MipMapMode& mipMapMode = MipMapMode::Nearest, const Float& mipMapBias = 0.f, const Float& maxLod = std::numeric_limits<Float>::max(), const Float& minLod = 0.f, const Float& anisotropy = 0.f) const override;
};

/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/Backends/Vulkan/include/litefx/backends/vulkan_api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ namespace LiteFX::Rendering::Backends {
class IVulkanBuffer;
class IVulkanVertexBuffer;
class IVulkanIndexBuffer;
class IVulkanConstantBuffer;
class IVulkanImage;
class IVulkanTexture;
class IVulkanSampler;
Expand Down
55 changes: 0 additions & 55 deletions src/Backends/Vulkan/src/buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -210,11 +210,6 @@ const VulkanVertexBufferLayout& VulkanVertexBuffer::layout() const noexcept
return m_impl->m_layout;
}

const UInt32& VulkanVertexBuffer::binding() const noexcept
{
return m_impl->m_layout.binding();
}

UniquePtr<IVulkanVertexBuffer> VulkanVertexBuffer::allocate(const VulkanVertexBufferLayout& layout, const UInt32& elements, const VmaAllocator& allocator, const VkBufferCreateInfo& createInfo, const VmaAllocationCreateInfo& allocationInfo, VmaAllocationInfo* allocationResult)
{
VkBuffer buffer;
Expand Down Expand Up @@ -269,54 +264,4 @@ UniquePtr<IVulkanIndexBuffer> VulkanIndexBuffer::allocate(const VulkanIndexBuffe
LITEFX_DEBUG(VULKAN_LOG, "Allocated buffer {0} with {4} bytes {{ Type: {1}, Elements: {2}, Element Size: {3} }}", fmt::ptr(reinterpret_cast<void*>(buffer)), BufferType::Index, elements, layout.elementSize(), layout.elementSize() * elements);

return makeUnique<VulkanIndexBuffer>(*layout.getDevice(), buffer, layout, elements, allocator, allocation);
}

// ------------------------------------------------------------------------------------------------
// Constant buffer implementation.
// ------------------------------------------------------------------------------------------------

class VulkanConstantBuffer::VulkanConstantBufferImpl : public Implement<VulkanConstantBuffer> {
public:
friend class VulkanConstantBuffer;

private:
const VulkanDescriptorLayout& m_layout;

public:
VulkanConstantBufferImpl(VulkanConstantBuffer* parent, const VulkanDescriptorLayout& layout) :
base(parent), m_layout(layout)
{
}
};

// ------------------------------------------------------------------------------------------------
// Constant buffer shared interface.
// ------------------------------------------------------------------------------------------------

VulkanConstantBuffer::VulkanConstantBuffer(const VulkanDevice& device, VkBuffer buffer, const VulkanDescriptorLayout& layout, const UInt32& elements, const size_t& alignment, const VmaAllocator& allocator, const VmaAllocation& allocation) :
m_impl(makePimpl<VulkanConstantBufferImpl>(this, layout)), VulkanBuffer(device, buffer, layout.type(), elements, layout.elementSize(), alignment, allocator, allocation)
{
}

VulkanConstantBuffer::~VulkanConstantBuffer() noexcept = default;

const VulkanDescriptorLayout& VulkanConstantBuffer::layout() const noexcept
{
return m_impl->m_layout;
}

const UInt32& VulkanConstantBuffer::binding() const noexcept
{
return m_impl->m_layout.binding();
}

UniquePtr<IVulkanConstantBuffer> VulkanConstantBuffer::allocate(const VulkanDescriptorLayout& layout, const UInt32& elements, const size_t& alignment, const VmaAllocator& allocator, const VkBufferCreateInfo& createInfo, const VmaAllocationCreateInfo& allocationInfo, VmaAllocationInfo * allocationResult)
{
VkBuffer buffer;
VmaAllocation allocation;

raiseIfFailed<RuntimeException>(::vmaCreateBuffer(allocator, &createInfo, &allocationInfo, &buffer, &allocation, allocationResult), "Unable to allocate constant buffer.");
LITEFX_DEBUG(VULKAN_LOG, "Allocated buffer {0} with {4} bytes {{ Type: {1}, Elements: {2}, Element Size: {3} }}", fmt::ptr(reinterpret_cast<void*>(buffer)), layout.type(), elements, layout.elementSize(), layout.elementSize() * elements);

return makeUnique<VulkanConstantBuffer>(*layout.getDevice(), buffer, layout, elements, alignment, allocator, allocation);
}
29 changes: 0 additions & 29 deletions src/Backends/Vulkan/src/buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,6 @@ namespace LiteFX::Rendering::Backends {
/// <inheritdoc />
const VulkanVertexBufferLayout& layout() const noexcept override;

// IBindable interface.
public:
/// <inheritdoc />
virtual const UInt32& binding() const noexcept override;

// VulkanVertexBuffer.
public:
static UniquePtr<IVulkanVertexBuffer> allocate(const VulkanVertexBufferLayout& layout, const UInt32& elements, const VmaAllocator& allocator, const VkBufferCreateInfo& createInfo, const VmaAllocationCreateInfo& allocationInfo, VmaAllocationInfo* allocationResult = nullptr);
Expand All @@ -129,28 +124,4 @@ namespace LiteFX::Rendering::Backends {
public:
static UniquePtr<IVulkanIndexBuffer> allocate(const VulkanIndexBufferLayout& layout, const UInt32& elements, const VmaAllocator& allocator, const VkBufferCreateInfo& createInfo, const VmaAllocationCreateInfo& allocationInfo, VmaAllocationInfo* allocationResult = nullptr);
};

class VulkanConstantBuffer : public VulkanBuffer, public IVulkanConstantBuffer {
LITEFX_IMPLEMENTATION(VulkanConstantBufferImpl);

public:
explicit VulkanConstantBuffer(const VulkanDevice& device, VkBuffer buffer, const VulkanDescriptorLayout& layout, const UInt32& elements, const size_t& alignment, const VmaAllocator& allocator, const VmaAllocation& allocation);
VulkanConstantBuffer(VulkanConstantBuffer&&) = delete;
VulkanConstantBuffer(const VulkanConstantBuffer&) = delete;
virtual ~VulkanConstantBuffer() noexcept;

// IDescriptor interface.
public:
/// <inheritdoc />
const VulkanDescriptorLayout& layout() const noexcept override;

// IBindable interface.
public:
/// <inheritdoc />
virtual const UInt32& binding() const noexcept override;

// VulkanConstantBuffer.
public:
static UniquePtr<IVulkanConstantBuffer> allocate(const VulkanDescriptorLayout& layout, const UInt32& elements, const size_t& alignment, const VmaAllocator& allocator, const VkBufferCreateInfo& createInfo, const VmaAllocationCreateInfo& allocationInfo, VmaAllocationInfo* allocationResult = nullptr);
};
}

0 comments on commit 1ba474d

Please sign in to comment.