diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2024-05-22 20:51:58 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-22 20:51:58 +0300 |
| commit | 6cc7dd09d5e69cf57e6de7fb568a0ad2693f9c9a (patch) | |
| tree | fab23811a5cedc1ebf01479c852ee92ff62b636c /indra/newview/lldynamictexture.cpp | |
| parent | ef8f4819822288e044ea719feb6af7a1f4df4c4e (diff) | |
| parent | 7bb5afc11ee5a6af78302a8d76a9a619e2baaab2 (diff) | |
Merge pull request #1545 from Ansariel/DRTVWR-600-maint-A
Merge main into DRTVWR-600-maint-a
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 437ebe8c7e..937bd35fee 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() ;
+ }
+ }
+}
|
