Move the GUI rendering to a secondary command buffer for threading later.
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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 >
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user