working on rendering
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include "tier1/utlvector.h"
|
||||
#include "tier2/iappsystem.h"
|
||||
#include "materialsystem/imaterialsystem.h"
|
||||
#include "materialsystem/shaderinternals.h"
|
||||
#include "vulkan/vulkan_core.h"
|
||||
|
||||
#define REQUIRED_EXTENSION(ext) bool bIsSupported_##ext;
|
||||
@@ -26,6 +27,7 @@ extern CUtlVector<VkCommandPool> g_vkCommandPools;
|
||||
extern CUtlVector<VkCommandBuffer> g_vkCommandBuffers;
|
||||
|
||||
extern VkInstance g_vkInstance;
|
||||
extern VmaAllocator g_vkAllocator;
|
||||
extern VkPhysicalDevice g_vkPhysicalDevice;
|
||||
extern VkDevice g_vkDevice;
|
||||
|
||||
@@ -115,7 +117,7 @@ public:
|
||||
virtual void AddCommand( CVkCommand *pCommand ) = 0;
|
||||
|
||||
virtual void Reset() = 0;
|
||||
virtual void Submit( int iFrameIndex ) = 0;
|
||||
virtual void Submit( int iFrameIndex = 0 ) = 0;
|
||||
virtual void Render() = 0;
|
||||
};
|
||||
|
||||
@@ -135,6 +137,8 @@ class CVkCommandRegistry
|
||||
public:
|
||||
CVkCommandRegistry( const char *szName, fnCreateVulkanCommand_t pfnCreate );
|
||||
};
|
||||
#define CREATE_COMMAND(name) \
|
||||
(CVk##name##Command*)g_pCommandBufferManager->CreateCommand(#name)
|
||||
|
||||
#define BEGIN_VULKAN_COMMAND( name ) \
|
||||
class CVk##name##Command : public CVkCommand \
|
||||
@@ -162,7 +166,7 @@ class CVkImage: public IImage
|
||||
{
|
||||
public:
|
||||
CVkImage();
|
||||
CVkImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType );
|
||||
CVkImage( uint32_t nWidth, uint32_t nHeight, uint32_t nDepth, EImageFormat eFormat, EMultisampleType eMultisampleType, EImageType eImageType, VkImageUsageFlagBits eUsage );
|
||||
~CVkImage();
|
||||
|
||||
virtual void SetDebugName( const char *szName ) override;
|
||||
@@ -171,7 +175,7 @@ public:
|
||||
virtual EImageFormat GetImageFormat() override;
|
||||
virtual EMultisampleType GetMultisampleType() override;
|
||||
|
||||
void CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType );
|
||||
void CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType, VkImageUsageFlagBits eUsage );
|
||||
void CreateImageView();
|
||||
|
||||
static VkImageViewType GetImageViewType( enum EImageType eImageType );
|
||||
@@ -205,10 +209,10 @@ public:
|
||||
virtual void Unmap() override;
|
||||
virtual uint32_t GetSize() override;
|
||||
|
||||
VmaAllocation allocation;
|
||||
VkBuffer buffer;
|
||||
VkDeviceAddress address;
|
||||
uint32_t nSize;
|
||||
VmaAllocation m_allocation;
|
||||
VkBuffer m_buffer;
|
||||
VkDeviceAddress m_address;
|
||||
uint32_t m_nSize;
|
||||
};
|
||||
|
||||
class CVkPipelineLibrary
|
||||
@@ -228,6 +232,7 @@ public: \
|
||||
#define END_DEFINE_PIPELINE_LIBRARY() \
|
||||
};
|
||||
|
||||
extern VkPipelineLayout g_pLibraryEmptyLayout;
|
||||
#define BEGIN_BUILD_PIPELINE_LIBRARY(name) \
|
||||
void CVk##name##PipelineLibrary::Build() \
|
||||
{ \
|
||||
@@ -236,22 +241,59 @@ void CVk##name##PipelineLibrary::Build() \
|
||||
pipeline.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; \
|
||||
library.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT; \
|
||||
pipeline.pNext = &library; \
|
||||
pipeline.flags = VK_PIPELINE_CREATE_LIBRARY_BIT_KHR; \
|
||||
pipeline.flags = VK_PIPELINE_CREATE_LIBRARY_BIT_KHR | VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT; \
|
||||
pipeline.layout = g_pLibraryEmptyLayout;
|
||||
|
||||
#define END_BUILD_PIPELINE_LIBRARY() \
|
||||
vkCreateGraphicsPipelines(g_vkDevice, NULL, 1, &pipeline, NULL, &m_hPipeline); \
|
||||
}
|
||||
|
||||
class CVkShader : IShader
|
||||
class CVkShader : public IShader
|
||||
{
|
||||
public:
|
||||
void AddShaderLibrary( CVkPipelineLibrary *pLibrary );
|
||||
void Build();
|
||||
virtual uint32_t PSGetResourceByName( const char *szName ) override;
|
||||
virtual uint32_t VSGetResourceByName( const char *szName ) override;
|
||||
VkPipeline m_hPipeline = NULL;
|
||||
VkPipelineLayout m_hPipelineLayout;
|
||||
CUtlVector<CVkPipelineLibrary*> m_libraries;
|
||||
};
|
||||
|
||||
class CVkMaterial: public IMaterial
|
||||
{
|
||||
public:
|
||||
CVkMaterial( IShader *pShader );
|
||||
virtual ~CVkMaterial() override;
|
||||
|
||||
virtual void VSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) override;
|
||||
virtual void VSSetConstantsBuffer( uint32_t uRegister, IBuffer *pConstants ) override;
|
||||
|
||||
virtual void PSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) override;
|
||||
virtual void PSSetConstantsBuffer( uint32_t uRegister, IBuffer *pConstants ) override;
|
||||
|
||||
CVkShader *m_pVkShader;
|
||||
private:
|
||||
void SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderingObject *pObject);
|
||||
};
|
||||
|
||||
|
||||
|
||||
enum EVulkanRenderingStage
|
||||
{
|
||||
RENDERING_STAGE_SETUP_RASTER,
|
||||
RENDERING_STAGE_RASTER,
|
||||
RENDERING_STAGE_POST_RASTER,
|
||||
RENDERING_STAGE_FINISHED,
|
||||
};
|
||||
|
||||
struct VulkanMaterialCommandBuffer_t
|
||||
{
|
||||
IMaterial *m_pMaterial;
|
||||
IVkCommandBuffer *m_pCommandBuffer;
|
||||
};
|
||||
|
||||
|
||||
enum EVkFrameObjectType_t
|
||||
{
|
||||
FRAME_OBJECT_TYPE_SINGLE,
|
||||
@@ -267,6 +309,64 @@ struct VkFrameObject_t
|
||||
};
|
||||
};
|
||||
|
||||
struct VulkanRenderOutput_t {
|
||||
VkFrameObject_t m_stImage;
|
||||
VkFrameObject_t m_stResolveImage;
|
||||
|
||||
float m_fClearColor[4];
|
||||
float m_fClearDepth;
|
||||
|
||||
uint32_t m_uIndex;
|
||||
EResolveMode m_eResolveMode;
|
||||
ELoadMode m_eLoadMode;
|
||||
EStoreMode m_eStoreMode;
|
||||
};
|
||||
|
||||
class CVkRenderCommandList: public IRenderCommandList
|
||||
{
|
||||
public:
|
||||
virtual void ResetRendering() override;
|
||||
|
||||
virtual void SetRenderTarget( uint32_t uIndex, IImage *pImage ) override;
|
||||
virtual void SetClearColor( uint32_t uIndex, float r, float g, float b, float a ) override;
|
||||
|
||||
virtual void SetDepthTarget( IImage *pDepth ) override;
|
||||
virtual void SetClearDepth( float fVal ) override;
|
||||
|
||||
virtual void SetRenderResolution( uint32_t iWidth, uint32_t iHeight ) override;
|
||||
|
||||
// Should they apply per material or for all?
|
||||
virtual void SetScissors( uint32_t uX, uint32_t uY, uint32_t uWidth, uint32_t uHeight ) override;
|
||||
virtual void SetViewport( uint32_t uX, uint32_t uY, uint32_t uWidth, uint32_t uHeight, float fMinDepth, float fMaxDepth ) override;
|
||||
|
||||
virtual void SetMaterial( IMaterial *pMaterial ) override;
|
||||
virtual void SetVertexBuffer( uint32_t uBinding, IVertexBuffer *pBuffer ) override;
|
||||
virtual void SetIndexBuffer( IVertexBuffer *pBuffer ) override;
|
||||
virtual void DrawPrimitives( uint32_t nVertexCount, uint32_t nFirstVertex, uint32_t nInstanceCount, uint32_t nFirstInstance ) override;
|
||||
virtual void DrawPrimitivesIndexed( uint32_t nIndexCount, uint32_t nFirstIndex, uint32_t nVertexOffset, uint32_t nInstanceCount, uint32_t nFirstInstance ) override;
|
||||
|
||||
virtual void ResolveImage( IImage *pOriginal, IImage *pResolved ) override;
|
||||
|
||||
virtual void StartRecording() override;
|
||||
virtual void EndRecording() override;
|
||||
|
||||
void Submit();
|
||||
private:
|
||||
void SwitchRenderingStage( EVulkanRenderingStage eStage );
|
||||
|
||||
VulkanRenderOutput_t *FindOrCreateRenderOutput( uint32_t uIndex );
|
||||
IVkCommandBuffer *FindOrCreateMaterialCommandBuffer( IMaterial *pMaterial, bool *pbWasCreated = NULL );
|
||||
|
||||
VulkanRenderOutput_t m_depth;
|
||||
|
||||
CUtlVector<VulkanRenderOutput_t> m_pOutput = {};
|
||||
CUtlSelfReferencingVector<VulkanMaterialCommandBuffer_t> m_materials = {};
|
||||
IVkCommandBuffer *m_pPostRaster;
|
||||
|
||||
IVkCommandBuffer *m_pCurrentMaterialBuffer = NULL;
|
||||
};
|
||||
|
||||
|
||||
IRenderingObject *VulkanGetObject( VkFrameObject_t stObject, int iIndex );
|
||||
|
||||
VkAccessFlags2 VulkanGetAccessFlags( EDependencyMode eMode );
|
||||
@@ -274,4 +374,6 @@ VkPipelineStageFlags2 VulkanGetStageFlags( EDependencyMode eMode );
|
||||
VkImageLayout VulkanGetImageLayout( EDependencyMode eMode );
|
||||
VkFormat VulkanGetVertexFormat( EVertexFormat eFormat );
|
||||
VkPrimitiveTopology VulkanGetTopology( ETopologyMode eMode );
|
||||
VkShaderStageFlagBits VulkanGetShaderStage( EShaderStage eStage );
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user