diff options
Diffstat (limited to 'indra/newview/lldynamictexture.cpp')
-rw-r--r-- | indra/newview/lldynamictexture.cpp | 558 |
1 files changed, 279 insertions, 279 deletions
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index 937bd35fee..22e23727b8 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -1,279 +1,279 @@ -/**
- * @file lldynamictexture.cpp
- * @brief Implementation of LLViewerDynamicTexture class
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "lldynamictexture.h"
-
-// Linden library includes
-#include "llglheaders.h"
-#include "llwindow.h" // getPosition()
-
-// Viewer includes
-#include "llviewerwindow.h"
-#include "llviewercamera.h"
-#include "llviewercontrol.h"
-#include "llviewertexture.h"
-#include "llvertexbuffer.h"
-#include "llviewerdisplay.h"
-#include "llrender.h"
-#include "pipeline.h"
-#include "llglslshader.h"
-
-// static
-LLViewerDynamicTexture::instance_list_t LLViewerDynamicTexture::sInstances[ LLViewerDynamicTexture::ORDER_COUNT ];
-S32 LLViewerDynamicTexture::sNumRenders = 0;
-
-//-----------------------------------------------------------------------------
-// LLViewerDynamicTexture()
-//-----------------------------------------------------------------------------
-LLViewerDynamicTexture::LLViewerDynamicTexture(S32 width, S32 height, S32 components, EOrder order, bool clamp) :
- LLViewerTexture(width, height, components, false),
- mClamp(clamp)
-{
- llassert((1 <= components) && (components <= 4));
-
- generateGLTexture();
-
- llassert( 0 <= order && order < ORDER_COUNT );
- LLViewerDynamicTexture::sInstances[ order ].insert(this);
-}
-
-//-----------------------------------------------------------------------------
-// LLViewerDynamicTexture()
-//-----------------------------------------------------------------------------
-LLViewerDynamicTexture::~LLViewerDynamicTexture()
-{
- for( S32 order = 0; order < ORDER_COUNT; order++ )
- {
- LLViewerDynamicTexture::sInstances[order].erase(this); // will fail in all but one case.
- }
-}
-
-//virtual
-S8 LLViewerDynamicTexture::getType() const
-{
- return LLViewerTexture::DYNAMIC_TEXTURE ;
-}
-
-//-----------------------------------------------------------------------------
-// generateGLTexture()
-//-----------------------------------------------------------------------------
-void LLViewerDynamicTexture::generateGLTexture()
-{
- LLViewerTexture::generateGLTexture() ;
- generateGLTexture(-1, 0, 0, false);
-}
-
-void LLViewerDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, bool swap_bytes)
-{
- if (mComponents < 1 || mComponents > 4)
- {
- LL_ERRS() << "Bad number of components in dynamic texture: " << mComponents << LL_ENDL;
- }
-
- LLPointer<LLImageRaw> raw_image = new LLImageRaw(mFullWidth, mFullHeight, mComponents);
- if (internal_format >= 0)
- {
- setExplicitFormat(internal_format, primary_format, type_format, swap_bytes);
- }
- createGLTexture(0, raw_image, 0, true, LLGLTexture::DYNAMIC_TEX);
- setAddressMode((mClamp) ? LLTexUnit::TAM_CLAMP : LLTexUnit::TAM_WRAP);
- mGLTexturep->setGLTextureCreated(false);
-}
-
-//-----------------------------------------------------------------------------
-// render()
-//-----------------------------------------------------------------------------
-bool LLViewerDynamicTexture::render()
-{
- return false;
-}
-
-//-----------------------------------------------------------------------------
-// preRender()
-//-----------------------------------------------------------------------------
-void LLViewerDynamicTexture::preRender(bool clear_depth)
-{
- //use the bottom left corner
- mOrigin.set(0, 0);
-
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- // Set up camera
- LLViewerCamera* camera = LLViewerCamera::getInstance();
- mCamera.setOrigin(*camera);
- mCamera.setAxes(*camera);
- mCamera.setAspect(camera->getAspect());
- mCamera.setView(camera->getView());
- mCamera.setNear(camera->getNear());
-
- glViewport(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight);
- if (clear_depth)
- {
- glClear(GL_DEPTH_BUFFER_BIT);
- }
-}
-
-//-----------------------------------------------------------------------------
-// postRender()
-//-----------------------------------------------------------------------------
-void LLViewerDynamicTexture::postRender(bool success)
-{
- {
- if (success)
- {
- if(mGLTexturep.isNull())
- {
- generateGLTexture() ;
- }
- else if(!mGLTexturep->getHasGLTexture())
- {
- generateGLTexture() ;
- }
- else if(mGLTexturep->getDiscardLevel() != 0)//do not know how it happens, but regenerate one if it does.
- {
- generateGLTexture() ;
- }
-
- success = mGLTexturep->setSubImageFromFrameBuffer(0, 0, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight);
- }
- }
-
- // restore viewport
- gViewerWindow->setup2DViewport();
-
- // restore camera
- LLViewerCamera* camera = LLViewerCamera::getInstance();
- camera->setOrigin(mCamera);
- camera->setAxes(mCamera);
- camera->setAspect(mCamera.getAspect());
- camera->setViewNoBroadcast(mCamera.getView());
- camera->setNear(mCamera.getNear());
-}
-
-//-----------------------------------------------------------------------------
-// static
-// updateDynamicTextures()
-// Calls update on each dynamic texture. Calls each group in order: "first," then "middle," then "last."
-//-----------------------------------------------------------------------------
-bool LLViewerDynamicTexture::updateAllInstances()
-{
- sNumRenders = 0;
- if (gGLManager.mIsDisabled)
- {
- return true;
- }
-
- bool use_fbo = gPipeline.mBake.isComplete() && !gGLManager.mIsAMD;
-
- if (use_fbo)
- {
- gPipeline.mBake.bindTarget();
- gPipeline.mBake.clear();
- }
-
- LLGLSLShader::unbind();
- LLVertexBuffer::unbind();
-
- bool result = false;
- bool ret = false ;
- for( S32 order = 0; order < ORDER_COUNT; order++ )
- {
- for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin();
- iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter)
- {
- LLViewerDynamicTexture *dynamicTexture = *iter;
- if (dynamicTexture->needsRender())
- {
- glClear(GL_DEPTH_BUFFER_BIT);
- 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())
- {
- ret = true ;
- result = true;
- sNumRenders++;
- }
- gGL.flush();
- LLVertexBuffer::unbind();
- dynamicTexture->setBoundTarget(nullptr);
- dynamicTexture->postRender(result);
- }
- }
- }
-
- if (use_fbo)
- {
- gPipeline.mBake.flush();
- }
-
- gGL.flush();
-
- return ret;
-}
-
-//-----------------------------------------------------------------------------
-// static
-// destroyGL()
-//-----------------------------------------------------------------------------
-void LLViewerDynamicTexture::destroyGL()
-{
- for( S32 order = 0; order < ORDER_COUNT; order++ )
- {
- for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin();
- iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter)
- {
- LLViewerDynamicTexture *dynamicTexture = *iter;
- dynamicTexture->destroyGLTexture() ;
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-// static
-// restoreGL()
-//-----------------------------------------------------------------------------
-void LLViewerDynamicTexture::restoreGL()
-{
- if (gGLManager.mIsDisabled)
- {
- return ;
- }
-
- for( S32 order = 0; order < ORDER_COUNT; order++ )
- {
- for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin();
- iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter)
- {
- LLViewerDynamicTexture *dynamicTexture = *iter;
- dynamicTexture->restoreGLTexture() ;
- }
- }
-}
+/** + * @file lldynamictexture.cpp + * @brief Implementation of LLViewerDynamicTexture class + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "lldynamictexture.h" + +// Linden library includes +#include "llglheaders.h" +#include "llwindow.h" // getPosition() + +// Viewer includes +#include "llviewerwindow.h" +#include "llviewercamera.h" +#include "llviewercontrol.h" +#include "llviewertexture.h" +#include "llvertexbuffer.h" +#include "llviewerdisplay.h" +#include "llrender.h" +#include "pipeline.h" +#include "llglslshader.h" + +// static +LLViewerDynamicTexture::instance_list_t LLViewerDynamicTexture::sInstances[ LLViewerDynamicTexture::ORDER_COUNT ]; +S32 LLViewerDynamicTexture::sNumRenders = 0; + +//----------------------------------------------------------------------------- +// LLViewerDynamicTexture() +//----------------------------------------------------------------------------- +LLViewerDynamicTexture::LLViewerDynamicTexture(S32 width, S32 height, S32 components, EOrder order, bool clamp) : + LLViewerTexture(width, height, components, false), + mClamp(clamp) +{ + llassert((1 <= components) && (components <= 4)); + + generateGLTexture(); + + llassert( 0 <= order && order < ORDER_COUNT ); + LLViewerDynamicTexture::sInstances[ order ].insert(this); +} + +//----------------------------------------------------------------------------- +// LLViewerDynamicTexture() +//----------------------------------------------------------------------------- +LLViewerDynamicTexture::~LLViewerDynamicTexture() +{ + for( S32 order = 0; order < ORDER_COUNT; order++ ) + { + LLViewerDynamicTexture::sInstances[order].erase(this); // will fail in all but one case. + } +} + +//virtual +S8 LLViewerDynamicTexture::getType() const +{ + return LLViewerTexture::DYNAMIC_TEXTURE ; +} + +//----------------------------------------------------------------------------- +// generateGLTexture() +//----------------------------------------------------------------------------- +void LLViewerDynamicTexture::generateGLTexture() +{ + LLViewerTexture::generateGLTexture() ; + generateGLTexture(-1, 0, 0, false); +} + +void LLViewerDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, bool swap_bytes) +{ + if (mComponents < 1 || mComponents > 4) + { + LL_ERRS() << "Bad number of components in dynamic texture: " << mComponents << LL_ENDL; + } + + LLPointer<LLImageRaw> raw_image = new LLImageRaw(mFullWidth, mFullHeight, mComponents); + if (internal_format >= 0) + { + setExplicitFormat(internal_format, primary_format, type_format, swap_bytes); + } + createGLTexture(0, raw_image, 0, true, LLGLTexture::DYNAMIC_TEX); + setAddressMode((mClamp) ? LLTexUnit::TAM_CLAMP : LLTexUnit::TAM_WRAP); + mGLTexturep->setGLTextureCreated(false); +} + +//----------------------------------------------------------------------------- +// render() +//----------------------------------------------------------------------------- +bool LLViewerDynamicTexture::render() +{ + return false; +} + +//----------------------------------------------------------------------------- +// preRender() +//----------------------------------------------------------------------------- +void LLViewerDynamicTexture::preRender(bool clear_depth) +{ + //use the bottom left corner + mOrigin.set(0, 0); + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + // Set up camera + LLViewerCamera* camera = LLViewerCamera::getInstance(); + mCamera.setOrigin(*camera); + mCamera.setAxes(*camera); + mCamera.setAspect(camera->getAspect()); + mCamera.setView(camera->getView()); + mCamera.setNear(camera->getNear()); + + glViewport(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight); + if (clear_depth) + { + glClear(GL_DEPTH_BUFFER_BIT); + } +} + +//----------------------------------------------------------------------------- +// postRender() +//----------------------------------------------------------------------------- +void LLViewerDynamicTexture::postRender(bool success) +{ + { + if (success) + { + if(mGLTexturep.isNull()) + { + generateGLTexture() ; + } + else if(!mGLTexturep->getHasGLTexture()) + { + generateGLTexture() ; + } + else if(mGLTexturep->getDiscardLevel() != 0)//do not know how it happens, but regenerate one if it does. + { + generateGLTexture() ; + } + + success = mGLTexturep->setSubImageFromFrameBuffer(0, 0, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight); + } + } + + // restore viewport + gViewerWindow->setup2DViewport(); + + // restore camera + LLViewerCamera* camera = LLViewerCamera::getInstance(); + camera->setOrigin(mCamera); + camera->setAxes(mCamera); + camera->setAspect(mCamera.getAspect()); + camera->setViewNoBroadcast(mCamera.getView()); + camera->setNear(mCamera.getNear()); +} + +//----------------------------------------------------------------------------- +// static +// updateDynamicTextures() +// Calls update on each dynamic texture. Calls each group in order: "first," then "middle," then "last." +//----------------------------------------------------------------------------- +bool LLViewerDynamicTexture::updateAllInstances() +{ + sNumRenders = 0; + if (gGLManager.mIsDisabled) + { + return true; + } + + bool use_fbo = gPipeline.mBake.isComplete() && !gGLManager.mIsAMD; + + if (use_fbo) + { + gPipeline.mBake.bindTarget(); + gPipeline.mBake.clear(); + } + + LLGLSLShader::unbind(); + LLVertexBuffer::unbind(); + + bool result = false; + bool ret = false ; + for( S32 order = 0; order < ORDER_COUNT; order++ ) + { + for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin(); + iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter) + { + LLViewerDynamicTexture *dynamicTexture = *iter; + if (dynamicTexture->needsRender()) + { + glClear(GL_DEPTH_BUFFER_BIT); + 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()) + { + ret = true ; + result = true; + sNumRenders++; + } + gGL.flush(); + LLVertexBuffer::unbind(); + dynamicTexture->setBoundTarget(nullptr); + dynamicTexture->postRender(result); + } + } + } + + if (use_fbo) + { + gPipeline.mBake.flush(); + } + + gGL.flush(); + + return ret; +} + +//----------------------------------------------------------------------------- +// static +// destroyGL() +//----------------------------------------------------------------------------- +void LLViewerDynamicTexture::destroyGL() +{ + for( S32 order = 0; order < ORDER_COUNT; order++ ) + { + for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin(); + iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter) + { + LLViewerDynamicTexture *dynamicTexture = *iter; + dynamicTexture->destroyGLTexture() ; + } + } +} + +//----------------------------------------------------------------------------- +// static +// restoreGL() +//----------------------------------------------------------------------------- +void LLViewerDynamicTexture::restoreGL() +{ + if (gGLManager.mIsDisabled) + { + return ; + } + + for( S32 order = 0; order < ORDER_COUNT; order++ ) + { + for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin(); + iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter) + { + LLViewerDynamicTexture *dynamicTexture = *iter; + dynamicTexture->restoreGLTexture() ; + } + } +} |