diff --git a/.fpccfg b/.fpccfg index aa6a25e..606f15a 100644 --- a/.fpccfg +++ b/.fpccfg @@ -9,7 +9,11 @@ sysroot = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator. [x86_64-linux-android] sysroot = "/home/kotofyt/Android/Sdk/ndk/29.0.13599879/toolchains/llvm/prebuilt/linux-x86_64/sysroot" -"clang++" = "/home/kotofyt/Android/Sdk/ndk/29.0.13599879/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++" - -[Android_Build_Tools] +cc = "/home/kotofyt/Android/Sdk/ndk/29.0.13599879/toolchains/llvm/prebuilt/linux-x86_64/bin/clang" path = "/home/kotofyt/Android/Sdk/build-tools/36.0.0" + +[aarch64-linux-android] +sysroot = "/home/kotofyt/Downloads/android-ndk-r29/toolchains/llvm/prebuilt/linux-x86_64/sysroot" +cc = "/home/kotofyt/Downloads/android-ndk-r29/toolchains/llvm/prebuilt/linux-x86_64/bin/clang" +"clang++" = "/home/kotofyt/Downloads/android-ndk-r29/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++" +build_tools = "/home/kotofyt/Android/Sdk/build-tools/36.0.0" diff --git a/engine/engine.cpp b/engine/engine.cpp index b81c7be..dedf7b1 100644 --- a/engine/engine.cpp +++ b/engine/engine.cpp @@ -42,6 +42,7 @@ extern "C" void __cdecl SteamAPIDebug( ESteamNetworkingSocketsDebugOutputType nT V_printf("STEAM: %s\n", pszMsg); } #endif +#include "time.h" extern "C" void FunnyMain( int argc, char **argv ) { @@ -124,7 +125,6 @@ extern "C" void FunnyMain( int argc, char **argv ) Console()->Execute(); double fPrevious = Plat_GetTime(); for (;;) { - if (!stConstants.m_bIsDedicated) { if (pWindow->IsValid() == false) @@ -145,8 +145,6 @@ extern "C" void FunnyMain( int argc, char **argv ) g_pHumanDeviceManager->Frame(); g_pServerGame->m_pBridge->Frame(fDelta); - fCurrent = Plat_GetTime(); - if (!stConstants.m_bIsDedicated) { diff --git a/engine/kottui.cpp b/engine/kottui.cpp index 4e40261..5999449 100644 --- a/engine/kottui.cpp +++ b/engine/kottui.cpp @@ -318,10 +318,6 @@ void CKotUIBuffer::Draw( IImage *pImage ) pList->SetLoadStoreModes(0, LOAD_MODE_LOAD, STORE_MODE_STORE); pList->SetRenderResolution(pImage->GetImageWidth(), pImage->GetImageHeight()); - pList->Barrier(m_pDataBuffer, true, false); - pList->Barrier(pScreenBuffer, true, false); - pList->Barrier(m_pFont->GetAtlas(), true, false); - pList->SetMaterial(m_pMaterial); pList->SetVertexBuffer(0, s_pGlyphBuffer); pList->DrawPrimitives(6, 0, uRealGlyphCount, 0); diff --git a/engine/openxr.cpp b/engine/openxr.cpp index feb3ffb..5b9e919 100644 --- a/engine/openxr.cpp +++ b/engine/openxr.cpp @@ -1041,7 +1041,7 @@ void COpenXRHeadset::CreateSwapchainForEye( XrViewConfigurationView *pConf, VkFo for ( int i = 0; i < imageCount; i++ ) { pEye->m_pImages[i] = m_pManager->m_pRenderContext->CreateImageFromVkImage( - images[i].image, + (uint64_t)images[i].image, createInfo.width, createInfo.height, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, diff --git a/external/GameNetworkingSockets b/external/GameNetworkingSockets index 517fff0..b0ed47d 160000 --- a/external/GameNetworkingSockets +++ b/external/GameNetworkingSockets @@ -1 +1 @@ -Subproject commit 517fff0cf6866ba163f4f016b0ef28f365c06c05 +Subproject commit b0ed47de2e6f44efacf3598a6fd5b7fe3b8d3178 diff --git a/external/OpenXR-SDK b/external/OpenXR-SDK index 64f2b37..57af7fc 160000 --- a/external/OpenXR-SDK +++ b/external/OpenXR-SDK @@ -1 +1 @@ -Subproject commit 64f2b37c8c6da3d83c9b4d11865ba1fb752cb8ec +Subproject commit 57af7fc61f9f2d492580cb28aab6d0ea59d8d417 diff --git a/external/SDL b/external/SDL index 1d08131..5e8eb0d 160000 --- a/external/SDL +++ b/external/SDL @@ -1 +1 @@ -Subproject commit 1d081314a89eb6bfd22bbc0224b604533ae6156b +Subproject commit 5e8eb0d4e728bfb6db222fef36f150967fc624c0 diff --git a/external/SPIRV-Headers b/external/SPIRV-Headers index 1e770e7..0d25db9 160000 --- a/external/SPIRV-Headers +++ b/external/SPIRV-Headers @@ -1 +1 @@ -Subproject commit 1e770e7de8373a8dd49f23416cf7ca4001d01040 +Subproject commit 0d25db97cb9b8f725e4c95e4553001710e7fc39d diff --git a/external/Vulkan-Headers b/external/Vulkan-Headers index 29184b9..b51f6b8 160000 --- a/external/Vulkan-Headers +++ b/external/Vulkan-Headers @@ -1 +1 @@ -Subproject commit 29184b98984f6169a5e83e97557a77cff1e5b0ca +Subproject commit b51f6b865c18fc5b33990d12f75e8dfd672cede6 diff --git a/external/Vulkan-Utility-Libraries b/external/Vulkan-Utility-Libraries index c15a1ac..245b48c 160000 --- a/external/Vulkan-Utility-Libraries +++ b/external/Vulkan-Utility-Libraries @@ -1 +1 @@ -Subproject commit c15a1ac31670cb2ce61c235f070fb40ec6e42612 +Subproject commit 245b48c522b5375c0acd5377d52bef5e4917f31e diff --git a/external/VulkanMemoryAllocator b/external/VulkanMemoryAllocator index b3cbbb4..3aa9212 160000 --- a/external/VulkanMemoryAllocator +++ b/external/VulkanMemoryAllocator @@ -1 +1 @@ -Subproject commit b3cbbb43ea3a506dffe10759e205a41c27c35ae2 +Subproject commit 3aa921224c154a0d2c43912bc88e1c42ce1f7607 diff --git a/external/cglm b/external/cglm index 83d5b2c..58d8c15 160000 --- a/external/cglm +++ b/external/cglm @@ -1 +1 @@ -Subproject commit 83d5b2c97378e61a4666825fd3a5548955c83add +Subproject commit 58d8c15a124c202188d0094705f778f6129a2612 diff --git a/external/funnystdlib b/external/funnystdlib index ecb21ea..116e7d1 160000 --- a/external/funnystdlib +++ b/external/funnystdlib @@ -1 +1 @@ -Subproject commit ecb21ea0c4e1e3541727cc28f6f38bdfebd3cb88 +Subproject commit 116e7d1aaf63823c73f7dc1c634a1c6db17a362e diff --git a/external/slang b/external/slang index f267cb7..30d3e0f 160000 --- a/external/slang +++ b/external/slang @@ -1 +1 @@ -Subproject commit f267cb77a09b0f4cf083a9585bc1ddb3744c310a +Subproject commit 30d3e0f3e8c1fae72826988aa8576db344683834 diff --git a/external/stb b/external/stb index e6cd956..2c980bb 160000 --- a/external/stb +++ b/external/stb @@ -1 +1 @@ -Subproject commit e6cd9561ea6dae43d41633797745789d142b691e +Subproject commit 2c980bb59875b0d32144a71867fbdebb2f77cd20 diff --git a/external/volk b/external/volk index e91ceff..2e19a77 160000 --- a/external/volk +++ b/external/volk @@ -1 +1 @@ -Subproject commit e91ceff7db05f92ac8b498c9631235a6a73566e2 +Subproject commit 2e19a77ce9b5bd8df0106f66b91032c0e5c776a1 diff --git a/external/xtool b/external/xtool index f12a84e..2d58d98 160000 --- a/external/xtool +++ b/external/xtool @@ -1 +1 @@ -Subproject commit f12a84e960fa9bced1249a8d233ab8eafca28f6f +Subproject commit 2d58d987edff728fccebc6df643b1672e3583f00 diff --git a/game/client/game.cpp b/game/client/game.cpp index 57158a9..d3b0378 100644 --- a/game/client/game.cpp +++ b/game/client/game.cpp @@ -85,9 +85,9 @@ void CFunnyGameBridge::Init() g_pKotUI->ConnectInterface(g_pRenderContext, RENDER_CONTEXT_INTERFACE_VERSION); g_pKotUI->Init(); - g_pXRManager->ConnectInterface(g_pRenderContext, RENDER_CONTEXT_INTERFACE_VERSION); - g_pXRManager->Init(); - g_pRenderContext->ConnectInterface(g_pXRManager, XR_INTERFACE_VERSION); + //g_pXRManager->ConnectInterface(g_pRenderContext, RENDER_CONTEXT_INTERFACE_VERSION); + //g_pXRManager->Init(); + //g_pRenderContext->ConnectInterface(g_pXRManager, XR_INTERFACE_VERSION); g_pWorldRenderer->Init(); @@ -96,6 +96,7 @@ void CFunnyGameBridge::Init() m_pMainViewport->SetPosition({0,0,0}); m_pMainViewport->SetRotation({0,0,0,1}); + /* IXRHeadset *pHeadSet = g_pXRManager->GetHeadset(0); if (pHeadSet) { @@ -116,8 +117,8 @@ void CFunnyGameBridge::Init() { pHeadSet->GetController(i)->SetInputCallback(XRInputCallback); V_printf("callback set on %p\n", pHeadSet->GetController(i)); - } + */ } void CFunnyGameBridge::Tick( float fDelta ) @@ -168,7 +169,7 @@ void CFunnyGameBridge::Frame( float fDelta ) TryToConnectToServer(); - g_pXRManager->Frame(); + //g_pXRManager->Frame(); INetworkBase *pCurrentServer = g_pServerBridge; pCurrentServer = g_pServerBridge; diff --git a/game/client/worldrender.cpp b/game/client/worldrender.cpp index e8f59d9..a9b0c89 100644 --- a/game/client/worldrender.cpp +++ b/game/client/worldrender.cpp @@ -49,11 +49,17 @@ void CFunnyViewport::UpdateResolution( uint32_t uX, uint32_t uY ) g_pRenderContext->DestroyImage(m_pRenderImage); } m_pColor = g_pRenderContext->CreateRenderTarget(uX, uY, IMAGE_FORMAT_RGBA8_UNORM, MULTISAMPLE_TYPE_4_SAMPLES); + m_pColor->SetDebugName("m_pColor"); m_pNormal = g_pRenderContext->CreateRenderTarget(uX, uY, IMAGE_FORMAT_RGBA16_SNORM, MULTISAMPLE_TYPE_4_SAMPLES); + m_pNormal->SetDebugName("m_pNormal"); m_pWorldCoords = g_pRenderContext->CreateRenderTarget(uX, uY, IMAGE_FORMAT_RGBA32_SFLOAT, MULTISAMPLE_TYPE_4_SAMPLES); + m_pWorldCoords->SetDebugName("m_pWorldCoords"); m_pDepth = g_pRenderContext->CreateRenderTarget(uX, uY, IMAGE_FORMAT_D32_SFLOAT, MULTISAMPLE_TYPE_4_SAMPLES); + m_pDepth->SetDebugName("m_pDepth"); m_pColorResolved = g_pRenderContext->CreateRenderTarget(uX, uY, IMAGE_FORMAT_RGBA8_UNORM, MULTISAMPLE_TYPE_1_SAMPLES); + m_pColorResolved->SetDebugName("m_pColorResolved"); m_pRenderImage = g_pRenderContext->CreateStorageImage(uX, uY, IMAGE_FORMAT_RGBA16_SFLOAT, MULTISAMPLE_TYPE_1_SAMPLES); + m_pRenderImage->SetDebugName("m_pRenderImage"); m_uX = uX; m_uY = uY; } @@ -319,6 +325,26 @@ void CFunnyWorldRenderer::Frame( float fDelta ) m_pViewBuffer->Unmap(); m_pRasterCommandList->StartRecording(); + m_pRasterCommandList->BarrierTransition( + v->m_pColor, + IMAGE_LAYOUT_UNDEFINED, IMAGE_LAYOUT_COLOR, + STAGE_HAZARD_NONE, STAGE_HAZARD_RASTER_COLOR_OUT, + BARRIER_HAZARD_RASTER_COLOR); + m_pRasterCommandList->BarrierTransition( + v->m_pNormal, + IMAGE_LAYOUT_UNDEFINED, IMAGE_LAYOUT_COLOR, + STAGE_HAZARD_NONE, STAGE_HAZARD_RASTER_COLOR_OUT, + BARRIER_HAZARD_RASTER_COLOR); + m_pRasterCommandList->BarrierTransition( + v->m_pWorldCoords, + IMAGE_LAYOUT_UNDEFINED, IMAGE_LAYOUT_COLOR, + STAGE_HAZARD_NONE, STAGE_HAZARD_RASTER_COLOR_OUT, + BARRIER_HAZARD_RASTER_COLOR); + m_pRasterCommandList->BarrierTransition( + v->m_pDepth, + IMAGE_LAYOUT_UNDEFINED, IMAGE_LAYOUT_DEPTH_STENCIL, + STAGE_HAZARD_NONE, STAGE_HAZARD_RASTER_EARLY_DEPTH_OUT, + BARRIER_HAZARD_DEPTH_STENCIL); m_pRasterCommandList->SetRenderResolution(uWidth, uHeight); m_pRasterCommandList->SetRenderTarget(0, v->m_pColor); m_pRasterCommandList->SetRenderTarget(1, v->m_pNormal); @@ -373,15 +399,35 @@ void CFunnyWorldRenderer::Frame( float fDelta ) m_pRasterCommandList->DrawPrimitives(mesh->m_pVertexBuffer->GetSize()/32, 0, mesh->m_instances.GetSize(), u); u += mesh->m_instances.GetSize(); } + m_pRasterCommandList->Barrier(STAGE_HAZARD_RASTER_COLOR_OUT, STAGE_HAZARD_NONE, 0); + m_pRasterCommandList->BarrierTransition( + v->m_pColor, + IMAGE_LAYOUT_COLOR, IMAGE_LAYOUT_TRANSFER_SRC, + STAGE_HAZARD_RASTER_COLOR_OUT, STAGE_HAZARD_TRANSFER, + 0); + m_pRasterCommandList->BarrierTransition( + v->m_pColorResolved, + IMAGE_LAYOUT_UNDEFINED, IMAGE_LAYOUT_TRANSFER_DST, + STAGE_HAZARD_NONE, STAGE_HAZARD_TRANSFER, + 0); m_pRasterCommandList->ResolveImage(v->m_pColor, v->m_pColorResolved); + m_pRasterCommandList->BarrierTransition( + v->m_pColorResolved, + IMAGE_LAYOUT_TRANSFER_DST, IMAGE_LAYOUT_GENERAL, + STAGE_HAZARD_TRANSFER, STAGE_HAZARD_COMPUTE, + 0); + m_pRasterCommandList->BarrierTransition( + v->m_pRenderImage, + IMAGE_LAYOUT_UNDEFINED, IMAGE_LAYOUT_GENERAL, + STAGE_HAZARD_NONE, STAGE_HAZARD_COMPUTE, + 0); m_pPostProcessingMaterial->CSSetTexture(0, 0, v->m_pColorResolved); m_pPostProcessingMaterial->CSSetTexture(1, 0, v->m_pRenderImage); m_pRasterCommandList->SetMaterial(m_pPostProcessingMaterial); - m_pRasterCommandList->Barrier(v->m_pColorResolved, true, false); - m_pRasterCommandList->Barrier(v->m_pRenderImage, false, true); m_pRasterCommandList->DispatchCompute(uWidth, uHeight, 1); + m_pRasterCommandList->Barrier(STAGE_HAZARD_COMPUTE, STAGE_HAZARD_NONE, 0); m_pRasterCommandList->EndRecording(); g_pRenderContext->SubmitCommandList(m_pRasterCommandList); diff --git a/launcher/build.cpp b/launcher/build.cpp index 1d3b085..892999b 100644 --- a/launcher/build.cpp +++ b/launcher/build.cpp @@ -49,7 +49,6 @@ DECLARE_BUILD_STAGE(launcher) manifest.SetPackageName("funnygame"); manifest.SetPackageID("com.kotofyt.funnygame"); manifest.SetPackageExecutable(outputProject); - V_printf("%s\n", manifest.m_szPackageName.GetString()); CUtlString szOutputDir = manifest.BuildManifest(); @@ -65,6 +64,32 @@ DECLARE_BUILD_STAGE(launcher) filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "../build/funnygame/assets/shaders"); CUtlString szIpa = AppleTool()->BuildPackage( manifest, szOutputDir ); } + if (compileProject.m_target.kernel == TARGET_KERNEL_ANDROID) + { + AndroidManifest_t manifest = {}; + manifest.SetPackageName("funnygame"); + manifest.SetPackageID("com.kotofyt.funnygame"); + manifest.SetTargetSDKVersion(32); + manifest.SetMinSDKVersion(32); + + CUtlString szOutputDir = manifest.BuildManifest(); + + filesystem2->MakeDirectory(CUtlString("%s/lib/x86_64",szOutputDir.GetString())); + filesystem2->CopyFile(CUtlString("%s/lib/x86_64/libnative-app.so",szOutputDir.GetString()), outputProject); + + filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "../funnyassets/maps"); + filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "../funnyassets/models"); + filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "../funnyassets/meshes"); + filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "../funnyassets/materials"); + filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "../funnyassets/textures"); + filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "../funnyassets/physics"); + filesystem2->CopyFile(CUtlString("%s/core/",szOutputDir.GetString()), "../funnyassets/default.cfg"); + filesystem2->CopyDirectory(szOutputDir, "../external/ios/SDL3.framework"); + + filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "../build/funnygame/assets/shaders"); + CUtlString szApkPackage = APKTool()->BuildPackage( manifest, szOutputDir ); + APKTool()->SignPackage(szApkPackage, NULL, "kotofyt", "password1", "password1"); + } ADD_OUTPUT_OBJECT("launcher", outputProject); return 0; }; diff --git a/materialsystem/vulkan/commandbuffer.cpp b/materialsystem/vulkan/commandbuffer.cpp index d9cd7e1..5e21df9 100644 --- a/materialsystem/vulkan/commandbuffer.cpp +++ b/materialsystem/vulkan/commandbuffer.cpp @@ -4,40 +4,18 @@ #include "tier1/utlvector.h" #include "vulkan_state.h" -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: virtual void SetVulkanHandlers( VkDevice hDevice, IVkCommandBufferManager *pManager ) override; virtual void AddCommand( CVkCommand *pCommand ) override; virtual void Reset() override; - virtual void Submit( int iFrameIndex ) override; + virtual void Submit() override; virtual void Render() override; void FreeWithCommands(); private: - void SortDependencies(); - void TryBarrier( int iCurrent, int iCurrentBuffer ); - VulkanCommandDepenency_t *FindLastObjectDependency( IRenderingObject *pObject ); - CUtlVector m_commands; - CUtlVector m_hBuffers = NULL; - CUtlVector m_usedDependencies; - CUtlVector> m_dependencies; - CUtlVector m_usedSwapchainDependencies; - CUtlVector> m_swapchainDependencies; + VkCommandBuffer m_hBuffer = NULL; VkDevice m_hDevice; IVkCommandBufferManager *m_pMgr; @@ -52,7 +30,7 @@ void CVkCommandBuffer::FreeWithCommands() { delete c; }; - vkFreeCommandBuffers(m_hDevice, m_hPool, m_hBuffers.GetSize(), m_hBuffers.GetData()); + vkFreeCommandBuffers(m_hDevice, m_hPool, 1, &m_hBuffer); vkDestroyCommandPool(m_hDevice, m_hPool, NULL); m_hPool = NULL; } @@ -74,14 +52,13 @@ void CVkCommandBuffer::Reset() stCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; stCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; vkCreateCommandPool(m_hDevice, &stCreateInfo, NULL, &m_hPool); - m_hBuffers = {}; - m_hBuffers.Resize(FRAMES_IN_FLIGHT); + m_hBuffer = {}; commandBufferAllocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; commandBufferAllocInfo.commandPool = m_hPool; commandBufferAllocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - commandBufferAllocInfo.commandBufferCount = FRAMES_IN_FLIGHT; - vkAllocateCommandBuffers(m_hDevice, &commandBufferAllocInfo, m_hBuffers.GetData()); + commandBufferAllocInfo.commandBufferCount = 1; + vkAllocateCommandBuffers(m_hDevice, &commandBufferAllocInfo, &m_hBuffer); m_commands = {}; } @@ -91,274 +68,26 @@ void CVkCommandBuffer::AddCommand( CVkCommand *pCommand ) m_commands.AppendTail(pCommand); } -void CVkCommandBuffer::Submit( int iFrameIndex ) +void CVkCommandBuffer::Submit() { - m_pMgr->GetVulkanCommands().AppendTail(m_hBuffers[iFrameIndex]); -}; - -struct VulkanBarrierObjects_t -{ - VulkanCommandDepenency_t m_dependency; + m_pMgr->GetVulkanCommands().AppendTail(m_hBuffer); }; 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(y,i); - pCommand->Execute(hBuffer, i); - y++; - }; - TryBarrier(y, i); - vkEndCommandBuffer(hBuffer); - - i++; - } -} - -struct VulkanCommandBarrier_t -{ - EDependencyMode m_eOldDependency; - EDependencyMode m_eNewDependency; - IRenderingObject *m_pObject; -}; - -void CVkCommandBuffer::SortDependencies() -{ - m_dependencies = {}; - m_swapchainDependencies = {}; - m_dependencies.Resize(m_commands.GetSize()+1); - m_swapchainDependencies.Resize(m_commands.GetSize()+1); - m_usedDependencies = {}; - m_usedSwapchainDependencies = {}; - - int i = 0; - for ( auto dependency: m_dependencies) - { - dependency = NULL; - } + VkCommandBufferBeginInfo stCommandBufferBeginInfo = {}; + stCommandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + vkBeginCommandBuffer(m_hBuffer, &stCommandBufferBeginInfo); for (auto &pCommand: m_commands) { - 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_NEXT_STAGE; - - 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_NEXT_STAGE; - - 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++; - } - - - for (auto &pCommand: m_commands) - { - 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_dependency.m_eDependencyMode = DEPENDENCY_MODE_NEXT_STAGE; - stLastUsage.m_eLastUsage = DEPENDENCY_MODE_NEXT_STAGE; - - if (pLastUsage) - { - stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode; - if (pLastUsage->m_nLastUsedCommand == i) - continue; - m_dependencies[i].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_dependency.m_eDependencyMode = DEPENDENCY_MODE_NEXT_STAGE; - stLastUsage.m_eLastUsage = DEPENDENCY_MODE_NEXT_STAGE; - - if (pLastUsage) - { - stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode; - if (pLastUsage->m_nLastUsedCommand == i) - continue; - m_swapchainDependencies[i].AppendTail(stLastUsage); - m_usedSwapchainDependencies.AppendTail(stLastUsage); - } - } - } + pCommand->Execute(m_hBuffer, 0); + }; + vkEndCommandBuffer(m_hBuffer); + } - -void CVkCommandBuffer::TryBarrier( int iCurrent, int iCurrentBuffer ) -{ - int x = 0; - CUtlVector dependency = m_dependencies[iCurrent]; - CUtlVector swapchainDependency = m_swapchainDependencies[iCurrent]; - CUtlVector barriers; - - VkDependencyInfo stDependencyInfo = {}; - stDependencyInfo.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO; - CUtlVector memoryBarriers = {}; - CUtlVector imageBarriers = {}; - CUtlVector 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(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; - if (barrier.m_eNewDependency == DEPENDENCY_MODE_NEXT_STAGE) - imageMemoryBarrier.newLayout = pImage->m_ePreferredLayout; - else - imageMemoryBarrier.newLayout = VulkanGetImageLayout(barrier.m_eNewDependency); - imageMemoryBarrier.dstStageMask = VulkanGetStageFlags(barrier.m_eNewDependency); - imageMemoryBarrier.dstAccessMask = VulkanGetAccessFlags(barrier.m_eNewDependency); - if (barrier.m_eOldDependency == DEPENDENCY_MODE_NEXT_STAGE) - { - if (pImage->m_eLastUsage == DEPENDENCY_MODE_JUST_CREATED) - { - imageMemoryBarrier.oldLayout = VulkanGetImageLayout(DEPENDENCY_MODE_JUST_CREATED); - imageMemoryBarrier.srcStageMask = VulkanGetStageFlags(DEPENDENCY_MODE_JUST_CREATED); - imageMemoryBarrier.srcAccessMask = VulkanGetAccessFlags(DEPENDENCY_MODE_JUST_CREATED); - } - else - { - imageMemoryBarrier.oldLayout = pImage->m_ePreferredLayout; - imageMemoryBarrier.srcStageMask = VulkanGetStageFlags(DEPENDENCY_MODE_NEXT_STAGE); - imageMemoryBarrier.srcAccessMask = VulkanGetAccessFlags(DEPENDENCY_MODE_NEXT_STAGE); - } - } 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(pObject)) - { - } - } - - 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 { public: @@ -446,14 +175,3 @@ CVkCommandRegistry::CVkCommandRegistry( const char *szName, fnCreateVulkanComman pCommand->m_pNext = s_pVulkanCommands; s_pVulkanCommands = pCommand; } - - -void CVkCommand::AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode ) -{ - m_dependencies.AppendTail({ pObject, eDependencyMode }); -} -void CVkCommand::AddSwapchainDependency( IRenderingObject **ppObject, EDependencyMode eDependencyMode ) -{ - m_swapchainDependencies.AppendTail({ ppObject, eDependencyMode }); -} - diff --git a/materialsystem/vulkan/commands.h b/materialsystem/vulkan/commands.h index d099235..2608d0e 100644 --- a/materialsystem/vulkan/commands.h +++ b/materialsystem/vulkan/commands.h @@ -5,13 +5,13 @@ #include "vulkan_state.h" BEGIN_VULKAN_COMMAND(Empty) -END_VULKAN_COMMAND(Empty) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(Dispatch) uint32_t uX = 0; uint32_t uY = 0; uint32_t uZ = 0; -END_VULKAN_COMMAND(Dispatch) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(Blit) VkFrameObject_t stInputImage; @@ -20,7 +20,7 @@ BEGIN_VULKAN_COMMAND(Blit) int32_t iSrcMax[3] = {}; int32_t iDstMin[3] = {}; int32_t iDstMax[3] = {}; -END_VULKAN_COMMAND(Blit) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(ClearColor) float r; @@ -28,7 +28,7 @@ BEGIN_VULKAN_COMMAND(ClearColor) float b; float a; VkFrameObject_t stImage; -END_VULKAN_COMMAND(ClearColor) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(Begin) CUtlVector images; @@ -38,37 +38,37 @@ BEGIN_VULKAN_COMMAND(Begin) uint32_t nResolutionY = 0; -END_VULKAN_COMMAND(Begin) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(End) -END_VULKAN_COMMAND(End) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(SetVertexBuffer) uint32_t uBinding; IVertexBuffer *pBuffer; -END_VULKAN_COMMAND(SetVertexBuffer) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(SetShader) IBaseShader *pShader; -END_VULKAN_COMMAND(SetShader) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(SetShaderData) IMaterial *pShaderData; -END_VULKAN_COMMAND(SetShaderData) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(DrawPrimitives) uint32_t nVertexCount; uint32_t nFirstVertex; uint32_t nInstanceCount; uint32_t nFirstInstance; -END_VULKAN_COMMAND(DrawPrimitives) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(SetScissors) int32_t iX = 0; int32_t iY = 0; uint32_t uWidth = 0; uint32_t uHeight = 0; -END_VULKAN_COMMAND(SetScissors) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(SetViewport) float fX = 0; @@ -77,12 +77,12 @@ BEGIN_VULKAN_COMMAND(SetViewport) float fHeight = 0; float fDepthMin = 0; float fDepthMax = 1; -END_VULKAN_COMMAND(SetViewport) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(ResolveImage) VkFrameObject_t stInputImage; VkFrameObject_t stOutputImage; -END_VULKAN_COMMAND(ResolveImage) +END_VULKAN_COMMAND() BEGIN_VULKAN_COMMAND(CopyBufferToImage) IBuffer *pBuffer; @@ -93,7 +93,22 @@ BEGIN_VULKAN_COMMAND(CopyBufferToImage) uint32_t iImageX = 1; uint32_t iImageY = 1; uint32_t iImageZ = 1; -END_VULKAN_COMMAND(CopyBufferToImage) +END_VULKAN_COMMAND() + +BEGIN_VULKAN_COMMAND(Barrier) + EStageHazard eStageIn; + EStageHazard eStageOut; + uint32_t eHazard; +END_VULKAN_COMMAND() + +BEGIN_VULKAN_COMMAND(LayoutBarrier) + IImage *pImage; + EImageLayoutHazard eLayoutIn; + EImageLayoutHazard eLayoutOut; + EStageHazard eStageIn; + EStageHazard eStageOut; + uint32_t eHazard; +END_VULKAN_COMMAND() #endif diff --git a/materialsystem/vulkan/commands/draw.cpp b/materialsystem/vulkan/commands/draw.cpp index 49f33e8..ec3c077 100644 --- a/materialsystem/vulkan/commands/draw.cpp +++ b/materialsystem/vulkan/commands/draw.cpp @@ -163,3 +163,116 @@ DECLARE_VULKAN_COMMAND(ResolveImage) vkCmdResolveImage2(hCommandBuffer, &i); } +static VkPipelineStageFlags2 GetStage( EStageHazard stage ) +{ + switch (stage) + { + case STAGE_HAZARD_COMPUTE: + return VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT; + case STAGE_HAZARD_TRANSFER: + return VK_PIPELINE_STAGE_2_TRANSFER_BIT; + case STAGE_HAZARD_RASTER_COLOR_OUT: + return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; + case STAGE_HAZARD_NONE: + return VK_PIPELINE_STAGE_2_NONE; + case STAGE_HAZARD_RASTER_EARLY_DEPTH_OUT: + return VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT; + case STAGE_HAZARD_RASTER_LATE_DEPTH_OUT: + return VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT; + } + +} +static VkAccessFlags2 GetAccessSrc( uint32_t hazard, EStageHazard stage ) +{ + VkAccessFlags2 f = 0; + if (hazard & BARRIER_HAZARD_DRAW_ARGUMENTS) + f |= VK_ACCESS_2_SHADER_WRITE_BIT; + if (hazard & BARRIER_HAZARD_DESCRIPTOR) + f |= VK_ACCESS_2_SHADER_WRITE_BIT; + if (stage == STAGE_HAZARD_RASTER_EARLY_DEPTH_OUT) + { + if (hazard & BARRIER_HAZARD_DEPTH_STENCIL) + f |= VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + } + if (stage == STAGE_HAZARD_RASTER_COLOR_OUT) + { + if (hazard & BARRIER_HAZARD_RASTER_COLOR) + f |= VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT; + + } + if (hazard == 0) + f |= VK_ACCESS_2_MEMORY_READ_BIT | VK_ACCESS_2_MEMORY_WRITE_BIT; + return f; + +} +static VkAccessFlags2 GetAccessDst( uint32_t hazard, EStageHazard stage ) +{ + VkAccessFlags2 f = 0; + if (hazard & BARRIER_HAZARD_DRAW_ARGUMENTS) + f |= VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT; + if (hazard & BARRIER_HAZARD_DESCRIPTOR) + f |= VK_ACCESS_2_SHADER_READ_BIT; + if (hazard & BARRIER_HAZARD_DEPTH_STENCIL) + f |= VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + if (hazard & BARRIER_HAZARD_RASTER_COLOR) + f |= VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT; + if (hazard == 0) + f |= VK_ACCESS_2_MEMORY_READ_BIT | VK_ACCESS_2_MEMORY_WRITE_BIT; + return f; +} +static VkImageLayout GetLayout( EImageLayoutHazard hazard ) +{ + switch (hazard) + { + case IMAGE_LAYOUT_COLOR: + return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + case IMAGE_LAYOUT_DEPTH_STENCIL: + return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + case IMAGE_LAYOUT_GENERAL: + return VK_IMAGE_LAYOUT_GENERAL; + case IMAGE_LAYOUT_PRESENT: + return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + case IMAGE_LAYOUT_UNDEFINED: + return VK_IMAGE_LAYOUT_UNDEFINED; + case IMAGE_LAYOUT_TRANSFER_SRC: + return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; + case IMAGE_LAYOUT_TRANSFER_DST: + return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + } + +} + +DECLARE_VULKAN_COMMAND(Barrier) +{ + + VkMemoryBarrier2 barrier = {}; + barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2; + barrier.srcStageMask = GetStage(eStageIn); + barrier.srcAccessMask = GetAccessSrc(eHazard, eStageIn); + barrier.dstStageMask = GetStage(eStageOut); + barrier.dstAccessMask = GetAccessDst(eHazard, eStageOut); + VkDependencyInfo dependency = {}; + dependency.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO; + dependency.memoryBarrierCount = 1; + dependency.pMemoryBarriers = &barrier; + vkCmdPipelineBarrier2(hCommandBuffer, &dependency); +} + +DECLARE_VULKAN_COMMAND(LayoutBarrier) +{ + VkImageMemoryBarrier2 barrier = {}; + barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2; + barrier.srcStageMask = GetStage(eStageIn); + barrier.srcAccessMask = GetAccessSrc(eHazard, eStageIn); + barrier.dstStageMask = GetStage(eStageOut); + barrier.dstAccessMask = GetAccessDst(eHazard, eStageOut); + barrier.image = ((CVkImage*)pImage)->m_image; + barrier.subresourceRange = ((CVkImage*)pImage)->m_range; + barrier.oldLayout = GetLayout(eLayoutIn); + barrier.newLayout = GetLayout(eLayoutOut); + VkDependencyInfo dependency = {}; + dependency.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO; + dependency.imageMemoryBarrierCount = 1; + dependency.pImageMemoryBarriers = &barrier; + vkCmdPipelineBarrier2(hCommandBuffer, &dependency); +} diff --git a/materialsystem/vulkan/rendercommandlist.cpp b/materialsystem/vulkan/rendercommandlist.cpp index 98fdb1f..d2d9282 100644 --- a/materialsystem/vulkan/rendercommandlist.cpp +++ b/materialsystem/vulkan/rendercommandlist.cpp @@ -116,13 +116,8 @@ void CVkRenderCommandList::SetMaterial( IMaterial *pMaterial ) pBeginCommand->images = m_pOutput; pBeginCommand->nResolutionX = m_uWidth; pBeginCommand->nResolutionY = m_uHeight; - for ( auto &i: pBeginCommand->images) - { - pBeginCommand->AddDependency(i.m_stImage.m_pSingle, DEPENDENCY_MODE_DRAWCALL_MIXED_IMAGE); - } if ( m_bDepthEnabled ) { - pBeginCommand->AddDependency(m_depth.m_stImage.m_pSingle, DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE); pBeginCommand->bDepthEnabled = m_bDepthEnabled; pBeginCommand->stDepthImage = m_depth; @@ -161,7 +156,6 @@ void CVkRenderCommandList::SetVertexBuffer( uint32_t uBinding, IVertexBuffer *pB CVkSetVertexBufferCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, SetVertexBuffer); pCmd->uBinding = uBinding; pCmd->pBuffer = pBuffer; - pCmd->AddDependency(pBuffer, DEPENDENCY_MODE_BUFFER_SOURCE); m_pCurrentMaterialBuffer->AddCommand(pCmd); } @@ -179,7 +173,6 @@ void CVkRenderCommandList::DrawPrimitives( uint32_t nVertexCount, uint32_t nFirs pCmd->nFirstVertex = nFirstVertex; pCmd->nInstanceCount = nInstanceCount; pCmd->nFirstInstance = nFirstInstance; - FlushBarriers(pCmd); m_pCurrentMaterialBuffer->AddCommand(pCmd); } @@ -204,8 +197,6 @@ void CVkRenderCommandList::BlitImageToImage( IImage *pSrc, ImageSector_t src, II pCmd->stInputImage.m_pSingle = pSrc; pCmd->stOutputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE; pCmd->stOutputImage.m_pSingle = pDst; - pCmd->AddDependency(pSrc, DEPENDENCY_MODE_BLIT_IMAGE_SOURCE); - pCmd->AddDependency(pDst, DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION); pCmd->iSrcMin[0] = src.m_iX; pCmd->iSrcMin[1] = src.m_iY; pCmd->iSrcMin[2] = 0; @@ -226,7 +217,6 @@ void CVkRenderCommandList::ClearImage( IImage *pImage, float fR, float fG, float { SwitchRenderingStage(RENDERING_STAGE_POST_RASTER); CVkClearColorCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, ClearColor); - pCmd->AddDependency(pImage, DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION); pCmd->r = fR; pCmd->g = fG; pCmd->b = fB; @@ -251,8 +241,6 @@ void CVkRenderCommandList::ResolveImage( IImage *pOriginal, IImage *pResolved ) pCmd->stInputImage.m_pSingle = pOriginal; pCmd->stOutputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE; pCmd->stOutputImage.m_pSingle = pResolved; - pCmd->AddDependency(pOriginal, DEPENDENCY_MODE_IMAGE_RESOLVE_SOURCE); - pCmd->AddDependency(pResolved, DEPENDENCY_MODE_IMAGE_RESOLVE_DESTINATION); m_pPostRaster->AddCommand(pCmd); } @@ -266,18 +254,37 @@ void CVkRenderCommandList::EndRecording() { SwitchRenderingStage(RENDERING_STAGE_FINISHED); } - -void CVkRenderCommandList::Barrier( IRenderingObject *pObject, bool bIsRead, bool bIsWrite ) +void CVkRenderCommandList::Barrier( EStageHazard eBefore, EStageHazard eAfter, uint32_t hazard ) { - m_barriers.AppendTail({pObject, bIsRead, bIsWrite}); + SwitchRenderingStage(RENDERING_STAGE_POST_RASTER); + CVkBarrierCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, Barrier); + pCmd->eStageIn = eBefore; + pCmd->eStageOut = eAfter; + pCmd->eHazard = hazard; + m_pPostRaster->AddCommand(pCmd); + } + +void CVkRenderCommandList::BarrierTransition( IImage *pObject, EImageLayoutHazard old_layout, EImageLayoutHazard layout, EStageHazard eBefore, EStageHazard eAfter, uint32_t hazard ) +{ + SwitchRenderingStage(RENDERING_STAGE_POST_RASTER); + CVkLayoutBarrierCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, LayoutBarrier); + pCmd->eStageIn = eBefore; + pCmd->eStageOut = eAfter; + pCmd->eHazard = hazard; + pCmd->pImage = pObject; + pCmd->eLayoutIn = old_layout; + pCmd->eLayoutOut = layout; + m_pPostRaster->AddCommand(pCmd); + +} + void CVkRenderCommandList::DispatchCompute( uint32_t uX, uint32_t uY, uint32_t uZ ) { SwitchRenderingStage(RENDERING_STAGE_POST_RASTER); CVkDispatchCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, Dispatch); - FlushBarriers(pCmd); pCmd->uX = uX; pCmd->uY = uY; pCmd->uZ = uZ; @@ -293,38 +300,6 @@ void CVkRenderCommandList::Submit() } } -void CVkRenderCommandList::FlushBarriers( CVkCommand *pCmd ) -{ - for ( auto &b: m_barriers ) - { - if (dynamic_cast(b.pObject)) - { - if (b.m_bIsRead) - if (b.m_bIsWrite) - pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_BUFFER_READ_WRITE); - else - pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_BUFFER_READ); - else - if (b.m_bIsWrite) - pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_BUFFER_WRITE); - - } - if (dynamic_cast(b.pObject)) - { - if (b.m_bIsRead) - if (b.m_bIsWrite) - pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_IMAGE_READ_WRITE); - else - pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_IMAGE_READ); - else - if (b.m_bIsWrite) - pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_IMAGE_WRITE); - - } - } - m_barriers = {}; -} - void CVkRenderCommandList::SwitchRenderingStage( EVulkanRenderingStage eStage ) { if (eStage != RENDERING_STAGE_RASTER) diff --git a/materialsystem/vulkan/rendercontext.cpp b/materialsystem/vulkan/rendercontext.cpp index d394f72..6d90b3d 100644 --- a/materialsystem/vulkan/rendercontext.cpp +++ b/materialsystem/vulkan/rendercontext.cpp @@ -45,9 +45,6 @@ struct VulkanWindow_t VkSurfaceKHR m_surface; VkSwapchainKHR m_swapchain; VkFormat m_eFormat; - VkFence m_fences[FRAMES_IN_FLIGHT]; - VkSemaphore m_imageAvailable[FRAMES_IN_FLIGHT]; - VkSemaphore m_renderFinished[FRAMES_IN_FLIGHT]; CUtlVector m_images; uint32_t m_uCurrentFrame; }; @@ -58,21 +55,13 @@ CVkImage::CVkImage() } -CVkImage::CVkImage( uint32_t nWidth, uint32_t nHeight, uint32_t nDepth, EImageFormat eFormat, EMultisampleType eMultisampleType, EImageType eImageType, VkImageUsageFlagBits eUsage ) +CVkImage::CVkImage( uint32_t nWidth, uint32_t nHeight, uint32_t nDepth, EImageFormat eFormat, EMultisampleType eMultisampleType, EImageType eImageType, VkImageUsageFlags eUsage ) { m_nWidth = nWidth; m_nHeight = nHeight; m_eMultisampleType = eMultisampleType; m_eImageType = eImageType; m_eFormat = eFormat; - if (eFormat == IMAGE_FORMAT_D32_SFLOAT) - m_ePreferredLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL; - else - if (eUsage == VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) - m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - else - m_ePreferredLayout = VK_IMAGE_LAYOUT_GENERAL; - CreateImage(nWidth, nHeight, eFormat, eMultisampleType, eUsage); CreateImageView(); } @@ -186,7 +175,7 @@ VkSampleCountFlagBits CVkImage::GetMultisampling( enum EMultisampleType eImageFo } } -void CVkImage::CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType, VkImageUsageFlagBits eUsage ) +void CVkImage::CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType, VkImageUsageFlags eUsage ) { VkImageCreateInfo stCreateInfo = {}; VmaAllocationCreateInfo stAlloc = {}; @@ -233,7 +222,13 @@ void CVkImage::CreateImageView() } void CVkImage::SetDebugName( const char *szName ) { + VkDebugUtilsObjectNameInfoEXT nameInfo = {}; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.objectType = VK_OBJECT_TYPE_IMAGE; + nameInfo.objectHandle = (uint64_t)m_image; + nameInfo.pObjectName = szName; + vkSetDebugUtilsObjectNameEXT(s_vkDevice, &nameInfo); } @@ -421,12 +416,21 @@ uint32_t CVkTextureArray::CreateTexture( uint32_t i, const char *szPath ) stbi_image_free(pImg); + CVkLayoutBarrierCommand *pBarrierCommand = NULL; CVkCopyBufferToImageCommand *pCopyCommand = NULL; + IVkCommandBuffer *pCommandBuffer = m_pCommandBufferManager->CreateCommandBuffer(); pCommandBuffer->Reset(); + + pBarrierCommand = CREATE_COMMAND(m_pCommandBufferManager, LayoutBarrier); + pBarrierCommand->pImage = pImage; + pBarrierCommand->eHazard = 0; + pBarrierCommand->eStageIn = STAGE_HAZARD_NONE; + pBarrierCommand->eStageOut = STAGE_HAZARD_TRANSFER; + pBarrierCommand->eLayoutIn = IMAGE_LAYOUT_UNDEFINED; + pBarrierCommand->eLayoutOut = IMAGE_LAYOUT_TRANSFER_DST; + pCommandBuffer->AddCommand(pBarrierCommand); pCopyCommand = CREATE_COMMAND(m_pCommandBufferManager, CopyBufferToImage); - pCopyCommand->AddDependency((IRenderingObject*)pBuffer, DEPENDENCY_MODE_BUFFER_SOURCE); - pCopyCommand->AddDependency((IRenderingObject*)pImage, DEPENDENCY_MODE_IMAGE_DESTINATION); pCopyCommand->pBuffer = pBuffer; pCopyCommand->stOutputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE; pCopyCommand->stOutputImage.m_pSingle = pImage; @@ -502,7 +506,7 @@ public: virtual void *GetVulkanInstance() override; virtual void *GetVulkanPhysicalDevice() override; virtual void *GetVulkanDevice() override; - virtual IImage *CreateImageFromVkImage( void *pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType ) override; + virtual IImage *CreateImageFromVkImage( uint64_t pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType ) override; private: VkPhysicalDevice SelectPhysicalDevice( CUtlVector physicalDevices ); CUtlVector GetDeviceExtensions(); @@ -593,14 +597,13 @@ IBuffer *CVkRenderContext::CreateBufferAligned( uint32_t nSize, uint32_t nAlignm IImage *CVkRenderContext::CreateRenderTarget( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) { if (eFormat == IMAGE_FORMAT_D32_SFLOAT) - return new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT); + return new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT); else - return new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); + return new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT); } IImage *CVkRenderContext::CreateTexture( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) { CVkImage *pImage = new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_SAMPLED_BIT); - pImage->m_ePreferredLayout = VK_IMAGE_LAYOUT_GENERAL; return pImage; } @@ -734,7 +737,7 @@ void *CVkRenderContext::GetVulkanDevice() return s_vkDevice; } -IImage *CVkRenderContext::CreateImageFromVkImage( void *pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType ) +IImage *CVkRenderContext::CreateImageFromVkImage( uint64_t pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType ) { CVkImage *pImage; pImage = new CVkImage; @@ -744,7 +747,6 @@ IImage *CVkRenderContext::CreateImageFromVkImage( void *pVkImage, uint32_t x, ui pImage->m_eFormat = eFormat; pImage->m_nHeight = x; pImage->m_nWidth = y; - pImage->m_ePreferredLayout = (VkImageLayout)optimalLayout; pImage->CreateImageView(); return pImage; } @@ -798,6 +800,7 @@ void CVkRenderContext::Init() stInstanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; stInstanceCreateInfo.pApplicationInfo = &stApplicationInfo; enabledInstanceExtensions.AppendTail(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); + enabledInstanceExtensions.AppendTail(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); stInstanceCreateInfo.enabledExtensionCount = enabledInstanceExtensions.GetSize(); stInstanceCreateInfo.ppEnabledExtensionNames = enabledInstanceExtensions.GetData(); @@ -862,6 +865,7 @@ void CVkRenderContext::Init() vk12Features.runtimeDescriptorArray = VK_TRUE; vk12Features.descriptorBindingPartiallyBound = VK_TRUE; vk12Features.descriptorBindingVariableDescriptorCount = VK_TRUE; + vk12Features.timelineSemaphore = VK_TRUE; VkPhysicalDeviceVulkan11Features vk11Features = {}; vk11Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES; vk11Features.pNext = &vk12Features; @@ -925,13 +929,10 @@ void CVkRenderContext::Init() vkCreateSampler(s_vkDevice, &samplerInfo, nullptr, &m_defaultSampler.m_sampler); } +#include "time.h" void CVkRenderContext::Frame( float fDeltaTime ) { - uint32_t i; - CUtlVector fences = {}; - CUtlVector imageReady = {}; - CUtlVector renderFinish = {}; CUtlVector swapchains = {}; CUtlVector uImageIndexes = {}; CUtlVector uSwapchainImageIndexes = {}; @@ -961,24 +962,25 @@ void CVkRenderContext::Frame( float fDeltaTime ) for ( auto &s: m_renderWindows) { - fences.AppendTail(s.m_fences[s.m_uCurrentFrame]); - imageReady.AppendTail(s.m_imageAvailable[s.m_uCurrentFrame]); - renderFinish.AppendTail(s.m_renderFinished[s.m_uCurrentFrame]); swapchains.AppendTail(s.m_swapchain); uImageIndexes.AppendTail(s.m_uCurrentFrame); } uSwapchainImageIndexes.Resize(m_renderWindows.GetSize()); - - vkWaitForFences(s_vkDevice, fences.GetSize(), fences.GetData(), VK_TRUE, UINT64_MAX); - vkResetFences(s_vkDevice, fences.GetSize(), fences.GetData()); - + VkFence fence; + VkFenceCreateInfo fci = {}; + fci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; + fci.flags = VK_FENCE_CREATE_SIGNALED_BIT; + vkCreateFence(s_vkDevice, &fci, NULL, &fence); i = 0; for ( auto &s: m_renderWindows ) { - VkResult r = vkAcquireNextImageKHR(s_vkDevice, s.m_swapchain, UINT64_MAX, s.m_imageAvailable[s.m_uCurrentFrame], NULL, &uSwapchainImageIndexes[i]); + vkResetFences(s_vkDevice, 1, &fence); + VkResult r = vkAcquireNextImageKHR(s_vkDevice, s.m_swapchain, UINT64_MAX, NULL, fence, &uSwapchainImageIndexes[i]); + vkWaitForFences(s_vkDevice, 1, &fence, true, UINT64_MAX); i++; } + vkDestroyFence(s_vkDevice, fence, 0); if (m_pXRManager) m_pXRManager->PreRender(); @@ -987,13 +989,11 @@ void CVkRenderContext::Frame( float fDeltaTime ) pList->StartRecording(); - double a = Plat_GetTime(); i = 0; for ( auto &s: m_renderWindows ) { - CVkBlitCommand *pBlitCommand = NULL; if (s.m_pWindow->GetOutputImage()) { @@ -1007,7 +1007,23 @@ void CVkRenderContext::Frame( float fDeltaTime ) dst.m_iHeight = s.m_pWindow->GetRenderHeight(); dst.m_iX = 0; dst.m_iY = 0; + pList->BarrierTransition( + s.m_pWindow->GetOutputImage(), + IMAGE_LAYOUT_GENERAL, IMAGE_LAYOUT_TRANSFER_SRC, + STAGE_HAZARD_NONE, STAGE_HAZARD_TRANSFER, 0); + pList->BarrierTransition( + s.m_images[uSwapchainImageIndexes[i]], + IMAGE_LAYOUT_UNDEFINED, IMAGE_LAYOUT_TRANSFER_DST, + STAGE_HAZARD_NONE, STAGE_HAZARD_TRANSFER, 0); pList->BlitImageToImage(s.m_pWindow->GetOutputImage(), src, s.m_images[uSwapchainImageIndexes[i]], dst); + pList->BarrierTransition( + s.m_pWindow->GetOutputImage(), + IMAGE_LAYOUT_TRANSFER_SRC, IMAGE_LAYOUT_GENERAL, + STAGE_HAZARD_TRANSFER, STAGE_HAZARD_NONE, 0); + pList->BarrierTransition( + s.m_images[uSwapchainImageIndexes[i]], + IMAGE_LAYOUT_TRANSFER_DST, IMAGE_LAYOUT_PRESENT, + STAGE_HAZARD_TRANSFER, STAGE_HAZARD_NONE, 0); } i++; } @@ -1017,34 +1033,54 @@ void CVkRenderContext::Frame( float fDeltaTime ) if (m_pXRManager) m_pXRManager->CopySwapchain(); + VkSemaphoreTypeCreateInfo timelineInfo = {}; + timelineInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO; + timelineInfo.pNext = NULL; + timelineInfo.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE; + timelineInfo.initialValue = 0; + VkSemaphoreCreateInfo semaphore_ci = {}; + semaphore_ci.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + semaphore_ci.pNext = &timelineInfo; + VkSemaphore semaphore = {}; + vkCreateSemaphore(s_vkDevice, &semaphore_ci, NULL, &semaphore); VkPipelineStageFlags uPipelineStageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; VkSubmitInfo stSubmitInfo = {}; stSubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - stSubmitInfo.waitSemaphoreCount = imageReady.GetSize(); - stSubmitInfo.pWaitSemaphores = imageReady.GetData(); stSubmitInfo.pWaitDstStageMask = &uPipelineStageFlags; stSubmitInfo.commandBufferCount = m_pCommandBufferManager->GetVulkanCommands().GetSize(); stSubmitInfo.pCommandBuffers = m_pCommandBufferManager->GetVulkanCommands().GetData(); - stSubmitInfo.signalSemaphoreCount = renderFinish.GetSize(); - stSubmitInfo.pSignalSemaphores = renderFinish.GetData(); + stSubmitInfo.signalSemaphoreCount = 1; + stSubmitInfo.pSignalSemaphores = &semaphore; + const uint64_t v = 1; + VkTimelineSemaphoreSubmitInfo tssi = {}; + tssi.sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO; + tssi.signalSemaphoreValueCount = 1; + tssi.pSignalSemaphoreValues = &v; + stSubmitInfo.pNext = &tssi; - vkQueueSubmit(s_vkDrawQueue, 1, &stSubmitInfo, fences[0]); + double a = Plat_GetTime(); + vkQueueSubmit(s_vkDrawQueue, 1, &stSubmitInfo, 0); + VkSemaphoreWaitInfo wi = {}; + wi.sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO; + wi.semaphoreCount = 1; + wi.pSemaphores = &semaphore; + wi.pValues = &v; + vkWaitSemaphores(s_vkDevice, &wi, UINT64_MAX); VkPresentInfoKHR stPresentInfo = {}; stPresentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; - stPresentInfo.waitSemaphoreCount = renderFinish.GetSize(); - stPresentInfo.pWaitSemaphores = renderFinish.GetData(); stPresentInfo.swapchainCount = swapchains.GetSize(); stPresentInfo.pSwapchains = swapchains.GetData(); stPresentInfo.pImageIndices = uImageIndexes.GetData(); vkQueuePresentKHR(s_vkPresentQueue, &stPresentInfo); vkDeviceWaitIdle(s_vkDevice); + vkDestroySemaphore(s_vkDevice, semaphore, NULL); if (m_pXRManager) m_pXRManager->PostRender(); @@ -1116,6 +1152,7 @@ VulkanWindow_t CVkRenderContext::CreateSwapchain( IGameWindow *pWindow ) for (auto &format: surfaceFormats) { + for (int i = 0; i < sizeof(preferedSurfaceFormats)/sizeof(VkFormat); i++) { if (format.format == preferedSurfaceFormats[i]) @@ -1126,6 +1163,7 @@ VulkanWindow_t CVkRenderContext::CreateSwapchain( IGameWindow *pWindow ) } } formatPicked: + V_printf("Surface format: %s\n", string_VkFormat(stSelectedFormat.format)); vkGetPhysicalDeviceSurfacePresentModesKHR(s_vkPhysicalDevice, window.m_surface, &nSurfacePresentModes, NULL); surfacePresentModes.Resize(nSurfacePresentModes); @@ -1165,20 +1203,9 @@ formatPicked: pImage->m_eFormat = IMAGE_FORMAT_BGRA8_UNORM; pImage->m_nHeight = pWindow->GetRenderWidth(); pImage->m_nWidth = pWindow->GetRenderHeight(); - pImage->m_ePreferredLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; pImage->CreateImageView(); window.m_images[i] = pImage; } - for ( int i = 0; i < FRAMES_IN_FLIGHT; i++ ) - { - stFenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - stFenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; - vkCreateFence(s_vkDevice, &stFenceCreateInfo, NULL, &window.m_fences[i]); - - stSemaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - vkCreateSemaphore(s_vkDevice, &stSemaphoreCreateInfo, NULL, &window.m_imageAvailable[i]); - vkCreateSemaphore(s_vkDevice, &stSemaphoreCreateInfo, NULL, &window.m_renderFinished[i]); - } window.m_pWindow = pWindow; return window; @@ -1193,12 +1220,6 @@ void CVkRenderContext::DestroySwapchain( uint32_t uIndex ) } vkDestroySwapchainKHR(s_vkDevice, m_renderWindows[uIndex].m_swapchain, NULL); m_renderWindows[uIndex].m_pWindow->DestroyVulkanSurface(s_vkInstance); - for ( int i = 0; i < FRAMES_IN_FLIGHT; i++ ) - { - vkDestroyFence(s_vkDevice, m_renderWindows[uIndex].m_fences[i], NULL); - vkDestroySemaphore(s_vkDevice, m_renderWindows[uIndex].m_imageAvailable[i], NULL); - vkDestroySemaphore(s_vkDevice, m_renderWindows[uIndex].m_renderFinished[i], NULL); - } } //----------------------------------------------------------------------------- diff --git a/materialsystem/vulkan/utils.cpp b/materialsystem/vulkan/utils.cpp index b4e3d9e..bfe127a 100644 --- a/materialsystem/vulkan/utils.cpp +++ b/materialsystem/vulkan/utils.cpp @@ -13,108 +13,6 @@ IRenderingObject *VulkanGetObject( VkFrameObject_t stObject, int iIndex ) return NULL; } } - -VkAccessFlags2 VulkanGetAccessFlags( EDependencyMode eMode ) -{ - switch (eMode) - { - case DEPENDENCY_MODE_JUST_CREATED: return VK_ACCESS_2_NONE; - case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR; - case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - case DEPENDENCY_MODE_DRAWCALL_MIXED_IMAGE: return VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR | VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR; - case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_ACCESS_2_TRANSFER_WRITE_BIT; - case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_ACCESS_2_NONE; - case DEPENDENCY_MODE_SHADER_BUFFER_READ: return VK_ACCESS_2_SHADER_READ_BIT; - case DEPENDENCY_MODE_SHADER_BUFFER_WRITE: return VK_ACCESS_2_SHADER_READ_BIT; - case DEPENDENCY_MODE_SHADER_BUFFER_READ_WRITE: return VK_ACCESS_2_SHADER_READ_BIT | VK_ACCESS_2_SHADER_WRITE_BIT; - case DEPENDENCY_MODE_SHADER_IMAGE_READ: return VK_ACCESS_2_SHADER_READ_BIT; - case DEPENDENCY_MODE_SHADER_IMAGE_WRITE: return VK_ACCESS_2_SHADER_READ_BIT; - case DEPENDENCY_MODE_SHADER_IMAGE_READ_WRITE: return VK_ACCESS_2_SHADER_READ_BIT | VK_ACCESS_2_SHADER_WRITE_BIT; - - case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE: - case DEPENDENCY_MODE_IMAGE_SOURCE: - case DEPENDENCY_MODE_BUFFER_SOURCE: - case DEPENDENCY_MODE_IMAGE_RESOLVE_SOURCE: - return VK_ACCESS_2_TRANSFER_READ_BIT; - - case DEPENDENCY_MODE_IMAGE_DESTINATION: - case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION: - case DEPENDENCY_MODE_BUFFER_DESTINATION: - case DEPENDENCY_MODE_IMAGE_RESOLVE_DESTINATION: - return VK_ACCESS_2_TRANSFER_WRITE_BIT; - - default: - return VK_ACCESS_2_NONE; - } -} - -VkPipelineStageFlags2 VulkanGetStageFlags( EDependencyMode eMode ) -{ - switch (eMode) - { - case DEPENDENCY_MODE_JUST_CREATED: return VK_PIPELINE_STAGE_2_NONE; - case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; - case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT; - case DEPENDENCY_MODE_DRAWCALL_MIXED_IMAGE: return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; - case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_PIPELINE_STAGE_2_TRANSFER_BIT; - case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; - - case DEPENDENCY_MODE_SHADER_BUFFER_READ: return VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT; - case DEPENDENCY_MODE_SHADER_BUFFER_WRITE: return VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT; - case DEPENDENCY_MODE_SHADER_BUFFER_READ_WRITE: return VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT; - case DEPENDENCY_MODE_SHADER_IMAGE_READ: return VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT; - case DEPENDENCY_MODE_SHADER_IMAGE_WRITE: return VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT; - case DEPENDENCY_MODE_SHADER_IMAGE_READ_WRITE: return VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT; - - case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE: - case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION: - return VK_PIPELINE_STAGE_2_BLIT_BIT; - - case DEPENDENCY_MODE_BUFFER_SOURCE: - case DEPENDENCY_MODE_IMAGE_SOURCE: - case DEPENDENCY_MODE_BUFFER_DESTINATION: - case DEPENDENCY_MODE_IMAGE_DESTINATION: - return VK_PIPELINE_STAGE_2_COPY_BIT; - - case DEPENDENCY_MODE_IMAGE_RESOLVE_SOURCE: - case DEPENDENCY_MODE_IMAGE_RESOLVE_DESTINATION: - return VK_PIPELINE_STAGE_2_RESOLVE_BIT; - - default: - return VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT; - } -} - -VkImageLayout VulkanGetImageLayout( EDependencyMode eMode ) -{ - switch (eMode) - { - case DEPENDENCY_MODE_JUST_CREATED: return VK_IMAGE_LAYOUT_UNDEFINED; - case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL; - case DEPENDENCY_MODE_DRAWCALL_MIXED_IMAGE: return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; - case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE: - case DEPENDENCY_MODE_IMAGE_SOURCE: - case DEPENDENCY_MODE_BUFFER_SOURCE: - case DEPENDENCY_MODE_IMAGE_RESOLVE_SOURCE: - return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; - case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION: - case DEPENDENCY_MODE_IMAGE_DESTINATION: - case DEPENDENCY_MODE_BUFFER_DESTINATION: - case DEPENDENCY_MODE_IMAGE_RESOLVE_DESTINATION: - return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - - case DEPENDENCY_MODE_SHADER_IMAGE_READ: - case DEPENDENCY_MODE_SHADER_IMAGE_WRITE: - case DEPENDENCY_MODE_SHADER_IMAGE_READ_WRITE: - return VK_IMAGE_LAYOUT_GENERAL; - - default: - return VK_IMAGE_LAYOUT_UNDEFINED; - } -} VkFormat VulkanGetVertexFormat( EVertexFormat eFormat ) { switch (eFormat) diff --git a/materialsystem/vulkan/vulkan_state.h b/materialsystem/vulkan/vulkan_state.h index 5ffde23..2a0d10e 100644 --- a/materialsystem/vulkan/vulkan_state.h +++ b/materialsystem/vulkan/vulkan_state.h @@ -41,57 +41,6 @@ enum EVulkanCommandParameterType VULKAN_PARAMETER_TYPE_IMAGE, }; -enum EDependencyMode -{ - DEPENDENCY_MODE_JUST_CREATED, - - DEPENDENCY_MODE_SHADER_IMAGE_READ, - DEPENDENCY_MODE_SHADER_BUFFER_READ, - DEPENDENCY_MODE_SHADER_IMAGE_WRITE, - DEPENDENCY_MODE_SHADER_BUFFER_WRITE, - DEPENDENCY_MODE_SHADER_BUFFER_READ_WRITE, - DEPENDENCY_MODE_SHADER_IMAGE_READ_WRITE, - DEPENDENCY_MODE_SHADER_ACCELERATION_STRUCTURE, - - DEPENDENCY_MODE_DRAWCALL_VERTEX_BUFFER, - DEPENDENCY_MODE_DRAWCALL_INDEX_BUFFER, - DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE, - DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE, - DEPENDENCY_MODE_DRAWCALL_INPUT_IMAGE, - DEPENDENCY_MODE_DRAWCALL_MIXED_IMAGE, - - DEPENDENCY_MODE_BUFFER_SOURCE, - DEPENDENCY_MODE_IMAGE_SOURCE, - DEPENDENCY_MODE_IMAGE_DESTINATION, - DEPENDENCY_MODE_BUFFER_DESTINATION, - - DEPENDENCY_MODE_IMAGE_RESOLVE_SOURCE, - DEPENDENCY_MODE_IMAGE_RESOLVE_DESTINATION, - - DEPENDENCY_MODE_BLIT_IMAGE_SOURCE, - DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION, - - DEPENDENCY_MODE_COLOR_CLEAR_SOURCE, - DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION, - - DEPENDENCY_MODE_ALL_COMMANDS, - DEPENDENCY_MODE_IMAGE_PRESENT, - - DEPENDENCY_MODE_NEXT_STAGE, - - DEPENDENCY_MODE_COUNT, -}; - - -struct VulkanCommandDepenency_t { - IRenderingObject *m_pObject; - EDependencyMode m_eDependencyMode; -}; -struct VulkanCommandSwapchainDepenency_t { - IRenderingObject **m_ppObjects; - EDependencyMode m_eDependencyMode; -}; - struct VulkanCommandParameter_t { const char *m_szName; @@ -109,12 +58,7 @@ public: virtual ~CVkCommand() = default; //virtual const char *GetName(); - CUtlVector m_dependencies = {}; - CUtlVector m_swapchainDependencies = {}; EVulkanCommandType m_eType; - - void AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode ); - void AddSwapchainDependency( IRenderingObject **ppObjects, EDependencyMode eDependencyMode ); }; class IVkCommandBufferManager; @@ -125,7 +69,7 @@ public: virtual void AddCommand( CVkCommand *pCommand ) = 0; virtual void Reset() = 0; - virtual void Submit( int iFrameIndex = 0 ) = 0; + virtual void Submit() = 0; virtual void Render() = 0; }; @@ -157,7 +101,7 @@ class CVk##name##Command : public CVkCommand \ public: \ virtual void Execute( VkCommandBuffer hCommandBuffer, int iCurrentFrame ) override; \ -#define END_VULKAN_COMMAND( name ) \ +#define END_VULKAN_COMMAND() \ }; \ #define DECLARE_VULKAN_COMMAND(name) \ @@ -177,7 +121,7 @@ class CVkImage: public IImage { public: CVkImage(); - CVkImage( uint32_t nWidth, uint32_t nHeight, uint32_t nDepth, EImageFormat eFormat, EMultisampleType eMultisampleType, EImageType eImageType, VkImageUsageFlagBits eUsage ); + CVkImage( uint32_t nWidth, uint32_t nHeight, uint32_t nDepth, EImageFormat eFormat, EMultisampleType eMultisampleType, EImageType eImageType, VkImageUsageFlags eUsage ); ~CVkImage(); virtual void SetDebugName( const char *szName ) override; @@ -186,7 +130,7 @@ public: virtual EImageFormat GetImageFormat() override; virtual EMultisampleType GetMultisampleType() override; - void CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType, VkImageUsageFlagBits eUsage ); + void CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType, VkImageUsageFlags eUsage ); void CreateImageView(); static VkImageViewType GetImageViewType( enum EImageType eImageType ); @@ -204,10 +148,6 @@ public: VmaAllocation m_allocation; VkImageSubresourceRange m_range; - VkImageLayout m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - VkImageLayout m_eImageLayout = VK_IMAGE_LAYOUT_UNDEFINED; - EDependencyMode m_eLastUsage = DEPENDENCY_MODE_JUST_CREATED; VkDescriptorType m_eDescriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; }; @@ -433,6 +373,7 @@ enum EVulkanRenderingStage RENDERING_STAGE_RASTER, RENDERING_STAGE_POST_RASTER, RENDERING_STAGE_FINISHED, + RENDERING_STAGE_SYNC, }; struct VulkanMaterialCommandBuffer_t @@ -508,7 +449,8 @@ public: virtual void StartRecording() override; virtual void EndRecording() override; - virtual void Barrier( IRenderingObject *pObject, bool bIsRead, bool bIsWrite ) override; + virtual void Barrier( EStageHazard eBefore, EStageHazard eAfter, uint32_t hazard ) override; + virtual void BarrierTransition( IImage *pObject, EImageLayoutHazard old_layout, EImageLayoutHazard layout, EStageHazard eBefore, EStageHazard eAfter, uint32_t hazard ) override; virtual void DispatchCompute( uint32_t uX, uint32_t uY, uint32_t uZ ) override; virtual void CopyImageToImage( IImage *pSrc, IImage *pDst ) override; @@ -517,7 +459,6 @@ public: virtual void ClearDepth( IImage *pImage, float fVal ) override; void Submit(); - void FlushBarriers( CVkCommand *pCmd ); IVkCommandBufferManager *m_pCommandBufferManager; private: @@ -539,7 +480,6 @@ private: uint32_t m_uHeight; CUtlVector m_pCommandBuffers = {}; CUtlVector m_pScheduledDestroyPostRaster = {}; - CUtlVector m_barriers = {}; EVulkanRenderingStage m_eCurrentStage = RENDERING_STAGE_SETUP_RASTER; }; @@ -547,9 +487,6 @@ private: IRenderingObject *VulkanGetObject( VkFrameObject_t stObject, int iIndex ); -VkAccessFlags2 VulkanGetAccessFlags( EDependencyMode eMode ); -VkPipelineStageFlags2 VulkanGetStageFlags( EDependencyMode eMode ); -VkImageLayout VulkanGetImageLayout( EDependencyMode eMode ); VkFormat VulkanGetVertexFormat( EVertexFormat eFormat ); VkPrimitiveTopology VulkanGetTopology( ETopologyMode eMode ); VkShaderStageFlagBits VulkanGetShaderStage( EShaderStage eStage ); diff --git a/public/materialsystem/imaterialsystem.h b/public/materialsystem/imaterialsystem.h index 3ce44c0..a636b7b 100644 --- a/public/materialsystem/imaterialsystem.h +++ b/public/materialsystem/imaterialsystem.h @@ -314,6 +314,35 @@ struct ImageSector_t int32_t m_iHeight; }; +enum EBarrierHazard +{ + BARRIER_HAZARD_DRAW_ARGUMENTS = 0x1, + BARRIER_HAZARD_DESCRIPTOR = 0x2, + BARRIER_HAZARD_DEPTH_STENCIL = 0x4, + BARRIER_HAZARD_RASTER_COLOR = 0x8, +}; + +enum EStageHazard +{ + STAGE_HAZARD_NONE = 0, + STAGE_HAZARD_TRANSFER, + STAGE_HAZARD_COMPUTE, + STAGE_HAZARD_RASTER_COLOR_OUT, + STAGE_HAZARD_RASTER_EARLY_DEPTH_OUT, + STAGE_HAZARD_RASTER_LATE_DEPTH_OUT, +}; + +enum EImageLayoutHazard +{ + IMAGE_LAYOUT_UNDEFINED, + IMAGE_LAYOUT_GENERAL, + IMAGE_LAYOUT_COLOR, + IMAGE_LAYOUT_DEPTH_STENCIL, + IMAGE_LAYOUT_PRESENT, + IMAGE_LAYOUT_TRANSFER_SRC, + IMAGE_LAYOUT_TRANSFER_DST, +}; + abstract_class IRenderCommandList { public: @@ -342,7 +371,8 @@ public: virtual void StartRecording() = 0; virtual void EndRecording() = 0; - virtual void Barrier( IRenderingObject *pObject, bool bIsRead, bool bIsWrite ) = 0; + virtual void Barrier( EStageHazard eBefore, EStageHazard eAfter, uint32_t hazard ) = 0; + virtual void BarrierTransition( IImage *pObject, EImageLayoutHazard old_layout, EImageLayoutHazard layout, EStageHazard eBefore, EStageHazard eAfter, uint32_t hazard ) = 0; virtual void CopyImageToImage( IImage *pSrc, IImage *pDst ) = 0; virtual void BlitImageToImage( IImage *pSrc, ImageSector_t src, IImage *pDst, ImageSector_t dst ) = 0; virtual void ClearImage( IImage *pImage, float fR, float fG, float fB, float fA ) = 0; @@ -395,7 +425,7 @@ public: virtual void *GetVulkanInstance() = 0; virtual void *GetVulkanPhysicalDevice() = 0; virtual void *GetVulkanDevice() = 0; - virtual IImage *CreateImageFromVkImage( void *pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType ) = 0; + virtual IImage *CreateImageFromVkImage( uint64_t pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType ) = 0; }; #define RENDER_CONTEXT_INTERFACE_VERSION "RenderContext001"