lots of updates

This commit is contained in:
2026-02-19 00:39:20 +02:00
parent 898bf90504
commit 4dd2e13c48
53 changed files with 1495 additions and 250 deletions

View File

@@ -26,6 +26,7 @@ public:
virtual void Reset() override;
virtual void Submit( int iFrameIndex ) override;
virtual void Render() override;
void FreeWithCommands();
private:
void SortDependencies();
void TryBarrier( int iCurrent, int iCurrentBuffer );
@@ -40,9 +41,23 @@ private:
VkDevice m_hDevice;
IVkCommandBufferManager *m_pMgr;
VkCommandPool m_hPool;
VkCommandPool m_hPool = NULL;
};
void CVkCommandBuffer::FreeWithCommands()
{
if (m_hPool)
{
for ( auto &c: m_commands)
{
delete c;
};
vkFreeCommandBuffers(m_hDevice, m_hPool, m_hBuffers.GetSize(), m_hBuffers.GetData());
vkDestroyCommandPool(m_hDevice, m_hPool, NULL);
m_hPool = NULL;
}
}
void CVkCommandBuffer::SetVulkanHandlers( VkDevice hDevice, IVkCommandBufferManager *pManager )
{
m_hDevice = hDevice;
@@ -54,6 +69,8 @@ void CVkCommandBuffer::Reset()
VkCommandBufferAllocateInfo commandBufferAllocInfo = {};
VkCommandPoolCreateInfo stCreateInfo = {};
FreeWithCommands();
stCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
stCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
vkCreateCommandPool(m_hDevice, &stCreateInfo, NULL, &m_hPool);
@@ -343,6 +360,7 @@ public:
virtual IVkCommandBuffer *CreateCommandBuffer() override;
virtual CVkCommand *CreateCommand( const char *szName ) override;
virtual CUtlVector<VkCommandBuffer> &GetVulkanCommands() override;
virtual void FreeCommandBufferWithCommands(IVkCommandBuffer* pCommandBuffer) override;
virtual void RenderingFinished() override;
private:
@@ -399,6 +417,12 @@ CUtlVector<VkCommandBuffer> &CVkCommandBufferManager::GetVulkanCommands()
{
return m_commands;
}
void CVkCommandBufferManager::FreeCommandBufferWithCommands(IVkCommandBuffer* pCommandBuffer)
{
CVkCommandBuffer *pVkBuffer = (CVkCommandBuffer*)pCommandBuffer;
pVkBuffer->FreeWithCommands();
delete pVkBuffer;
};
void CVkCommandBufferManager::RenderingFinished()
{

View File

@@ -27,9 +27,10 @@ END_VULKAN_COMMAND(ClearColor)
BEGIN_VULKAN_COMMAND(Begin)
CUtlVector<VulkanRenderOutput_t> images;
VulkanRenderOutput_t stDepthImage;
uint32_t nResolutionX;
uint32_t nResolutionY;
VulkanRenderOutput_t stDepthImage = {};
bool bDepthEnabled = {};
uint32_t nResolutionX = 0;
uint32_t nResolutionY = 0;
END_VULKAN_COMMAND(Begin)

View File

@@ -32,6 +32,7 @@ DECLARE_VULKAN_COMMAND(Begin)
{
VkRenderingInfo stRenderingInfo = {};
CUtlVector<VkRenderingAttachmentInfo> attachments = {};
VkRenderingAttachmentInfo depthAttachment = {};
for (auto i: images)
{
VkRenderingAttachmentInfo a = {};
@@ -46,6 +47,16 @@ DECLARE_VULKAN_COMMAND(Begin)
a.imageView = ((CVkImage*)VulkanGetObject(i.m_stImage, iCurrentFrame))->m_imageView;
attachments.AppendTail(a);
}
if (bDepthEnabled)
{
depthAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
depthAttachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
depthAttachment.clearValue.depthStencil.depth = stDepthImage.m_fClearDepth;
depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
depthAttachment.imageView = ((CVkImage*)VulkanGetObject(stDepthImage.m_stImage, iCurrentFrame))->m_imageView;
stRenderingInfo.pDepthAttachment = &depthAttachment;
}
stRenderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO;
stRenderingInfo.layerCount = 1;

View File

@@ -3,16 +3,20 @@ CVkMaterial::CVkMaterial( IShader *pShader )
{
m_pVkShader = (CVkShader*)pShader;
VkDescriptorPoolSize pools[1] =
VkDescriptorPoolSize pools[2] =
{
{
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
128,
},
{
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
128,
}
};
VkDescriptorPoolCreateInfo stPool = {};
stPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
stPool.poolSizeCount = 1;
stPool.poolSizeCount = 2;
stPool.pPoolSizes = pools;
stPool.maxSets = 1;
stPool.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT;
@@ -37,6 +41,7 @@ CVkMaterial::CVkMaterial( IShader *pShader )
switch (b.eDescriptorType)
{
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
write.pBufferInfo = new VkDescriptorBufferInfo;
break;
default:
@@ -88,6 +93,6 @@ void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderi
((VkDescriptorBufferInfo*)m_writes[uRegister].pBufferInfo)->buffer = pBuffer->m_buffer;
((VkDescriptorBufferInfo*)m_writes[uRegister].pBufferInfo)->range = pBuffer->m_nSize;
}
Frame();
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 1, &m_writes[uRegister], 0, 0);
}

View File

@@ -1,14 +1,18 @@
#include "vulkan_state.h"
#include "commands.h"
CVkRenderCommandList::~CVkRenderCommandList()
{
ResetRendering();
}
void CVkRenderCommandList::ResetRendering()
{
/*
for ( auto m: m_materials)
for ( auto m: m_materials )
{
delete m.m_pCommandBuffer;
m_pCommandBufferManager->FreeCommandBufferWithCommands(m.m_pCommandBuffer);
}
*/
m_materials = {};
}
@@ -33,7 +37,15 @@ void CVkRenderCommandList::SetClearColor( uint32_t uIndex, float r, float g, flo
void CVkRenderCommandList::SetDepthTarget( IImage *pDepth )
{
SwitchRenderingStage(RENDERING_STAGE_SETUP_RASTER);
m_depth.m_stImage.m_pSingle = pDepth;
if (pDepth)
{
m_bDepthEnabled = true;
m_depth.m_stImage.m_pSingle = pDepth;
}
else
{
m_bDepthEnabled = false;
}
}
void CVkRenderCommandList::SetClearDepth( float fVal)
@@ -76,11 +88,17 @@ void CVkRenderCommandList::SetMaterial( IMaterial *pMaterial )
pBeginCommand->images = m_pOutput;
pBeginCommand->nResolutionX = m_uWidth;
pBeginCommand->nResolutionY = m_uHeight;
pBeginCommand->stDepthImage = m_depth;
for ( auto &i: pBeginCommand->images)
{
pBeginCommand->AddDependency(i.m_stImage.m_pSingle, DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE);
}
if ( m_bDepthEnabled )
{
pBeginCommand->AddDependency(m_depth.m_stImage.m_pSingle, DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE);
pBeginCommand->bDepthEnabled = m_bDepthEnabled;
pBeginCommand->stDepthImage = m_depth;
}
m_pCurrentMaterialBuffer->AddCommand(pBeginCommand);
CVkSetShaderCommand *pSetShader = CREATE_COMMAND(SetShader);
@@ -207,5 +225,5 @@ IVkCommandBuffer *CVkRenderCommandList::FindOrCreateMaterialCommandBuffer( IMate
m_materials.AppendTail(mat);
if (pbWasCreated)
*pbWasCreated = true;
return m_materials.GetLast().m_pCommandBuffer;
return m_materials[m_materials.GetSize()-1].m_pCommandBuffer;
}

View File

@@ -62,7 +62,11 @@ CVkImage::CVkImage( uint32_t nWidth, uint32_t nHeight, uint32_t nDepth, EImageFo
m_eMultisampleType = eMultisampleType;
m_eImageType = eImageType;
m_eFormat = eFormat;
m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
if (eFormat == IMAGE_FORMAT_D32_SFLOAT)
m_ePreferredLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
else
m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
CreateImage(nWidth, nHeight, eFormat, eMultisampleType, eUsage);
CreateImageView();
}
@@ -211,7 +215,7 @@ CVkBuffer::CVkBuffer( uint32_t nSize, VkBufferUsageFlags2 eUsage, uint32_t nAlig
CVkBuffer::~CVkBuffer()
{
vmaDestroyBuffer(s_vkAllocator, m_buffer, m_allocation);
}
@@ -233,7 +237,9 @@ void *CVkBuffer::Map()
void *pData;
pData = NULL;
vmaMapMemory(s_vkAllocator, m_allocation, &pData);
VkResult r = vmaMapMemory(s_vkAllocator, m_allocation, &pData);
VULKAN_RESULT_PRINT(r, vmaMapMemory);
return pData;
}
@@ -295,6 +301,10 @@ private:
CUtlVector<VulkanWindow_t> m_renderWindows;
CUtlVector<CVkMaterial*> m_pMaterials;
CUtlVector<CVkRenderCommandList*> m_scheduledRemovalLists;
CUtlVector<CVkBuffer*> m_scheduledRemovalBuffers;
CUtlVector<CVkImage*> m_scheduledRemovalImages;
};
EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
@@ -366,7 +376,7 @@ IImage *CVkRenderContext::CreateStorageImage( uint32_t x, uint32_t y, EImageForm
void CVkRenderContext::DestroyBuffer( IBuffer *pBuffer )
{
delete (CVkBuffer*)pBuffer;
m_scheduledRemovalBuffers.AppendTail((CVkBuffer*)pBuffer);
}
void CVkRenderContext::DestroyImage( IImage *pImage )
@@ -412,7 +422,7 @@ IRenderCommandList *CVkRenderContext::CreateCommandList()
void CVkRenderContext::DestroyCommandList( IRenderCommandList *pCommandList )
{
m_scheduledRemovalLists.AppendTail((CVkRenderCommandList*)pCommandList);
}
void CVkRenderContext::SubmitCommandList(IRenderCommandList *pList)
@@ -711,6 +721,21 @@ void CVkRenderContext::Frame( float fDeltaTime )
s.m_uCurrentFrame = (s.m_uCurrentFrame + 1) % FRAMES_IN_FLIGHT;
}
m_pCommandBufferManager->RenderingFinished();
vkDeviceWaitIdle(s_vkDevice);
for (auto &a: m_scheduledRemovalBuffers)
{
delete a;
}
for (auto &a: m_scheduledRemovalLists)
{
delete a;
}
m_scheduledRemovalLists = {};
m_scheduledRemovalBuffers = {};
m_pCommandBufferManager->FreeCommandBufferWithCommands(s_pPresentCommandBuffer);
vkDeviceWaitIdle(s_vkDevice);
}
VulkanWindow_t CVkRenderContext::CreateSwapchain( IGameWindow *pWindow )

View File

@@ -37,6 +37,11 @@ void CVkShader::AddOutputImage( int iImageIndex, EImageFormat eFormat )
void CVkShader::SetDepthImage( EImageFormat eFormat )
{
m_eDepthFormat = CVkImage::GetImageFormat(eFormat);
}
void CVkShader::DisablePixelShader( bool bDisable )
{
}
@@ -71,12 +76,11 @@ void CVkShader::Build()
VulkanInputMetaData_t *pMetaData = (VulkanInputMetaData_t*)m_shader.GetLumpPtr(m_shader.m_objects[i].m_nMetadataLump);
for ( int u = 0; u < pMetaData->nDescriptorsCount; u++ )
{
VulkanDescriptor_t *pDescriptor = (VulkanDescriptor_t*)m_shader.GetLumpPtr(pMetaData->pDescriptorSets);
V_printf("%s\n" ,pDescriptor->szName);
VulkanDescriptor_t stDescriptor = ((VulkanDescriptor_t*)m_shader.GetLumpPtr(pMetaData->pDescriptorSets))[u];
bool bFound = false;
for ( auto &b: bindings )
{
if (b.binding != pDescriptor->uBinding)
if (b.binding != stDescriptor.uBinding)
continue;
bFound = true;
break;
@@ -84,12 +88,12 @@ void CVkShader::Build()
if (bFound)
break;
VkDescriptorSetLayoutBinding bind = {};
bind.binding = pDescriptor->uBinding;
bind.binding = stDescriptor.uBinding;
bind.descriptorCount = 1;
bind.descriptorType = pDescriptor->eDescriptorType;
bind.descriptorType = stDescriptor.eDescriptorType;
bind.stageFlags = VK_SHADER_STAGE_ALL;
bindings.AppendTail(bind);
m_bindings.AppendTail(*pDescriptor);
m_bindings.AppendTail(stDescriptor);
}
modules[i].sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
modules[i].pCode = (uint32_t*)m_shader.GetLumpPtr(m_shader.m_objects[i].m_nDataLump);
@@ -146,6 +150,13 @@ void CVkShader::Build()
render.pColorAttachmentFormats = m_eFormats.GetData();
depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
if (m_eDepthFormat == VK_FORMAT_D32_SFLOAT)
{
depthStencil.depthTestEnable = VK_TRUE;
depthStencil.depthWriteEnable = VK_TRUE;
depthStencil.depthCompareOp = VK_COMPARE_OP_LESS;
render.depthAttachmentFormat = m_eDepthFormat;
}
for ( auto e: m_eFormats )
{
@@ -159,10 +170,6 @@ void CVkShader::Build()
blend.attachmentCount = attachments.GetSize();
blend.pAttachments = attachments.GetData();
render.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO;
render.colorAttachmentCount = m_eFormats.GetSize();
render.pColorAttachmentFormats = m_eFormats.GetData();
createInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
createInfo.stageCount = stages.GetSize();
createInfo.pStages = stages.GetData();

View File

@@ -18,7 +18,9 @@ VkAccessFlags2 VulkanGetAccessFlags( EDependencyMode eMode )
{
switch (eMode)
{
case DEPENDENCY_MODE_JUST_CREATED: return VK_ACCESS_2_NONE;
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR;
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_ACCESS_2_TRANSFER_WRITE_BIT;
case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_ACCESS_2_NONE;
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION: return VK_ACCESS_2_TRANSFER_WRITE_BIT;
@@ -32,7 +34,9 @@ VkPipelineStageFlags2 VulkanGetStageFlags( EDependencyMode eMode )
{
switch (eMode)
{
case DEPENDENCY_MODE_JUST_CREATED: return VK_PIPELINE_STAGE_2_NONE;
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT;
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT;
case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_PIPELINE_STAGE_2_TRANSFER_BIT;
case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT;
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION:
@@ -47,7 +51,9 @@ VkImageLayout VulkanGetImageLayout( EDependencyMode eMode )
{
switch (eMode)
{
case DEPENDENCY_MODE_JUST_CREATED: return VK_IMAGE_LAYOUT_UNDEFINED;
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION: return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;

View File

@@ -42,6 +42,7 @@ enum EVulkanCommandParameterType
enum EDependencyMode
{
DEPENDENCY_MODE_JUST_CREATED,
DEPENDENCY_MODE_SHADER_IMAGE_READ,
DEPENDENCY_MODE_SHADER_BUFFER_READ,
@@ -52,6 +53,7 @@ enum EDependencyMode
DEPENDENCY_MODE_DRAWCALL_VERTEX_BUFFER,
DEPENDENCY_MODE_DRAWCALL_INDEX_BUFFER,
DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE,
DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE,
DEPENDENCY_MODE_DRAWCALL_INPUT_IMAGE,
DEPENDENCY_MODE_DRAWCALL_MIXED_IMAGE,
@@ -96,6 +98,7 @@ abstract_class CVkCommand
{
public:
virtual void Execute( VkCommandBuffer hCommandBuffer, int iCurrentFrame ) = 0;
virtual ~CVkCommand() = default;
//virtual const char *GetName();
CUtlVector<VulkanCommandDepenency_t> m_dependencies = {};
@@ -127,6 +130,7 @@ public:
virtual IVkCommandBuffer *CreateCommandBuffer() = 0;
virtual CVkCommand *CreateCommand( const char *szName ) = 0;
virtual CUtlVector<VkCommandBuffer> &GetVulkanCommands() = 0;
virtual void FreeCommandBufferWithCommands(IVkCommandBuffer* pCommandBuffer) = 0;
virtual void RenderingFinished() = 0;
};
#define VULKAN_COMMAND_BUFFER_MANAGER_INTERFACE_NAME "VulkanCommandBufferManager"
@@ -194,7 +198,7 @@ public:
VkImageLayout m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
VkImageLayout m_eImageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
EDependencyMode m_eLastUsage;
EDependencyMode m_eLastUsage = DEPENDENCY_MODE_JUST_CREATED;
};
class CVkBuffer: public IBuffer
@@ -261,6 +265,7 @@ public:
virtual void SetTopology( ETopologyMode eTopology ) override;
virtual void AddOutputImage( int iImageIndex, EImageFormat eFormat ) override;
virtual void SetDepthImage( EImageFormat eFormat ) override;
virtual void DisablePixelShader( bool bDisable) override;
virtual void Build() override;
VkPipeline m_hPipeline = NULL;
@@ -274,6 +279,8 @@ private:
CUtlVector<VkVertexInputBindingDescription> m_layouts;
CUtlVector<VkVertexInputAttributeDescription> m_attributes;
CUtlVector<VkFormat> m_eFormats;
VkFormat m_eDepthFormat;
bool m_bIsFragmentEnabled;
};
@@ -347,6 +354,7 @@ struct VulkanRenderOutput_t {
class CVkRenderCommandList: public IRenderCommandList
{
public:
~CVkRenderCommandList();
virtual void ResetRendering() override;
virtual void SetRenderTarget( uint32_t uIndex, IImage *pImage ) override;
@@ -381,10 +389,11 @@ private:
VulkanRenderOutput_t *FindOrCreateRenderOutput( uint32_t uIndex );
IVkCommandBuffer *FindOrCreateMaterialCommandBuffer( IMaterial *pMaterial, bool *pbWasCreated = NULL );
VulkanRenderOutput_t m_depth;
bool m_bDepthEnabled = false;
VulkanRenderOutput_t m_depth = {};
CUtlVector<VulkanRenderOutput_t> m_pOutput = {};
CUtlSelfReferencingVector<VulkanMaterialCommandBuffer_t> m_materials = {};
CUtlVector<VulkanMaterialCommandBuffer_t> m_materials = {};
IVkCommandBuffer *m_pPostRaster;
IVkCommandBuffer *m_pCurrentMaterialBuffer = NULL;