17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-25 03:17:13 +01:00

perf(debug): cpu time of the parts of the culling and the draws of the instances of the main view in the gpu culling section of the debug panel

This commit is contained in:
2026-10-24 01:38:33 +02:00
parent 3e2d292709
commit e53c44ed4d
2 changed files with 35 additions and 0 deletions

View File

@@ -1141,6 +1141,11 @@ void opengl46_renderer::SwapBuffers()
}
culltext += Light_Shadow_Cull_Info( false );
if( Global.gfx_gpucull == 1 ) {
auto const &parts { m_cullparts };
culltext +=
"gpu cull, cpu by part: depth of the scene so far " + to_string( parts.scenedepth, 3 ) + ", depth pyramid " + to_string( parts.pyramid, 3 )
+ ", culling " + to_string( parts.culling, 3 ) + ", walks and order " + to_string( parts.record, 3 ) + ", depth draws " + to_string( parts.depth, 3 )
+ ", colour draws " + to_string( parts.colour, 3 ) + " ms\n";
// all passes of the last frame
auto const &walks { m_lastwalkcounts };
culltext +=
@@ -4911,12 +4916,20 @@ void opengl46_renderer::Render_Instances_Indirect()
{
auto const cpustart { std::chrono::steady_clock::now() };
auto *viewport { m_current_viewport };
// the cpu time of the parts, for the panel
auto partstart { cpustart };
auto const part = [ &partstart ]( double &Part ) {
auto const now { std::chrono::steady_clock::now() };
Part += std::chrono::duration<double, std::milli>( now - partstart ).count();
partstart = now; };
m_cullparts = {};
if( m_scenerecording ) {
// the depth of what the recorded walk of the depth pass of the scene went through so far, for the occlusion test
// and for the depth of the instances to be tested against
Render_Scene_Prepass();
}
part( m_cullparts.scenedepth );
// occlusion test against the depth drawn so far in the pass: cab, terrain, shapes, tracks, vehicles, other models
opengl46_instance_cull::occlusion_setup occlusion;
auto const useocclusion {
@@ -4932,15 +4945,18 @@ void opengl46_renderer::Render_Instances_Indirect()
occlusion.screen = glm::vec2{ m_hiz.source_size() };
occlusion.projection = OpenGLMatrices.data( GL_PROJECTION );
}
part( m_cullparts.pyramid );
// in two phases the instances seen in the previous frame are drawn first, and the others are tested against a pyramid
// made again with their depth in it (not in wireframe, which doesn't draw surfaces)
m_instancecull.dispatch(
OpenGLMatrices.data( GL_MODELVIEW ),
( useocclusion ? &occlusion : nullptr ),
( Global.gfx_gpucull_occlusion_instances && ( false == Global.bWireFrame ) ) );
part( m_cullparts.culling );
// the draws, recorded while the gpu culls
Record_Indirect_Draws( m_instancecull );
part( m_cullparts.record );
using command_set = opengl46_instance_cull::command_set;
auto const twophase { m_instancecull.two_phase() };
@@ -4959,27 +4975,33 @@ void opengl46_renderer::Render_Instances_Indirect()
m_instancecull.bind_draw();
if( depthfirst ) {
prepasscounts += Render_Instances_Indirect_Prepass( command_set::first, m_prepassfirsttimer );
part( m_cullparts.depth );
}
else {
colourcounts += Render_Instances_Indirect_Colour( command_set::first );
part( m_cullparts.colour );
}
m_hiz.build( *viewport->msaa_fb, viewport->width, viewport->height, true );
occlusion.pyramid = m_hiz.texture();
part( m_cullparts.pyramid );
}
// the others are tested against it; with no draws the instances are only marked for the next frame
m_instancecull.dispatch_second( occlusion );
colourset = ( depthfirst ? command_set::all : command_set::second );
part( m_cullparts.culling );
}
if( draws ) {
m_instancecull.bind_draw();
if( depthfirst ) {
prepasscounts += Render_Instances_Indirect_Prepass( ( twophase ? command_set::second : command_set::first ), m_prepasstimer );
part( m_cullparts.depth );
}
if( false == m_scenedepthpass ) {
colourcounts += Render_Instances_Indirect_Colour( colourset );
}
::glBindBuffer( GL_DRAW_INDIRECT_BUFFER, 0 );
Bind_Instance_Stream();
part( m_cullparts.colour );
}
if( m_scenedepthpass ) {
// the colour pass takes the draws from here, and counts them
@@ -6074,6 +6096,7 @@ void opengl46_renderer::Render_Instances_Indirect_Pending()
colourcounts = Render_Instances_Indirect_Colour( m_indirectcolourset );
::glBindBuffer( GL_DRAW_INDIRECT_BUFFER, 0 );
Bind_Instance_Stream();
m_cullparts.colour += std::chrono::duration<double, std::milli>( std::chrono::steady_clock::now() - cpustart ).count();
m_instancecull.draw_result(
colourcounts.draws,
m_instancecull.prepass_draws(),

View File

@@ -793,6 +793,18 @@ class opengl46_renderer : public gfx_renderer {
double walktime { 0.0 };
double ordertime { 0.0 };
};
// cpu time of the parts of the culling and the draws of the instances of the main view (Render_Instances_Indirect() and
// _Pending()), for the panel: the depth of the recorded walk of the scene drawn before the culling, the depth pyramids, the
// culling passes, the walks with putting the draws in order, the depth and the colour of the instances
struct cull_parts {
double scenedepth { 0.0 };
double pyramid { 0.0 };
double culling { 0.0 };
double record { 0.0 };
double depth { 0.0 };
double colour { 0.0 };
};
cull_parts m_cullparts;
walk_counts m_walkcounts;
walk_counts m_lastwalkcounts;
unsigned int m_walkcountsframe { 0 };