diff options
| -rw-r--r-- | indra/llrender/llrendertarget.cpp | 26 | ||||
| -rw-r--r-- | indra/llrender/llrendertarget.h | 3 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl | 6 | ||||
| -rw-r--r-- | indra/newview/llgltfmaterialpreviewmgr.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 17 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.h | 1 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 71 | ||||
| -rw-r--r-- | indra/newview/pipeline.h | 2 | 
8 files changed, 104 insertions, 30 deletions
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index 88c48e5166..3dccb9c8fd 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -567,4 +567,30 @@ bool LLRenderTarget::isBoundInStack() const      return cur == this;  } +void LLRenderTarget::swapFBORefs(LLRenderTarget& other) +{ +    // Must be initialized +    llassert(mFBO); +    llassert(other.mFBO); +    // Must be unbound +    // *NOTE: mPreviousRT can be non-null even if this target is unbound - presumably for debugging purposes? +    llassert(sCurFBO != mFBO); +    llassert(sCurFBO != other.mFBO); +    llassert(!isBoundInStack()); +    llassert(!other.isBoundInStack()); + +    // Must be same type +    llassert(sUseFBO == other.sUseFBO); +    llassert(mResX == other.mResX); +    llassert(mResY == other.mResY); +    llassert(mInternalFormat == other.mInternalFormat); +    llassert(mTex.size() == other.mTex.size()); +    llassert(mDepth == other.mDepth); +    llassert(mUseDepth == other.mUseDepth); +    llassert(mGenerateMipMaps == other.mGenerateMipMaps); +    llassert(mMipLevels == other.mMipLevels); +    llassert(mUsage == other.mUsage); + +    std::swap(mFBO, other.mFBO); +} diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index 9fcea35e3d..da401572d1 100644 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -169,6 +169,9 @@ public:  	static LLRenderTarget* getCurrentBoundTarget() { return sBoundTarget; } +	// *HACK +	void swapFBORefs(LLRenderTarget& other); +  protected:  	U32 mResX;  	U32 mResY; diff --git a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl index 9ac4ceb37e..eff7221ae7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl @@ -28,7 +28,9 @@  out vec4 frag_color;  uniform sampler2D emissiveRect; +#ifdef USE_LAST_EXPOSURE  uniform sampler2D exposureMap; +#endif  uniform float dt;  uniform vec2 noiseVec; @@ -51,10 +53,12 @@ void main()      L /= max_L;      L = pow(L, 2.0);      float s = mix(dynamic_exposure_params.z, dynamic_exposure_params.y, L); - +     +#ifdef USE_LAST_EXPOSURE      float prev = texture(exposureMap, vec2(0.5,0.5)).r;      s = mix(prev, s, min(dt*2.0*abs(prev-s), 0.04)); +#endif      frag_color = max(vec4(s, s, s, dt), vec4(0.0));  } diff --git a/indra/newview/llgltfmaterialpreviewmgr.cpp b/indra/newview/llgltfmaterialpreviewmgr.cpp index 36bd552c31..1c39f1ae7d 100644 --- a/indra/newview/llgltfmaterialpreviewmgr.cpp +++ b/indra/newview/llgltfmaterialpreviewmgr.cpp @@ -517,9 +517,12 @@ BOOL LLGLTFPreviewTexture::render()          screen.flush();      } +    // *HACK: Hide mExposureMap from generateExposure +    gPipeline.mExposureMap.swapFBORefs(gPipeline.mLastExposure); +      gPipeline.copyScreenSpaceReflections(&screen, &gPipeline.mSceneMap);      gPipeline.generateLuminance(&screen, &gPipeline.mLuminanceMap); -    gPipeline.generateExposure(&gPipeline.mLuminanceMap, &gPipeline.mExposureMap); +    gPipeline.generateExposure(&gPipeline.mLuminanceMap, &gPipeline.mExposureMap, /*use_history = */ false);      gPipeline.gammaCorrect(&screen, &gPipeline.mPostMap);      LLVertexBuffer::unbind();      gPipeline.generateGlow(&gPipeline.mPostMap); @@ -527,6 +530,9 @@ BOOL LLGLTFPreviewTexture::render()  	gPipeline.renderDoF(&screen, &gPipeline.mPostMap);  	gPipeline.applyFXAA(&gPipeline.mPostMap, &screen); +    // *HACK: Restore mExposureMap (it will be consumed by generateExposure next frame) +    gPipeline.mExposureMap.swapFBORefs(gPipeline.mLastExposure); +      // Final render  	gDeferredPostNoDoFProgram.bind(); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 4eb934114d..354cc79036 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -196,6 +196,7 @@ LLGLSLShader			gDeferredPostGammaCorrectProgram;  LLGLSLShader            gNoPostGammaCorrectProgram;  LLGLSLShader            gLegacyPostGammaCorrectProgram;  LLGLSLShader			gExposureProgram; +LLGLSLShader			gExposureProgramNoFade;  LLGLSLShader			gLuminanceProgram;  LLGLSLShader			gFXAAProgram;  LLGLSLShader			gDeferredPostNoDoFProgram; @@ -980,6 +981,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredCoFProgram.unload();		  		gDeferredDoFCombineProgram.unload();          gExposureProgram.unload(); +        gExposureProgramNoFade.unload();          gLuminanceProgram.unload();  		gDeferredPostGammaCorrectProgram.unload();          gNoPostGammaCorrectProgram.unload(); @@ -2127,6 +2129,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()          gExposureProgram.mFeatures.isDeferred = true;          gExposureProgram.mShaderFiles.clear();          gExposureProgram.clearPermutations(); +        gExposureProgram.addPermutation("USE_LAST_EXPOSURE", "1");          gExposureProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));          gExposureProgram.mShaderFiles.push_back(make_pair("deferred/exposureF.glsl", GL_FRAGMENT_SHADER));          gExposureProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; @@ -2136,6 +2139,20 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()      if (success)      { +        gExposureProgramNoFade.mName = "Exposure (no fade)"; +        gExposureProgramNoFade.mFeatures.hasSrgb = true; +        gExposureProgramNoFade.mFeatures.isDeferred = true; +        gExposureProgramNoFade.mShaderFiles.clear(); +        gExposureProgramNoFade.clearPermutations(); +        gExposureProgramNoFade.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER)); +        gExposureProgramNoFade.mShaderFiles.push_back(make_pair("deferred/exposureF.glsl", GL_FRAGMENT_SHADER)); +        gExposureProgramNoFade.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; +        success = gExposureProgramNoFade.createShader(NULL, NULL); +        llassert(success); +    } + +    if (success) +    {          gLuminanceProgram.mName = "Luminance";          gLuminanceProgram.mShaderFiles.clear();          gLuminanceProgram.clearPermutations(); diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 57fc66ce0d..2502be6bb1 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -249,6 +249,7 @@ extern LLGLSLShader			gDeferredPostGammaCorrectProgram;  extern LLGLSLShader         gNoPostGammaCorrectProgram;  extern LLGLSLShader         gLegacyPostGammaCorrectProgram;  extern LLGLSLShader			gExposureProgram; +extern LLGLSLShader			gExposureProgramNoFade;  extern LLGLSLShader			gLuminanceProgram;  extern LLGLSLShader			gDeferredAvatarShadowProgram;  extern LLGLSLShader			gDeferredAvatarAlphaShadowProgram; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 9d90002eb9..6ceaca731b 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -6772,11 +6772,12 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst)  	}  } -void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst) { +void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history) {  	// exposure sample  	{  		LL_PROFILE_GPU_ZONE("exposure sample"); +		if (use_history)  		{  			// copy last frame's exposure into mLastExposure  			mLastExposure.bindTarget(); @@ -6793,51 +6794,67 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst) {  		LLGLDepthTest depth(GL_FALSE, GL_FALSE); -		gExposureProgram.bind(); +		LLGLSLShader* shader; +		if (use_history) +		{ +			shader = &gExposureProgram; +		} +		else +		{ +			shader = &gExposureProgramNoFade; +		} + +		shader->bind(); -		S32 channel = gExposureProgram.enableTexture(LLShaderMgr::DEFERRED_EMISSIVE); +		S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_EMISSIVE);  		if (channel > -1)  		{ -			mLuminanceMap.bindTexture(0, channel, LLTexUnit::TFO_TRILINEAR); +			src->bindTexture(0, channel, LLTexUnit::TFO_TRILINEAR);  		} -		channel = gExposureProgram.enableTexture(LLShaderMgr::EXPOSURE_MAP); -		if (channel > -1) +		if (use_history)  		{ -			mLastExposure.bindTexture(0, channel); +			channel = shader->enableTexture(LLShaderMgr::EXPOSURE_MAP); +			if (channel > -1) +			{ +				mLastExposure.bindTexture(0, channel); +			}  		}  		static LLStaticHashedString dt("dt");  		static LLStaticHashedString noiseVec("noiseVec");  		static LLStaticHashedString dynamic_exposure_params("dynamic_exposure_params");  		static LLCachedControl<F32> dynamic_exposure_coefficient(gSavedSettings, "RenderDynamicExposureCoefficient", 0.175f); -        static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", true); +		static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", true); -        LLSettingsSky::ptr_t sky = LLEnvironment::instance().getCurrentSky(); +		LLSettingsSky::ptr_t sky = LLEnvironment::instance().getCurrentSky(); -        F32 probe_ambiance = LLEnvironment::instance().getCurrentSky()->getReflectionProbeAmbiance(should_auto_adjust); -        F32 exp_min = 1.f; -        F32 exp_max = 1.f; -                 -        if (probe_ambiance > 0.f) -        { -            F32 hdr_scale = sqrtf(LLEnvironment::instance().getCurrentSky()->getGamma())*2.f; +		F32 probe_ambiance = LLEnvironment::instance().getCurrentSky()->getReflectionProbeAmbiance(should_auto_adjust); +		F32 exp_min = 1.f; +		F32 exp_max = 1.f; -            if (hdr_scale > 1.f) -            { -                exp_min = 1.f / hdr_scale; -                exp_max = hdr_scale; -            } -        } -		gExposureProgram.uniform1f(dt, gFrameIntervalSeconds); -		gExposureProgram.uniform2f(noiseVec, ll_frand() * 2.0 - 1.0, ll_frand() * 2.0 - 1.0); -		gExposureProgram.uniform3f(dynamic_exposure_params, dynamic_exposure_coefficient, exp_min, exp_max); +		if (probe_ambiance > 0.f) +		{ +			F32 hdr_scale = sqrtf(LLEnvironment::instance().getCurrentSky()->getGamma()) * 2.f; + +			if (hdr_scale > 1.f) +			{ +				exp_min = 1.f / hdr_scale; +				exp_max = hdr_scale; +			} +		} +		shader->uniform1f(dt, gFrameIntervalSeconds); +		shader->uniform2f(noiseVec, ll_frand() * 2.0 - 1.0, ll_frand() * 2.0 - 1.0); +		shader->uniform3f(dynamic_exposure_params, dynamic_exposure_coefficient, exp_min, exp_max);  		mScreenTriangleVB->setBuffer();  		mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); -		gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage()); -		gExposureProgram.unbind(); +		if (use_history) +		{ +			gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage()); +		} +		shader->unbind();  		dst->flush();  	}  } diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index e8c6da1473..259dc3f9d0 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -154,7 +154,7 @@ public:  	void renderFinalize();  	void copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* dst);  	void generateLuminance(LLRenderTarget* src, LLRenderTarget* dst); -	void generateExposure(LLRenderTarget* src, LLRenderTarget* dst); +	void generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history = true);  	void gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst);  	void generateGlow(LLRenderTarget* src);  	void applyFXAA(LLRenderTarget* src, LLRenderTarget* dst);  | 
