reworked begin and end

This commit is contained in:
2026-08-27 20:00:21 +03:00
parent a6818a6cf4
commit aaf298d8cc
10 changed files with 181 additions and 283 deletions
-1
View File
@@ -17,7 +17,6 @@ private:
CUtlVector<CVkCommand*> m_commands;
VkCommandBuffer m_hBuffer = NULL;
VkDevice m_hDevice;
IVkCommandBufferManager *m_pMgr;
VkCommandPool m_hPool = NULL;
+4
View File
@@ -321,6 +321,8 @@ static VkAccessFlags2 GetAccessSrc( uint32_t hazard, EStageHazard stage )
}
if (hazard == 0)
f |= VK_ACCESS_2_MEMORY_READ_BIT | VK_ACCESS_2_MEMORY_WRITE_BIT;
if (stage == STAGE_HAZARD_COMPUTE)
f |= VK_ACCESS_2_SHADER_STORAGE_READ_BIT | VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT;
return f;
}
@@ -337,6 +339,8 @@ static VkAccessFlags2 GetAccessDst( uint32_t hazard, EStageHazard stage )
f |= VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT;
if (hazard == 0)
f |= VK_ACCESS_2_MEMORY_READ_BIT | VK_ACCESS_2_MEMORY_WRITE_BIT;
if (stage == STAGE_HAZARD_COMPUTE)
f |= VK_ACCESS_2_SHADER_STORAGE_READ_BIT | VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT;
return f;
}
static VkImageLayout GetLayout( EImageLayoutHazard hazard )
+70 -211
View File
@@ -3,84 +3,77 @@
CVkRenderCommandList::~CVkRenderCommandList()
{
ResetRendering();
m_pCommandBufferManager->FreeCommandBufferWithCommands(m_pCommandBuffer);
}
void CVkRenderCommandList::ResetRendering()
{
for ( auto m: m_pCommandBuffers )
m_pCommandBuffer->Reset();
}
void CVkRenderCommandList::Begin( BeginInfo *pBegin )
{
CUtlVector<VulkanRenderOutput_t> images = {};
images.Reserve(pBegin->uRenderImageCount);
CVkBeginCommand *pBeginCommand = CREATE_COMMAND(m_pCommandBufferManager, Begin);
pBeginCommand->nResolutionX = pBegin->uWidth;
pBeginCommand->nResolutionY = pBegin->uHeight;
for (uint32_t i = 0; i < pBegin->uRenderImageCount; i++)
{
m_pCommandBufferManager->FreeCommandBufferWithCommands(m);
RenderImage *renderImage = &pBegin->pRenderImages[i];
VulkanRenderOutput_t output = {};
output.m_stImage.m_pSingle = renderImage->pImage;
output.m_fClearColor[0] = renderImage->clear_color.r;
output.m_fClearColor[1] = renderImage->clear_color.g;
output.m_fClearColor[2] = renderImage->clear_color.b;
output.m_fClearColor[3] = renderImage->clear_color.a;
output.m_eLoadMode = renderImage->eLoadMode;
output.m_eStoreMode = renderImage->eStoreMode;
images.AppendTail(output);
}
m_pPostRaster = NULL;
m_materials = {};
m_pCommandBuffers = {};
}
void CVkRenderCommandList::SetRenderTarget( uint32_t uIndex, IImage *pImage )
{
SwitchRenderingStage(RENDERING_STAGE_SETUP_RASTER);
VulkanRenderOutput_t *pOutput = FindOrCreateRenderOutput(uIndex);
pOutput->m_stImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
pOutput->m_stImage.m_pSingle = pImage;
}
void CVkRenderCommandList::SetClearColor( uint32_t uIndex, float r, float g, float b, float a )
{
SwitchRenderingStage(RENDERING_STAGE_SETUP_RASTER);
VulkanRenderOutput_t *pOutput = FindOrCreateRenderOutput(uIndex);
pOutput->m_fClearColor[0] = r;
pOutput->m_fClearColor[1] = g;
pOutput->m_fClearColor[2] = b;
pOutput->m_fClearColor[3] = a;
}
void CVkRenderCommandList::SetLoadStoreModes( uint32_t uIndex, ELoadMode eLoadMode, EStoreMode eStoreMode )
{
SwitchRenderingStage(RENDERING_STAGE_SETUP_RASTER);
VulkanRenderOutput_t *pOutput = FindOrCreateRenderOutput(uIndex);
pOutput->m_eLoadMode = eLoadMode;
pOutput->m_eStoreMode = eStoreMode;
}
void CVkRenderCommandList::SetDepthTarget( IImage *pDepth )
{
SwitchRenderingStage(RENDERING_STAGE_SETUP_RASTER);
if (pDepth)
pBeginCommand->images = images;
if ( pBegin->pDepth )
{
m_bDepthEnabled = true;
m_depth.m_stImage.m_pSingle = pDepth;
VulkanRenderOutput_t output = {};
output.m_stImage.m_pSingle = pBegin->pDepth->pImage;
output.m_fClearDepth = pBegin->pDepth->clear_color.depth;
output.m_eLoadMode = pBegin->pDepth->eLoadMode;
output.m_eStoreMode = pBegin->pDepth->eStoreMode;
pBeginCommand->stDepthImage = output;
}
else
{
m_bDepthEnabled = false;
}
m_pCurrentBegin = pBeginCommand;
m_pCommandBuffer->AddCommand(pBeginCommand);
}
void CVkRenderCommandList::SetClearDepth( float fVal)
void CVkRenderCommandList::End()
{
SwitchRenderingStage(RENDERING_STAGE_SETUP_RASTER);
m_depth.m_fClearDepth = fVal;
CVkEndCommand *pEndCommand = CREATE_COMMAND(m_pCommandBufferManager, End);
pEndCommand->pBeginCommand = (CVkBeginCommand*)m_pCurrentBegin;
m_pCommandBuffer->AddCommand(pEndCommand);
}
void CVkRenderCommandList::SetRenderResolution( uint32_t iWidth, uint32_t iHeight )
{
SwitchRenderingStage(RENDERING_STAGE_SETUP_RASTER);
m_uWidth = iWidth;
m_uHeight = iHeight;
}
void CVkRenderCommandList::SetScissors( uint32_t uX, uint32_t uY, uint32_t uWidth, uint32_t uHeight )
{
SwitchRenderingStage(RENDERING_STAGE_RASTER);
CVkSetScissorsCommand *pScissorsCommand = CREATE_COMMAND(m_pCommandBufferManager, SetScissors);
pScissorsCommand->uWidth = uWidth;
pScissorsCommand->uHeight = uHeight;
pScissorsCommand->iX = uX;
pScissorsCommand->iY = uY;
m_pCommandBuffer->AddCommand(pScissorsCommand);
}
void CVkRenderCommandList::SetViewport( uint32_t uX, uint32_t uY, uint32_t uWidth, uint32_t uHeight, float fMinDepth, float fMaxDepth )
{
SwitchRenderingStage(RENDERING_STAGE_RASTER);
CVkSetViewportCommand *pViewportCommand = CREATE_COMMAND(m_pCommandBufferManager, SetViewport);
pViewportCommand->fX = uX;
pViewportCommand->fY = uY;
pViewportCommand->fWidth = uWidth;
pViewportCommand->fHeight = uHeight;
pViewportCommand->fDepthMin = fMinDepth;
pViewportCommand->fDepthMax = fMaxDepth;
m_pCommandBuffer->AddCommand(pViewportCommand);
}
@@ -90,108 +83,51 @@ void CVkRenderCommandList::SetViewport( uint32_t uX, uint32_t uY, uint32_t uWidt
void CVkRenderCommandList::SetMaterial( IMaterial *pMaterial )
{
CVkMaterial *pVkMat = (CVkMaterial*)pMaterial;
CVkComputeShader *pCS = dynamic_cast<CVkComputeShader*>(pVkMat->m_pShader);
if (pCS)
{
SwitchRenderingStage(RENDERING_STAGE_POST_RASTER);
CVkSetShaderCommand *pSetShader = CREATE_COMMAND(m_pCommandBufferManager, SetShader);
pSetShader->pShader = pVkMat->m_pShader;
m_pCommandBuffer->AddCommand(pSetShader);
CVkSetShaderCommand *pSetShader = CREATE_COMMAND(m_pCommandBufferManager, SetShader);
pSetShader->pShader = pCS;
m_pPostRaster->AddCommand(pSetShader);
CVkSetShaderDataCommand *pSetShaderData = CREATE_COMMAND(m_pCommandBufferManager, SetShaderData);
pSetShaderData->pShaderData = pMaterial;
m_pPostRaster->AddCommand(pSetShaderData);
}
else
{
SwitchRenderingStage(RENDERING_STAGE_SETUP_RASTER);
bool bWasCreated = false;
m_pCurrentMaterialBuffer = FindOrCreateMaterialCommandBuffer(pMaterial, &bWasCreated);
if (bWasCreated)
{
m_pCurrentMaterialBuffer->Reset();
CVkBeginCommand *pBeginCommand = CREATE_COMMAND(m_pCommandBufferManager, Begin);
pBeginCommand->images = m_pOutput;
pBeginCommand->nResolutionX = m_uWidth;
pBeginCommand->nResolutionY = m_uHeight;
if ( m_bDepthEnabled )
{
pBeginCommand->bDepthEnabled = m_bDepthEnabled;
pBeginCommand->stDepthImage = m_depth;
}
m_materials[m_materials.GetSize()-1].m_pBeginCommand = pBeginCommand;
m_pCurrentMaterialBuffer->AddCommand(pBeginCommand);
CVkSetShaderCommand *pSetShader = CREATE_COMMAND(m_pCommandBufferManager, SetShader);
pSetShader->pShader = ((CVkMaterial*)pMaterial)->m_pShader;
m_pCurrentMaterialBuffer->AddCommand(pSetShader);
CVkSetShaderDataCommand *pSetShaderData = CREATE_COMMAND(m_pCommandBufferManager, SetShaderData);
pSetShaderData->pShaderData = pMaterial;
m_pCurrentMaterialBuffer->AddCommand(pSetShaderData);
CVkSetScissorsCommand *pScissorsCommand = CREATE_COMMAND(m_pCommandBufferManager, SetScissors);
pScissorsCommand->uWidth = m_uWidth;
pScissorsCommand->uHeight = m_uHeight;
m_pCurrentMaterialBuffer->AddCommand(pScissorsCommand);
CVkSetViewportCommand *pViewportCommand = CREATE_COMMAND(m_pCommandBufferManager, SetViewport);
pViewportCommand->fX = 0;
pViewportCommand->fY = 0;
pViewportCommand->fWidth = m_uWidth;
pViewportCommand->fHeight = m_uHeight;
pViewportCommand->fDepthMin = 0;
pViewportCommand->fDepthMax = 1;
m_pCurrentMaterialBuffer->AddCommand(pViewportCommand);
}
}
CVkSetShaderDataCommand *pSetShaderData = CREATE_COMMAND(m_pCommandBufferManager, SetShaderData);
pSetShaderData->pShaderData = pMaterial;
m_pCommandBuffer->AddCommand(pSetShaderData);
}
void CVkRenderCommandList::SetVertexBuffer( uint32_t uBinding, IVertexBuffer *pBuffer )
{
SwitchRenderingStage(RENDERING_STAGE_RASTER);
CVkSetVertexBufferCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, SetVertexBuffer);
pCmd->uBinding = uBinding;
pCmd->pBuffer = pBuffer;
m_pCurrentMaterialBuffer->AddCommand(pCmd);
m_pCommandBuffer->AddCommand(pCmd);
}
void CVkRenderCommandList::SetIndexBuffer( IVertexBuffer *pBuffer )
{
SwitchRenderingStage(RENDERING_STAGE_RASTER);
}
void CVkRenderCommandList::DrawPrimitives( uint32_t nVertexCount, uint32_t nFirstVertex, uint32_t nInstanceCount, uint32_t nFirstInstance )
{
SwitchRenderingStage(RENDERING_STAGE_RASTER);
CVkDrawPrimitivesCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, DrawPrimitives);
pCmd->nVertexCount = nVertexCount;
pCmd->nFirstVertex = nFirstVertex;
pCmd->nInstanceCount = nInstanceCount;
pCmd->nFirstInstance = nFirstInstance;
m_pCurrentMaterialBuffer->AddCommand(pCmd);
m_pCommandBuffer->AddCommand(pCmd);
}
void CVkRenderCommandList::DrawPrimitivesIndexed( uint32_t nIndexCount, uint32_t nFirstIndex, uint32_t nVertexOffset, uint32_t nInstanceCount, uint32_t nFirstInstance )
{
SwitchRenderingStage(RENDERING_STAGE_RASTER);
}
void CVkRenderCommandList::CopyImageToImage( IImage *pSrc, IImage *pDst )
{
SwitchRenderingStage(RENDERING_STAGE_POST_RASTER);
}
void CVkRenderCommandList::BlitImageToImage( IImage *pSrc, ImageSector_t src, IImage *pDst, ImageSector_t dst )
{
SwitchRenderingStage(RENDERING_STAGE_POST_RASTER);
CVkBlitCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, Blit);
pCmd->stInputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
pCmd->stInputImage.m_pSingle = pSrc;
@@ -209,13 +145,12 @@ void CVkRenderCommandList::BlitImageToImage( IImage *pSrc, ImageSector_t src, II
pCmd->iDstMax[0] = dst.m_iWidth;
pCmd->iDstMax[1] = dst.m_iHeight;
pCmd->iDstMax[2] = 1;
m_pPostRaster->AddCommand(pCmd);
m_pCommandBuffer->AddCommand(pCmd);
}
void CVkRenderCommandList::ClearImage( IImage *pImage, float fR, float fG, float fB, float fA )
{
SwitchRenderingStage(RENDERING_STAGE_POST_RASTER);
CVkClearColorCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, ClearColor);
pCmd->r = fR;
pCmd->g = fG;
@@ -223,7 +158,7 @@ void CVkRenderCommandList::ClearImage( IImage *pImage, float fR, float fG, float
pCmd->a = fA;
pCmd->stImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
pCmd->stImage.m_pSingle = pImage;
m_pPostRaster->AddCommand(pCmd);
m_pCommandBuffer->AddCommand(pCmd);
}
@@ -234,40 +169,37 @@ void CVkRenderCommandList::ClearDepth( IImage *pImage, float fVal )
void CVkRenderCommandList::ResolveImage( IImage *pOriginal, IImage *pResolved )
{
SwitchRenderingStage(RENDERING_STAGE_POST_RASTER);
CVkResolveImageCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, ResolveImage);
pCmd->stInputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
pCmd->stInputImage.m_pSingle = pOriginal;
pCmd->stOutputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
pCmd->stOutputImage.m_pSingle = pResolved;
m_pPostRaster->AddCommand(pCmd);
m_pCommandBuffer->AddCommand(pCmd);
}
void CVkRenderCommandList::StartRecording()
{
ResetRendering();
m_pCommandBuffer = m_pCommandBufferManager->CreateCommandBuffer();
m_pCommandBuffer->Reset();
}
void CVkRenderCommandList::EndRecording()
{
SwitchRenderingStage(RENDERING_STAGE_FINISHED);
m_pCommandBuffer->Render();
}
void CVkRenderCommandList::Barrier( EStageHazard eBefore, EStageHazard eAfter, uint32_t hazard )
{
SwitchRenderingStage(RENDERING_STAGE_POST_RASTER);
CVkBarrierCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, Barrier);
pCmd->eStageIn = eBefore;
pCmd->eStageOut = eAfter;
pCmd->eHazard = hazard;
m_pPostRaster->AddCommand(pCmd);
m_pCommandBuffer->AddCommand(pCmd);
}
void CVkRenderCommandList::BarrierTransition( IImage *pObject, EImageLayoutHazard old_layout, EImageLayoutHazard layout, EStageHazard eBefore, EStageHazard eAfter, uint32_t hazard )
{
SwitchRenderingStage(RENDERING_STAGE_POST_RASTER);
CVkLayoutBarrierCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, LayoutBarrier);
pCmd->eStageIn = eBefore;
pCmd->eStageOut = eAfter;
@@ -275,95 +207,22 @@ void CVkRenderCommandList::BarrierTransition( IImage *pObject, EImageLayoutHazar
pCmd->pImage = pObject;
pCmd->eLayoutIn = old_layout;
pCmd->eLayoutOut = layout;
m_pPostRaster->AddCommand(pCmd);
m_pCommandBuffer->AddCommand(pCmd);
}
void CVkRenderCommandList::DispatchCompute( uint32_t uX, uint32_t uY, uint32_t uZ )
{
SwitchRenderingStage(RENDERING_STAGE_POST_RASTER);
CVkDispatchCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, Dispatch);
pCmd->uX = uX;
pCmd->uY = uY;
pCmd->uZ = uZ;
m_pPostRaster->AddCommand(pCmd);
m_pCommandBuffer->AddCommand(pCmd);
}
void CVkRenderCommandList::Submit()
{
for ( auto m: m_pCommandBuffers)
{
m->Submit();
}
}
void CVkRenderCommandList::SwitchRenderingStage( EVulkanRenderingStage eStage )
{
if (eStage != RENDERING_STAGE_RASTER)
{
for ( auto m: m_materials)
{
CVkEndCommand *pEndCommand = CREATE_COMMAND(m_pCommandBufferManager, End);
m.m_pCommandBuffer->AddCommand(pEndCommand);
m.m_pCommandBuffer->Render();
m_pCommandBuffers.AppendTail(m.m_pCommandBuffer);
}
m_materials = {};
};
if (eStage == RENDERING_STAGE_POST_RASTER )
{
if (m_eCurrentStage != RENDERING_STAGE_POST_RASTER)
{
m_pPostRaster = m_pCommandBufferManager->CreateCommandBuffer();
m_pPostRaster->Reset();
}
}
else
{
if (m_pPostRaster)
{
m_pPostRaster->Render();
m_pCommandBuffers.AppendTail(m_pPostRaster);
m_pPostRaster = NULL;
}
}
m_eCurrentStage = eStage;
}
VulkanRenderOutput_t *CVkRenderCommandList::FindOrCreateRenderOutput( uint32_t uIndex )
{
for ( auto &v: m_pOutput )
{
if (v.m_uIndex == uIndex)
return &v;
}
VulkanRenderOutput_t output = {};
output.m_uIndex = uIndex;
m_pOutput.AppendTail(output);
return &m_pOutput[m_pOutput.GetSize()-1];
}
IVkCommandBuffer *CVkRenderCommandList::FindOrCreateMaterialCommandBuffer( IMaterial *pMaterial, bool *pbWasCreated )
{
for (auto &m: m_materials)
{
if (m.m_pMaterial == pMaterial)
{
if (pbWasCreated)
*pbWasCreated = false;
return m.m_pCommandBuffer;
}
}
VulkanMaterialCommandBuffer_t mat;
mat.m_pCommandBuffer = m_pCommandBufferManager->CreateCommandBuffer();
mat.m_pMaterial = pMaterial;
m_materials.AppendTail(mat);
if (pbWasCreated)
*pbWasCreated = true;
return m_materials[m_materials.GetSize()-1].m_pCommandBuffer;
m_pCommandBuffer->Submit();
}
+3 -5
View File
@@ -81,10 +81,8 @@ void CVkShader::Build()
VkPipelineRenderingCreateInfo render = {};
CUtlVector<VkPipelineColorBlendAttachmentState> attachments = {};
VkDynamicState dynamicStates[] = {
VK_DYNAMIC_STATE_VIEWPORT,
VK_DYNAMIC_STATE_SCISSOR,
VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT,
VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT,
vkCmdSetViewportWithCount ? VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT : VK_DYNAMIC_STATE_VIEWPORT,
vkCmdSetScissorWithCount ? VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT : VK_DYNAMIC_STATE_SCISSOR,
};
VkPipelineLayoutCreateInfo stPipelineLayout = {};
CUtlVector<CUtlVector<VkDescriptorSetLayoutBinding>> bindings = {};
@@ -170,7 +168,7 @@ void CVkShader::Build()
inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
dynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
dynamicState.dynamicStateCount = 2;
dynamicState.dynamicStateCount = sizeof(dynamicStates)/(sizeof(*dynamicStates));
dynamicState.pDynamicStates = dynamicStates;
rasterState.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
+4 -29
View File
@@ -427,16 +427,9 @@ public:
~CVkRenderCommandList();
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 SetLoadStoreModes( uint32_t uIndex, ELoadMode eLoadMode, EStoreMode eStoreMode ) override;
virtual void Begin( BeginInfo *pBegin ) override;
virtual void End() 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;
@@ -464,26 +457,8 @@ public:
IVkCommandBufferManager *m_pCommandBufferManager;
private:
void SwitchRenderingStage( EVulkanRenderingStage eStage );
VulkanRenderOutput_t *FindOrCreateRenderOutput( uint32_t uIndex );
IVkCommandBuffer *FindOrCreateMaterialCommandBuffer( IMaterial *pMaterial, bool *pbWasCreated = NULL );
bool m_bDepthEnabled = false;
VulkanRenderOutput_t m_depth = {};
CUtlVector<VulkanRenderOutput_t> m_pOutput = {};
CUtlVector<VulkanMaterialCommandBuffer_t> m_materials = {};
IVkCommandBuffer *m_pPostRaster = NULL;
IVkCommandBuffer *m_pCurrentMaterialBuffer = NULL;
uint32_t m_uWidth;
uint32_t m_uHeight;
CUtlVector<IVkCommandBuffer*> m_pCommandBuffers = {};
CUtlVector<IVkCommandBuffer*> m_pScheduledDestroyPostRaster = {};
EVulkanRenderingStage m_eCurrentStage = RENDERING_STAGE_SETUP_RASTER;
IVkCommandBuffer *m_pCommandBuffer = NULL;
CVkCommand *m_pCurrentBegin = NULL;
};