added barriers, started working on libraries

This commit is contained in:
2025-12-15 20:31:16 +02:00
parent 5d4c587bf2
commit dd1a51b752
20 changed files with 608 additions and 61 deletions

View File

@@ -58,13 +58,20 @@ enum EDependencyMode
DEPENDENCY_MODE_DRAWCALL_VERTEX_BUFFER,
DEPENDENCY_MODE_DRAWCALL_INDEX_BUFFER,
DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE,
DEPENDENCY_MODE_DRAWCALL_INPUT_IMAGE,
DEPENDENCY_MODE_DRAWCALL_MIXED_IMAGE,
DEPENDENCY_MODE_IMAGE_SOURCE,
DEPENDENCY_MODE_IMAGE_DESTINATION,
DEPENDENCY_MODE_COLOR_CLEAR_SOURCE,
DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION,
DEPENDENCY_MODE_ALL_COMMANDS,
DEPENDENCY_MODE_IMAGE_PRESENT,
DEPENDENCY_MODE_FROM_PREVIOUS,
DEPENDENCY_MODE_COUNT,
};
@@ -73,6 +80,10 @@ struct VulkanCommandDepenency_t {
IRenderingObject *m_pObject;
EDependencyMode m_eDependencyMode;
};
struct VulkanCommandSwapchainDepenency_t {
IRenderingObject **m_ppObjects;
EDependencyMode m_eDependencyMode;
};
struct VulkanCommandParameter_t
{
@@ -90,10 +101,12 @@ public:
virtual void Execute( VkCommandBuffer hCommandBuffer, int iCurrentFrame ) = 0;
//virtual const char *GetName();
CUtlVector<VulkanCommandDepenency_t> m_depedencies;
CUtlVector<VulkanCommandDepenency_t> m_dependencies = {};
CUtlVector<VulkanCommandSwapchainDepenency_t> m_swapchainDependencies = {};
EVulkanCommandType m_eType;
protected:
void AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode );
void AddSwapchainDependency( IRenderingObject **ppObjects, EDependencyMode eDependencyMode );
};
abstract_class IVkCommandBuffer
@@ -173,9 +186,88 @@ public:
VkImage m_image;
VkImageView m_imageView;
VmaAllocation m_allocation;
VkImageSubresourceRange m_range;
VkImageLayout m_eImageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
EDependencyMode m_eLastUsage;
};
class CVkBuffer: public IBuffer
{
public:
CVkBuffer( uint32_t nSize, VkBufferUsageFlags2 eUsage, uint32_t nAlignment );
~CVkBuffer();
virtual void SetDebugName( const char *szName ) override;
virtual void Lock() override;
virtual void Unlock() override;
virtual void *Map() override;
virtual void Unmap() override;
virtual uint32_t GetSize() override;
VmaAllocation allocation;
VkBuffer buffer;
VkDeviceAddress address;
uint32_t nSize;
};
class CVkPipelineLibrary
{
public:
virtual void Build() = 0;
VkPipeline m_hPipeline = NULL;
};
#define BEGIN_DEFINE_PIPELINE_LIBRARY(name) \
class CVk##name##PipelineLibrary: public CVkPipelineLibrary \
{ \
public: \
virtual void Build() override; \
#define END_DEFINE_PIPELINE_LIBRARY() \
};
#define BEGIN_BUILD_PIPELINE_LIBRARY(name) \
void CVk##name##PipelineLibrary::Build() \
{ \
VkGraphicsPipelineCreateInfo pipeline = {}; \
pipeline.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; \
#define END_BUILD_PIPELINE_LIBRARY() \
vkCreateGraphicsPipelines(g_vkDevice, NULL, 1, &pipeline, NULL, &m_hPipeline); \
}
class CVkShader : IShader
{
public:
void AddShaderLibrary( CVkPipelineLibrary *pLibrary );
void Build();
VkPipeline m_hPipeline = NULL;
VkPipelineLayout m_hPipelineLayout;
CUtlVector<CVkPipelineLibrary*> m_libraries;
};
enum EVkFrameObjectType_t
{
FRAME_OBJECT_TYPE_SINGLE,
FRAME_OBJECT_TYPE_SWAPPED,
};
struct VkFrameObject_t
{
EVkFrameObjectType_t m_eObjectType;
union {
IRenderingObject *m_pSingle;
IRenderingObject **m_ppSwapped;
};
};
IRenderingObject *VulkanGetObject( VkFrameObject_t stObject, int iIndex );
VkAccessFlags2 VulkanGetAccessFlags( EDependencyMode eMode );
VkPipelineStageFlags2 VulkanGetStageFlags( EDependencyMode eMode );
VkImageLayout VulkanGetImageLayout( EDependencyMode eMode );
#endif