From 980a331cec780fe0b2a860517d02a2566eb7451c Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Thu, 24 Jan 2013 22:53:08 +0000 Subject: Remove the SMP renderer feature --- src/rend2/tr_backend.c | 45 +++-------------------- src/rend2/tr_bsp.c | 4 +-- src/rend2/tr_cmds.c | 96 +++++++------------------------------------------- src/rend2/tr_fbo.c | 5 ++- src/rend2/tr_font.c | 3 +- src/rend2/tr_glsl.c | 3 +- src/rend2/tr_image.c | 3 +- src/rend2/tr_init.c | 33 ++++------------- src/rend2/tr_light.c | 8 ++--- src/rend2/tr_local.h | 47 +++++++----------------- src/rend2/tr_main.c | 7 +--- src/rend2/tr_model.c | 5 ++- src/rend2/tr_scene.c | 36 ++++++++----------- src/rend2/tr_shader.c | 14 +------- src/rend2/tr_surface.c | 22 +++++++----- src/rend2/tr_vbo.c | 12 +++---- src/rend2/tr_world.c | 16 ++++----- 17 files changed, 90 insertions(+), 269 deletions(-) (limited to 'src/rend2') diff --git a/src/rend2/tr_backend.c b/src/rend2/tr_backend.c index c3d39433..4e6ab2dd 100644 --- a/src/rend2/tr_backend.c +++ b/src/rend2/tr_backend.c @@ -21,7 +21,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "tr_local.h" -backEndData_t *backEndData[SMP_FRAMES]; +backEndData_t *backEndData; backEndState_t backEnd; @@ -838,7 +838,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { /* ============================================================================ -RENDER BACK END THREAD FUNCTIONS +RENDER BACK END FUNCTIONS ============================================================================ */ @@ -913,7 +913,7 @@ void RE_StretchRaw (int x, int y, int w, int h, int cols, int rows, const byte * if ( !tr.registered ) { return; } - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); // we definately want to sync every frame for the cinematics qglFinish(); @@ -1811,9 +1811,6 @@ const void *RB_PostProcess(const void *data) /* ==================== RB_ExecuteRenderCommands - -This function will be called synchronously if running without -smp extensions, or asynchronously by another thread. ==================== */ void RB_ExecuteRenderCommands( const void *data ) { @@ -1821,12 +1818,6 @@ void RB_ExecuteRenderCommands( const void *data ) { t1 = ri.Milliseconds (); - if ( !r_smp->integer || data == backEndData[0]->commands.cmds ) { - backEnd.smpFrame = 0; - } else { - backEnd.smpFrame = 1; - } - while ( 1 ) { data = PADP(data, sizeof(void *)); @@ -1866,7 +1857,7 @@ void RB_ExecuteRenderCommands( const void *data ) { break; case RC_END_OF_LIST: default: - // stop rendering on this thread + // stop rendering t2 = ri.Milliseconds (); backEnd.pc.msec = t2 - t1; return; @@ -1874,31 +1865,3 @@ void RB_ExecuteRenderCommands( const void *data ) { } } - - -/* -================ -RB_RenderThread -================ -*/ -void RB_RenderThread( void ) { - const void *data; - - // wait for either a rendering command or a quit command - while ( 1 ) { - // sleep until we have work to do - data = GLimp_RendererSleep(); - - if ( !data ) { - return; // all done, renderer is shutting down - } - - renderThreadActive = qtrue; - - RB_ExecuteRenderCommands( data ); - - renderThreadActive = qfalse; - } -} - - diff --git a/src/rend2/tr_bsp.c b/src/rend2/tr_bsp.c index 08e66c85..0eb56ce4 100644 --- a/src/rend2/tr_bsp.c +++ b/src/rend2/tr_bsp.c @@ -218,7 +218,7 @@ static void R_LoadLightmaps( lump_t *l, lump_t *surfs ) { buf = fileBase + l->fileofs; // we are about to upload textures - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); tr.lightmapSize = DEFAULT_LIGHTMAP_SIZE; numLightmaps = len / (tr.lightmapSize * tr.lightmapSize * 3); @@ -3185,7 +3185,7 @@ void R_MergeLeafSurfaces(void) } // finish up the ibo - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); qglGenBuffersARB(1, &ibo->indexesVBO); diff --git a/src/rend2/tr_cmds.c b/src/rend2/tr_cmds.c index fe4d33d8..622b401a 100644 --- a/src/rend2/tr_cmds.c +++ b/src/rend2/tr_cmds.c @@ -23,9 +23,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA volatile renderCommandList_t *renderCommandList; -volatile qboolean renderThreadActive; - - /* ===================== R_PerformanceCounters @@ -82,49 +79,15 @@ void R_PerformanceCounters( void ) { } -/* -==================== -R_InitCommandBuffers -==================== -*/ -void R_InitCommandBuffers( void ) { - glConfig.smpActive = qfalse; - if ( r_smp->integer ) { - ri.Printf( PRINT_ALL, "Trying SMP acceleration...\n" ); - if ( GLimp_SpawnRenderThread( RB_RenderThread ) ) { - ri.Printf( PRINT_ALL, "...succeeded.\n" ); - glConfig.smpActive = qtrue; - } else { - ri.Printf( PRINT_ALL, "...failed.\n" ); - } - } -} - -/* -==================== -R_ShutdownCommandBuffers -==================== -*/ -void R_ShutdownCommandBuffers( void ) { - // kill the rendering thread - if ( glConfig.smpActive ) { - GLimp_WakeRenderer( NULL ); - glConfig.smpActive = qfalse; - } -} - /* ==================== R_IssueRenderCommands ==================== */ -int c_blockedOnRender; -int c_blockedOnMain; - void R_IssueRenderCommands( qboolean runPerformanceCounters ) { renderCommandList_t *cmdList; - cmdList = &backEndData[tr.smpFrame]->commands; + cmdList = &backEndData->commands; assert(cmdList); // add an end-of-list command *(int *)(cmdList->cmds + cmdList->used) = RC_END_OF_LIST; @@ -132,26 +95,6 @@ void R_IssueRenderCommands( qboolean runPerformanceCounters ) { // clear it out, in case this is a sync and not a buffer flip cmdList->used = 0; - if ( glConfig.smpActive ) { - // if the render thread is not idle, wait for it - if ( renderThreadActive ) { - c_blockedOnRender++; - if ( r_showSmp->integer ) { - ri.Printf( PRINT_ALL, "R" ); - } - } else { - c_blockedOnMain++; - if ( r_showSmp->integer ) { - ri.Printf( PRINT_ALL, "." ); - } - } - - // sleep until the renderer has completed - GLimp_FrontEndSleep(); - } - - // at this point, the back end thread is idle, so it is ok - // to look at its performance counters if ( runPerformanceCounters ) { R_PerformanceCounters(); } @@ -159,49 +102,36 @@ void R_IssueRenderCommands( qboolean runPerformanceCounters ) { // actually start the commands going if ( !r_skipBackEnd->integer ) { // let it start on the new batch - if ( !glConfig.smpActive ) { - RB_ExecuteRenderCommands( cmdList->cmds ); - } else { - GLimp_WakeRenderer( cmdList ); - } + RB_ExecuteRenderCommands( cmdList->cmds ); } } /* ==================== -R_SyncRenderThread +R_IssuePendingRenderCommands Issue any pending commands and wait for them to complete. -After exiting, the render thread will have completed its work -and will remain idle and the main thread is free to issue -OpenGL calls until R_IssueRenderCommands is called. ==================== */ -void R_SyncRenderThread( void ) { +void R_IssuePendingRenderCommands( void ) { if ( !tr.registered ) { return; } R_IssueRenderCommands( qfalse ); - - if ( !glConfig.smpActive ) { - return; - } - GLimp_FrontEndSleep(); } /* ============ R_GetCommandBuffer -make sure there is enough command space, waiting on the -render thread if needed. +make sure there is enough command space ============ */ void *R_GetCommandBuffer( int bytes ) { renderCommandList_t *cmdList; - cmdList = &backEndData[tr.smpFrame]->commands; + cmdList = &backEndData->commands; bytes = PAD(bytes, sizeof(void *)); // always leave room for the end of list command @@ -508,7 +438,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { } else { - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); qglEnable( GL_STENCIL_TEST ); qglStencilMask( ~0U ); qglClearStencil( 0U ); @@ -521,7 +451,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { { // this is only reached if it was on and is now off if ( r_measureOverdraw->modified ) { - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); qglDisable( GL_STENCIL_TEST ); } r_measureOverdraw->modified = qfalse; @@ -531,7 +461,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { // texturemode stuff // if ( r_textureMode->modified ) { - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); GL_TextureMode( r_textureMode->string ); r_textureMode->modified = qfalse; } @@ -542,7 +472,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { if ( r_gamma->modified ) { r_gamma->modified = qfalse; - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); R_SetColorMappings(); } @@ -551,7 +481,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { { int err; - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); if ((err = qglGetError()) != GL_NO_ERROR) ri.Error(ERR_FATAL, "RE_BeginFrame() - glGetError() failed (0x%x)!", err); } @@ -697,9 +627,7 @@ void RE_EndFrame( int *frontEndMsec, int *backEndMsec ) { R_IssueRenderCommands( qtrue ); - // use the other buffers next frame, because another CPU - // may still be rendering into the current ones - R_ToggleSmpFrame(); + R_InitNextFrame(); if ( frontEndMsec ) { *frontEndMsec = tr.frontEndMsec; diff --git a/src/rend2/tr_fbo.c b/src/rend2/tr_fbo.c index 0e84d944..b498fe70 100644 --- a/src/rend2/tr_fbo.c +++ b/src/rend2/tr_fbo.c @@ -370,8 +370,7 @@ void FBO_Init(void) GL_CheckErrors(); - // make sure the render thread is stopped - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); /* if(glRefConfig.textureNonPowerOfTwo) { @@ -862,4 +861,4 @@ void FBO_FastBlit(FBO_t *src, vec4i_t srcBox, FBO_t *dst, vec4i_t dstBox, int bu qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glState.currentFBO = NULL; -} \ No newline at end of file +} diff --git a/src/rend2/tr_font.c b/src/rend2/tr_font.c index 87465e52..0c3d2236 100644 --- a/src/rend2/tr_font.c +++ b/src/rend2/tr_font.c @@ -356,8 +356,7 @@ void RE_RegisterFont(const char *fontName, int pointSize, fontInfo_t *font) { pointSize = 12; } - // make sure the render thread is stopped - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); if (registeredFontCount >= MAX_FONTS) { ri.Printf(PRINT_WARNING, "RE_RegisterFont: Too many fonts registered already.\n"); diff --git a/src/rend2/tr_glsl.c b/src/rend2/tr_glsl.c index 941d75a9..6e8d91ac 100644 --- a/src/rend2/tr_glsl.c +++ b/src/rend2/tr_glsl.c @@ -829,8 +829,7 @@ void GLSL_InitGPUShaders(void) ri.Printf(PRINT_ALL, "------- GLSL_InitGPUShaders -------\n"); - // make sure the render thread is stopped - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); startTime = ri.Milliseconds(); diff --git a/src/rend2/tr_image.c b/src/rend2/tr_image.c index 20edb0af..13dda827 100644 --- a/src/rend2/tr_image.c +++ b/src/rend2/tr_image.c @@ -3349,8 +3349,7 @@ qhandle_t RE_RegisterSkin( const char *name ) { Q_strncpyz( skin->name, name, sizeof( skin->name ) ); skin->numSurfaces = 0; - // make sure the render thread is stopped - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); // If not a .skin file, load as a single shader if ( strcmp( name + strlen( name ) - 5, ".skin" ) ) { diff --git a/src/rend2/tr_init.c b/src/rend2/tr_init.c index 30062bb9..ce2f6176 100644 --- a/src/rend2/tr_init.c +++ b/src/rend2/tr_init.c @@ -55,8 +55,6 @@ cvar_t *r_znear; cvar_t *r_zproj; cvar_t *r_stereoSeparation; -cvar_t *r_smp; -cvar_t *r_showSmp; cvar_t *r_skipBackEnd; cvar_t *r_stereoEnabled; @@ -268,9 +266,6 @@ static void InitOpenGL( void ) } } - // init command buffers and SMP - R_InitCommandBuffers(); - // set default state GL_SetDefaultState(); } @@ -957,9 +952,6 @@ void GfxInfo_f( void ) { ri.Printf( PRINT_ALL, "HACK: riva128 approximations\n" ); } - if ( glConfig.smpActive ) { - ri.Printf( PRINT_ALL, "Using dual processor acceleration\n" ); - } if ( r_finish->integer ) { ri.Printf( PRINT_ALL, "Forcing glFinish\n" ); } @@ -1071,7 +1063,6 @@ void R_Register( void ) r_vertexLight = ri.Cvar_Get( "r_vertexLight", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_uiFullScreen = ri.Cvar_Get( "r_uifullscreen", "0", 0); r_subdivisions = ri.Cvar_Get ("r_subdivisions", "4", CVAR_ARCHIVE | CVAR_LATCH); - r_smp = ri.Cvar_Get( "r_smp", "0", CVAR_ARCHIVE | CVAR_LATCH); r_stereoEnabled = ri.Cvar_Get( "r_stereoEnabled", "0", CVAR_ARCHIVE | CVAR_LATCH); r_greyscale = ri.Cvar_Get("r_greyscale", "0", CVAR_ARCHIVE | CVAR_LATCH); ri.Cvar_CheckRange(r_greyscale, 0, 1, qfalse); @@ -1185,7 +1176,6 @@ void R_Register( void ) r_flareFade = ri.Cvar_Get ("r_flareFade", "7", CVAR_CHEAT); r_flareCoeff = ri.Cvar_Get ("r_flareCoeff", FLARE_STDCOEFF, CVAR_CHEAT); - r_showSmp = ri.Cvar_Get ("r_showSmp", "0", CVAR_CHEAT); r_skipBackEnd = ri.Cvar_Get ("r_skipBackEnd", "0", CVAR_CHEAT); r_measureOverdraw = ri.Cvar_Get( "r_measureOverdraw", "0", CVAR_CHEAT ); @@ -1318,19 +1308,11 @@ void R_Init( void ) { 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(); + ptr = ri.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); + R_InitNextFrame(); InitOpenGL(); @@ -1385,8 +1367,7 @@ void RE_Shutdown( qboolean destroyWindow ) { if ( tr.registered ) { - R_SyncRenderThread(); - R_ShutdownCommandBuffers(); + R_IssuePendingRenderCommands(); R_ShutDownQueries(); if (glRefConfig.framebufferObject) FBO_Shutdown(); @@ -1414,7 +1395,7 @@ Touch all images to make sure they are resident ============= */ void RE_EndRegistration( void ) { - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); if (!ri.Sys_LowPhysicalMemory()) { RB_ShowImages(); } diff --git a/src/rend2/tr_light.c b/src/rend2/tr_light.c index 9c15982a..4e90ce20 100644 --- a/src/rend2/tr_light.c +++ b/src/rend2/tr_light.c @@ -95,11 +95,11 @@ void R_DlightBmodel( bmodel_t *bmodel ) { surf = tr.world->surfaces + bmodel->firstSurface + i; if ( *surf->data == SF_FACE ) { - ((srfSurfaceFace_t *)surf->data)->dlightBits[ tr.smpFrame ] = mask; + ((srfSurfaceFace_t *)surf->data)->dlightBits = mask; } else if ( *surf->data == SF_GRID ) { - ((srfGridMesh_t *)surf->data)->dlightBits[ tr.smpFrame ] = mask; + ((srfGridMesh_t *)surf->data)->dlightBits = mask; } else if ( *surf->data == SF_TRIANGLES ) { - ((srfTriangles_t *)surf->data)->dlightBits[ tr.smpFrame ] = mask; + ((srfTriangles_t *)surf->data)->dlightBits = mask; } } } @@ -444,4 +444,4 @@ int R_LightDirForPoint( vec3_t point, vec3_t lightDir, vec3_t normal, world_t *w VectorCopy(ent.lightDir, lightDir); return qtrue; -} \ No newline at end of file +} diff --git a/src/rend2/tr_local.h b/src/rend2/tr_local.h index 6730f5c1..4b46f612 100644 --- a/src/rend2/tr_local.h +++ b/src/rend2/tr_local.h @@ -40,11 +40,6 @@ typedef unsigned int glIndex_t; #define BUFFER_OFFSET(i) ((char *)NULL + (i)) -// everything that is needed by the backend needs -// to be double buffered to allow it to run in -// parallel on a dual cpu machine -#define SMP_FRAMES 2 - // 14 bits // can't be increased without changing bit packing for drawsurfs // see QSORT_SHADERNUM_SHIFT @@ -1138,8 +1133,8 @@ typedef struct srfGridMesh_s surfaceType_t surfaceType; // dynamic lighting information - int dlightBits[SMP_FRAMES]; - int pshadowBits[SMP_FRAMES]; + int dlightBits; + int pshadowBits; // culling information vec3_t meshBounds[2]; @@ -1182,8 +1177,8 @@ typedef struct surfaceType_t surfaceType; // dynamic lighting information - int dlightBits[SMP_FRAMES]; - int pshadowBits[SMP_FRAMES]; + int dlightBits; + int pshadowBits; // culling information cplane_t plane; @@ -1214,8 +1209,8 @@ typedef struct surfaceType_t surfaceType; // dynamic lighting information - int dlightBits[SMP_FRAMES]; - int pshadowBits[SMP_FRAMES]; + int dlightBits; + int pshadowBits; // culling information // vec3_t bounds[2]; @@ -1280,8 +1275,8 @@ typedef struct srfVBOMesh_s int fogIndex; // dynamic lighting information - int dlightBits[SMP_FRAMES]; - int pshadowBits[SMP_FRAMES]; + int dlightBits; + int pshadowBits; // culling information vec3_t bounds[2]; @@ -1752,7 +1747,6 @@ typedef struct { // all state modified by the back end is seperated // from the front end state typedef struct { - int smpFrame; trRefdef_t refdef; viewParms_t viewParms; orientationr_t or; @@ -1798,8 +1792,6 @@ typedef struct { int viewCount; // incremented every view (twice a scene if portaled) // and every R_MarkFragments call - int smpFrame; // toggles from 0 to 1 every endFrame - int frameSceneNum; // zeroed at RE_BeginFrame qboolean worldMapLoaded; @@ -2084,8 +2076,6 @@ extern cvar_t *r_portalOnly; extern cvar_t *r_subdivisions; extern cvar_t *r_lodCurveError; -extern cvar_t *r_smp; -extern cvar_t *r_showSmp; extern cvar_t *r_skipBackEnd; extern cvar_t *r_stereoEnabled; @@ -2329,11 +2319,6 @@ void GLimp_Init( void ); void GLimp_Shutdown( void ); void GLimp_EndFrame( void ); -qboolean GLimp_SpawnRenderThread( void (*function)( void ) ); -void *GLimp_RendererSleep( void ); -void GLimp_FrontEndSleep( void ); -void GLimp_WakeRenderer( void *data ); - void GLimp_LogComment( char *comment ); void GLimp_Minimize(void); @@ -2588,7 +2573,7 @@ SCENE GENERATION ============================================================ */ -void R_ToggleSmpFrame( void ); +void R_InitNextFrame( void ); void RE_ClearScene( void ); void RE_AddRefEntityToScene( const refEntity_t *ent ); @@ -2702,7 +2687,6 @@ RENDERER BACK END FUNCTIONS ============================================================= */ -void RB_RenderThread( void ); void RB_ExecuteRenderCommands( const void *data ); /* @@ -2830,9 +2814,7 @@ typedef enum { #define MAX_POLYVERTS 3000 // all of the information needed by the back end must be -// contained in a backEndData_t. This entire structure is -// duplicated so the front and back end can run in parallel -// on an SMP machine +// contained in a backEndData_t typedef struct { drawSurf_t drawSurfs[MAX_DRAWSURFS]; dlight_t dlights[MAX_DLIGHTS]; @@ -2846,20 +2828,15 @@ typedef struct { extern int max_polys; extern int max_polyverts; -extern backEndData_t *backEndData[SMP_FRAMES]; // the second one may not be allocated +extern backEndData_t *backEndData; // the second one may not be allocated extern volatile renderCommandList_t *renderCommandList; -extern volatile qboolean renderThreadActive; - void *R_GetCommandBuffer( int bytes ); void RB_ExecuteRenderCommands( const void *data ); -void R_InitCommandBuffers( void ); -void R_ShutdownCommandBuffers( void ); - -void R_SyncRenderThread( void ); +void R_IssuePendingRenderCommands( void ); void R_AddDrawSurfCmd( drawSurf_t *drawSurfs, int numDrawSurfs ); void R_AddCapShadowmapCmd( int dlight, int cubeSide ); diff --git a/src/rend2/tr_main.c b/src/rend2/tr_main.c index 5b7ad5f7..0935dce7 100644 --- a/src/rend2/tr_main.c +++ b/src/rend2/tr_main.c @@ -1606,10 +1606,6 @@ static qboolean SurfIsOffscreen( const drawSurf_t *drawSurf, vec4_t clipDest[128 unsigned int pointOr = 0; unsigned int pointAnd = (unsigned int)~0; - if ( glConfig.smpActive ) { // FIXME! we can't do RB_BeginSurface/RB_EndSurface stuff with smp! - return qfalse; - } - R_RotateForViewer(); R_DecomposeSort( drawSurf->sort, &entityNum, &shader, &fogNum, &dlighted, &pshadowed ); @@ -2122,8 +2118,7 @@ void R_DebugGraphics( void ) { return; } - // the render thread can't make callbacks to the main thread - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); GL_Bind( tr.whiteImage); GL_Cull( CT_FRONT_SIDED ); diff --git a/src/rend2/tr_model.c b/src/rend2/tr_model.c index b77e10a1..5aeab8ef 100644 --- a/src/rend2/tr_model.c +++ b/src/rend2/tr_model.c @@ -307,8 +307,7 @@ qhandle_t RE_RegisterModel( const char *name ) { Q_strncpyz( mod->name, name, sizeof( mod->name ) ); - // make sure the render thread is stopped - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); mod->type = MOD_BAD; mod->numLods = 0; @@ -1305,7 +1304,7 @@ void RE_BeginRegistration( glconfig_t *glconfigOut ) { *glconfigOut = glConfig; - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); tr.visIndex = 0; memset(tr.visClusters, -2, sizeof(tr.visClusters)); // force markleafs to regenerate diff --git a/src/rend2/tr_scene.c b/src/rend2/tr_scene.c index f134c997..c7a414f2 100644 --- a/src/rend2/tr_scene.c +++ b/src/rend2/tr_scene.c @@ -38,20 +38,12 @@ int r_numpolyverts; /* ==================== -R_ToggleSmpFrame +R_InitNextFrame ==================== */ -void R_ToggleSmpFrame( void ) { - if ( r_smp->integer ) { - // use the other buffers next frame, because another CPU - // may still be rendering into the current ones - tr.smpFrame ^= 1; - } else { - tr.smpFrame = 0; - } - - backEndData[tr.smpFrame]->commands.used = 0; +void R_InitNextFrame( void ) { + backEndData->commands.used = 0; r_firstSceneDrawSurf = 0; @@ -148,11 +140,11 @@ void RE_AddPolyToScene( qhandle_t hShader, int numVerts, const polyVert_t *verts return; } - poly = &backEndData[tr.smpFrame]->polys[r_numpolys]; + poly = &backEndData->polys[r_numpolys]; poly->surfaceType = SF_POLY; poly->hShader = hShader; poly->numVerts = numVerts; - poly->verts = &backEndData[tr.smpFrame]->polyVerts[r_numpolyverts]; + poly->verts = &backEndData->polyVerts[r_numpolyverts]; Com_Memcpy( poly->verts, &verts[numVerts*j], numVerts * sizeof( *verts ) ); @@ -234,13 +226,13 @@ void RE_AddRefEntityToScene( const refEntity_t *ent ) { ri.Error( ERR_DROP, "RE_AddRefEntityToScene: bad reType %i", ent->reType ); } - backEndData[tr.smpFrame]->entities[r_numentities].e = *ent; - backEndData[tr.smpFrame]->entities[r_numentities].lightingCalculated = qfalse; + backEndData->entities[r_numentities].e = *ent; + backEndData->entities[r_numentities].lightingCalculated = qfalse; #ifdef REACTION // JBravo: Mirrored models CrossProduct(ent->axis[0], ent->axis[1], cross); - backEndData[tr.smpFrame]->entities[r_numentities].mirrored = (DotProduct(ent->axis[2], cross) < 0.f); + backEndData->entities[r_numentities].mirrored = (DotProduct(ent->axis[2], cross) < 0.f); #endif r_numentities++; @@ -269,7 +261,7 @@ void RE_AddDynamicLightToScene( const vec3_t org, float intensity, float r, floa if ( glConfig.hardwareType == GLHW_RIVA128 || glConfig.hardwareType == GLHW_PERMEDIA2 ) { return; } - dl = &backEndData[tr.smpFrame]->dlights[r_numdlights++]; + dl = &backEndData->dlights[r_numdlights++]; VectorCopy (org, dl->origin); dl->radius = intensity; dl->color[0] = r; @@ -439,19 +431,19 @@ void RE_RenderScene( const refdef_t *fd ) { tr.refdef.floatTime = tr.refdef.time * 0.001f; tr.refdef.numDrawSurfs = r_firstSceneDrawSurf; - tr.refdef.drawSurfs = backEndData[tr.smpFrame]->drawSurfs; + tr.refdef.drawSurfs = backEndData->drawSurfs; tr.refdef.num_entities = r_numentities - r_firstSceneEntity; - tr.refdef.entities = &backEndData[tr.smpFrame]->entities[r_firstSceneEntity]; + tr.refdef.entities = &backEndData->entities[r_firstSceneEntity]; tr.refdef.num_dlights = r_numdlights - r_firstSceneDlight; - tr.refdef.dlights = &backEndData[tr.smpFrame]->dlights[r_firstSceneDlight]; + tr.refdef.dlights = &backEndData->dlights[r_firstSceneDlight]; tr.refdef.numPolys = r_numpolys - r_firstScenePoly; - tr.refdef.polys = &backEndData[tr.smpFrame]->polys[r_firstScenePoly]; + tr.refdef.polys = &backEndData->polys[r_firstScenePoly]; tr.refdef.num_pshadows = 0; - tr.refdef.pshadows = &backEndData[tr.smpFrame]->pshadows[0]; + tr.refdef.pshadows = &backEndData->pshadows[0]; // turn off dynamic lighting globally by clearing all the // dlights if it needs to be disabled or if vertex lighting is enabled diff --git a/src/rend2/tr_shader.c b/src/rend2/tr_shader.c index d66b5408..04aa73ae 100644 --- a/src/rend2/tr_shader.c +++ b/src/rend2/tr_shader.c @@ -2499,7 +2499,7 @@ sortedIndex. ============== */ static void FixRenderCommandList( int newShader ) { - renderCommandList_t *cmdList = &backEndData[tr.smpFrame]->commands; + renderCommandList_t *cmdList = &backEndData->commands; if( cmdList ) { const void *curCmd = cmdList->cmds; @@ -3103,12 +3103,6 @@ shader_t *R_FindShader( const char *name, int lightmapIndex, qboolean mipRawImag } } - // make sure the render thread is stopped, because we are probably - // going to have to upload an image - if (r_smp->integer) { - R_SyncRenderThread(); - } - // clear the global shader Com_Memset( &shader, 0, sizeof( shader ) ); Com_Memset( &stages, 0, sizeof( stages ) ); @@ -3254,12 +3248,6 @@ qhandle_t RE_RegisterShaderFromImage(const char *name, int lightmapIndex, image_ } } - // make sure the render thread is stopped, because we are probably - // going to have to upload an image - if (r_smp->integer) { - R_SyncRenderThread(); - } - // clear the global shader Com_Memset( &shader, 0, sizeof( shader ) ); Com_Memset( &stages, 0, sizeof( stages ) ); diff --git a/src/rend2/tr_surface.c b/src/rend2/tr_surface.c index ace8980e..406c7a26 100644 --- a/src/rend2/tr_surface.c +++ b/src/rend2/tr_surface.c @@ -574,12 +574,14 @@ RB_SurfaceTriangles ============= */ static void RB_SurfaceTriangles( srfTriangles_t *srf ) { - if( RB_SurfaceHelperVBO (srf->vbo, srf->ibo, srf->numVerts, srf->numTriangles * 3, srf->firstIndex, srf->minIndex, srf->maxIndex, srf->dlightBits[backEnd.smpFrame], srf->pshadowBits[backEnd.smpFrame], qtrue ) ) + if( RB_SurfaceHelperVBO (srf->vbo, srf->ibo, srf->numVerts, srf->numTriangles * 3, + srf->firstIndex, srf->minIndex, srf->maxIndex, srf->dlightBits, srf->pshadowBits, qtrue ) ) { return; } - RB_SurfaceHelper(srf->numVerts, srf->verts, srf->numTriangles, srf->triangles, srf->dlightBits[backEnd.smpFrame], srf->pshadowBits[backEnd.smpFrame]); + RB_SurfaceHelper(srf->numVerts, srf->verts, srf->numTriangles, + srf->triangles, srf->dlightBits, srf->pshadowBits); } @@ -1305,12 +1307,14 @@ RB_SurfaceFace ============== */ static void RB_SurfaceFace( srfSurfaceFace_t *srf ) { - if( RB_SurfaceHelperVBO (srf->vbo, srf->ibo, srf->numVerts, srf->numTriangles * 3, srf->firstIndex, srf->minIndex, srf->maxIndex, srf->dlightBits[backEnd.smpFrame], srf->pshadowBits[backEnd.smpFrame], qtrue ) ) + if( RB_SurfaceHelperVBO (srf->vbo, srf->ibo, srf->numVerts, srf->numTriangles * 3, + srf->firstIndex, srf->minIndex, srf->maxIndex, srf->dlightBits, srf->pshadowBits, qtrue ) ) { return; } - RB_SurfaceHelper(srf->numVerts, srf->verts, srf->numTriangles, srf->triangles, srf->dlightBits[backEnd.smpFrame], srf->pshadowBits[backEnd.smpFrame]); + RB_SurfaceHelper(srf->numVerts, srf->verts, srf->numTriangles, + srf->triangles, srf->dlightBits, srf->pshadowBits); } @@ -1372,15 +1376,16 @@ static void RB_SurfaceGrid( srfGridMesh_t *srf ) { int pshadowBits; //int *vDlightBits; - if( RB_SurfaceHelperVBO (srf->vbo, srf->ibo, srf->numVerts, srf->numTriangles * 3, srf->firstIndex, srf->minIndex, srf->maxIndex, srf->dlightBits[backEnd.smpFrame], srf->pshadowBits[backEnd.smpFrame], qtrue ) ) + if( RB_SurfaceHelperVBO (srf->vbo, srf->ibo, srf->numVerts, srf->numTriangles * 3, + srf->firstIndex, srf->minIndex, srf->maxIndex, srf->dlightBits, srf->pshadowBits, qtrue ) ) { return; } - dlightBits = srf->dlightBits[backEnd.smpFrame]; + dlightBits = srf->dlightBits; tess.dlightBits |= dlightBits; - pshadowBits = srf->pshadowBits[backEnd.smpFrame]; + pshadowBits = srf->pshadowBits; tess.pshadowBits |= pshadowBits; // determine the allowable discrepance @@ -1630,7 +1635,8 @@ static void RB_SurfaceFlare(srfFlare_t *surf) static void RB_SurfaceVBOMesh(srfVBOMesh_t * srf) { - RB_SurfaceHelperVBO (srf->vbo, srf->ibo, srf->numVerts, srf->numIndexes, srf->firstIndex, srf->minIndex, srf->maxIndex, srf->dlightBits[backEnd.smpFrame], srf->pshadowBits[backEnd.smpFrame], qfalse ); + RB_SurfaceHelperVBO (srf->vbo, srf->ibo, srf->numVerts, srf->numIndexes, srf->firstIndex, + srf->minIndex, srf->maxIndex, srf->dlightBits, srf->pshadowBits, qfalse ); } void RB_SurfaceVBOMDVMesh(srfVBOMDVMesh_t * surface) diff --git a/src/rend2/tr_vbo.c b/src/rend2/tr_vbo.c index 41af9375..65946f18 100644 --- a/src/rend2/tr_vbo.c +++ b/src/rend2/tr_vbo.c @@ -56,8 +56,7 @@ VBO_t *R_CreateVBO(const char *name, byte * vertexes, int vertexesSize, ri.Error( ERR_DROP, "R_CreateVBO: MAX_VBOS hit\n"); } - // make sure the render thread is stopped - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); vbo = tr.vbos[tr.numVBOs] = ri.Hunk_Alloc(sizeof(*vbo), h_low); tr.numVBOs++; @@ -125,8 +124,7 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert ri.Error( ERR_DROP, "R_CreateVBO2: MAX_VBOS hit\n"); } - // make sure the render thread is stopped - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); vbo = tr.vbos[tr.numVBOs] = ri.Hunk_Alloc(sizeof(*vbo), h_low); tr.numVBOs++; @@ -475,8 +473,7 @@ IBO_t *R_CreateIBO(const char *name, byte * indexes, int indexesSize, v ri.Error( ERR_DROP, "R_CreateIBO: MAX_IBOS hit\n"); } - // make sure the render thread is stopped - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); ibo = tr.ibos[tr.numIBOs] = ri.Hunk_Alloc(sizeof(*ibo), h_low); tr.numIBOs++; @@ -544,8 +541,7 @@ IBO_t *R_CreateIBO2(const char *name, int numTriangles, srfTriangle_t * ri.Error( ERR_DROP, "R_CreateIBO2: MAX_IBOS hit\n"); } - // make sure the render thread is stopped - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); ibo = tr.ibos[tr.numIBOs] = ri.Hunk_Alloc(sizeof(*ibo), h_low); tr.numIBOs++; diff --git a/src/rend2/tr_world.c b/src/rend2/tr_world.c index 5e1bcf7b..950ee6a4 100644 --- a/src/rend2/tr_world.c +++ b/src/rend2/tr_world.c @@ -206,13 +206,13 @@ static int R_DlightSurface( msurface_t *surf, int dlightBits ) { } if ( *surf->data == SF_FACE ) { - ((srfSurfaceFace_t *)surf->data)->dlightBits[ tr.smpFrame ] = dlightBits; + ((srfSurfaceFace_t *)surf->data)->dlightBits = dlightBits; } else if ( *surf->data == SF_GRID ) { - ((srfGridMesh_t *)surf->data)->dlightBits[ tr.smpFrame ] = dlightBits; + ((srfGridMesh_t *)surf->data)->dlightBits = dlightBits; } else if ( *surf->data == SF_TRIANGLES ) { - ((srfTriangles_t *)surf->data)->dlightBits[ tr.smpFrame ] = dlightBits; + ((srfTriangles_t *)surf->data)->dlightBits = dlightBits; } else if ( *surf->data == SF_VBO_MESH ) { - ((srfVBOMesh_t *)surf->data)->dlightBits[ tr.smpFrame ] = dlightBits; + ((srfVBOMesh_t *)surf->data)->dlightBits = dlightBits; } else { dlightBits = 0; } @@ -289,13 +289,13 @@ static int R_PshadowSurface( msurface_t *surf, int pshadowBits ) { } if ( *surf->data == SF_FACE ) { - ((srfSurfaceFace_t *)surf->data)->pshadowBits[ tr.smpFrame ] = pshadowBits; + ((srfSurfaceFace_t *)surf->data)->pshadowBits = pshadowBits; } else if ( *surf->data == SF_GRID ) { - ((srfGridMesh_t *)surf->data)->pshadowBits[ tr.smpFrame ] = pshadowBits; + ((srfGridMesh_t *)surf->data)->pshadowBits = pshadowBits; } else if ( *surf->data == SF_TRIANGLES ) { - ((srfTriangles_t *)surf->data)->pshadowBits[ tr.smpFrame ] = pshadowBits; + ((srfTriangles_t *)surf->data)->pshadowBits = pshadowBits; } else if ( *surf->data == SF_VBO_MESH ) { - ((srfVBOMesh_t *)surf->data)->pshadowBits[ tr.smpFrame ] = pshadowBits; + ((srfVBOMesh_t *)surf->data)->pshadowBits = pshadowBits; } else { pshadowBits = 0; } -- cgit