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,23 +55,16 @@ void CVkCommandBuffer::Submit( int iFrameIndex )
|
||||
g_vkCommandBuffers.AppendTail(m_hBuffers[iFrameIndex]);
|
||||
};
|
||||
|
||||
struct VulkanBarrierObjects_t
|
||||
{
|
||||
VulkanCommandDepenency_t m_dependency;
|
||||
};
|
||||
|
||||
void CVkCommandBuffer::Render()
|
||||
{
|
||||
|
||||
uint32_t nNumDependencies;
|
||||
|
||||
|
||||
nNumDependencies = 0;
|
||||
for (auto pCommand: g_commands)
|
||||
{
|
||||
nNumDependencies += pCommand->m_depedencies.GetSize();
|
||||
}
|
||||
|
||||
// issue vkCmdPipelineBarrier if there are any
|
||||
if (nNumDependencies)
|
||||
{
|
||||
|
||||
}
|
||||
int i = 0;
|
||||
|
||||
for (auto hBuffer: m_hBuffers)
|
||||
{
|
||||
@@ -73,14 +72,51 @@ void CVkCommandBuffer::Render()
|
||||
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:
|
||||
|
||||
@@ -8,8 +8,8 @@ BEGIN_VULKAN_COMMAND(ClearColor)
|
||||
float g;
|
||||
float b;
|
||||
float a;
|
||||
IImage *pImage;
|
||||
IImage **ppImage;
|
||||
IImage *pImage = NULL;
|
||||
IImage **ppSwapchainImages = NULL;
|
||||
END_VULKAN_COMMAND(ClearColor)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,16 +1,23 @@
|
||||
#include "../vulkan_state.h"
|
||||
#include "../commands.h"
|
||||
#include "tier0/platform.h"
|
||||
|
||||
|
||||
DECLARE_VULKAN_COMMAND(ClearColor)
|
||||
{
|
||||
AddDependency(pImage, DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION);
|
||||
|
||||
CVkImage *pImg;
|
||||
|
||||
pImage = NULL;
|
||||
if (pImage)
|
||||
pImg = (CVkImage*)pImage;
|
||||
if (ppImage)
|
||||
pImg = (CVkImage*)*ppImage;
|
||||
if (ppSwapchainImages)
|
||||
pImg = (CVkImage*)ppSwapchainImages[iCurrentFrame];
|
||||
|
||||
if (pImg == NULL)
|
||||
Plat_FatalErrorFunc("pImage and *ppSwapchainImages are NULL\n");
|
||||
|
||||
AddDependency(pImg, DEPENDENCY_MODE_IMAGE_DESTINATION);
|
||||
|
||||
VkClearColorValue color = {.float32 = {r,g,b,a}};
|
||||
VkImageSubresourceRange range = {
|
||||
|
||||
@@ -479,9 +479,8 @@ void CVkRenderContext::Init()
|
||||
pCommandBuffer = g_pCommandBufferManager->CreateCommandBuffer();
|
||||
CVkClearColorCommand *pCommand = (CVkClearColorCommand*)g_pCommandBufferManager->CreateCommand("ClearColor");
|
||||
|
||||
pCommand->pImage = g_vkSwapchainImages[0];
|
||||
printf("what3 %p\n", ((CVkImage*)g_vkSwapchainImages[0])->m_image);
|
||||
printf("what4 %p\n", ((CVkImage*)pCommand->pImage)->m_image);
|
||||
pCommand->pImage = NULL;
|
||||
pCommand->ppSwapchainImages = g_vkSwapchainImages.GetData();
|
||||
pCommand->r = 1;
|
||||
pCommand->b = 1;
|
||||
|
||||
@@ -508,6 +507,7 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
stSubmitInfo.pWaitSemaphores = &g_vkGraphicsSemaphores[s_nImageIndex];
|
||||
stSubmitInfo.pWaitDstStageMask = &uPipelineStageFlags;
|
||||
|
||||
pCurrentImage = g_vkSwapchainImages[nImageIndex];
|
||||
g_vkCommandBuffers = {};
|
||||
pCommandBuffer->Submit(nImageIndex);
|
||||
|
||||
@@ -613,13 +613,11 @@ formatPicked:
|
||||
CVkImage *pImage;
|
||||
pImage = new CVkImage;
|
||||
pImage->m_image = swapchainImages[i];
|
||||
printf("what %p\n", pImage->m_image);
|
||||
pImage->m_eImageType = IMAGE_TYPE_2D;
|
||||
pImage->m_eMultisampleType = MULTISAMPLE_TYPE_NONE;
|
||||
pImage->m_eFormat = IMAGE_FORMAT_WINDOW;
|
||||
pImage->CreateImageView();
|
||||
g_vkSwapchainImages[i] = pImage;
|
||||
printf("what2 %p\n", ((CVkImage*)g_vkSwapchainImages[i])->m_image);
|
||||
|
||||
stFenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
||||
stFenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
|
||||
|
||||
@@ -48,6 +48,7 @@ enum EVulkanCommandParameterType
|
||||
|
||||
enum EDependencyMode
|
||||
{
|
||||
|
||||
DEPENDENCY_MODE_SHADER_IMAGE_READ,
|
||||
DEPENDENCY_MODE_SHADER_BUFFER_READ,
|
||||
DEPENDENCY_MODE_SHADER_IMAGE_WRITE,
|
||||
@@ -61,7 +62,10 @@ enum EDependencyMode
|
||||
DEPENDENCY_MODE_IMAGE_SOURCE,
|
||||
DEPENDENCY_MODE_IMAGE_DESTINATION,
|
||||
|
||||
DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION,
|
||||
DEPENDENCY_MODE_ALL_COMMANDS,
|
||||
DEPENDENCY_MODE_IMAGE_PRESENT,
|
||||
|
||||
DEPENDENCY_MODE_COUNT,
|
||||
};
|
||||
|
||||
|
||||
@@ -83,7 +87,7 @@ struct VulkanCommandParameter_t
|
||||
abstract_class CVkCommand
|
||||
{
|
||||
public:
|
||||
virtual void Execute( VkCommandBuffer hCommandBuffer ) = 0;
|
||||
virtual void Execute( VkCommandBuffer hCommandBuffer, int iCurrentFrame ) = 0;
|
||||
//virtual const char *GetName();
|
||||
|
||||
CUtlVector<VulkanCommandDepenency_t> m_depedencies;
|
||||
@@ -123,7 +127,7 @@ public:
|
||||
class CVk##name##Command : public CVkCommand \
|
||||
{ \
|
||||
public: \
|
||||
virtual void Execute( VkCommandBuffer hCommandBuffer ) override; \
|
||||
virtual void Execute( VkCommandBuffer hCommandBuffer, int iCurrentFrame ) override; \
|
||||
|
||||
#define END_VULKAN_COMMAND( name ) \
|
||||
}; \
|
||||
@@ -131,7 +135,7 @@ public: \
|
||||
#define DECLARE_VULKAN_COMMAND(name) \
|
||||
CVkCommand *_VulkanCommandCreate_##name() { return new CVk##name##Command; } \
|
||||
CVkCommandRegistry _VulkanCommandRegistry_##name( #name, _VulkanCommandCreate_##name ); \
|
||||
void CVk##name##Command::Execute( VkCommandBuffer hCommandBuffer ) \
|
||||
void CVk##name##Command::Execute( VkCommandBuffer hCommandBuffer, int iCurrentFrame ) \
|
||||
|
||||
#undef __cplusplus
|
||||
#include "vulkan/vk_enum_string_helper.h"
|
||||
@@ -169,6 +173,9 @@ public:
|
||||
VkImage m_image;
|
||||
VkImageView m_imageView;
|
||||
VmaAllocation m_allocation;
|
||||
|
||||
VkImageLayout m_eImageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
EDependencyMode m_eLastUsage;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user