diff options
| author | Dave Parks <davep@lindenlab.com> | 2022-10-07 13:25:40 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2022-10-07 13:25:40 -0500 | 
| commit | 4a4b0f8ee8834de01e52d32aecdb0479ed5fb7a9 (patch) | |
| tree | 30bc350ef6fca729e50466b2ca72ff147db357a1 | |
| parent | 26f99409d247a0c872239d73ac05451ef8531ff4 (diff) | |
SL-18190 Rearrange render order so 3D UI has access to the depth buffer.
| -rw-r--r-- | indra/newview/llviewerdisplay.cpp | 71 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 140 | 
2 files changed, 108 insertions, 103 deletions
| diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 5ae7f522f2..112d669740 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1374,10 +1374,10 @@ void render_ui(F32 zoom_factor, int subfield)  		gGL.popMatrix();  	} -	// Finalize scene -	gPipeline.renderFinalize(); -  	{ +        // draw hud and 3D ui elements into screen render target so they'll be able to use  +        // the depth buffer (avoids extra copy of depth buffer per frame) +        gPipeline.mRT->screen.bindTarget();  		// SL-15709  		// NOTE: Tracy only allows one ZoneScoped per function.  		// Solutions are: @@ -1394,41 +1394,46 @@ void render_ui(F32 zoom_factor, int subfield)  			gPipeline.disableLights();  		} -		{ -			gGL.color4f(1,1,1,1); -			if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) -			{ -				if (!gDisconnected) -				{ -					LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 3D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_3D); -					render_ui_3d(); -					LLGLState::checkStates(); -				} -				else -				{ -					render_disconnected_background(); -				} +        gGL.color4f(1,1,1,1); -				LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 2D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_2D); -				render_ui_2d(); -				LLGLState::checkStates(); -			} -			gGL.flush(); +        bool render_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI); +        if (render_ui) +        { +            if (!gDisconnected) +            { +                LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 3D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_3D); +                render_ui_3d(); +                LLGLState::checkStates(); +            } +            else +            { +                render_disconnected_background(); +            } +        } -			gViewerWindow->setup2DRender(); -			gViewerWindow->updateDebugText(); -			gViewerWindow->drawDebugText(); +        gPipeline.mRT->screen.flush(); -			LLVertexBuffer::unbind(); -		} +        // apply gamma correction and post effects before rendering 2D UI +        gPipeline.renderFinalize(); -		if (!gSnapshot) -		{ -			set_current_modelview(saved_view); -			gGL.popMatrix(); -		} +        if (render_ui) +        { +            LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 2D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_2D); +            render_ui_2d(); +            LLGLState::checkStates(); +            gGL.flush(); +        } -	} // Tracy integration +        gViewerWindow->setup2DRender(); +        gViewerWindow->updateDebugText(); +        gViewerWindow->drawDebugText(); +	} + +	if (!gSnapshot) +	{ +		set_current_modelview(saved_view); +		gGL.popMatrix(); +	}  }  static LLTrace::BlockTimerStatHandle FTM_SWAP("Swap"); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index c360a7fc63..87a5cd9cc8 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7599,6 +7599,76 @@ void LLPipeline::renderFinalize()      gGL.setColorMask(true, true);      glClearColor(0, 0, 0, 0); +    if (!gCubeSnapshot) +    { +        // gamma correct lighting +        gGL.matrixMode(LLRender::MM_PROJECTION); +        gGL.pushMatrix(); +        gGL.loadIdentity(); +        gGL.matrixMode(LLRender::MM_MODELVIEW); +        gGL.pushMatrix(); +        gGL.loadIdentity(); + +        { +            LL_PROFILE_GPU_ZONE("gamma correct"); + +            LLGLDepthTest depth(GL_FALSE, GL_FALSE); + +            LLRenderTarget* screen_target = &mRT->screen; + +            LLVector2 tc1(0, 0); +            LLVector2 tc2((F32)screen_target->getWidth() * 2, (F32)screen_target->getHeight() * 2); + +            screen_target->bindTarget(); +            // Apply gamma correction to the frame here. +            gDeferredPostGammaCorrectProgram.bind(); +            // mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +            S32 channel = 0; +            channel = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, screen_target->getUsage()); +            if (channel > -1) +            { +                screen_target->bindTexture(0, channel, LLTexUnit::TFO_POINT); +            } + +            gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, screen_target->getWidth(), screen_target->getHeight()); + +            F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma"); + +            gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f / 2.2f)); + +            gGL.begin(LLRender::TRIANGLE_STRIP); +            gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); +            gGL.vertex2f(-1, -1); + +            gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); +            gGL.vertex2f(-1, 3); + +            gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); +            gGL.vertex2f(3, -1); + +            gGL.end(); + +            gGL.getTexUnit(channel)->unbind(screen_target->getUsage()); +            gDeferredPostGammaCorrectProgram.unbind(); +            screen_target->flush(); +        } + +        gGL.matrixMode(LLRender::MM_PROJECTION); +        gGL.popMatrix(); +        gGL.matrixMode(LLRender::MM_MODELVIEW); +        gGL.popMatrix(); + +        LLVertexBuffer::unbind(); + +        if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) +        { +            // Render debugging beacons. +            gObjectList.renderObjectBeacons(); +            gObjectList.resetObjectBeacons(); +            gSky.addSunMoonBeacons(); +        } +    } +      if (sRenderGlow)      {          LL_PROFILE_GPU_ZONE("glow"); @@ -9037,76 +9107,6 @@ void LLPipeline::renderDeferredLighting()      }      screen_target->flush(); - -    if (!gCubeSnapshot) -    { -        // gamma correct lighting -        gGL.matrixMode(LLRender::MM_PROJECTION); -        gGL.pushMatrix(); -        gGL.loadIdentity(); -        gGL.matrixMode(LLRender::MM_MODELVIEW); -        gGL.pushMatrix(); -        gGL.loadIdentity(); - -        { -            LL_PROFILE_GPU_ZONE("gamma correct"); - -            LLGLDepthTest depth(GL_FALSE, GL_FALSE); - -            LLVector2 tc1(0, 0); -            LLVector2 tc2((F32)screen_target->getWidth() * 2, (F32)screen_target->getHeight() * 2); - -            screen_target->bindTarget(); -            // Apply gamma correction to the frame here. -            gDeferredPostGammaCorrectProgram.bind(); -            // mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); -            S32 channel = 0; -            channel = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, screen_target->getUsage()); -            if (channel > -1) -            { -                screen_target->bindTexture(0, channel, LLTexUnit::TFO_POINT); -            } - -            gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, screen_target->getWidth(), screen_target->getHeight()); - -            F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma"); - -            gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f / 2.2f)); - -            gGL.begin(LLRender::TRIANGLE_STRIP); -            gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); -            gGL.vertex2f(-1, -1); - -            gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); -            gGL.vertex2f(-1, 3); - -            gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); -            gGL.vertex2f(3, -1); - -            gGL.end(); - -            gGL.getTexUnit(channel)->unbind(screen_target->getUsage()); -            gDeferredPostGammaCorrectProgram.unbind(); -            screen_target->flush(); -        } - -        gGL.matrixMode(LLRender::MM_PROJECTION); -        gGL.popMatrix(); -        gGL.matrixMode(LLRender::MM_MODELVIEW); -        gGL.popMatrix(); -     -        LLVertexBuffer::unbind(); - -        if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) -        { -            // Render debugging beacons. -            gObjectList.renderObjectBeacons(); -            gObjectList.resetObjectBeacons(); -            gSky.addSunMoonBeacons(); -        } -    } - -    screen_target->flush();  }  void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep) | 
