improvements
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user