improvements

This commit is contained in:
2025-12-14 22:46:45 +02:00
parent 860ec0c422
commit 5d4c587bf2
5 changed files with 81 additions and 33 deletions

View File

@@ -1,3 +1,4 @@
#include "materialsystem/imaterialsystem.h"
#include "tier0/platform.h"
#include "tier1/interface.h"
#include "tier1/utlvector.h"
@@ -14,8 +15,13 @@ public:
virtual void Submit( int iFrameIndex ) override;
virtual void Render() override;
private:
CUtlSelfReferencingVector<CVkCommand*> g_commands;
void SortDependencies();
void TryBarrier();
VulkanCommandDepenency_t *FindLastObjectDependency( IRenderingObject *pObject );
CUtlSelfReferencingVector<CVkCommand*> m_commands;
CUtlVector<VkCommandBuffer> m_hBuffers = NULL;
CUtlVector<VulkanCommandDepenency_t> m_usedDependencies;
};
void CVkCommandBuffer::Reset()
@@ -36,12 +42,12 @@ void CVkCommandBuffer::Reset()
i++;
}
g_commands = {};
m_commands = {};
}
void CVkCommandBuffer::AddCommand( CVkCommand *pCommand )
{
g_commands.AppendTail(pCommand);
m_commands.AppendTail(pCommand);
}
void CVkCommandBuffer::Submit( int iFrameIndex )
@@ -49,38 +55,68 @@ void CVkCommandBuffer::Submit( int iFrameIndex )
g_vkCommandBuffers.AppendTail(m_hBuffers[iFrameIndex]);
};
struct VulkanBarrierObjects_t
{
VulkanCommandDepenency_t m_dependency;
};
void CVkCommandBuffer::Render()
{
uint32_t nNumDependencies;
int i = 0;
nNumDependencies = 0;
for (auto pCommand: g_commands)
{
nNumDependencies += pCommand->m_depedencies.GetSize();
}
// issue vkCmdPipelineBarrier if there are any
if (nNumDependencies)
{
}
for (auto hBuffer: m_hBuffers)
{
VkCommandBufferBeginInfo stCommandBufferBeginInfo = {};
stCommandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
vkBeginCommandBuffer(hBuffer, &stCommandBufferBeginInfo);
for (auto &pCommand: g_commands)
for (auto &pCommand: m_commands)
{
pCommand->Execute(hBuffer);
TryBarrier();
pCommand->Execute(hBuffer, i);
};
vkEndCommandBuffer(hBuffer);
i++;
}
}
struct VulkanCommandBarrier_t
{
EDependencyMode m_eOldDependency;
EDependencyMode m_eNewDependency;
IRenderingObject *m_pObject;
};
void CVkCommandBuffer::SortDependencies()
{
}
void CVkCommandBuffer::TryBarrier()
{
CUtlVector<VulkanCommandBarrier_t> barriers;
for (auto &pCommand: m_commands)
{
for ( auto dependency: pCommand->m_depedencies)
{
VulkanCommandDepenency_t *pLastDependency = FindLastObjectDependency(dependency.m_pObject);
}
}
};
VulkanCommandDepenency_t *CVkCommandBuffer::FindLastObjectDependency( IRenderingObject *pObject )
{
VulkanCommandDepenency_t *pDependency = NULL;
for ( auto &dependency: m_usedDependencies )
{
if ( dependency.m_pObject == pObject )
pDependency = &dependency;
}
return pDependency;
}
class CVkCommandBufferManager: public IVkCommandBufferManager
{
public: