SH-2902 Fix for avatar bakes etc. getting garbage data sometimes.

meow-7.2.2
Dave Parks 2012-02-07 14:51:30 -06:00
parent 38e0b7de96
commit 8c15a7e17f
2 changed files with 27 additions and 6 deletions

View File

@ -125,8 +125,16 @@ BOOL LLViewerDynamicTexture::render()
//-----------------------------------------------------------------------------
void LLViewerDynamicTexture::preRender(BOOL clear_depth)
{
{
// force rendering to on-screen portion of frame buffer
//only images up to 512x512 are supported
llassert(mFullHeight <= 512);
llassert(mFullWidth <= 512);
if (gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete())
{ //using offscreen render target, just use the bottom left corner
mOrigin.set(0, 0);
}
else
{ // force rendering to on-screen portion of frame buffer
LLCoordScreen window_pos;
gViewerWindow->getWindow()->getPosition( &window_pos );
mOrigin.set(0, gViewerWindow->getWindowHeightRaw() - mFullHeight); // top left corner
@ -140,9 +148,9 @@ void LLViewerDynamicTexture::preRender(BOOL clear_depth)
mOrigin.mY += window_pos.mY;
mOrigin.mY = llmax(mOrigin.mY, 0) ;
}
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
// Set up camera
LLViewerCamera* camera = LLViewerCamera::getInstance();
mCamera.setOrigin(*camera);
@ -208,6 +216,13 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
return TRUE;
}
bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete();
if (use_fbo)
{
gPipeline.mWaterDis.bindTarget();
}
LLGLSLShader::bindNoShader();
LLVertexBuffer::unbind();
@ -241,6 +256,11 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
}
}
if (use_fbo)
{
gPipeline.mWaterDis.flush();
}
return ret;
}

View File

@ -1076,10 +1076,11 @@ void LLPipeline::createGLBuffers()
if (LLPipeline::sWaterReflections)
{ //water reflection texture
U32 res = (U32) gSavedSettings.getS32("RenderWaterRefResolution");
U32 res = (U32) llmax(gSavedSettings.getS32("RenderWaterRefResolution"), 512);
mWaterRef.allocate(res,res,GL_RGBA,TRUE,FALSE);
mWaterDis.allocate(res,res,GL_RGBA,TRUE,FALSE);
//always use FBO for mWaterDis so it can be used for avatar texture bakes
mWaterDis.allocate(res,res,GL_RGBA,TRUE,FALSE,LLTexUnit::TT_TEXTURE, true);
}
mHighlight.allocate(256,256,GL_RGBA, FALSE, FALSE);