diff --git a/neo/renderer/NVRHI/Framebuffer_NVRHI.cpp b/neo/renderer/NVRHI/Framebuffer_NVRHI.cpp index 707553e0..255ca06c 100644 --- a/neo/renderer/NVRHI/Framebuffer_NVRHI.cpp +++ b/neo/renderer/NVRHI/Framebuffer_NVRHI.cpp @@ -216,8 +216,6 @@ void Framebuffer::ResizeFramebuffers() void Framebuffer::Bind() { - RENDERLOG_PRINTF( "Framebuffer::Bind( %s )\n", fboName.c_str() ); - if( tr.backend.currentFrameBuffer != this ) { tr.backend.currentPipeline = nullptr; @@ -234,7 +232,6 @@ bool Framebuffer::IsBound() void Framebuffer::Unbind() { - RENDERLOG_PRINTF( "Framebuffer::Unbind()\n" ); globalFramebuffers.swapFramebuffers[deviceManager->GetCurrentBackBufferIndex()]->Bind(); } diff --git a/neo/renderer/NVRHI/Image_NVRHI.cpp b/neo/renderer/NVRHI/Image_NVRHI.cpp index 0b068519..79a39c74 100644 --- a/neo/renderer/NVRHI/Image_NVRHI.cpp +++ b/neo/renderer/NVRHI/Image_NVRHI.cpp @@ -168,8 +168,6 @@ Automatically enables 2D mapping or cube mapping if needed */ void idImage::Bind() { - RENDERLOG_PRINTF( "idImage::Bind( %s )\n", GetName() ); - tr.backend.SetCurrentImage( this ); } diff --git a/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp b/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp index ad096f7d..a22c2b82 100644 --- a/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp +++ b/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp @@ -123,6 +123,7 @@ void idRenderBackend::Init() // Need to reinitialize this pass once this image is resized. renderProgManager.Init( deviceManager->GetDevice() ); + renderLog.Init(); bindingCache.Init( deviceManager->GetDevice() ); samplerCache.Init( deviceManager->GetDevice() ); @@ -229,8 +230,6 @@ void idRenderBackend::DrawElementsWithCounters( const drawSurf_t* surf ) currentIndexOffset = indexOffset; } - RENDERLOG_PRINTF( "Binding Buffers: %p:%i %p:%i\n", vertexBuffer, vertOffset, indexBuffer, indexOffset ); - if( currentIndexBuffer != ( nvrhi::IBuffer* )indexBuffer->GetAPIObject() || !r_useStateCaching.GetBool() ) { currentIndexBuffer = indexBuffer->GetAPIObject(); @@ -668,6 +667,9 @@ idRenderBackend::GL_StartFrame */ void idRenderBackend::GL_StartFrame() { + // fetch GPU timer queries of last frame + renderLog.FetchGPUTimers( pc ); + deviceManager->BeginFrame(); commandList->open(); @@ -729,7 +731,7 @@ may touch, including the editor. */ void idRenderBackend::GL_SetDefaultState() { - RENDERLOG_PRINTF( "--- GL_SetDefaultState ---\n" ); + renderLog.OpenBlock( "--- GL_SetDefaultState ---\n" ); glStateBits = 0; @@ -740,6 +742,8 @@ void idRenderBackend::GL_SetDefaultState() renderProgManager.Unbind(); Framebuffer::Unbind(); + + renderLog.CloseBlock(); } /* @@ -1069,8 +1073,6 @@ void idRenderBackend::SetBuffer( const void* data ) const setBufferCommand_t* cmd = ( const setBufferCommand_t* )data; - //RENDERLOG_PRINTF( "---------- RB_SetBuffer ---------- to buffer # %d\n", cmd->buffer ); - renderLog.OpenBlock( "Render_SetBuffer" ); currentScissor.Clear(); @@ -1203,8 +1205,6 @@ void idRenderBackend::DrawStencilShadowPass( const drawSurf_t* drawSurf, const b currentIndexOffset = indexOffset; } - //RENDERLOG_PRINTF( "Binding Buffers: %p:%i %p:%i\n", vertexBuffer, vertOffset, indexBuffer, indexOffset ); - if( currentIndexBuffer != ( nvrhi::IBuffer* )indexBuffer->GetAPIObject() || !r_useStateCaching.GetBool() ) { currentIndexBuffer = indexBuffer->GetAPIObject(); diff --git a/neo/renderer/NVRHI/RenderDebug_NVRHI.cpp b/neo/renderer/NVRHI/RenderDebug_NVRHI.cpp index 132db429..dc33dd5e 100644 --- a/neo/renderer/NVRHI/RenderDebug_NVRHI.cpp +++ b/neo/renderer/NVRHI/RenderDebug_NVRHI.cpp @@ -2105,9 +2105,8 @@ void idRenderBackend::DBG_RenderDebugTools( drawSurf_t** drawSurfs, int numDrawS return; } - renderLog.OpenMainBlock( MRB_DRAW_DEBUG_TOOLS, commandList ); + renderLog.OpenMainBlock( MRB_DRAW_DEBUG_TOOLS ); renderLog.OpenBlock( "Render_DebugTools", colorGreen ); - RENDERLOG_PRINTF( "---------- RB_RenderDebugTools ----------\n" ); GL_State( GLS_DEFAULT ); diff --git a/neo/renderer/NVRHI/RenderProgs_NVRHI.cpp b/neo/renderer/NVRHI/RenderProgs_NVRHI.cpp index c1df5b72..1d5838ad 100644 --- a/neo/renderer/NVRHI/RenderProgs_NVRHI.cpp +++ b/neo/renderer/NVRHI/RenderProgs_NVRHI.cpp @@ -62,7 +62,6 @@ void idRenderProgManager::BindProgram( int index ) } currentIndex = index; - RENDERLOG_PRINTF( "Binding HLSL Program %s\n", renderProgs[index].name.c_str() ); } /* diff --git a/neo/renderer/Passes/FowardShadingPass.cpp b/neo/renderer/Passes/FowardShadingPass.cpp index e8bc7c39..a85b2dc6 100644 --- a/neo/renderer/Passes/FowardShadingPass.cpp +++ b/neo/renderer/Passes/FowardShadingPass.cpp @@ -221,8 +221,6 @@ void ForwardShadingPass::ShadowMapPass( nvrhi::ICommandList* commandList, const return; } - RENDERLOG_PRINTF( "---------- RB_ShadowMapPass( side = %i ) ----------\n", side ); - renderProgManager.BindShader_Depth(); GL_SelectTexture( 0 ); @@ -846,8 +844,6 @@ void ForwardShadingPass::SetupInputBuffers( const drawSurf_t* surf, nvrhi::Graph } const uint indexOffset = ( uint )( ibHandle >> VERTCACHE_OFFSET_SHIFT ) & VERTCACHE_OFFSET_MASK; - RENDERLOG_PRINTF( "Binding Buffers: %p:%i %p:%i\n", vertexBuffer, vertOffset, indexBuffer, indexOffset ); - state.indexBuffer = { indexBuffer->GetAPIObject(), nvrhi::Format::R16_UINT, indexOffset }; state.vertexBuffers = { { vertexBuffer->GetAPIObject(), 0, vertOffset } }; } diff --git a/neo/renderer/Passes/GBufferFillPass.cpp b/neo/renderer/Passes/GBufferFillPass.cpp index 0f80b066..5e3c46c2 100644 --- a/neo/renderer/Passes/GBufferFillPass.cpp +++ b/neo/renderer/Passes/GBufferFillPass.cpp @@ -571,8 +571,6 @@ void GBufferFillPass::DrawElementsWithCounters( const drawSurf_t* surf ) } const uint indexOffset = ( uint )( ibHandle >> VERTCACHE_OFFSET_SHIFT ) & VERTCACHE_OFFSET_MASK; - RENDERLOG_PRINTF( "Binding Buffers: %p:%i %p:%i\n", vertexBuffer, vertOffset, indexBuffer, indexOffset ); - auto currentIndexBuffer = ( nvrhi::IBuffer* )indexBuffer->GetAPIObject(); if( currentIndexBuffer != ( nvrhi::IBuffer* )indexBuffer->GetAPIObject() || !r_useStateCaching.GetBool() ) diff --git a/neo/renderer/Passes/GeometryPasses.cpp b/neo/renderer/Passes/GeometryPasses.cpp index 4f7e9b90..aa51c7d8 100644 --- a/neo/renderer/Passes/GeometryPasses.cpp +++ b/neo/renderer/Passes/GeometryPasses.cpp @@ -105,12 +105,6 @@ static void RB_LoadShaderTextureMatrix( const float* shaderRegisters, const text texT[1] = matrix[1 * 4 + 1]; texT[2] = matrix[2 * 4 + 1]; texT[3] = matrix[3 * 4 + 1]; - - RENDERLOG_PRINTF( "Setting Texture Matrix\n" ); - renderLog.Indent(); - RENDERLOG_PRINTF( "Texture Matrix S : %4.3f, %4.3f, %4.3f, %4.3f\n", texS[0], texS[1], texS[2], texS[3] ); - RENDERLOG_PRINTF( "Texture Matrix T : %4.3f, %4.3f, %4.3f, %4.3f\n", texT[0], texT[1], texT[2], texT[3] ); - renderLog.Outdent(); } SetVertexParm( RENDERPARM_TEXTUREMATRIX_S, texS ); diff --git a/neo/renderer/RenderBackend.cpp b/neo/renderer/RenderBackend.cpp index 718605c9..4a8d9635 100644 --- a/neo/renderer/RenderBackend.cpp +++ b/neo/renderer/RenderBackend.cpp @@ -208,11 +208,11 @@ void RB_LoadShaderTextureMatrix( const float* shaderRegisters, const textureStag texT[2] = matrix[2 * 4 + 1]; texT[3] = matrix[3 * 4 + 1]; - RENDERLOG_PRINTF( "Setting Texture Matrix\n" ); - renderLog.Indent(); - RENDERLOG_PRINTF( "Texture Matrix S : %4.3f, %4.3f, %4.3f, %4.3f\n", texS[0], texS[1], texS[2], texS[3] ); - RENDERLOG_PRINTF( "Texture Matrix T : %4.3f, %4.3f, %4.3f, %4.3f\n", texT[0], texT[1], texT[2], texT[3] ); - renderLog.Outdent(); + //RENDERLOG_PRINTF( "Setting Texture Matrix\n" ); + //renderLog.Indent(); + //RENDERLOG_PRINTF( "Texture Matrix S : %4.3f, %4.3f, %4.3f, %4.3f\n", texS[0], texS[1], texS[2], texS[3] ); + //RENDERLOG_PRINTF( "Texture Matrix T : %4.3f, %4.3f, %4.3f, %4.3f\n", texT[0], texT[1], texT[2], texT[3] ); + //renderLog.Outdent(); } SetVertexParm( RENDERPARM_TEXTUREMATRIX_S, texS ); @@ -367,7 +367,6 @@ void idRenderBackend::PrepareStageTexturing( const shaderStage_t* pStage, const GL_SelectTexture( 0 ); - RENDERLOG_PRINTF( "TexGen: TG_REFLECT_CUBE: Bumpy Environment\n" ); if( surf->jointCache ) { renderProgManager.BindShader_BumpyEnvironmentSkinned(); @@ -379,7 +378,6 @@ void idRenderBackend::PrepareStageTexturing( const shaderStage_t* pStage, const } else { - RENDERLOG_PRINTF( "TexGen: TG_REFLECT_CUBE: Environment\n" ); if( surf->jointCache ) { renderProgManager.BindShader_EnvironmentSkinned(); @@ -464,8 +462,8 @@ void idRenderBackend::PrepareStageTexturing( const shaderStage_t* pStage, const float mat[16]; R_MatrixMultiply( surf->space->modelViewMatrix, viewDef->projectionMatrix, mat ); - RENDERLOG_PRINTF( "TexGen : %s\n", ( pStage->texture.texgen == TG_SCREEN ) ? "TG_SCREEN" : "TG_SCREEN2" ); - renderLog.Indent(); + //RENDERLOG_PRINTF( "TexGen : %s\n", ( pStage->texture.texgen == TG_SCREEN ) ? "TG_SCREEN" : "TG_SCREEN2" ); + //renderLog.Indent(); float plane[4]; plane[0] = mat[0 * 4 + 0]; @@ -473,23 +471,23 @@ void idRenderBackend::PrepareStageTexturing( const shaderStage_t* pStage, const plane[2] = mat[2 * 4 + 0]; plane[3] = mat[3 * 4 + 0]; SetVertexParm( RENDERPARM_TEXGEN_0_S, plane ); - RENDERLOG_PRINTF( "TEXGEN_S = %4.3f, %4.3f, %4.3f, %4.3f\n", plane[0], plane[1], plane[2], plane[3] ); + //RENDERLOG_PRINTF( "TEXGEN_S = %4.3f, %4.3f, %4.3f, %4.3f\n", plane[0], plane[1], plane[2], plane[3] ); plane[0] = mat[0 * 4 + 1]; plane[1] = mat[1 * 4 + 1]; plane[2] = mat[2 * 4 + 1]; plane[3] = mat[3 * 4 + 1]; SetVertexParm( RENDERPARM_TEXGEN_0_T, plane ); - RENDERLOG_PRINTF( "TEXGEN_T = %4.3f, %4.3f, %4.3f, %4.3f\n", plane[0], plane[1], plane[2], plane[3] ); + //RENDERLOG_PRINTF( "TEXGEN_T = %4.3f, %4.3f, %4.3f, %4.3f\n", plane[0], plane[1], plane[2], plane[3] ); plane[0] = mat[0 * 4 + 3]; plane[1] = mat[1 * 4 + 3]; plane[2] = mat[2 * 4 + 3]; plane[3] = mat[3 * 4 + 3]; SetVertexParm( RENDERPARM_TEXGEN_0_Q, plane ); - RENDERLOG_PRINTF( "TEXGEN_Q = %4.3f, %4.3f, %4.3f, %4.3f\n", plane[0], plane[1], plane[2], plane[3] ); + //RENDERLOG_PRINTF( "TEXGEN_Q = %4.3f, %4.3f, %4.3f, %4.3f\n", plane[0], plane[1], plane[2], plane[3] ); - renderLog.Outdent(); + //renderLog.Outdent(); } else if( pStage->texture.texgen == TG_DIFFUSE_CUBE ) @@ -803,7 +801,7 @@ void idRenderBackend::FillDepthBufferFast( drawSurf_t** drawSurfs, int numDrawSu return; } - renderLog.OpenMainBlock( MRB_FILL_DEPTH_BUFFER, commandList ); + renderLog.OpenMainBlock( MRB_FILL_DEPTH_BUFFER ); renderLog.OpenBlock( "Render_FillDepthBufferFast", colorBlue ); // force MVP change on first surface @@ -1935,7 +1933,7 @@ void idRenderBackend::AmbientPass( const drawSurf_t* const* drawSurfs, int numDr #endif - renderLog.OpenMainBlock( fillGbuffer ? MRB_FILL_GEOMETRY_BUFFER : MRB_AMBIENT_PASS, commandList ); + renderLog.OpenMainBlock( fillGbuffer ? MRB_FILL_GEOMETRY_BUFFER : MRB_AMBIENT_PASS ); renderLog.OpenBlock( fillGbuffer ? "Fill_GeometryBuffer" : "Render_AmbientPass", colorBlue ); if( fillGbuffer ) @@ -2402,7 +2400,7 @@ void idRenderBackend::StencilShadowPass( const drawSurf_t* drawSurfs, const view return; } - RENDERLOG_PRINTF( "---------- RB_StencilShadowPass ----------\n" ); + renderLog.OpenBlock( "Render_StencilShadowPass" ); renderProgManager.BindShader_Shadow(); @@ -2567,6 +2565,8 @@ void idRenderBackend::StencilShadowPass( const drawSurf_t* drawSurfs, const view GL_DepthBoundsTest( 0.0f, 0.0f ); } } + + renderLog.CloseBlock(); } /* @@ -3821,7 +3821,7 @@ void idRenderBackend::DrawInteractions( const viewDef_t* _viewDef ) return; } - renderLog.OpenMainBlock( MRB_DRAW_INTERACTIONS, commandList ); + renderLog.OpenMainBlock( MRB_DRAW_INTERACTIONS ); renderLog.OpenBlock( "Render_Interactions", colorYellow ); GL_SelectTexture( 0 ); @@ -4819,7 +4819,7 @@ void idRenderBackend::FogAllLights() return; } - renderLog.OpenMainBlock( MRB_FOG_ALL_LIGHTS, commandList ); + renderLog.OpenMainBlock( MRB_FOG_ALL_LIGHTS ); renderLog.OpenBlock( "Render_FogAllLights", colorBlue ); // force fog plane to recalculate @@ -4969,8 +4969,6 @@ void idRenderBackend::CalculateAutomaticExposure() void idRenderBackend::Tonemap( const viewDef_t* _viewDef ) { - RENDERLOG_PRINTF( "---------- RB_Tonemap( avg = %f, max = %f, key = %f, is2Dgui = %i ) ----------\n", hdrAverageLuminance, hdrMaxLuminance, hdrKey, ( int )viewDef->is2Dgui ); - renderLog.OpenBlock( "Tonemap" ); //postProcessCommand_t* cmd = ( postProcessCommand_t* )data; @@ -5071,11 +5069,9 @@ void idRenderBackend::Bloom( const viewDef_t* _viewDef ) return; } - renderLog.OpenMainBlock( MRB_BLOOM, commandList ); + renderLog.OpenMainBlock( MRB_BLOOM ); renderLog.OpenBlock( "Render_Bloom", colorBlue ); - RENDERLOG_PRINTF( "---------- RB_Bloom( avg = %f, max = %f, key = %f ) ----------\n", hdrAverageLuminance, hdrMaxLuminance, hdrKey ); - // BRIGHTPASS renderLog.OpenBlock( "Brightpass" ); @@ -5116,7 +5112,7 @@ void idRenderBackend::Bloom( const viewDef_t* _viewDef ) int w = viewDef->viewport.x2 - viewDef->viewport.x1 + 1; int h = viewDef->viewport.y2 - viewDef->viewport.y1 + 1; - RENDERLOG_PRINTF( "Resolve to %i x %i buffer\n", w, h ); + //RENDERLOG_PRINTF( "Resolve to %i x %i buffer\n", w, h ); // resolve the screen globalImages->currentRenderImage->CopyFramebuffer( x, y, w, h ); @@ -5236,7 +5232,7 @@ void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef return; } - renderLog.OpenMainBlock( MRB_SSAO_PASS, commandList ); + renderLog.OpenMainBlock( MRB_SSAO_PASS ); renderLog.OpenBlock( "Render_SSAO", colorBlue ); currentSpace = &viewDef->worldSpace; @@ -5968,7 +5964,7 @@ void idRenderBackend::ExecuteBackEndCommands( const emptyCommand_t* cmds ) if( drawView3D_timestamps ) { // SRS - Capture separate timestamps for overlay GUI rendering when RC_DRAW_VIEW_3D timestamps are active - renderLog.OpenMainBlock( MRB_DRAW_GUI, commandList ); + renderLog.OpenMainBlock( MRB_DRAW_GUI ); renderLog.OpenBlock( "Render_DrawViewGUI", colorBlue ); // SRS - Disable detailed timestamps during overlay GUI rendering so they do not overwrite timestamps from 3D rendering glConfig.timerQueryAvailable = false; @@ -6195,7 +6191,7 @@ void idRenderBackend::DrawViewInternal( const viewDef_t* _viewDef, const int ste int processed = 0; if( !r_skipShaderPasses.GetBool() ) { - renderLog.OpenMainBlock( MRB_DRAW_SHADER_PASSES, commandList ); + renderLog.OpenMainBlock( MRB_DRAW_SHADER_PASSES ); float guiScreenOffset; if( _viewDef->viewEntitys != NULL ) { @@ -6233,7 +6229,7 @@ void idRenderBackend::DrawViewInternal( const viewDef_t* _viewDef, const int ste int w = viewDef->viewport.x2 - viewDef->viewport.x1 + 1; int h = viewDef->viewport.y2 - viewDef->viewport.y1 + 1; - RENDERLOG_PRINTF( "Resolve to %i x %i buffer\n", w, h ); + //RENDERLOG_PRINTF( "Resolve to %i x %i buffer\n", w, h ); GL_SelectTexture( 0 ); @@ -6271,7 +6267,7 @@ void idRenderBackend::DrawViewInternal( const viewDef_t* _viewDef, const int ste SetFragmentParm( RENDERPARM_WINDOWCOORD, windowCoordParm ); // rpWindowCoord // render the remaining surfaces - renderLog.OpenMainBlock( MRB_DRAW_SHADER_PASSES_POST, commandList ); + renderLog.OpenMainBlock( MRB_DRAW_SHADER_PASSES_POST ); DrawShaderPasses( drawSurfs + processed, numDrawSurfs - processed, 0.0f /* definitely not a gui */, stereoEye ); renderLog.CloseMainBlock(); } @@ -6548,7 +6544,7 @@ void idRenderBackend::CopyRender( const void* data ) return; } - RENDERLOG_PRINTF( "***************** RB_CopyRender *****************\n" ); + renderLog.OpenBlock( "***************** RB_CopyRender *****************" ); if( cmd->image ) { @@ -6559,6 +6555,8 @@ void idRenderBackend::CopyRender( const void* data ) { GL_Clear( true, false, false, STENCIL_SHADOW_TEST_VALUE, 0, 0, 0, 0 ); } + + renderLog.CloseBlock(); } /* @@ -6583,7 +6581,7 @@ void idRenderBackend::PostProcess( const void* data ) } - renderLog.OpenMainBlock( MRB_POSTPROCESS, commandList ); + renderLog.OpenMainBlock( MRB_POSTPROCESS ); renderLog.OpenBlock( "Render_PostProcessing", colorBlue ); // FIXME diff --git a/neo/renderer/RenderLog.cpp b/neo/renderer/RenderLog.cpp index 7460f174..b874342d 100644 --- a/neo/renderer/RenderLog.cpp +++ b/neo/renderer/RenderLog.cpp @@ -29,6 +29,11 @@ If you have questions concerning this license or the applicable additional terms #include "RenderCommon.h" #pragma hdrstop +#if defined( USE_NVRHI ) + #include + extern DeviceManager* deviceManager; +#endif + /* ================================================================================================ Contains the RenderLog implementation. @@ -310,26 +315,32 @@ idRenderLog idRenderLog renderLog; -/* -======================== -idRenderLog::idRenderLog -======================== -*/ idRenderLog::idRenderLog() { frameCounter = 0; frameParity = 0; } +void idRenderLog::Init() +{ +#if defined( USE_NVRHI ) + for( int i = 0; i < MRB_TOTAL_QUERIES; i++ ) + { + timerQueries.Append( deviceManager->GetDevice()->createTimerQuery() ); + timerUsed.Append( false ); + } +#endif +} + void idRenderLog::StartFrame( nvrhi::ICommandList* _commandList ) { +#if defined( USE_NVRHI ) commandList = _commandList; +#endif } void idRenderLog::EndFrame() { - frameCounter++; - frameParity = frameCounter % NUM_FRAME_DATA; } @@ -339,12 +350,8 @@ void idRenderLog::EndFrame() idRenderLog::OpenMainBlock ======================== */ -void idRenderLog::OpenMainBlock( renderLogMainBlock_t block, nvrhi::ICommandList* _commandList ) +void idRenderLog::OpenMainBlock( renderLogMainBlock_t block ) { -#if defined( USE_NVRHI ) - commandList = _commandList; -#endif - // SRS - Use glConfig.timerQueryAvailable flag to control timestamp capture for all platforms if( glConfig.timerQueryAvailable ) { @@ -352,7 +359,10 @@ void idRenderLog::OpenMainBlock( renderLogMainBlock_t block, nvrhi::ICommandList #if defined( USE_NVRHI ) - // SP: use nvrhi timer queries + int timerIndex = mainBlock + frameParity * MRB_TOTAL; + + commandList->beginTimerQuery( timerQueries[ timerIndex ] ); + timerUsed[ timerIndex ] = true; #elif defined( USE_VULKAN ) if( vkcontext.queryIndex[ vkcontext.frameParity ] >= ( NUM_TIMESTAMP_QUERIES - 1 ) ) @@ -402,7 +412,13 @@ void idRenderLog::CloseMainBlock() if( glConfig.timerQueryAvailable ) { -#if defined( USE_VULKAN ) +#if defined( USE_NVRHI ) + + int timerIndex = mainBlock + frameParity * MRB_TOTAL; + + commandList->endTimerQuery( timerQueries[ timerIndex ] ); + +#elif defined( USE_VULKAN ) if( vkcontext.queryIndex[ vkcontext.frameParity ] >= ( NUM_TIMESTAMP_QUERIES - 1 ) ) { return; @@ -414,10 +430,6 @@ void idRenderLog::CloseMainBlock() uint32 queryIndex = vkcontext.queryAssignedIndex[ vkcontext.frameParity ][ mainBlock * 2 + 1 ] = vkcontext.queryIndex[ vkcontext.frameParity ]++; vkCmdWriteTimestamp( commandBuffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, queryPool, queryIndex ); -#elif defined(USE_NVRHI) - - // SP: Close nvrhi timer queries - #elif defined(__APPLE__) // SRS - For OSX use elapsed time query for Apple OpenGL 4.1 using GL_TIME_ELAPSED vs GL_TIMESTAMP (which is not implemented on OSX) // SRS - OSX AMD drivers have a rendering bug (flashing colours) with an elasped time query when Shadow Mapping is on - turn off query for that case unless r_skipAMDWorkarounds is set @@ -434,6 +446,63 @@ void idRenderLog::CloseMainBlock() } } +/* +======================== +idRenderLog::FetchGPUTimers +======================== +*/ +void idRenderLog::FetchGPUTimers( backEndCounters_t& pc ) +{ + frameCounter++; + frameParity ^= 1; + +#if defined( USE_NVRHI ) + + for( int i = 0; i < MRB_TOTAL; i++ ) + { + int timerIndex = i + frameParity * MRB_TOTAL; + + if( timerUsed[timerIndex] ) + { + double time = deviceManager->GetDevice()->getTimerQueryTime( timerQueries[ timerIndex ] ); + time *= 1000000.0; // seconds -> microseconds + + if( i == MRB_GPU_TIME ) + { + pc.gpuMicroSec = time; + } + else if( i == MRB_FILL_DEPTH_BUFFER ) + { + pc.gpuDepthMicroSec = time; + } + else if( i == MRB_SSAO_PASS ) + { + pc.gpuScreenSpaceAmbientOcclusionMicroSec = time; + } + else if( i == MRB_AMBIENT_PASS ) + { + pc.gpuAmbientPassMicroSec = time; + } + else if( i == MRB_DRAW_INTERACTIONS ) + { + pc.gpuInteractionsMicroSec = time; + } + else if( i == MRB_DRAW_SHADER_PASSES ) + { + pc.gpuShaderPassMicroSec = time; + } + else if( i == MRB_POSTPROCESS ) + { + pc.gpuPostProcessingMicroSec = time; + } + } + + // reset timer + timerUsed[timerIndex] = false; + } +#endif +} + /* ======================== diff --git a/neo/renderer/RenderLog.h b/neo/renderer/RenderLog.h index 4e4aacf6..d9871401 100644 --- a/neo/renderer/RenderLog.h +++ b/neo/renderer/RenderLog.h @@ -59,18 +59,6 @@ enum renderLogMainBlock_t MRB_TOTAL_QUERIES = MRB_TOTAL * 2, }; -// these are used to make sure each Indent() is properly paired with an Outdent() -enum renderLogIndentLabel_t -{ - RENDER_LOG_INDENT_DEFAULT, - RENDER_LOG_INDENT_MAIN_BLOCK, - RENDER_LOG_INDENT_BLOCK, - RENDER_LOG_INDENT_TEST -}; - -// using this macro avoids printf parameter overhead if the renderlog isn't active -#define RENDERLOG_PRINTF( ... ) if ( renderLog.activeLevel ) renderLog.Printf( __VA_ARGS__ ); - /* @@ -92,11 +80,24 @@ private: uint64 frameCounter; uint32 frameParity; + + idStaticList timerQueries; + idStaticList timerUsed; + + //idArray< idArray< nvrhi::TimerQueryHandle, MRB_TOTAL_QUERIES >, NUM_FRAME_DATA > timerQueries; + + // GPU timestamp queries + //idArray< uint32, NUM_FRAME_DATA > queryIndex; + + //idArray< idArray< uint64, NUM_TIMESTAMP_QUERIES >, NUM_FRAME_DATA > queryResults; + //idArray< VkQueryPool, NUM_FRAME_DATA > queryPools; #endif public: idRenderLog(); + void Init(); + void StartFrame( nvrhi::ICommandList* _commandList ); void EndFrame(); void Close() {} @@ -107,14 +108,12 @@ public: void OpenBlock( const char* label, const idVec4& color = colorBlack ); void CloseBlock(); - void OpenMainBlock( renderLogMainBlock_t block, nvrhi::ICommandList* commandList ); - void CloseMainBlock();// {} - void Indent( renderLogIndentLabel_t label = RENDER_LOG_INDENT_DEFAULT ) {} - void Outdent( renderLogIndentLabel_t label = RENDER_LOG_INDENT_DEFAULT ) {} + void OpenMainBlock( renderLogMainBlock_t block ); + void CloseMainBlock(); void Printf( VERIFY_FORMAT_STRING const char* fmt, ... ) {} - int activeLevel; + void FetchGPUTimers( backEndCounters_t& pc ); }; extern idRenderLog renderLog; diff --git a/neo/renderer/RenderSystem.cpp b/neo/renderer/RenderSystem.cpp index 1a6434e9..42857a91 100644 --- a/neo/renderer/RenderSystem.cpp +++ b/neo/renderer/RenderSystem.cpp @@ -136,8 +136,12 @@ void idRenderSystemLocal::RenderCommandBuffers( const emptyCommand_t* const cmdH // draw 2D graphics if( !r_skipBackEnd.GetBool() ) { +#if defined(USE_NVRHI) + + renderLog.FetchGPUTimers( backend.pc ); + // SRS - For OSX skip total rendering time query due to missing GL_TIMESTAMP support in Apple OpenGL 4.1, will calculate it inside SwapCommandBuffers_FinishRendering instead -#if !defined(USE_VULKAN) && !defined(__APPLE__) && !defined(USE_NVRHI) +#elif !defined(USE_VULKAN) && !defined(__APPLE__) if( glConfig.timerQueryAvailable ) { if( glcontext.renderLogMainBlockTimeQueryIds[ glcontext.frameParity ][ MRB_GPU_TIME ] == 0 )