diff --git a/indra/newview/alrenderutils.cpp b/indra/newview/alrenderutils.cpp index 28b073a88b0cff459cfd78ef6c887ab40a49b657..809fa98c1cceb29a757385062e5c686e2e8d24d7 100644 --- a/indra/newview/alrenderutils.cpp +++ b/indra/newview/alrenderutils.cpp @@ -513,39 +513,16 @@ bool ALRenderUtil::setupColorGrade() return true; } -void ALRenderUtil::renderTonemap(LLRenderTarget* src, LLRenderTarget* dst, LLRenderTarget* bloom, LLRenderTarget* exposure) +void ALRenderUtil::renderTonemap(LLRenderTarget* src, LLRenderTarget* exposure) { LLGLDepthTest depth(GL_FALSE, GL_FALSE); - dst->bindTarget(); - LLGLSLShader* tone_shader = (mCGLut != 0 ) ? &gDeferredPostColorGradeLUTProgram[mTonemapType] : &gDeferredPostTonemapProgram[mTonemapType]; tone_shader->bind(); - S32 channel = tone_shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); - if (channel > -1) - { - src->bindTexture(0, channel, LLTexUnit::TFO_POINT); - } - - if (bloom) - { - channel = tone_shader->enableTexture(LLShaderMgr::DEFERRED_EMISSIVE, bloom->getUsage()); - if (channel > -1) - { - bloom->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); - } - } - - if (exposure) - { - channel = tone_shader->enableTexture(LLShaderMgr::EXPOSURE_MAP, exposure->getUsage()); - if (channel > -1) - { - exposure->bindTexture(0, channel); - } - } + tone_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); + tone_shader->bindTexture(LLShaderMgr::EXPOSURE_MAP, exposure, false, LLTexUnit::TFO_BILINEAR); tone_shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, src->getWidth(), src->getHeight()); tone_shader->uniform1f(al_exposure, mTonemapExposure); @@ -575,9 +552,10 @@ void ALRenderUtil::renderTonemap(LLRenderTarget* src, LLRenderTarget* dst, LLRen } } + S32 channel = -1; if (mCGLut != 0) { - S32 channel = tone_shader->enableTexture(LLShaderMgr::COLORGRADE_LUT, LLTexUnit::TT_TEXTURE_3D); + channel = tone_shader->enableTexture(LLShaderMgr::COLORGRADE_LUT, LLTexUnit::TT_TEXTURE_3D); if (channel > -1) { gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE_3D, mCGLut); @@ -592,8 +570,14 @@ void ALRenderUtil::renderTonemap(LLRenderTarget* src, LLRenderTarget* dst, LLRen mRenderBuffer->drawArrays(LLRender::TRIANGLES, 0, 3); stop_glerror(); + if (channel > -1) + { + gGL.getTexUnit(channel)->unbind(LLTexUnit::TT_TEXTURE_3D); + } + + tone_shader->unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); + tone_shader->unbindTexture(LLShaderMgr::EXPOSURE_MAP, exposure->getUsage()); tone_shader->unbind(); - dst->flush(); } bool ALRenderUtil::setupSharpen() @@ -641,7 +625,7 @@ bool ALRenderUtil::setupSharpen() return true; } -void ALRenderUtil::renderSharpen(LLRenderTarget* src, LLRenderTarget* dst) +void ALRenderUtil::renderSharpen(LLRenderTarget* src) { if (mSharpenMethod == ALSharpen::SHARPEN_NONE) { @@ -665,28 +649,14 @@ void ALRenderUtil::renderSharpen(LLRenderTarget* src, LLRenderTarget* dst) LLGLDepthTest depth(GL_FALSE, GL_FALSE); // Bind setup: - if (dst) - { - dst->bindTarget(); - } - sharpen_shader->bind(); - S32 channel = sharpen_shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); - if (channel > -1) - { - src->bindTexture(0, channel, LLTexUnit::TFO_POINT); - } + sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); // Draw mRenderBuffer->setBuffer(); mRenderBuffer->drawArrays(LLRender::TRIANGLES, 0, 3); - if (dst) - { - dst->flush(); - } - + sharpen_shader->unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); sharpen_shader->unbind(); - gGL.getTexUnit(0)->disable(); } diff --git a/indra/newview/alrenderutils.h b/indra/newview/alrenderutils.h index adb1846d2e0fa62f5e996db74a7866deaa71fd86..3008416ee845193b547900b4d94e081cfc3e2238 100644 --- a/indra/newview/alrenderutils.h +++ b/indra/newview/alrenderutils.h @@ -62,7 +62,7 @@ class ALRenderUtil }; bool setupTonemap(); bool setupColorGrade(); - void renderTonemap(LLRenderTarget* src, LLRenderTarget* dst, LLRenderTarget* bloom, LLRenderTarget* exposure); + void renderTonemap(LLRenderTarget* src, LLRenderTarget* exposure); enum ALSharpen : uint32_t { @@ -73,7 +73,7 @@ class ALRenderUtil }; bool setupSharpen(); - void renderSharpen(LLRenderTarget* src, LLRenderTarget* dst); + void renderSharpen(LLRenderTarget* src); // End Deferred Only U32 getSharpenMethod() { return mSharpenMethod; }; diff --git a/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl b/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl index 9c50f84735dc4d7d876677b82922db47a9898e96..436e6720dd6e1d7d395b289db817d88547638399 100644 --- a/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl +++ b/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl @@ -49,9 +49,6 @@ uniform vec3 sharpen_params; #define kDenoiseMin (0.001) #define kDenoiseMax (-0.1) -vec3 linear_to_srgb(vec3 cl); -vec3 srgb_to_linear(vec3 cl); - float GetLuma(vec4 p) { return 0.212655 * p.r + 0.715158 * p.g + 0.072187 * p.b; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 38f844fc69dbb044dbcc68c97ab232a3c8d46b76..26e4a49fb2990ff504530726a4597058ace409a7 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7310,6 +7310,8 @@ void LLPipeline::renderFinalize() gGL.setColorMask(true, true); glClearColor(0, 0, 0, 0); + LLRenderTarget* bound_target = &mPostMap; + LLRenderTarget* post_target = &mPostFXMap; if (!gCubeSnapshot) { LLRenderTarget* screen_target = screenTarget(); @@ -7429,17 +7431,15 @@ void LLPipeline::renderFinalize() mExposureMap.flush(); } -#if 1 - mALRenderUtil->renderTonemap(screenTarget(), &mPostMap, &mGlow[1], &mExposureMap); - - mALRenderUtil->renderSharpen(&mPostMap, &mPostMap); -#else - mPostMap.bindTarget(); + bound_target->bindTarget(); // gamma correct lighting { - LL_PROFILE_GPU_ZONE("gamma correct"); + LL_PROFILE_GPU_ZONE("gamma correct"); +#if 1 + mALRenderUtil->renderTonemap(screenTarget(), &mExposureMap); +#else LLGLDepthTest depth(GL_FALSE, GL_FALSE); // Apply gamma correction to the frame here. @@ -7466,10 +7466,20 @@ void LLPipeline::renderFinalize() gGL.getTexUnit(channel)->unbind(screenTarget()->getUsage()); gDeferredPostGammaCorrectProgram.unbind(); - } - - mPostMap.flush(); #endif + } + + bound_target->flush(); + + std::swap(bound_target, post_target); + + if(mALRenderUtil->getSharpenMethod() != ALRenderUtil::SHARPEN_NONE) + { + bound_target->bindTarget(); + mALRenderUtil->renderSharpen(post_target); + bound_target->flush(); + std::swap(bound_target, post_target); + } LLVertexBuffer::unbind(); } @@ -7500,7 +7510,7 @@ void LLPipeline::renderFinalize() gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA); - gGlowExtractProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, &mPostMap); + gGlowExtractProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, post_target); gGL.color4f(1, 1, 1, 1); gPipeline.enableLightsFullbright(); @@ -7570,19 +7580,17 @@ void LLPipeline::renderFinalize() } // [RLVa:KB] - @setsphere - LLRenderTarget* pRenderBuffer = &mPostMap; if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) { - LLShaderEffectParams params(pRenderBuffer, &mPostFXMap, false); + LLShaderEffectParams params(post_target, bound_target, false); LLVfxManager::instance().runEffect(EVisualEffect::RlvSphere, ¶ms); - pRenderBuffer = params.m_pDstBuffer; + std::swap(bound_target, post_target); } // [/RLVa:KB] { llassert(!gCubeSnapshot); bool multisample = RenderFSAASamples > 1 && mRT->fxaaBuffer.isComplete(); - LLGLSLShader* shader = &gGlowCombineProgram; S32 width = screenTarget()->getWidth(); S32 height = screenTarget()->getHeight(); @@ -7616,15 +7624,15 @@ void LLPipeline::renderFinalize() glViewport(0, 0, width, height); - shader = &gGlowCombineFXAAProgram; + LLGLSLShader* shader = &gGlowCombineFXAAProgram; shader->bind(); shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, width, height); - channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, pRenderBuffer->getUsage()); + channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, post_target->getUsage()); if (channel > -1) { - pRenderBuffer->bindTexture(0, channel); + post_target->bindTexture(0, channel); } channel = shader->enableTexture(LLShaderMgr::DEFERRED_EMISSIVE, mGlow[1].getUsage()); @@ -7641,7 +7649,7 @@ void LLPipeline::renderFinalize() gGL.flush(); - shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mPostMap.getUsage()); + shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, post_target->getUsage()); shader->unbind(); mRT->fxaaBuffer.flush(); @@ -7690,11 +7698,11 @@ void LLPipeline::renderFinalize() LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); - shader->bind(); + gGlowCombineProgram.bind(); - shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, pRenderBuffer); - shader->bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); - shader->bindTexture(LLShaderMgr::DEFERRED_EMISSIVE, &mGlow[1]); + gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, post_target); + gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); + gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_EMISSIVE, &mGlow[1]); gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; @@ -7706,7 +7714,7 @@ void LLPipeline::renderFinalize() mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); gGL.flush(); - shader->unbind(); + gGlowCombineProgram.unbind(); } }