Move the GUI rendering to a secondary command buffer for threading later.

This commit is contained in:
2024-06-24 07:02:08 -04:00
parent b83de4ccd8
commit 11e431907f
9 changed files with 69 additions and 35 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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();
}

View File

@@ -5,7 +5,6 @@
#pragma once
#include <vulkan/vulkan.hpp>
#include <vulkan/vulkan_handles.hpp>
#include <cassert>
#include <memory>
@@ -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 );

View File

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

View File

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