Skip to content

Commit 1f7f30a

Browse files
committed
SL-20611 Brute force fix for water haze -- paid for by cycles saved by not drawing water twice, but needs a better long term solution.
1 parent 4ca2373 commit 1f7f30a

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

indra/newview/pipeline.cpp

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -787,10 +787,8 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
787787
resY /= res_mod;
788788
}
789789

790-
if (LLPipeline::sRenderTransparentWater)
791-
{ //water reflection texture
792-
mWaterDis.allocate(resX, resY, GL_RGBA16F, true);
793-
}
790+
//water reflection texture (always needed as scratch space whether or not transparent water is enabled)
791+
mWaterDis.allocate(resX, resY, GL_RGBA16F, true);
794792

795793
if (RenderUIBuffer)
796794
{
@@ -8239,7 +8237,6 @@ void LLPipeline::doAtmospherics()
82398237

82408238
if (RenderDeferredAtmospheric)
82418239
{
8242-
if (!sUnderWaterRender)
82438240
{
82448241
// copy depth buffer for use in haze shader (use water displacement map as temp storage)
82458242
LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
@@ -8274,7 +8271,7 @@ void LLPipeline::doAtmospherics()
82748271
LLGLSLShader& haze_shader = gHazeProgram;
82758272

82768273
LL_PROFILE_GPU_ZONE("haze");
8277-
bindDeferredShader(haze_shader, nullptr, sUnderWaterRender ? nullptr : &mWaterDis);
8274+
bindDeferredShader(haze_shader, nullptr, &mWaterDis);
82788275

82798276
LLEnvironment& environment = LLEnvironment::instance();
82808277
haze_shader.uniform1i(LLShaderMgr::SUN_UP_FACTOR, environment.getIsSunUp() ? 1 : 0);
@@ -8300,6 +8297,32 @@ void LLPipeline::doWaterHaze()
83008297

83018298
if (RenderDeferredAtmospheric)
83028299
{
8300+
// copy depth buffer for use in haze shader (use water displacement map as temp storage)
8301+
{
8302+
LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
8303+
8304+
LLRenderTarget& src = gPipeline.mRT->screen;
8305+
LLRenderTarget& depth_src = gPipeline.mRT->deferredScreen;
8306+
LLRenderTarget& dst = gPipeline.mWaterDis;
8307+
8308+
mRT->screen.flush();
8309+
dst.bindTarget();
8310+
gCopyDepthProgram.bind();
8311+
8312+
S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP);
8313+
S32 depth_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DEFERRED_DEPTH);
8314+
8315+
gGL.getTexUnit(diff_map)->bind(&src);
8316+
gGL.getTexUnit(depth_map)->bind(&depth_src, true);
8317+
8318+
gGL.setColorMask(false, false);
8319+
gPipeline.mScreenTriangleVB->setBuffer();
8320+
gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
8321+
8322+
dst.flush();
8323+
mRT->screen.bindTarget();
8324+
}
8325+
83038326
LLGLEnable blend(GL_BLEND);
83048327
gGL.blendFunc(LLRender::BF_ONE, LLRender::BF_SOURCE_ALPHA, LLRender::BF_ZERO, LLRender::BF_SOURCE_ALPHA);
83058328

@@ -8309,7 +8332,7 @@ void LLPipeline::doWaterHaze()
83098332
LLGLSLShader& haze_shader = gHazeWaterProgram;
83108333

83118334
LL_PROFILE_GPU_ZONE("haze");
8312-
bindDeferredShader(haze_shader);
8335+
bindDeferredShader(haze_shader, nullptr, &mWaterDis);
83138336

83148337
haze_shader.uniform4fv(LLShaderMgr::WATER_WATERPLANE, 1, LLDrawPoolAlpha::sWaterPlane.mV);
83158338

0 commit comments

Comments
 (0)