/** * @brief RB_ExecuteRenderCommands * @param[in] data */ void RB_ExecuteRenderCommands(const void *data) { int t1, t2; t1 = ri.Milliseconds(); while (1) { switch (*( const int * ) data) { case RC_SET_COLOR: data = RB_SetColor(data); break; case RC_STRETCH_PIC: data = RB_StretchPic(data); break; case RC_2DPOLYS: data = RB_Draw2dPolys(data); break; case RC_ROTATED_PIC: data = RB_RotatedPic(data); break; case RC_STRETCH_PIC_GRADIENT: data = RB_StretchPicGradient(data); break; case RC_DRAW_SURFS: data = RB_DrawSurfs(data); break; case RC_DRAW_BUFFER: data = RB_DrawBuffer(data); break; case RC_SWAP_BUFFERS: data = RB_SwapBuffers(data); break; case RC_SCREENSHOT: data = RB_TakeScreenshotCmd(data); break; case RC_VIDEOFRAME: data = RB_TakeVideoFrameCmd(data); break; case RC_RENDERTOTEXTURE: data = RB_RenderToTexture(data); break; case RC_FINISH: data = RB_Finish(data); break; case RC_END_OF_LIST: default: // stop rendering on this thread t2 = ri.Milliseconds(); backEnd.pc.msec = t2 - t1; return; } } }
/* ==================== RB_ExecuteRenderCommands This function will be called synchronously if running without smp extensions, or asynchronously by another thread. ==================== */ void RB_ExecuteRenderCommands( const void *data ) { int t1, t2; t1 = ri.Milliseconds(); if ( !r_smp->integer || data == backEndData[ 0 ]->commands.cmds ) { backEnd.smpFrame = 0; } else { backEnd.smpFrame = 1; } while ( 1 ) { switch ( * ( const int * ) data ) { case RC_SET_COLOR: data = RB_SetColor( data ); break; case RC_STRETCH_PIC: data = RB_StretchPic( data ); break; case RC_2DPOLYS: data = RB_Draw2dPolys( data ); break; case RC_ROTATED_PIC: data = RB_RotatedPic( data ); break; case RC_STRETCH_PIC_GRADIENT: data = RB_StretchPicGradient( data ); break; case RC_DRAW_SURFS: data = RB_DrawSurfs( data ); break; case RC_RUN_VISTESTS: data = RB_RunVisTests( data ); break; case RC_DRAW_BUFFER: data = RB_DrawBuffer( data ); break; case RC_SWAP_BUFFERS: data = RB_SwapBuffers( data ); break; case RC_VIDEOFRAME: data = RB_TakeVideoFrameCmd( data ); break; //bani case RC_RENDERTOTEXTURE: data = RB_RenderToTexture( data ); break; //bani case RC_FINISH: data = RB_Finish( data ); break; case RC_END_OF_LIST: default: // stop rendering on this thread t2 = ri.Milliseconds(); backEnd.pc.msec = t2 - t1; return; } } }
/* * R_RenderScene */ void R_RenderScene( const refdef_t *fd ) { int fbFlags = 0; int ppFrontBuffer = 0; image_t *ppSource; if( r_norefresh->integer ) return; R_Set2DMode( false ); RB_SetTime( fd->time ); if( !( fd->rdflags & RDF_NOWORLDMODEL ) ) rsc.refdef = *fd; rn.refdef = *fd; if( !rn.refdef.minLight ) { rn.refdef.minLight = 0.1f; } fd = &rn.refdef; rn.renderFlags = RF_NONE; rn.farClip = R_DefaultFarClip(); rn.clipFlags = 15; if( rsh.worldModel && !( fd->rdflags & RDF_NOWORLDMODEL ) && rsh.worldBrushModel->globalfog ) rn.clipFlags |= 16; rn.meshlist = &r_worldlist; rn.portalmasklist = &r_portalmasklist; rn.shadowBits = 0; rn.dlightBits = 0; rn.shadowGroup = NULL; fbFlags = 0; rn.fbColorAttachment = rn.fbDepthAttachment = NULL; if( !( fd->rdflags & RDF_NOWORLDMODEL ) ) { if( r_soft_particles->integer && ( rsh.screenTexture != NULL ) ) { rn.fbColorAttachment = rsh.screenTexture; rn.fbDepthAttachment = rsh.screenDepthTexture; rn.renderFlags |= RF_SOFT_PARTICLES; fbFlags |= 1; } if( rsh.screenPPCopies[0] && rsh.screenPPCopies[1] ) { int oldFlags = fbFlags; shader_t *cc = rn.refdef.colorCorrection; if( r_fxaa->integer ) { fbFlags |= 2; } if( cc && cc->numpasses > 0 && cc->passes[0].images[0] && cc->passes[0].images[0] != rsh.noTexture ) { fbFlags |= 4; } if( fbFlags != oldFlags ) { if( !rn.fbColorAttachment ) { rn.fbColorAttachment = rsh.screenPPCopies[0]; ppFrontBuffer = 1; } } } } ppSource = rn.fbColorAttachment; // clip new scissor region to the one currently set Vector4Set( rn.scissor, fd->scissor_x, fd->scissor_y, fd->scissor_width, fd->scissor_height ); Vector4Set( rn.viewport, fd->x, fd->y, fd->width, fd->height ); VectorCopy( fd->vieworg, rn.pvsOrigin ); VectorCopy( fd->vieworg, rn.lodOrigin ); if( gl_finish->integer && !( fd->rdflags & RDF_NOWORLDMODEL ) ) RB_Finish(); R_BindFrameBufferObject( 0 ); R_BuildShadowGroups(); R_RenderView( fd ); R_RenderDebugSurface( fd ); R_RenderDebugBounds(); R_BindFrameBufferObject( 0 ); R_Set2DMode( true ); // blit and blend framebuffers in proper order if( fbFlags == 1 ) { // only blit soft particles directly when we don't have any other post processing // otherwise use the soft particles FBO as the base texture on the next layer // to avoid wasting time on resolves and the fragment shader to blit to a temp texture R_BlitTextureToScrFbo( fd, ppSource, 0, GLSL_PROGRAM_TYPE_NONE, colorWhite, 0, 0, NULL ); } fbFlags &= ~1; // apply FXAA if( fbFlags & 2 ) { image_t *dest; fbFlags &= ~2; dest = fbFlags ? rsh.screenPPCopies[ppFrontBuffer] : NULL; R_BlitTextureToScrFbo( fd, ppSource, dest ? dest->fbo : 0, GLSL_PROGRAM_TYPE_FXAA, colorWhite, 0, 0, NULL ); ppFrontBuffer ^= 1; ppSource = dest; } // apply color correction if( fbFlags & 4 ) { image_t *dest; fbFlags &= ~4; dest = fbFlags ? rsh.screenPPCopies[ppFrontBuffer] : NULL; R_BlitTextureToScrFbo( fd, ppSource, dest ? dest->fbo : 0, GLSL_PROGRAM_TYPE_COLORCORRECTION, colorWhite, 0, 1, &( rn.refdef.colorCorrection->passes[0].images[0] ) ); } }