added barriers, started working on libraries
This commit is contained in:
@@ -7,6 +7,20 @@
|
||||
CUtlVector<VkCommandBuffer> g_vkCommandBuffers;
|
||||
IVkCommandBufferManager *g_pCommandBufferManager;
|
||||
|
||||
struct VulkanCommandLastUsage_t
|
||||
{
|
||||
uint32_t m_nLastUsedCommand;
|
||||
EDependencyMode m_eLastUsage;
|
||||
VulkanCommandDepenency_t m_dependency;
|
||||
};
|
||||
|
||||
struct VulkanSwapchainCommandLastUsage_t
|
||||
{
|
||||
uint32_t m_nLastUsedCommand;
|
||||
EDependencyMode m_eLastUsage;
|
||||
VulkanCommandSwapchainDepenency_t m_dependency;
|
||||
};
|
||||
|
||||
class CVkCommandBuffer: public IVkCommandBuffer
|
||||
{
|
||||
public:
|
||||
@@ -16,12 +30,15 @@ public:
|
||||
virtual void Render() override;
|
||||
private:
|
||||
void SortDependencies();
|
||||
void TryBarrier();
|
||||
void TryBarrier( int iCurrent, int iCurrentBuffer );
|
||||
VulkanCommandDepenency_t *FindLastObjectDependency( IRenderingObject *pObject );
|
||||
|
||||
CUtlSelfReferencingVector<CVkCommand*> m_commands;
|
||||
CUtlVector<CVkCommand*> m_commands;
|
||||
CUtlVector<VkCommandBuffer> m_hBuffers = NULL;
|
||||
CUtlVector<VulkanCommandDepenency_t> m_usedDependencies;
|
||||
CUtlVector<VulkanCommandLastUsage_t> m_usedDependencies;
|
||||
CUtlVector<CUtlVector<VulkanCommandLastUsage_t>> m_dependencies;
|
||||
CUtlVector<VulkanSwapchainCommandLastUsage_t> m_usedSwapchainDependencies;
|
||||
CUtlVector<CUtlVector<VulkanSwapchainCommandLastUsage_t>> m_swapchainDependencies;
|
||||
};
|
||||
|
||||
void CVkCommandBuffer::Reset()
|
||||
@@ -65,17 +82,22 @@ void CVkCommandBuffer::Render()
|
||||
|
||||
uint32_t nNumDependencies;
|
||||
int i = 0;
|
||||
int y = 0;
|
||||
|
||||
SortDependencies();
|
||||
|
||||
for (auto hBuffer: m_hBuffers)
|
||||
{
|
||||
y = 0;
|
||||
VkCommandBufferBeginInfo stCommandBufferBeginInfo = {};
|
||||
stCommandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
||||
vkBeginCommandBuffer(hBuffer, &stCommandBufferBeginInfo);
|
||||
|
||||
for (auto &pCommand: m_commands)
|
||||
{
|
||||
TryBarrier();
|
||||
TryBarrier(y,i);
|
||||
pCommand->Execute(hBuffer, i);
|
||||
y++;
|
||||
};
|
||||
vkEndCommandBuffer(hBuffer);
|
||||
|
||||
@@ -89,33 +111,161 @@ struct VulkanCommandBarrier_t
|
||||
EDependencyMode m_eNewDependency;
|
||||
IRenderingObject *m_pObject;
|
||||
};
|
||||
|
||||
void CVkCommandBuffer::SortDependencies()
|
||||
{
|
||||
m_dependencies = {};
|
||||
m_swapchainDependencies = {};
|
||||
m_dependencies.Resize(m_commands.GetSize());
|
||||
m_swapchainDependencies.Resize(m_commands.GetSize());
|
||||
m_usedDependencies = {};
|
||||
m_usedSwapchainDependencies = {};
|
||||
|
||||
int i = 0;
|
||||
for ( auto dependency: m_dependencies)
|
||||
{
|
||||
dependency = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CVkCommandBuffer::TryBarrier()
|
||||
{
|
||||
CUtlVector<VulkanCommandBarrier_t> barriers;
|
||||
for (auto &pCommand: m_commands)
|
||||
{
|
||||
for ( auto dependency: pCommand->m_depedencies)
|
||||
for ( auto dependency: pCommand->m_dependencies)
|
||||
{
|
||||
VulkanCommandLastUsage_t *pLastUsage = NULL;
|
||||
|
||||
for ( auto &dep: m_usedDependencies )
|
||||
{
|
||||
if (dep.m_dependency.m_pObject == dependency.m_pObject)
|
||||
pLastUsage = &dep;
|
||||
}
|
||||
|
||||
VulkanCommandLastUsage_t stLastUsage = {};
|
||||
stLastUsage.m_nLastUsedCommand = i;
|
||||
stLastUsage.m_dependency = dependency;
|
||||
stLastUsage.m_eLastUsage = DEPENDENCY_MODE_FROM_PREVIOUS;
|
||||
|
||||
if (pLastUsage)
|
||||
stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode;
|
||||
|
||||
if (pLastUsage)
|
||||
m_dependencies[pLastUsage->m_nLastUsedCommand+1].AppendTail(stLastUsage);
|
||||
else
|
||||
m_dependencies[0].AppendTail(stLastUsage);
|
||||
|
||||
m_usedDependencies.AppendTail(stLastUsage);
|
||||
}
|
||||
for ( auto dependency: pCommand->m_swapchainDependencies)
|
||||
{
|
||||
VulkanSwapchainCommandLastUsage_t *pLastUsage = NULL;
|
||||
|
||||
for ( auto &dep: m_usedSwapchainDependencies )
|
||||
{
|
||||
if (dep.m_dependency.m_ppObjects == dependency.m_ppObjects)
|
||||
pLastUsage = &dep;
|
||||
}
|
||||
|
||||
VulkanSwapchainCommandLastUsage_t stLastUsage = {};
|
||||
stLastUsage.m_nLastUsedCommand = i;
|
||||
stLastUsage.m_dependency = dependency;
|
||||
stLastUsage.m_eLastUsage = DEPENDENCY_MODE_FROM_PREVIOUS;
|
||||
|
||||
if (pLastUsage)
|
||||
stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode;
|
||||
|
||||
if (pLastUsage)
|
||||
m_swapchainDependencies[pLastUsage->m_nLastUsedCommand+1].AppendTail(stLastUsage);
|
||||
else
|
||||
m_swapchainDependencies[0].AppendTail(stLastUsage);
|
||||
|
||||
m_usedSwapchainDependencies.AppendTail(stLastUsage);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CVkCommandBuffer::TryBarrier( int iCurrent, int iCurrentBuffer )
|
||||
{
|
||||
int x = 0;
|
||||
CUtlVector<VulkanCommandLastUsage_t> dependency = m_dependencies[iCurrent];
|
||||
CUtlVector<VulkanSwapchainCommandLastUsage_t> swapchainDependency = m_swapchainDependencies[iCurrent];
|
||||
CUtlVector<VulkanCommandBarrier_t> barriers;
|
||||
|
||||
VkDependencyInfo stDependencyInfo = {};
|
||||
stDependencyInfo.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
|
||||
CUtlVector<VkMemoryBarrier2> memoryBarriers = {};
|
||||
CUtlVector<VkImageMemoryBarrier2> imageBarriers = {};
|
||||
CUtlVector<VkBufferMemoryBarrier2> bufferBarriers = {};
|
||||
|
||||
for (auto barrier: dependency)
|
||||
{
|
||||
VulkanCommandBarrier_t stBarrier = {};
|
||||
stBarrier.m_eOldDependency = barrier.m_eLastUsage;
|
||||
stBarrier.m_eNewDependency = barrier.m_dependency.m_eDependencyMode;
|
||||
stBarrier.m_pObject = barrier.m_dependency.m_pObject;
|
||||
barriers.AppendTail(stBarrier);
|
||||
x++;
|
||||
};
|
||||
x = 0;
|
||||
for (auto barrier: swapchainDependency)
|
||||
{
|
||||
VulkanCommandBarrier_t stBarrier = {};
|
||||
stBarrier.m_eOldDependency = barrier.m_eLastUsage;
|
||||
stBarrier.m_eNewDependency = barrier.m_dependency.m_eDependencyMode;
|
||||
stBarrier.m_pObject = barrier.m_dependency.m_ppObjects[iCurrentBuffer];
|
||||
barriers.AppendTail(stBarrier);
|
||||
x++;
|
||||
};
|
||||
for ( auto barrier: barriers )
|
||||
{
|
||||
union {
|
||||
IRenderingObject *pObject;
|
||||
CVkImage *pImage;
|
||||
CVkBuffer *pBuffer;
|
||||
};
|
||||
|
||||
pObject = barrier.m_pObject;
|
||||
|
||||
if (dynamic_cast<CVkImage*>(pObject))
|
||||
{
|
||||
|
||||
VkImageMemoryBarrier2 imageMemoryBarrier = {};
|
||||
imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2;
|
||||
imageMemoryBarrier.image = pImage->m_image;
|
||||
imageMemoryBarrier.subresourceRange = pImage->m_range;
|
||||
imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
imageMemoryBarrier.newLayout = VulkanGetImageLayout(barrier.m_eNewDependency);
|
||||
imageMemoryBarrier.dstStageMask = VulkanGetStageFlags(barrier.m_eNewDependency);
|
||||
imageMemoryBarrier.dstAccessMask = VulkanGetAccessFlags(barrier.m_eNewDependency);
|
||||
if (barrier.m_eOldDependency == DEPENDENCY_MODE_FROM_PREVIOUS)
|
||||
{
|
||||
imageMemoryBarrier.oldLayout = VulkanGetImageLayout(pImage->m_eLastUsage);
|
||||
imageMemoryBarrier.srcStageMask = VulkanGetStageFlags(pImage->m_eLastUsage);
|
||||
imageMemoryBarrier.srcAccessMask = VulkanGetAccessFlags(pImage->m_eLastUsage);
|
||||
} else {
|
||||
imageMemoryBarrier.oldLayout = VulkanGetImageLayout(barrier.m_eOldDependency);
|
||||
imageMemoryBarrier.srcStageMask = VulkanGetStageFlags(barrier.m_eOldDependency);
|
||||
imageMemoryBarrier.srcAccessMask = VulkanGetAccessFlags(barrier.m_eOldDependency);
|
||||
}
|
||||
imageBarriers.AppendTail(imageMemoryBarrier);
|
||||
|
||||
pImage->m_eLastUsage = barrier.m_eNewDependency;
|
||||
}
|
||||
if (dynamic_cast<CVkBuffer*>(pObject))
|
||||
{
|
||||
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;
|
||||
}
|
||||
if (imageBarriers.GetSize() == 0 && bufferBarriers.GetSize() == 0 )
|
||||
return;
|
||||
|
||||
stDependencyInfo.imageMemoryBarrierCount = imageBarriers.GetSize();
|
||||
stDependencyInfo.bufferMemoryBarrierCount = bufferBarriers.GetSize();
|
||||
stDependencyInfo.pImageMemoryBarriers = imageBarriers.GetData();
|
||||
stDependencyInfo.pBufferMemoryBarriers = bufferBarriers.GetData();
|
||||
vkCmdPipelineBarrier2(m_hBuffers[iCurrentBuffer], &stDependencyInfo);
|
||||
};
|
||||
|
||||
class CVkCommandBufferManager: public IVkCommandBufferManager
|
||||
{
|
||||
@@ -175,5 +325,10 @@ CVkCommandRegistry::CVkCommandRegistry( const char *szName, fnCreateVulkanComman
|
||||
|
||||
void CVkCommand::AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode )
|
||||
{
|
||||
m_depedencies.AppendTail({ pObject, eDependencyMode });
|
||||
m_dependencies.AppendTail({ pObject, eDependencyMode });
|
||||
}
|
||||
void CVkCommand::AddSwapchainDependency( IRenderingObject **ppObject, EDependencyMode eDependencyMode )
|
||||
{
|
||||
m_swapchainDependencies.AppendTail({ ppObject, eDependencyMode });
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user