diff --git a/src/engine/EngineContext.cpp b/src/engine/EngineContext.cpp index b1b2415..7d84227 100644 --- a/src/engine/EngineContext.cpp +++ b/src/engine/EngineContext.cpp @@ -155,7 +155,7 @@ namespace fgl::engine camera_controller.moveInPlaneXZ( m_window.window(), delta_time, viewer ); camera.setView( viewer.getPosition(), viewer.getRotation() ); - if ( auto& command_buffer = m_renderer.beginFrame(); *command_buffer ) + if ( auto [ command_buffer, gui_command_buffer ] = m_renderer.beginFrame(); *command_buffer ) { preStage( command_buffer ); @@ -168,6 +168,7 @@ namespace fgl::engine FrameInfo frame_info { frame_index, delta_time, command_buffer, + gui_command_buffer, { camera, viewer.m_transform }, global_descriptor_sets[ frame_index ], m_game_objects_root, diff --git a/src/engine/FrameInfo.hpp b/src/engine/FrameInfo.hpp index 9cc2825..27abb52 100644 --- a/src/engine/FrameInfo.hpp +++ b/src/engine/FrameInfo.hpp @@ -65,7 +65,6 @@ namespace fgl::engine using GBufferDescriptorSet = DescriptorSetLayout< 0, PositionDescriptor, NormalDescriptor, AlbedoDescriptor >; - using CompositeDescriptor = AttachmentDescriptor< 0, vk::ShaderStageFlagBits::eFragment >; using GBufferCompositeDescriptorSet = DescriptorSetLayout< 0, CompositeDescriptor >; @@ -76,7 +75,9 @@ namespace fgl::engine { std::uint16_t frame_idx; float frame_time; + vk::raii::CommandBuffer& command_buffer; + vk::raii::CommandBuffer& gui_command_buffer; struct { diff --git a/src/engine/descriptors/DescriptorSetCollection.hpp b/src/engine/descriptors/DescriptorSetCollection.hpp index 4a3ce4f..a5b4221 100644 --- a/src/engine/descriptors/DescriptorSetCollection.hpp +++ b/src/engine/descriptors/DescriptorSetCollection.hpp @@ -60,7 +60,7 @@ namespace fgl::engine assert( vec.size() > 0 ); assert( vec.size() == binding_sets ); - return createDescriptorSetsT< DescriptorSets... >(); + return vec; } template < std::uint64_t IDX > diff --git a/src/engine/gui/core.cpp b/src/engine/gui/core.cpp index d65f43a..6699d0d 100644 --- a/src/engine/gui/core.cpp +++ b/src/engine/gui/core.cpp @@ -223,7 +223,7 @@ namespace fgl::engine::gui void drawMainGUI( FrameInfo& info ) { ZoneScoped; - TracyVkZone( info.tracy_ctx, *info.command_buffer, "ImGui Rendering" ); + TracyVkZone( info.tracy_ctx, *info.gui_command_buffer, "ImGui Rendering" ); beginImGui(); // TODO: Maybe play with docks again some other time @@ -235,7 +235,7 @@ namespace fgl::engine::gui drawEntityInfo( info ); drawFilesystemGUI( info ); - endImGui( info.command_buffer ); + endImGui( info.gui_command_buffer ); } static GameObject* selected_object { nullptr }; diff --git a/src/engine/rendering/RenderPass.cpp b/src/engine/rendering/RenderPass.cpp index a0cfd77..51bacb2 100644 --- a/src/engine/rendering/RenderPass.cpp +++ b/src/engine/rendering/RenderPass.cpp @@ -22,8 +22,6 @@ namespace fgl::engine info.dependencyCount = static_cast< std::uint32_t >( dependencies.size() ); info.pDependencies = dependencies.data(); - vk::RenderPass render_pass {}; - return device->createRenderPass( info ); } diff --git a/src/engine/rendering/Renderer.cpp b/src/engine/rendering/Renderer.cpp index c02fde6..b782e44 100644 --- a/src/engine/rendering/Renderer.cpp +++ b/src/engine/rendering/Renderer.cpp @@ -65,6 +65,10 @@ namespace fgl::engine VULKAN_HPP_DEFAULT_DISPATCHER.vkGetCalibratedTimestampsEXT ); */ #endif + + alloc_info.level = vk::CommandBufferLevel::eSecondary; + + m_gui_command_buffer = Device::getInstance()->allocateCommandBuffers( alloc_info ); } void Renderer::recreateSwapchain() @@ -93,7 +97,7 @@ namespace fgl::engine } } - vk::raii::CommandBuffer& Renderer::beginFrame() + std::pair< vk::raii::CommandBuffer&, vk::raii::CommandBuffer& > Renderer::beginFrame() { assert( !is_frame_started && "Cannot begin frame while frame is already in progress" ); auto [ result, image_idx ] = m_swapchain->acquireNextImage(); @@ -109,6 +113,7 @@ namespace fgl::engine is_frame_started = true; auto& command_buffer { getCurrentCommandbuffer() }; + auto& gui_command_buffer { getCurrentGuiCommandBuffer() }; vk::CommandBufferBeginInfo begin_info {}; begin_info.pNext = VK_NULL_HANDLE; @@ -117,7 +122,21 @@ namespace fgl::engine command_buffer.begin( begin_info ); - return command_buffer; + vk::CommandBufferInheritanceInfo inheritance_info {}; + inheritance_info.framebuffer = this->getSwapChain().getFrameBuffer( current_image_idx ); + inheritance_info.renderPass = this->getSwapChainRenderPass(); + inheritance_info.subpass = 2; + + vk::CommandBufferBeginInfo gui_begin_info {}; + gui_begin_info.pInheritanceInfo = &inheritance_info; + gui_begin_info.flags = vk::CommandBufferUsageFlagBits::eRenderPassContinue; + + gui_command_buffer.begin( gui_begin_info ); + + setViewport( gui_command_buffer ); + setScissor( gui_command_buffer ); + + return { command_buffer, gui_command_buffer }; } void Renderer::endFrame() @@ -144,12 +163,33 @@ namespace fgl::engine current_frame_idx = static_cast< std::uint16_t >( ( current_frame_idx + 1 ) % SwapChain::MAX_FRAMES_IN_FLIGHT ); } + void Renderer::setViewport( const vk::raii::CommandBuffer& buffer ) + { + vk::Viewport viewport {}; + viewport.x = 0.0f; + viewport.y = 0.0f; + viewport.width = static_cast< float >( m_swapchain->getSwapChainExtent().width ); + viewport.height = static_cast< float >( m_swapchain->getSwapChainExtent().height ); + viewport.minDepth = 0.0f; + viewport.maxDepth = 1.0f; + + std::vector< vk::Viewport > viewports { viewport }; + + buffer.setViewport( 0, viewports ); + } + + void Renderer::setScissor( const vk::raii::CommandBuffer& buffer ) + { + vk::Rect2D scissor { { 0, 0 }, m_swapchain->getSwapChainExtent() }; + + std::vector< vk::Rect2D > scissors { scissor }; + + buffer.setScissor( 0, scissors ); + } + void Renderer::beginSwapchainRendererPass( vk::raii::CommandBuffer& buffer ) { assert( is_frame_started && "Cannot call beginSwapChainRenderPass if frame is not in progress" ); - assert( - *buffer == *getCurrentCommandbuffer() - && "Cannot begin render pass on command buffer from a different frame" ); std::vector< vk::ClearValue > clear_values { m_swapchain->getClearValues() }; @@ -163,29 +203,13 @@ namespace fgl::engine buffer.beginRenderPass( render_pass_info, vk::SubpassContents::eInline ); - vk::Viewport viewport {}; - viewport.x = 0.0f; - viewport.y = 0.0f; - viewport.width = static_cast< float >( m_swapchain->getSwapChainExtent().width ); - viewport.height = static_cast< float >( m_swapchain->getSwapChainExtent().height ); - viewport.minDepth = 0.0f; - viewport.maxDepth = 1.0f; - - vk::Rect2D scissor { { 0, 0 }, m_swapchain->getSwapChainExtent() }; - - std::vector< vk::Viewport > viewports { viewport }; - std::vector< vk::Rect2D > scissors { scissor }; - - buffer.setViewport( 0, viewports ); - buffer.setScissor( 0, scissors ); + setViewport( buffer ); + setScissor( buffer ); } void Renderer::endSwapchainRendererPass( vk::raii::CommandBuffer& buffer ) { assert( is_frame_started && "Cannot call endSwapChainRenderPass if frame is not in progress" ); - assert( - *buffer == *getCurrentCommandbuffer() - && "Cannot end render pass on command buffer from a different frame" ); buffer.endRenderPass(); } diff --git a/src/engine/rendering/Renderer.hpp b/src/engine/rendering/Renderer.hpp index 60f1c8e..d06b50e 100644 --- a/src/engine/rendering/Renderer.hpp +++ b/src/engine/rendering/Renderer.hpp @@ -5,7 +5,6 @@ #pragma once #include -#include #include #include @@ -29,6 +28,7 @@ namespace fgl::engine std::unique_ptr< SwapChain > m_swapchain; std::vector< vk::raii::CommandBuffer > m_command_buffer {}; + std::vector< vk::raii::CommandBuffer > m_gui_command_buffer {}; std::optional< TracyVkCtx > m_tracy_ctx { std::nullopt }; @@ -65,6 +65,8 @@ namespace fgl::engine return m_command_buffer[ current_frame_idx ]; } + vk::raii::CommandBuffer& getCurrentGuiCommandBuffer() { return m_gui_command_buffer[ current_frame_idx ]; } + TracyVkCtx getCurrentTracyCTX() const { #if TRACY_ENABLE @@ -79,8 +81,12 @@ namespace fgl::engine float getAspectRatio() const { return m_swapchain->extentAspectRatio(); } - vk::raii::CommandBuffer& beginFrame(); + std::pair< vk::raii::CommandBuffer&, vk::raii::CommandBuffer& > beginFrame(); void endFrame(); + + void setViewport( const vk::raii::CommandBuffer& buffer ); + void setScissor( const vk::raii::CommandBuffer& buffer ); + void beginSwapchainRendererPass( vk::raii::CommandBuffer& buffer ); void endSwapchainRendererPass( vk::raii::CommandBuffer& buffer ); diff --git a/src/engine/systems/GuiSystem.cpp b/src/engine/systems/GuiSystem.cpp index 635cac4..30a0efc 100644 --- a/src/engine/systems/GuiSystem.cpp +++ b/src/engine/systems/GuiSystem.cpp @@ -25,8 +25,7 @@ namespace fgl::engine vk::raii::CommandBuffer& GuiSystem::setupSystem( FrameInfo& info ) { - auto& command_buffer { info.command_buffer }; - command_buffer.nextSubpass( vk::SubpassContents::eInline ); + auto& command_buffer { info.gui_command_buffer }; m_pipeline ->bindDescriptor( command_buffer, GBufferCompositeDescriptorSet::m_set_idx, info.gbuffer_composite_set ); @@ -44,6 +43,11 @@ namespace fgl::engine //Handle GUI gui::drawMainGUI( info ); + + command_buffer.end(); + + info.command_buffer.nextSubpass( vk::SubpassContents::eSecondaryCommandBuffers ); + info.command_buffer.executeCommands( { info.gui_command_buffer } ); } } // namespace fgl::engine diff --git a/src/engine/tree/octtree/OctTreeNode.hpp b/src/engine/tree/octtree/OctTreeNode.hpp index 72560dc..4821116 100644 --- a/src/engine/tree/octtree/OctTreeNode.hpp +++ b/src/engine/tree/octtree/OctTreeNode.hpp @@ -127,7 +127,7 @@ namespace fgl::engine CoordinateSpace::World >& frustum ) { ZoneScoped; - std::vector< OctTreeNodeLeaf* > leafs; + std::vector< OctTreeNodeLeaf* > leafs {}; leafs.reserve( LEAF_RESERVE_SIZE ); this->getAllLeafsInFrustum( frustum, leafs ); return leafs;