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