diff options
| author | Dave Houlton <euclid@lindenlab.com> | 2020-07-24 10:07:28 -0600 | 
|---|---|---|
| committer | Dave Houlton <euclid@lindenlab.com> | 2020-07-24 10:07:28 -0600 | 
| commit | 21cf868f3886452019d21f6e6333551527dbd891 (patch) | |
| tree | a759a797a9ec3001d288d7076cd9d620144ec342 | |
| parent | 6fbf39f9b319106e39f80b8641acaba122d02e0a (diff) | |
SL-13406, disable glow no longer disables all post passes
| -rw-r--r-- | indra/newview/llviewerdisplay.cpp | 90 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 236 | ||||
| -rw-r--r-- | indra/newview/pipeline.h | 2 | 
3 files changed, 146 insertions, 182 deletions
| diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 2b1f4b138f..dad36da280 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -705,9 +705,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		LLGLState::checkTextureChannels();  		LLGLState::checkClientArrays(); -		BOOL to_texture = gPipeline.canUseVertexShaders() && -						LLPipeline::sRenderGlow; -  		LLAppViewer::instance()->pingMainloopTimeout("Display:Swap");  		{  @@ -914,29 +911,26 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		stop_glerror(); -		if (to_texture) -		{ -			gGL.setColorMask(true, true); +		gGL.setColorMask(true, true); -			if (LLPipeline::sRenderDeferred) -			{ -				gPipeline.mDeferredScreen.bindTarget(); -				glClearColor(1,0,1,1); -				gPipeline.mDeferredScreen.clear(); -			} -			else +		if (LLPipeline::sRenderDeferred) +		{ +			gPipeline.mDeferredScreen.bindTarget(); +			glClearColor(1,0,1,1); +			gPipeline.mDeferredScreen.clear(); +		} +		else +		{ +			gPipeline.mScreen.bindTarget(); +			if (LLPipeline::sUnderWaterRender && !gPipeline.canUseWindLightShaders())  			{ -				gPipeline.mScreen.bindTarget(); -				if (LLPipeline::sUnderWaterRender && !gPipeline.canUseWindLightShaders()) -				{ -					const LLColor4 &col = LLEnvironment::instance().getCurrentWater()->getWaterFogColor(); -					glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f); -				} -				gPipeline.mScreen.clear(); +				const LLColor4 &col = LLEnvironment::instance().getCurrentWater()->getWaterFogColor(); +				glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);  			} -			 -			gGL.setColorMask(true, false); +			gPipeline.mScreen.clear();  		} +			 +		gGL.setColorMask(true, false);  		LLAppViewer::instance()->pingMainloopTimeout("Display:RenderGeom"); @@ -1002,33 +996,15 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");		 -		if (to_texture) -		{ -			if (LLPipeline::sRenderDeferred) -			{ -				gPipeline.mDeferredScreen.flush(); -				if(LLRenderTarget::sUseFBO) -				{ -					LLRenderTarget::copyContentsToFramebuffer(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(),  -															  gPipeline.mDeferredScreen.getHeight(), 0, 0,  -															  gPipeline.mDeferredScreen.getWidth(),  -															  gPipeline.mDeferredScreen.getHeight(),  -															  GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); -				} -			} -			else -			{ -				gPipeline.mScreen.flush(); -				if(LLRenderTarget::sUseFBO) -				{				 -					LLRenderTarget::copyContentsToFramebuffer(gPipeline.mScreen, 0, 0, gPipeline.mScreen.getWidth(),  -															  gPipeline.mScreen.getHeight(), 0, 0,  -															  gPipeline.mScreen.getWidth(),  -															  gPipeline.mScreen.getHeight(),  -															  GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); -				} -			} -		} +         +        LLRenderTarget &rt = (gPipeline.sRenderDeferred ? gPipeline.mDeferredScreen : gPipeline.mScreen); +        rt.flush(); + +        if (rt.sUseFBO) +        { +            LLRenderTarget::copyContentsToFramebuffer(rt, 0, 0, rt.getWidth(), rt.getHeight(), 0, 0, rt.getWidth(), rt.getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); +        } +  		if (LLPipeline::sRenderDeferred)  		{ @@ -1295,19 +1271,11 @@ void render_ui(F32 zoom_factor, int subfield)  		gGL.popMatrix();  	} -	{ -		BOOL to_texture = gPipeline.canUseVertexShaders() && -							LLPipeline::sRenderGlow; - -		if (to_texture) -		{ -			gPipeline.renderBloom(gSnapshot, zoom_factor, subfield); -		} +	gPipeline.renderPost(gSnapshot, zoom_factor, subfield); -		LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD); -		render_hud_elements(); -		render_hud_attachments(); -	} +	LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD); +	render_hud_elements(); +	render_hud_attachments();  	LLGLSDefault gls_default;  	LLGLSUIDefault gls_ui; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index f3b8ad9008..60fd34552a 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1052,19 +1052,13 @@ void LLPipeline::updateRenderBump()  //static  void LLPipeline::updateRenderDeferred()  { -	bool deferred = (bool(RenderDeferred &&  +	sRenderDeferred = (bool(RenderDeferred &&  					 LLRenderTarget::sUseFBO &&  					 LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&	   					 LLPipeline::sRenderBump &&  					 RenderAvatarVP &&  					 WindLightUseAtmosShaders)) &&  					!gUseWireframe; - -	sRenderDeferred = deferred;	 -	if (deferred) -	{ //must render glow when rendering deferred since post effect pass is needed to present any lighting at all -		sRenderGlow = true; -	}  }  //static @@ -1260,7 +1254,7 @@ void LLPipeline::createGLBuffers()  	GLuint resX = gViewerWindow->getWorldViewWidthRaw();  	GLuint resY = gViewerWindow->getWorldViewHeightRaw(); -	if (LLPipeline::sRenderGlow) +	if (1)  	{ //screen space glow buffers  		const U32 glow_res = llmax(1,   			llmin(512, 1 << gSavedSettings.getS32("RenderGlowResolutionPow"))); @@ -7544,14 +7538,8 @@ void LLPipeline::bindScreenToTexture()  static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Bloom"); -void LLPipeline::renderBloom(bool for_snapshot, F32 zoom_factor, int subfield) +void LLPipeline::renderPost(bool for_snapshot, F32 zoom_factor, int subfield)  { -	if (!(gPipeline.canUseVertexShaders() && -		sRenderGlow)) -	{ -		return; -	} -  	LLVertexBuffer::unbind();  	LLGLState::checkStates();  	LLGLState::checkTextureChannels(); @@ -7587,121 +7575,129 @@ void LLPipeline::renderBloom(bool for_snapshot, F32 zoom_factor, int subfield)  	gGL.setColorMask(true, true);  	glClearColor(0,0,0,0); -	{ -		{ -			LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM_FBO); -			mGlow[2].bindTarget(); -			mGlow[2].clear(); -		} -		 -		gGlowExtractProgram.bind(); -		F32 minLum = llmax((F32) RenderGlowMinLuminance, 0.0f); -		F32 maxAlpha = RenderGlowMaxExtractAlpha;		 -		F32 warmthAmount = RenderGlowWarmthAmount;	 -		LLVector3 lumWeights = RenderGlowLumWeights; -		LLVector3 warmthWeights = RenderGlowWarmthWeights; - - -		gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MIN_LUMINANCE, minLum); -		gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MAX_EXTRACT_ALPHA, maxAlpha); -		gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_LUM_WEIGHTS, lumWeights.mV[0], lumWeights.mV[1], lumWeights.mV[2]); -		gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_WARMTH_WEIGHTS, warmthWeights.mV[0], warmthWeights.mV[1], warmthWeights.mV[2]); -		gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_WARMTH_AMOUNT, warmthAmount); -		LLGLEnable blend_on(GL_BLEND); -		LLGLEnable test(GL_ALPHA_TEST); -		 -		gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA); -		 -		mScreen.bindTexture(0, 0, LLTexUnit::TFO_POINT); -		 -		gGL.color4f(1,1,1,1); -		gPipeline.enableLightsFullbright(); -		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(0)->unbind(mScreen.getUsage()); +    if (sRenderGlow) +    { +        { +            LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM_FBO); +            mGlow[2].bindTarget(); +            mGlow[2].clear(); +        } -		mGlow[2].flush(); -	} +        gGlowExtractProgram.bind(); +        F32 minLum = llmax((F32)RenderGlowMinLuminance, 0.0f); +        F32 maxAlpha = RenderGlowMaxExtractAlpha; +        F32 warmthAmount = RenderGlowWarmthAmount; +        LLVector3 lumWeights = RenderGlowLumWeights; +        LLVector3 warmthWeights = RenderGlowWarmthWeights; -	tc1.setVec(0,0); -	tc2.setVec(2,2); -	// power of two between 1 and 1024 -	U32 glowResPow = RenderGlowResolutionPow; -	const U32 glow_res = llmax(1,  -		llmin(1024, 1 << glowResPow)); +        gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MIN_LUMINANCE, minLum); +        gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MAX_EXTRACT_ALPHA, maxAlpha); +        gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_LUM_WEIGHTS, lumWeights.mV[0], lumWeights.mV[1], lumWeights.mV[2]); +        gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_WARMTH_WEIGHTS, warmthWeights.mV[0], warmthWeights.mV[1], warmthWeights.mV[2]); +        gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_WARMTH_AMOUNT, warmthAmount); +        LLGLEnable blend_on(GL_BLEND); +        LLGLEnable test(GL_ALPHA_TEST); -	S32 kernel = RenderGlowIterations*2; -	F32 delta = RenderGlowWidth / glow_res; -	// Use half the glow width if we have the res set to less than 9 so that it looks -	// almost the same in either case. -	if (glowResPow < 9) -	{ -		delta *= 0.5f; -	} -	F32 strength = RenderGlowStrength; +        gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA); -	gGlowProgram.bind(); -	gGlowProgram.uniform1f(LLShaderMgr::GLOW_STRENGTH, strength); +        mScreen.bindTexture(0, 0, LLTexUnit::TFO_POINT); -	for (S32 i = 0; i < kernel; i++) -	{ -		{ -			LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM_FBO); -			mGlow[i%2].bindTarget(); -			mGlow[i%2].clear(); -		} -			 -		if (i == 0) -		{ -			gGL.getTexUnit(0)->bind(&mGlow[2]); -		} -		else -		{ -			gGL.getTexUnit(0)->bind(&mGlow[(i-1)%2]); -		} +        gGL.color4f(1, 1, 1, 1); +        gPipeline.enableLightsFullbright(); +        gGL.begin(LLRender::TRIANGLE_STRIP); +        gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); +        gGL.vertex2f(-1, -1); -		if (i%2 == 0) -		{ -			gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, delta, 0); -		} -		else -		{ -			gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, 0, delta); -		} +        gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); +        gGL.vertex2f(-1, 3); -		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(); -		 -		mGlow[i%2].flush(); -	} +        gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); +        gGL.vertex2f(3, -1); -	gGlowProgram.unbind(); +        gGL.end(); -	/*if (LLRenderTarget::sUseFBO) -	{ -		LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM_FBO); -		glBindFramebuffer(GL_FRAMEBUFFER, 0); -	}*/ +        gGL.getTexUnit(0)->unbind(mScreen.getUsage()); + +        mGlow[2].flush(); + + +        tc1.setVec(0, 0); +        tc2.setVec(2, 2); + +        // power of two between 1 and 1024 +        U32 glowResPow = RenderGlowResolutionPow; +        const U32 glow_res = llmax(1, +            llmin(1024, 1 << glowResPow)); + +        S32 kernel = RenderGlowIterations * 2; +        F32 delta = RenderGlowWidth / glow_res; +        // Use half the glow width if we have the res set to less than 9 so that it looks +        // almost the same in either case. +        if (glowResPow < 9) +        { +            delta *= 0.5f; +        } +        F32 strength = RenderGlowStrength; + +        if (!sRenderGlow) +        { +            strength = 0.0f; +            kernel = 2; +        } + +        gGlowProgram.bind(); +        gGlowProgram.uniform1f(LLShaderMgr::GLOW_STRENGTH, strength); + +        for (S32 i = 0; i < kernel; i++) +        { +            { +                LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM_FBO); +                mGlow[i % 2].bindTarget(); +                mGlow[i % 2].clear(); +            } + +            if (i == 0) +            { +                gGL.getTexUnit(0)->bind(&mGlow[2]); +            } +            else +            { +                gGL.getTexUnit(0)->bind(&mGlow[(i - 1) % 2]); +            } + +            if (i % 2 == 0) +            { +                gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, delta, 0); +            } +            else +            { +                gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, 0, delta); +            } + +            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(); + +            mGlow[i % 2].flush(); +        } + +        gGlowProgram.unbind(); +    } +    else // !sRenderGlow, skip the glow ping-pong and just clear the result target +    { +        mGlow[1].bindTarget(); +        mGlow[1].clear(); +        mGlow[1].flush(); +    }  	gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;  	gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 5a07bdebe3..fe60eb69f8 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -139,7 +139,7 @@ public:  	void resetVertexBuffers(LLDrawable* drawable);  	void generateImpostor(LLVOAvatar* avatar);  	void bindScreenToTexture(); -	void renderBloom(bool for_snapshot, F32 zoom_factor = 1.f, int subfield = 0); +	void renderPost(bool for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);  	void init();  	void cleanup(); | 
