/* ============= RE_EndFrame Returns the number of msec spent in the back end ============= */ void RE_EndFrame( int *frontEndMsec, int *backEndMsec ) { swapBuffersCommand_t *cmd; if ( !tr.registered ) { return; } cmd = R_GetCommandBuffer( sizeof( *cmd ) ); if ( !cmd ) { return; } cmd->commandId = RC_SWAP_BUFFERS; R_IssueRenderCommands( qtrue ); // use the other buffers next frame, because another CPU // may still be rendering into the current ones R_ToggleSmpFrame(); if ( frontEndMsec ) { *frontEndMsec = tr.frontEndMsec; } tr.frontEndMsec = 0; if ( backEndMsec ) { *backEndMsec = backEnd.pc.msec; } backEnd.pc.msec = 0; }
/* ============= RE_EndFrame Returns the number of msec spent in the back end ============= */ void RE_EndFrame(int *frontEndMsec, int *backEndMsec) { renderCommandList_t *cmdList; if(!tr.registered) { return; } // Needs to use reserved space, so no R_GetCommandBuffer. cmdList = &backEndData[tr.smpFrame]->commands; assert(cmdList); // add swap-buffers command *(int *)(cmdList->cmds + cmdList->used) = RC_SWAP_BUFFERS; cmdList->used += sizeof(swapBuffersCommand_t); R_IssueRenderCommands(true); // use the other buffers next frame, because another CPU // may still be rendering into the current ones R_ToggleSmpFrame(); if(frontEndMsec) { *frontEndMsec = tr.frontEndMsec; } tr.frontEndMsec = 0; if(backEndMsec) { *backEndMsec = backEnd.pc.msec; } backEnd.pc.msec = 0; }
/* ============= EndFrame Returns the number of msec spent in the back end ============= */ void idRenderSystemLocal::EndFrame( int *frontEndMsec, int *backEndMsec, bool swapFrontBack ) { emptyCommand_t *cmd; if ( !glConfig.isInitialized ) { return; } // close any gui drawing guiModel->EmitFullScreen(); guiModel->Clear(); // save out timing information if ( frontEndMsec ) { *frontEndMsec = pc.frontEndMsec; } if ( backEndMsec ) { *backEndMsec = backEnd.pc.msec; } // print any other statistics and clear all of them R_PerformanceCounters(); // check for dynamic changes that require some initialization R_CheckCvars(); // check for errors GL_CheckErrors(); // add the swapbuffers command if(swapFrontBack) { cmd = (emptyCommand_t *)R_GetCommandBuffer( sizeof( *cmd ) ); cmd->commandId = RC_SWAP_BUFFERS; } // start the back end up again with the new command list R_IssueRenderCommands(); // use the other buffers next frame, because another CPU // may still be rendering into the current buffers R_ToggleSmpFrame(); // we can now release the vertexes used this frame vertexCache.EndFrame(); if ( session->writeDemo ) { session->writeDemo->WriteInt( DS_RENDER ); session->writeDemo->WriteInt( DC_END_FRAME ); if ( r_showDemo.GetBool() ) { common->Printf( "write DC_END_FRAME\n" ); } } }
/* ===================== R_InitFrameData ===================== */ void R_InitFrameData() { R_ShutdownFrameData(); for ( int i = 0; i < NUM_FRAME_DATA; i++ ) { smpFrameData[i].frameMemory = (byte *) Mem_Alloc16( MAX_FRAME_MEMORY, TAG_RENDER ); } // must be set before calling R_ToggleSmpFrame() frameData = &smpFrameData[ 0 ]; R_ToggleSmpFrame(); }
frameInfo_t idRenderSystemLocal::LocalEndFrame() { frameInfo_t info; memset(&info, 0, sizeof(info)); if (!glConfig.isInitialized) { return info; } // close any gui drawing guiModel->EmitFullScreen(); guiModel->Clear(); // save out timing information info.time.frontEndMsec = pc.frontEndMsec; info.time.backEndMsec = backEnd.pc.msec; // print any other statistics and clear all of them R_PerformanceCounters(); // check for errors GL_CheckErrors(false); // add the swapbuffers command auto cmd = R_GetCommandBuffer<emptyCommand_t>(); cmd->commandId = RC_SWAP_BUFFERS; // start the back end up again with the new command list info.framebuffer = R_IssueRenderCommands(); // use the other buffers next frame, because another CPU // may still be rendering into the current buffers R_ToggleSmpFrame(); // we can now release the vertexes used this frame vertexCache.EndFrame(); if (session->writeDemo) { session->writeDemo->WriteInt(DS_RENDER); session->writeDemo->WriteInt(DC_END_FRAME); if (r_showDemo.GetBool()) { common->Printf("write DC_END_FRAME\n"); } } return info; }
/* ============= RE_EndFrame Returns the number of msec spent in the back end ============= */ void RE_EndFrame( int *frontEndMsec, int *backEndMsec ) { swapBuffersCommand_t *cmd; if ( !tr.registered ) { return; } GLimp_HandleCvars(); cmd = (swapBuffersCommand_t*) R_GetCommandBuffer( sizeof( *cmd ) ); if ( !cmd ) { return; } cmd->commandId = renderCommand_t::RC_SWAP_BUFFERS; R_IssueRenderCommands( true ); // use the other buffers next frame, because another CPU // may still be rendering into the current ones R_ToggleSmpFrame(); // update the results of the vis tests R_UpdateVisTests(); if ( frontEndMsec ) { *frontEndMsec = tr.frontEndMsec; } tr.frontEndMsec = 0; if ( backEndMsec ) { *backEndMsec = backEnd.pc.msec; } backEnd.pc.msec = 0; }
/* ============= RE_EndFrame Returns the number of msec spent in the back end ============= */ void RE_EndFrame( int *frontEndMsec, int *backEndMsec ) { swapBuffersCommand_t *cmd; if ( !tr.registered ) { return; } cmd = (swapBuffersCommand_t *) R_GetCommandBuffer( sizeof( *cmd ) ); if ( !cmd ) { return; } cmd->commandId = RC_SWAP_BUFFERS; #ifdef _XBOX if (!qglBeginFrame()) return; #endif R_IssueRenderCommands( qtrue ); #ifdef _XBOX RE_ProcessDissolve(); // render the disolve now qglEndFrame(); #endif // use the other buffers next frame, because another CPU // may still be rendering into the current ones R_ToggleSmpFrame(); if ( frontEndMsec ) { *frontEndMsec = tr.frontEndMsec; } tr.frontEndMsec = 0; if ( backEndMsec ) { *backEndMsec = backEnd.pc.msec; } backEnd.pc.msec = 0; for(int i=0;i<MAX_LIGHT_STYLES;i++) { styleUpdated[i] = false; } }
/* ============= RE_EndFrame Returns the number of msec spent in the back end ============= */ void RE_EndFrame( int *frontEndMsec, int *backEndMsec ) { if ( !tr.registered ) { return; } if ( !R_GetCommandBuffer( RC_SWAP_BUFFERS, 0 ) ) { return; } R_IssueRenderCommands( qtrue ); // use the other buffers next frame, because another CPU // may still be rendering into the current ones R_ToggleSmpFrame(); if ( frontEndMsec ) { *frontEndMsec = tr.frontEndMsec; } tr.frontEndMsec = 0; if ( backEndMsec ) { *backEndMsec = backEnd.pc.msec; } backEnd.pc.msec = 0; }
/* ===================== R_InitFrameData ===================== */ void R_InitFrameData( void ) { int size; frameData_t *frame; frameMemoryBlock_t *block; R_ShutdownFrameData(); frameData = (frameData_t *)Mem_ClearedAlloc( sizeof( *frameData )); frame = frameData; size = MEMORY_BLOCK_SIZE; block = (frameMemoryBlock_t *)Mem_Alloc( size + sizeof( *block ) ); if ( !block ) { common->FatalError( "R_InitFrameData: Mem_Alloc() failed" ); } block->size = size; block->used = 0; block->next = NULL; frame->memory = block; frame->memoryHighwater = 0; R_ToggleSmpFrame(); }
/* =============== R_Init =============== */ void R_Init( void ) { int err; int i; ri.Printf( PRINT_ALL, "----- R_Init -----\n" ); // clear all our internal state memset( &tr, 0, sizeof( tr ) ); memset( &backEnd, 0, sizeof( backEnd ) ); memset( &tess, 0, sizeof( tess ) ); Swap_Init(); if ( (intptr_t)tess.xyz & 15 ) { Com_Printf( "WARNING: tess.xyz not 16 byte aligned\n" ); } memset( tess.constantColor255, 255, sizeof( tess.constantColor255 ) ); // // init function tables // for ( i = 0; i < FUNCTABLE_SIZE; i++ ) { tr.sinTable[i] = sin( DEG2RAD( i * 360.0f / ( ( float ) ( FUNCTABLE_SIZE - 1 ) ) ) ); tr.squareTable[i] = ( i < FUNCTABLE_SIZE / 2 ) ? 1.0f : -1.0f; tr.sawToothTable[i] = (float)i / FUNCTABLE_SIZE; tr.inverseSawToothTable[i] = 1.0f - tr.sawToothTable[i]; if ( i < FUNCTABLE_SIZE / 2 ) { if ( i < FUNCTABLE_SIZE / 4 ) { tr.triangleTable[i] = ( float ) i / ( FUNCTABLE_SIZE / 4 ); } else { tr.triangleTable[i] = 1.0f - tr.triangleTable[i - FUNCTABLE_SIZE / 4]; } } else { tr.triangleTable[i] = -tr.triangleTable[i - FUNCTABLE_SIZE / 2]; } } R_InitFogTable(); R_NoiseInit(); R_Register(); // Ridah, init the virtual memory R_Hunk_Begin(); max_polys = r_maxpolys->integer; if ( max_polys < MAX_POLYS ) { max_polys = MAX_POLYS; } max_polyverts = r_maxpolyverts->integer; if ( max_polyverts < MAX_POLYVERTS ) { max_polyverts = MAX_POLYVERTS; } // backEndData[0] = ri.Hunk_Alloc( sizeof( *backEndData[0] ), h_low ); backEndData[0] = ri.Hunk_Alloc( sizeof( *backEndData[0] ) + sizeof( srfPoly_t ) * max_polys + sizeof( polyVert_t ) * max_polyverts, h_low ); if ( r_smp->integer ) { // backEndData[1] = ri.Hunk_Alloc( sizeof( *backEndData[1] ), h_low ); backEndData[1] = ri.Hunk_Alloc( sizeof( *backEndData[1] ) + sizeof( srfPoly_t ) * max_polys + sizeof( polyVert_t ) * max_polyverts, h_low ); } else { backEndData[1] = NULL; } R_ToggleSmpFrame(); InitOpenGL(); R_InitImages(); R_InitShaders(); R_InitSkins(); R_ModelInit(); R_InitFreeType(); RB_ZombieFXInit(); err = qglGetError(); if ( err != GL_NO_ERROR ) { ri.Printf( PRINT_ALL, "glGetError() = 0x%x\n", err ); } ri.Printf( PRINT_ALL, "----- finished R_Init -----\n" ); }
/* =============== R_Init =============== */ void R_Init( void ) { int err; int i; byte *ptr; ri.Printf( PRINT_ALL, "----- R_Init -----\n" ); // clear all our internal state Com_Memset( &tr, 0, sizeof( tr ) ); Com_Memset( &backEnd, 0, sizeof( backEnd ) ); Com_Memset( &tess, 0, sizeof( tess ) ); if(sizeof(glconfig_t) != 11332) ri.Error( ERR_FATAL, "Mod ABI incompatible: sizeof(glconfig_t) == %u != 11332", (unsigned int) sizeof(glconfig_t)); // Swap_Init(); if ( (intptr_t)tess.xyz & 15 ) { ri.Printf( PRINT_WARNING, "tess.xyz not 16 byte aligned\n" ); } Com_Memset( tess.constantColor255, 255, sizeof( tess.constantColor255 ) ); // // init function tables // for ( i = 0; i < FUNCTABLE_SIZE; i++ ) { tr.sinTable[i] = sin( DEG2RAD( i * 360.0f / ( ( float ) ( FUNCTABLE_SIZE - 1 ) ) ) ); tr.squareTable[i] = ( i < FUNCTABLE_SIZE/2 ) ? 1.0f : -1.0f; tr.sawToothTable[i] = (float)i / FUNCTABLE_SIZE; tr.inverseSawToothTable[i] = 1.0f - tr.sawToothTable[i]; if ( i < FUNCTABLE_SIZE / 2 ) { if ( i < FUNCTABLE_SIZE / 4 ) { tr.triangleTable[i] = ( float ) i / ( FUNCTABLE_SIZE / 4 ); } else { tr.triangleTable[i] = 1.0f - tr.triangleTable[i-FUNCTABLE_SIZE / 4]; } } else { tr.triangleTable[i] = -tr.triangleTable[i-FUNCTABLE_SIZE/2]; } } R_InitFogTable(); R_NoiseInit(); R_Register(); R_BloomInit(); R_PostprocessingInit(); max_polys = r_maxpolys->integer; if (max_polys < MAX_POLYS) max_polys = MAX_POLYS; max_polyverts = r_maxpolyverts->integer; if (max_polyverts < MAX_POLYVERTS) max_polyverts = MAX_POLYVERTS; ptr = ri.Hunk_Alloc( sizeof( *backEndData[0] ) + sizeof(srfPoly_t) * max_polys + sizeof(polyVert_t) * max_polyverts, h_low); backEndData[0] = (backEndData_t *) ptr; backEndData[0]->polys = (srfPoly_t *) ((char *) ptr + sizeof( *backEndData[0] )); backEndData[0]->polyVerts = (polyVert_t *) ((char *) ptr + sizeof( *backEndData[0] ) + sizeof(srfPoly_t) * max_polys); if ( r_smp->integer ) { ptr = ri.Hunk_Alloc( sizeof( *backEndData[1] ) + sizeof(srfPoly_t) * max_polys + sizeof(polyVert_t) * max_polyverts, h_low); backEndData[1] = (backEndData_t *) ptr; backEndData[1]->polys = (srfPoly_t *) ((char *) ptr + sizeof( *backEndData[1] )); backEndData[1]->polyVerts = (polyVert_t *) ((char *) ptr + sizeof( *backEndData[1] ) + sizeof(srfPoly_t) * max_polys); } else { backEndData[1] = NULL; } R_ToggleSmpFrame(); InitOpenGL(); R_InitImages(); R_GLSL_Init(); R_InitShaders(); R_InitSkins(); R_ModelInit(); R_InitFreeType(); err = qglGetError(); if ( err != GL_NO_ERROR ) ri.Printf (PRINT_ALL, "glGetError() = 0x%x\n", err); // print info GfxInfo_f(); ri.Printf( PRINT_ALL, "----- finished R_Init -----\n" ); }
void R_Init( void ) { int i; byte *ptr; // Com_Printf ("----- R_Init -----\n" ); // clear all our internal state Com_Memset( &tr, 0, sizeof( tr ) ); Com_Memset( &backEnd, 0, sizeof( backEnd ) ); #ifndef DEDICATED Com_Memset( &tess, 0, sizeof( tess ) ); #endif // Swap_Init(); #ifndef DEDICATED #ifndef FINAL_BUILD if ( (int)tess.xyz & 15 ) { Com_Printf( "WARNING: tess.xyz not 16 byte aligned (%x)\n",(int)tess.xyz & 15 ); } #endif #endif // // init function tables // for ( i = 0; i < FUNCTABLE_SIZE; i++ ) { tr.sinTable[i] = sin( DEG2RAD( i * 360.0f / ( ( float ) ( FUNCTABLE_SIZE - 1 ) ) ) ); tr.squareTable[i] = ( i < FUNCTABLE_SIZE/2 ) ? 1.0f : -1.0f; tr.sawToothTable[i] = (float)i / FUNCTABLE_SIZE; tr.inverseSawToothTable[i] = 1.0f - tr.sawToothTable[i]; if ( i < FUNCTABLE_SIZE / 2 ) { if ( i < FUNCTABLE_SIZE / 4 ) { tr.triangleTable[i] = ( float ) i / ( FUNCTABLE_SIZE / 4 ); } else { tr.triangleTable[i] = 1.0f - tr.triangleTable[i-FUNCTABLE_SIZE / 4]; } } else { tr.triangleTable[i] = -tr.triangleTable[i-FUNCTABLE_SIZE/2]; } } #ifndef DEDICATED R_InitFogTable(); R_NoiseInit(); #endif R_Register(); max_polys = r_maxpolys->integer; if (max_polys < MAX_POLYS) max_polys = MAX_POLYS; max_polyverts = r_maxpolyverts->integer; if (max_polyverts < MAX_POLYVERTS) max_polyverts = MAX_POLYVERTS; ptr = (byte *)Hunk_Alloc( sizeof( *backEndData ) + sizeof(srfPoly_t) * max_polys + sizeof(polyVert_t) * max_polyverts, h_low); backEndData = (backEndData_t *) ptr; backEndData->polys = (srfPoly_t *) ((char *) ptr + sizeof( *backEndData )); backEndData->polyVerts = (polyVert_t *) ((char *) ptr + sizeof( *backEndData ) + sizeof(srfPoly_t) * max_polys); #ifndef DEDICATED R_ToggleSmpFrame(); for(i = 0; i < MAX_LIGHT_STYLES; i++) { RE_SetLightStyle(i, -1); } InitOpenGL(); R_InitImages(); R_InitShaders(qfalse); R_InitSkins(); R_TerrainInit(); //rwwRMG - added R_InitFonts(); #endif R_ModelInit(); G2VertSpaceServer = &CMiniHeap_singleton; #ifndef DEDICATED R_InitDecals ( ); R_InitWorldEffects(); int err = qglGetError(); if ( err != GL_NO_ERROR ) Com_Printf ( "glGetError() = 0x%x\n", err); #endif // Com_Printf ("----- finished R_Init -----\n" ); }
/* =============== R_Init =============== */ void R_Init( void ) { int i; ri.Printf( PRINT_DEVELOPER, "----- R_Init -----\n" ); // clear all our internal state memset( &tr, 0, sizeof( tr ) ); memset( &backEnd, 0, sizeof( backEnd ) ); memset( &tess, 0, sizeof( tess ) ); tess.xyz = tess_xyz; tess.texCoords0 = tess_texCoords0; tess.texCoords1 = tess_texCoords1; tess.indexes = tess_indexes; tess.normal = tess_normal; tess.vertexColors = tess_vertexColors; tess.maxShaderVerts = SHADER_MAX_VERTEXES; tess.maxShaderIndicies = SHADER_MAX_INDEXES; if ( ( intptr_t ) tess.xyz & 15 ) { Com_DPrintf( "WARNING: tess.xyz not 16 byte aligned\n" ); } memset( tess.constantColor255, 255, sizeof( tess.constantColor255 ) ); // // init function tables // for ( i = 0; i < FUNCTABLE_SIZE; i++ ) { tr.sinTable[ i ] = sin( DEG2RAD( i * 360.0f / ( ( float )( FUNCTABLE_SIZE - 1 ) ) ) ); tr.squareTable[ i ] = ( i < FUNCTABLE_SIZE / 2 ) ? 1.0f : -1.0f; tr.sawToothTable[ i ] = ( float ) i / FUNCTABLE_SIZE; tr.inverseSawToothTable[ i ] = 1.0f - tr.sawToothTable[ i ]; if ( i < FUNCTABLE_SIZE / 2 ) { if ( i < FUNCTABLE_SIZE / 4 ) { tr.triangleTable[ i ] = ( float ) i / ( FUNCTABLE_SIZE / 4 ); } else { tr.triangleTable[ i ] = 1.0f - tr.triangleTable[ i - FUNCTABLE_SIZE / 4 ]; } } else { tr.triangleTable[ i ] = -tr.triangleTable[ i - FUNCTABLE_SIZE / 2 ]; } } // Ridah, init the virtual memory R_Hunk_Begin(); R_InitFogTable(); R_NoiseInit(); R_Register(); max_polys = r_maxpolys->integer; if ( max_polys < MAX_POLYS ) { max_polys = MAX_POLYS; } max_polyverts = r_maxpolyverts->integer; if ( max_polyverts < MAX_POLYVERTS ) { max_polyverts = MAX_POLYVERTS; } // backEndData[0] = ri.Hunk_Alloc( sizeof( *backEndData[0] ), h_low ); backEndData[ 0 ] = ri.Hunk_Alloc( sizeof( *backEndData[ 0 ] ) + sizeof( srfPoly_t ) * max_polys + sizeof( polyVert_t ) * max_polyverts, h_low ); if ( r_smp->integer ) { // backEndData[1] = ri.Hunk_Alloc( sizeof( *backEndData[1] ), h_low ); backEndData[ 1 ] = ri.Hunk_Alloc( sizeof( *backEndData[ 1 ] ) + sizeof( srfPoly_t ) * max_polys + sizeof( polyVert_t ) * max_polyverts, h_low ); } else { backEndData[ 1 ] = NULL; } R_ToggleSmpFrame(); InitOpenGL(); R_InitImages(); R_InitShaders(); R_InitSkins(); R_ModelInit(); #if defined( USE_REFENTITY_ANIMATIONSYSTEM ) R_InitAnimations(); #endif R_InitFreeType(); GL_CheckErrors(); // print info GfxInfo_f(); ri.Printf( PRINT_DEVELOPER, "----- finished R_Init -----\n" ); }
/* =============== R_Init =============== */ void R_Init( void ) { int i; byte *ptr; ri.Printf( PRINT_ALL, "----- R_Init -----\n" ); // clear all our internal state Com_Memset( &tr, 0, sizeof( tr ) ); Com_Memset( &backEnd, 0, sizeof( backEnd ) ); #ifndef DEDICATED Com_Memset( &tess, 0, sizeof( tess ) ); #endif // Swap_Init(); #ifndef DEDICATED #ifndef FINAL_BUILD if ( (int)tess.xyz & 15 ) { Com_Printf( "WARNING: tess.xyz not 16 byte aligned (%x)\n",(int)tess.xyz & 15 ); } #endif Com_Memset( tess.constantColor255, 255, sizeof( tess.constantColor255 ) ); #endif // // init function tables // for ( i = 0; i < FUNCTABLE_SIZE; i++ ) { tr.sinTable[i] = sin( DEG2RAD( i * 360.0f / ( ( float ) ( FUNCTABLE_SIZE - 1 ) ) ) ); tr.squareTable[i] = ( i < FUNCTABLE_SIZE/2 ) ? 1.0f : -1.0f; tr.sawToothTable[i] = (float)i / FUNCTABLE_SIZE; tr.inverseSawToothTable[i] = 1.0f - tr.sawToothTable[i]; if ( i < FUNCTABLE_SIZE / 2 ) { if ( i < FUNCTABLE_SIZE / 4 ) { tr.triangleTable[i] = ( float ) i / ( FUNCTABLE_SIZE / 4 ); } else { tr.triangleTable[i] = 1.0f - tr.triangleTable[i-FUNCTABLE_SIZE / 4]; } } else { tr.triangleTable[i] = -tr.triangleTable[i-FUNCTABLE_SIZE/2]; } } #ifndef DEDICATED R_InitFogTable(); R_NoiseInit(); #endif R_Register(); max_polys = r_maxpolys->integer; if (max_polys < MAX_POLYS) max_polys = MAX_POLYS; max_polyverts = r_maxpolyverts->integer; if (max_polyverts < MAX_POLYVERTS) max_polyverts = MAX_POLYVERTS; ptr = (unsigned char *)ri.Hunk_Alloc( sizeof( *backEndData[0] ) + sizeof(srfPoly_t) * max_polys + sizeof(polyVert_t) * max_polyverts, h_low); backEndData[0] = (backEndData_t *) ptr; backEndData[0]->polys = (srfPoly_t *) ((char *) ptr + sizeof( *backEndData[0] )); backEndData[0]->polyVerts = (polyVert_t *) ((char *) ptr + sizeof( *backEndData[0] ) + sizeof(srfPoly_t) * max_polys); if ( r_smp->integer ) { ptr = (unsigned char *)ri.Hunk_Alloc( sizeof( *backEndData[1] ) + sizeof(srfPoly_t) * max_polys + sizeof(polyVert_t) * max_polyverts, h_low); backEndData[1] = (backEndData_t *) ptr; backEndData[1]->polys = (srfPoly_t *) ((char *) ptr + sizeof( *backEndData[1] )); backEndData[1]->polyVerts = (polyVert_t *) ((char *) ptr + sizeof( *backEndData[1] ) + sizeof(srfPoly_t) * max_polys); } else { backEndData[1] = NULL; } #ifndef DEDICATED R_ToggleSmpFrame(); for(i = 0; i < MAX_LIGHT_STYLES; i++) { RE_SetLightStyle(i, -1); } InitOpenGL(); R_InitImages(); R_InitShaders(); R_InitSkins(); R_InitFonts(); #endif R_ModelInit(); #ifndef DEDICATED #ifdef G2_COLLISION_ENABLED if (!G2VertSpaceServer) { G2VertSpaceServer = new CMiniHeap(G2_VERT_SPACE_SERVER_SIZE * 1024); } #endif int err = qglGetError(); if ( err != GL_NO_ERROR ) ri.Printf (PRINT_ALL, "glGetError() = 0x%x\n", err); #endif ri.Printf( PRINT_ALL, "----- finished R_Init -----\n" ); }
void R_Init( void ) { int err; int i; ri.Printf( PRINT_ALL, "----- R_Init -----\n" ); ShaderEntryPtrs_Clear(); // clear all our internal state memset( &tr, 0, sizeof( tr ) ); memset( &backEnd, 0, sizeof( backEnd ) ); memset( &tess, 0, sizeof( tess ) ); Swap_Init(); #ifndef FINAL_BUILD if ( (int)tess.xyz & 15 ) { Com_Printf( "WARNING: tess.xyz not 16 byte aligned (%x)\n",(int)tess.xyz & 15 ); } #endif memset( tess.constantColor255, 255, sizeof( tess.constantColor255 ) ); // // init function tables // for ( i = 0; i < FUNCTABLE_SIZE; i++ ) { tr.sinTable[i] = sin( DEG2RAD( i * 360.0f / ( ( float ) ( FUNCTABLE_SIZE - 1 ) ) ) ); tr.squareTable[i] = ( i < FUNCTABLE_SIZE/2 ) ? 1.0f : -1.0f; tr.sawToothTable[i] = (float)i / FUNCTABLE_SIZE; tr.inverseSawToothTable[i] = 1.0 - tr.sawToothTable[i]; if ( i < FUNCTABLE_SIZE / 2 ) { if ( i < FUNCTABLE_SIZE / 4 ) { tr.triangleTable[i] = ( float ) i / ( FUNCTABLE_SIZE / 4 ); } else { tr.triangleTable[i] = 1.0f - tr.triangleTable[i-FUNCTABLE_SIZE / 4]; } } else { tr.triangleTable[i] = -tr.triangleTable[i-FUNCTABLE_SIZE/2]; } } R_InitFogTable(); R_NoiseInit(); R_Register(); backEndData[0] = (backEndData_t *) ri.Hunk_Alloc( sizeof( *backEndData[0] ), qtrue ); if ( r_smp->integer ) { backEndData[1] = (backEndData_t *) ri.Hunk_Alloc( sizeof( *backEndData[1] ), qtrue ); } else { backEndData[1] = NULL; } R_ToggleSmpFrame(); const color4ub_t color = {0xff, 0xff, 0xff, 0xff}; for(i=0;i<MAX_LIGHT_STYLES;i++) { RE_SetLightStyle(i, *(int*)color); } InitOpenGL(); R_InitImages(); R_InitShaders(); R_InitSkins(); R_ModelInit(); // R_InitWorldEffects(); R_InitFonts(); err = qglGetError(); if ( err != GL_NO_ERROR ) ri.Printf (PRINT_ALL, "glGetError() = 0x%x\n", err); ri.Printf( PRINT_ALL, "----- finished R_Init -----\n" ); }
void RE_EndFrame( int *frontEndMsec, int *backEndMsec ) { swapBuffersCommand_t *cmd; float x; float y; float w; float h; GLuint texID; static int b = 0; if ( !tr.registered ) { return; } cmd = R_GetCommandBuffer( sizeof( *cmd ) ); if ( !cmd ) { return; } cmd->commandId = RC_SWAP_BUFFERS; R_IssueRenderCommands( qtrue ); //*** Rift post processing if (vr_warpingShader->integer) { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); if (!backEnd.projection2D) { RB_SetGL2D(); } glViewport(0, 0, glConfig.vidWidth, glConfig.vidHeight); // Render on the whole framebuffer, complete from the lower left corner to the upper right // Use our shader glUseProgram(glConfig.oculusProgId); glEnable(GL_TEXTURE_2D); { float VPX = 0.0f; float VPY = 0.0f; float VPW = glConfig.vidWidth; // ViewPort Width float VPH = glConfig.vidHeight; SetupShaderDistortion(0, VPX, VPY, VPW, VPH); // Left Eye } // Set our "renderedTexture" sampler to user Texture Unit 0 texID = glGetUniformLocation(glConfig.oculusProgId, "texid"); glUniform1i(texID, 0); qglColor3f( tr.identityLight, tr.identityLight, tr.identityLight ); // if (stereoFrame == STEREO_LEFT) { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, glConfig.oculusRenderTargetLeft); x = 0.0f; y = 0.0f; w = glConfig.vidWidth; h = glConfig.vidHeight; qglBegin (GL_QUADS); qglTexCoord2f( 0, 1 ); qglVertex2f( x, y ); qglTexCoord2f( 1, 1 ); qglVertex2f( x + w/2, y ); qglTexCoord2f( 1, 0 ); qglVertex2f( x + w/2, y + h ); qglTexCoord2f( 0, 0 ); qglVertex2f( x, y + h ); qglEnd(); } //else { { float VPX = 0; float VPY = 0.0f; float VPW = glConfig.vidWidth; // ViewPort Width float VPH = glConfig.vidHeight; SetupShaderDistortion(1, VPX, VPY, VPW, VPH); // Right Eye } glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, glConfig.oculusRenderTargetRight); x = glConfig.vidWidth*0.5f; y = 0.0f; w = glConfig.vidWidth; h = glConfig.vidHeight; qglBegin (GL_QUADS); qglTexCoord2f( 0, 1 ); qglVertex2f( x, y ); qglTexCoord2f( 1, 1 ); qglVertex2f( x + w/2, y ); qglTexCoord2f( 1, 0 ); qglVertex2f( x + w/2, y + h ); qglTexCoord2f( 0, 0 ); qglVertex2f( x, y + h ); qglEnd(); } // unbind the GLSL program // this means that from here the OpenGL fixed functionality is used glUseProgram(0); } // use the other buffers next frame, because another CPU // may still be rendering into the current ones R_ToggleSmpFrame(); if ( frontEndMsec ) { *frontEndMsec = tr.frontEndMsec; } tr.frontEndMsec = 0; if ( backEndMsec ) { *backEndMsec = backEnd.pc.msec; } backEnd.pc.msec = 0; }
/* =============== R_Init =============== */ void R_Init( void ) { int err; int i; byte *ptr; waitforit("R_Init 1"); ri.Printf( PRINT_ALL, "----- R_Init -----\n" ); // clear all our internal state Com_Memset( &tr, 0, sizeof( tr ) ); Com_Memset( &backEnd, 0, sizeof( backEnd ) ); Com_Memset( &tess, 0, sizeof( tess ) ); // Swap_Init(); waitforit("R_Init 2"); if ((int)tess.xyz & 15) { Com_Printf( "WARNING: tess.xyz not 16 byte aligned\n" ); } Com_Memset( tess.constantColor255, 255, sizeof( tess.constantColor255 ) ); // // init function tables // waitforit("R_Init 3"); for (i = 0; i < FUNCTABLE_SIZE; i++) { tr.sinTable[i] = sin( DEG2RAD( i * 360.0f / ( ( float ) ( FUNCTABLE_SIZE - 1 ) ) ) ); tr.squareTable[i] = ( i < FUNCTABLE_SIZE/2 ) ? 1.0f : -1.0f; tr.sawToothTable[i] = (float)i / FUNCTABLE_SIZE; tr.inverseSawToothTable[i] = 1.0f - tr.sawToothTable[i]; if ( i < FUNCTABLE_SIZE / 2 ) { if ( i < FUNCTABLE_SIZE / 4 ) { tr.triangleTable[i] = ( float ) i / ( FUNCTABLE_SIZE / 4 ); } else { tr.triangleTable[i] = 1.0f - tr.triangleTable[i-FUNCTABLE_SIZE / 4]; } } else { tr.triangleTable[i] = -tr.triangleTable[i-FUNCTABLE_SIZE/2]; } } waitforit("R_Init 4"); R_InitFogTable(); waitforit("R_Init 5"); R_NoiseInit(); waitforit("R_Init 6"); R_Register(); max_polys = r_maxpolys->integer; if (max_polys < MAX_POLYS) max_polys = MAX_POLYS; waitforit("R_Init 7"); max_polyverts = r_maxpolyverts->integer; if (max_polyverts < MAX_POLYVERTS) max_polyverts = MAX_POLYVERTS; waitforit("R_Init 8"); ptr = ri.Hunk_Alloc(sizeof(*backEndData[0]), h_low); backEndData[0] = (backEndData_t *) ptr; if ( r_smp->integer ) { ptr = ri.Hunk_Alloc( sizeof( *backEndData[1] ), h_low); backEndData[1] = (backEndData_t *) ptr; } else { backEndData[1] = NULL; } waitforit("R_Init 9"); R_ToggleSmpFrame(); waitforit("R_Init A"); InitOpenGL(); waitforit("R_Init B"); R_InitImages(); waitforit("R_Init C"); R_InitShaders(); waitforit("R_Init D"); R_InitSkins(); waitforit("R_Init E"); R_ModelInit(); waitforit("R_Init F"); R_InitFreeType(); waitforit("R_Init G"); err = qglGetError(); if ( err != GL_NO_ERROR ) ri.Printf (PRINT_ALL, "glGetError() = 0x%x\n", err); waitforit("R_Init H"); ri.Printf(PRINT_ALL, "----- finished R_Init -----\n"); waitforit("R_Init I"); }
/* ===================== idRenderSystemLocal::SwapCommandBuffers_FinishCommandBuffers ===================== */ const emptyCommand_t* idRenderSystemLocal::SwapCommandBuffers_FinishCommandBuffers() { if( !R_IsInitialized() ) { return NULL; } // close any gui drawing guiModel->EmitFullScreen(); guiModel->Clear(); // unmap the buffer objects so they can be used by the GPU vertexCache.BeginBackEnd(); // save off this command buffer const emptyCommand_t* commandBufferHead = frameData->cmdHead; // copy the code-used drawsurfs that were // allocated at the start of the buffer memory to the backEnd referenced locations backEnd.unitSquareSurface = tr.unitSquareSurface_; backEnd.zeroOneCubeSurface = tr.zeroOneCubeSurface_; backEnd.testImageSurface = tr.testImageSurface_; // use the other buffers next frame, because another CPU // may still be rendering into the current buffers R_ToggleSmpFrame(); // possibly change the stereo3D mode // PC if( glConfig.nativeScreenWidth == 1280 && glConfig.nativeScreenHeight == 1470 ) { glConfig.stereo3Dmode = STEREO3D_HDMI_720; } else { glConfig.stereo3Dmode = GetStereoScopicRenderingMode(); } // prepare the new command buffer guiModel->BeginFrame(); //------------------------------ // Make sure that geometry used by code is present in the buffer cache. // These use frame buffer cache (not static) because they may be used during // map loads. // // It is important to do this first, so if the buffers overflow during // scene generation, the basic surfaces needed for drawing the buffers will // always be present. //------------------------------ R_InitDrawSurfFromTri( tr.unitSquareSurface_, *tr.unitSquareTriangles ); R_InitDrawSurfFromTri( tr.zeroOneCubeSurface_, *tr.zeroOneCubeTriangles ); R_InitDrawSurfFromTri( tr.testImageSurface_, *tr.testImageTriangles ); // Reset render crop to be the full screen renderCrops[0].x1 = 0; renderCrops[0].y1 = 0; renderCrops[0].x2 = GetWidth() - 1; renderCrops[0].y2 = GetHeight() - 1; currentRenderCrop = 0; // this is the ONLY place this is modified frameCount++; // just in case we did a common->Error while this // was set guiRecursionLevel = 0; // the first rendering will be used for commands like // screenshot, rather than a possible subsequent remote // or mirror render // primaryWorld = NULL; // set the time for shader effects in 2D rendering frameShaderTime = Sys_Milliseconds() * 0.001; setBufferCommand_t* cmd2 = ( setBufferCommand_t* )R_GetCommandBuffer( sizeof( *cmd2 ) ); cmd2->commandId = RC_SET_BUFFER; cmd2->buffer = ( int )GL_BACK; // the old command buffer can now be rendered, while the new one can // be built in parallel return commandBufferHead; }
void R_Init( void ) { int err; int i; //VID_Printf( PRINT_ALL, "----- R_Init -----\n" ); #ifdef _XBOX extern qboolean vidRestartReloadMap; if (!vidRestartReloadMap) { Hunk_Clear(); extern void CM_Free(void); CM_Free(); void CM_CleanLeafCache(void); CM_CleanLeafCache(); } #endif ShaderEntryPtrs_Clear(); #ifdef _XBOX //Save visibility info as it has already been set. SPARC<byte> *vis = tr.externalVisData; #endif // clear all our internal state memset( &tr, 0, sizeof( tr ) ); memset( &backEnd, 0, sizeof( backEnd ) ); memset( &tess, 0, sizeof( tess ) ); #ifdef _XBOX //Restore visibility info. tr.externalVisData = vis; #endif Swap_Init(); #ifndef FINAL_BUILD if ( (int)tess.xyz & 15 ) { Com_Printf( "WARNING: tess.xyz not 16 byte aligned (%x)\n",(int)tess.xyz & 15 ); } #endif // // init function tables // for ( i = 0; i < FUNCTABLE_SIZE; i++ ) { tr.sinTable[i] = sin( DEG2RAD( i * 360.0f / ( ( float ) ( FUNCTABLE_SIZE - 1 ) ) ) ); tr.squareTable[i] = ( i < FUNCTABLE_SIZE/2 ) ? 1.0f : -1.0f; tr.sawToothTable[i] = (float)i / FUNCTABLE_SIZE; tr.inverseSawToothTable[i] = 1.0 - tr.sawToothTable[i]; if ( i < FUNCTABLE_SIZE / 2 ) { if ( i < FUNCTABLE_SIZE / 4 ) { tr.triangleTable[i] = ( float ) i / ( FUNCTABLE_SIZE / 4 ); } else { tr.triangleTable[i] = 1.0f - tr.triangleTable[i-FUNCTABLE_SIZE / 4]; } } else { tr.triangleTable[i] = -tr.triangleTable[i-FUNCTABLE_SIZE/2]; } } R_InitFogTable(); R_NoiseInit(); R_Register(); backEndData = (backEndData_t *) Hunk_Alloc( sizeof( backEndData_t ), qtrue ); R_ToggleSmpFrame(); //r_smp const color4ub_t color = {0xff, 0xff, 0xff, 0xff}; for(i=0;i<MAX_LIGHT_STYLES;i++) { RE_SetLightStyle(i, *(int*)color); } InitOpenGL(); R_InitImages(); R_InitShaders(); R_InitSkins(); #ifndef _XBOX R_TerrainInit(); #endif R_ModelInit(); // R_InitWorldEffects(); R_InitFonts(); err = qglGetError(); if ( err != GL_NO_ERROR ) VID_Printf (PRINT_ALL, "glGetError() = 0x%x\n", err); //VID_Printf( PRINT_ALL, "----- finished R_Init -----\n" ); }
/* =============== R_Init =============== */ void R_Init( void ) { int err; int i; byte *ptr; ri.Printf( PRINT_ALL, "----- R_Init -----\n" ); //get CPU info Sys_GetCpuInfo( &cpuInfo ); // clear all our internal state Com_Memset( &tr, 0, sizeof( tr ) ); Com_Memset( &backEnd, 0, sizeof( backEnd ) ); Com_Memset( &tess, 0, sizeof( tess ) ); // Swap_Init(); if ( (int)tess.xyz & 15 ) { ri.Printf( PRINT_ERROR, "WARNING: tess.xyz not 16 byte aligned\n" ); } // // init function tables // for ( i = 0; i < FUNCTABLE_SIZE; i++ ) { tr.sinTable[i] = sin( DEG2RAD( i * 360.0f / ( ( float ) ( FUNCTABLE_SIZE - 1 ) ) ) ); tr.squareTable[i] = ( i < FUNCTABLE_SIZE/2 ) ? 1.0f : -1.0f; tr.sawToothTable[i] = (float)i / FUNCTABLE_SIZE; tr.inverseSawToothTable[i] = 1.0f - tr.sawToothTable[i]; if ( i < FUNCTABLE_SIZE / 2 ) { if ( i < FUNCTABLE_SIZE / 4 ) { tr.triangleTable[i] = ( float ) i / ( FUNCTABLE_SIZE / 4 ); } else { tr.triangleTable[i] = 1.0f - tr.triangleTable[i-FUNCTABLE_SIZE / 4]; } } else { tr.triangleTable[i] = -tr.triangleTable[i-FUNCTABLE_SIZE/2]; } } R_InitFogTable(); R_NoiseInit(); R_Register(); max_polys = r_maxpolys->integer; if (max_polys < MAX_POLYS) max_polys = MAX_POLYS; max_polyverts = r_maxpolyverts->integer; if (max_polyverts < MAX_POLYVERTS) max_polyverts = MAX_POLYVERTS; ptr = ri.Hunk_Alloc( sizeof( *backEndData[0] ) + sizeof(srfPoly_t) * max_polys + sizeof(polyVert_t) * max_polyverts, h_low); backEndData[0] = (backEndData_t *) ptr; backEndData[0]->polys = (srfPoly_t *) ((char *) ptr + sizeof( *backEndData[0] )); backEndData[0]->polyVerts = (polyVert_t *) ((char *) ptr + sizeof( *backEndData[0] ) + sizeof(srfPoly_t) * max_polys); if ( r_smp->integer ) { ptr = ri.Hunk_Alloc( sizeof( *backEndData[1] ) + sizeof(srfPoly_t) * max_polys + sizeof(polyVert_t) * max_polyverts, h_low); backEndData[1] = (backEndData_t *) ptr; backEndData[1]->polys = (srfPoly_t *) ((char *) ptr + sizeof( *backEndData[1] )); backEndData[1]->polyVerts = (polyVert_t *) ((char *) ptr + sizeof( *backEndData[1] ) + sizeof(srfPoly_t) * max_polys); } else { backEndData[1] = NULL; } R_ToggleSmpFrame(); InitOpenGL(); R_StateInit(); //make sure these are called after state is brought up R_StateSetTextureModeCvar( r_textureMode->string ); R_StateSetTextureAnisotropyCvar( r_textureAniso->integer ); R_StateSetTextureMinLodCvar( r_textureLod->integer ); R_InitImages(); R_SpInit(); R_PpInit(); R_InitShaders(); R_InitSkins(); R_ModelInit(); R_InitFreeType(); err = glGetError(); if ( err != GL_NO_ERROR ) ri.Printf (PRINT_ALL, "glGetError() = 0x%x\n", err); ri.Printf( PRINT_ALL, "----- finished R_Init -----\n" ); }