diff --git a/materialsystem/vulkan/commandbuffer.cpp b/materialsystem/vulkan/commandbuffer.cpp index 5df6905..5812237 100644 --- a/materialsystem/vulkan/commandbuffer.cpp +++ b/materialsystem/vulkan/commandbuffer.cpp @@ -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 g_commands; + void SortDependencies(); + void TryBarrier(); + VulkanCommandDepenency_t *FindLastObjectDependency( IRenderingObject *pObject ); + + CUtlSelfReferencingVector m_commands; CUtlVector m_hBuffers = NULL; + CUtlVector 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 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: diff --git a/materialsystem/vulkan/commands.h b/materialsystem/vulkan/commands.h index 7db99bb..2ec5f2e 100644 --- a/materialsystem/vulkan/commands.h +++ b/materialsystem/vulkan/commands.h @@ -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 diff --git a/materialsystem/vulkan/commands/draw.cpp b/materialsystem/vulkan/commands/draw.cpp index 789e31c..085db4b 100644 --- a/materialsystem/vulkan/commands/draw.cpp +++ b/materialsystem/vulkan/commands/draw.cpp @@ -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 = { diff --git a/materialsystem/vulkan/rendercontext.cpp b/materialsystem/vulkan/rendercontext.cpp index ffb94c3..f886450 100644 --- a/materialsystem/vulkan/rendercontext.cpp +++ b/materialsystem/vulkan/rendercontext.cpp @@ -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; @@ -507,7 +506,8 @@ void CVkRenderContext::Frame( float fDeltaTime ) stSubmitInfo.waitSemaphoreCount = 1; 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; diff --git a/materialsystem/vulkan/vulkan_state.h b/materialsystem/vulkan/vulkan_state.h index e549caf..d9c2d91 100644 --- a/materialsystem/vulkan/vulkan_state.h +++ b/materialsystem/vulkan/vulkan_state.h @@ -48,6 +48,7 @@ enum EVulkanCommandParameterType enum EDependencyMode { + DEPENDENCY_MODE_SHADER_IMAGE_READ, DEPENDENCY_MODE_SHADER_BUFFER_READ, DEPENDENCY_MODE_SHADER_IMAGE_WRITE, @@ -60,8 +61,11 @@ enum EDependencyMode DEPENDENCY_MODE_IMAGE_SOURCE, DEPENDENCY_MODE_IMAGE_DESTINATION, + + DEPENDENCY_MODE_ALL_COMMANDS, + DEPENDENCY_MODE_IMAGE_PRESENT, - DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION, + 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 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