summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorGraham Linden <graham@lindenlab.com>2019-07-24 12:52:24 -0700
committerGraham Linden <graham@lindenlab.com>2019-07-24 12:52:24 -0700
commit41ede77744489c2a2d32849ea457bcbea516a588 (patch)
tree9f611afd7a33fc4a9c0bd40f779d4596ca00309a /indra/newview
parent15f5d8caf8fc51999c4de4217ed5ac37fa911ae9 (diff)
SL-10625
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/lldynamictexture.cpp14
-rw-r--r--indra/newview/lldynamictexture.h5
-rw-r--r--indra/newview/llviewertexlayer.h2
-rw-r--r--indra/newview/pipeline.cpp6
-rw-r--r--indra/newview/pipeline.h2
5 files changed, 22 insertions, 7 deletions
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index fa9a0712fa..f9b4df679b 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -129,7 +129,7 @@ void LLViewerDynamicTexture::preRender(BOOL clear_depth)
llassert(mFullHeight <= 512);
llassert(mFullWidth <= 512);
- if (gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI)
+ if (gGLManager.mHasFramebufferObject && gPipeline.mBake.isComplete())
{ //using offscreen render target, just use the bottom left corner
mOrigin.set(0, 0);
}
@@ -216,11 +216,12 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
return TRUE;
}
- bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI;
+ bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mBake.isComplete();
if (use_fbo)
{
- gPipeline.mWaterDis.bindTarget();
+ gPipeline.mBake.bindTarget();
+ gPipeline.mBake.clear();
}
LLGLSLShader::bindNoShader();
@@ -240,6 +241,7 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
gDepthDirty = TRUE;
gGL.color4f(1,1,1,1);
+ dynamicTexture->setBoundTarget(use_fbo ? &gPipeline.mBake : nullptr);
dynamicTexture->preRender(); // Must be called outside of startRender()
result = FALSE;
if (dynamicTexture->render())
@@ -250,7 +252,7 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
}
gGL.flush();
LLVertexBuffer::unbind();
-
+ dynamicTexture->setBoundTarget(nullptr);
dynamicTexture->postRender(result);
}
}
@@ -258,9 +260,11 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
if (use_fbo)
{
- gPipeline.mWaterDis.flush();
+ gPipeline.mBake.flush();
}
+ gGL.flush();
+
return ret;
}
diff --git a/indra/newview/lldynamictexture.h b/indra/newview/lldynamictexture.h
index f3f57c9a6b..4bd74a8425 100644
--- a/indra/newview/lldynamictexture.h
+++ b/indra/newview/lldynamictexture.h
@@ -88,6 +88,9 @@ public:
static BOOL updateAllInstances();
static void destroyGL() ;
static void restoreGL() ;
+
+ void setBoundTarget(LLRenderTarget* target) { mBoundTarget = target; }
+
protected:
void generateGLTexture();
void generateGLTexture(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes = FALSE);
@@ -97,6 +100,8 @@ protected:
LLCoordGL mOrigin;
LL_ALIGN_16(LLCamera mCamera);
+ LLRenderTarget* mBoundTarget;
+
typedef std::set<LLViewerDynamicTexture*> instance_list_t;
static instance_list_t sInstances[ LLViewerDynamicTexture::ORDER_COUNT ];
static S32 sNumRenders;
diff --git a/indra/newview/llviewertexlayer.h b/indra/newview/llviewertexlayer.h
index 027ae255ec..dec7f0ddfc 100644
--- a/indra/newview/llviewertexlayer.h
+++ b/indra/newview/llviewertexlayer.h
@@ -111,7 +111,7 @@ protected:
// Pass these along for tex layer rendering.
virtual void preRender(BOOL clear_depth) { preRenderTexLayerSet(); }
virtual void postRender(BOOL success) { postRenderTexLayerSet(success); }
- virtual BOOL render() { return renderTexLayerSet(); }
+ virtual BOOL render() { return renderTexLayerSet(mBoundTarget); }
//--------------------------------------------------------------------
// Updates
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index ef88d43cc4..448b65272b 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1162,6 +1162,7 @@ void LLPipeline::releaseGLBuffers()
mWaterRef.release();
mWaterDis.release();
+ mBake.release();
mHighlight.release();
for (U32 i = 0; i < 3; i++)
@@ -1225,6 +1226,9 @@ void LLPipeline::createGLBuffers()
mWaterDis.allocate(res,res,GL_RGBA,TRUE,FALSE,LLTexUnit::TT_TEXTURE);
}
+ // Use FBO for bake tex
+ mBake.allocate(512, 512, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, true);
+
mHighlight.allocate(256,256,GL_RGBA, FALSE, FALSE);
stop_glerror();
@@ -1395,7 +1399,7 @@ bool LLPipeline::canUseVertexShaders()
bool LLPipeline::canUseWindLightShaders() const
{
return (!LLPipeline::sDisableShaders &&
- /*gWLSkyProgram.mProgramObject != 0 &&*/
+ gWLSkyProgram.mProgramObject != 0 &&
LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT) > 1);
}
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index b0c40d145b..cc9ec06f80 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -650,6 +650,8 @@ public:
//water distortion texture (refraction)
LLRenderTarget mWaterDis;
+ LLRenderTarget mBake;
+
//texture for making the glow
LLRenderTarget mGlow[3];