verus/RendererVulkan/src/CGI/GeometryVulkan.h

74 lines
2.8 KiB
C
Raw Normal View History

2022-02-06 10:56:57 +01:00
// Copyright (C) 2021-2022, Dmitry Maluev (dmaluev@gmail.com). All rights reserved.
2019-04-03 00:02:02 +02:00
#pragma once
2023-08-12 13:43:56 +02:00
namespace verus::CGI
2019-04-03 00:02:02 +02:00
{
2023-08-12 13:43:56 +02:00
class GeometryVulkan : public BaseGeometry
2019-04-03 00:02:02 +02:00
{
2023-08-12 13:43:56 +02:00
static const int s_maxStorageBuffers = 8;
2023-05-02 21:35:12 +02:00
2023-08-12 13:43:56 +02:00
struct BufferEx
{
VmaAllocation _vmaAllocation = VK_NULL_HANDLE;
VkBuffer _buffer = VK_NULL_HANDLE;
VkDeviceSize _bufferSize = 0;
INT64 _utilization = -1;
};
2019-06-02 22:42:07 +02:00
2023-08-12 13:43:56 +02:00
struct StorageBufferEx : BufferEx
{
VkDescriptorSet _descriptorSet = VK_NULL_HANDLE;
int _structSize = 0;
};
2023-05-02 21:35:12 +02:00
2023-08-12 13:43:56 +02:00
Vector<BufferEx> _vVertexBuffers;
BufferEx _indexBuffer;
Vector<BufferEx> _vStagingVertexBuffers;
BufferEx _stagingIndexBuffer;
Vector<StorageBufferEx> _vStorageBuffers;
Vector<VkVertexInputBindingDescription> _vVertexInputBindingDesc;
Vector<VkVertexInputAttributeDescription> _vVertexInputAttributeDesc;
Vector<int> _vStrides;
Descriptors _descriptors;
2019-06-02 22:42:07 +02:00
2023-08-12 13:43:56 +02:00
public:
GeometryVulkan();
virtual ~GeometryVulkan() override;
2019-04-03 00:02:02 +02:00
2023-08-12 13:43:56 +02:00
virtual void Init(RcGeometryDesc desc) override;
virtual void Done() override;
2019-06-02 22:42:07 +02:00
2023-08-12 13:43:56 +02:00
virtual void CreateVertexBuffer(int count, int binding) override;
virtual void UpdateVertexBuffer(const void* p, int binding, PBaseCommandBuffer pCB, INT64 size, INT64 offset) override;
2019-07-01 20:39:32 +02:00
2023-08-12 13:43:56 +02:00
virtual void CreateIndexBuffer(int count) override;
virtual void UpdateIndexBuffer(const void* p, PBaseCommandBuffer pCB, INT64 size, INT64 offset) override;
2019-06-02 22:42:07 +02:00
2023-08-12 13:43:56 +02:00
virtual void CreateStorageBuffer(int count, int structSize, int sbIndex, ShaderStageFlags stageFlags) override;
virtual void UpdateStorageBuffer(const void* p, int sbIndex, PBaseCommandBuffer pCB, INT64 size, INT64 offset) override;
virtual int GetStorageBufferStructSize(int sbIndex) const override;
2023-05-02 21:35:12 +02:00
2023-08-12 13:43:56 +02:00
virtual Continue Scheduled_Update() override;
2020-04-01 22:21:16 +02:00
2023-08-12 13:43:56 +02:00
//
// Vulkan
//
2019-06-02 22:42:07 +02:00
2023-08-12 13:43:56 +02:00
VkPipelineVertexInputStateCreateInfo GetVkPipelineVertexInputStateCreateInfo(UINT32 bindingsFilter,
Vector<VkVertexInputBindingDescription>& vVertexInputBindingDesc, Vector<VkVertexInputAttributeDescription>& vVertexInputAttributeDesc) const;
2019-06-02 22:42:07 +02:00
2023-08-12 13:43:56 +02:00
int GetVertexBufferCount() const { return Utils::Cast32(_vVertexBuffers.size()); }
VkBuffer GetVkVertexBuffer(int binding) const { return _vVertexBuffers[binding]._buffer; }
VkDeviceSize GetVkVertexBufferOffset(int binding) const;
2023-05-02 21:35:12 +02:00
2023-08-12 13:43:56 +02:00
VkBuffer GetVkIndexBuffer() const { return _indexBuffer._buffer; }
VkDeviceSize GetVkIndexBufferOffset() const;
2021-02-01 18:22:02 +01:00
2023-08-12 13:43:56 +02:00
VkDescriptorSet GetVkDescriptorSet(int sbIndex) const { return _vStorageBuffers[sbIndex]._descriptorSet; }
VkDeviceSize GetVkStorageBufferOffset(int sbIndex) const;
2023-05-02 21:35:12 +02:00
2023-08-12 13:43:56 +02:00
void UpdateUtilization() const;;
};
VERUS_TYPEDEFS(GeometryVulkan);
2019-04-03 00:02:02 +02:00
}