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 "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:

View File

@@ -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

View File

@@ -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 = {

View File

@@ -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;

View File

@@ -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