/* ==================== RenderCommandBuffers ==================== */ void idRenderSystemLocal::RenderCommandBuffers( const emptyCommand_t* const cmdHead ) { // if there isn't a draw view command, do nothing to avoid swapping a bad frame bool hasView = false; for( const emptyCommand_t* cmd = cmdHead ; cmd ; cmd = ( const emptyCommand_t* )cmd->next ) { if( cmd->commandId == RC_DRAW_VIEW_3D || cmd->commandId == RC_DRAW_VIEW_GUI ) { hasView = true; break; } } if( !hasView ) { return; } // r_skipBackEnd allows the entire time of the back end // to be removed from performance measurements, although // nothing will be drawn to the screen. If the prints // are going to a file, or r_skipBackEnd is later disabled, // usefull data can be received. // r_skipRender is usually more usefull, because it will still // draw 2D graphics if( !r_skipBackEnd.GetBool() ) { if( glConfig.timerQueryAvailable ) { if( tr.timerQueryId == 0 ) { qglGenQueriesARB( 1, & tr.timerQueryId ); } qglBeginQueryARB( GL_TIME_ELAPSED_EXT, tr.timerQueryId ); RB_ExecuteBackEndCommands( cmdHead ); qglEndQueryARB( GL_TIME_ELAPSED_EXT ); qglFlush(); } else { RB_ExecuteBackEndCommands( cmdHead ); } } // pass in null for now - we may need to do some map specific hackery in the future resolutionScale.InitForMap( NULL ); }
/* ==================== R_IssueRenderCommands Called by R_EndFrame each frame ==================== */ static void R_IssueRenderCommands( void ) { if ( frameData->cmdHead->commandId == RC_NOP && !frameData->cmdHead->next ) { // nothing to issue return; } // r_skipBackEnd allows the entire time of the back end // to be removed from performance measurements, although // nothing will be drawn to the screen. If the prints // are going to a file, or r_skipBackEnd is later disabled, // usefull data can be received. // r_skipRender is usually more usefull, because it will still // draw 2D graphics if ( !r_skipBackEnd.GetBool() ) { RB_ExecuteBackEndCommands( frameData->cmdHead ); } R_ClearCommandChain(); }