diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-05-26 21:25:23 +0300 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-05-26 22:43:12 +0300 | 
| commit | 4cfa59d3f1b856f62ab18543b1dbefbc574fb218 (patch) | |
| tree | eaefc7f4db2c13ed27c0043c7fc6bc07e0004402 | |
| parent | 91606c7b60de4270050f373e1efe49eb3074951b (diff) | |
SL-17473 Viewer not clearing all Vertex Buffers in some cases
Image thread doesn't need mBuffer and buffer isn't thread safe so no point allocating it in an image thread.
| -rw-r--r-- | indra/llrender/llimagegl.cpp | 2 | ||||
| -rw-r--r-- | indra/llrender/llrender.cpp | 77 | ||||
| -rw-r--r-- | indra/llrender/llrender.h | 4 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 2 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.h | 1 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 8 | 
8 files changed, 64 insertions, 35 deletions
| diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 9bd3a0a6b0..46f0095c92 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -2432,7 +2432,7 @@ void LLImageGLThread::run()      // We must perform setup on this thread before actually servicing our      // WorkQueue, likewise cleanup afterwards.      mWindow->makeContextCurrent(mContext); -    gGL.init(); +    gGL.init(false);      ThreadPool::run();      gGL.shutdown();      mWindow->destroySharedContext(mContext); diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index a03a27cf94..72cca1f2a2 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -869,7 +869,7 @@ LLRender::~LLRender()  	shutdown();  } -void LLRender::init() +void LLRender::init(bool needs_vertex_buffer)  {  #if LL_WINDOWS      if (gGLManager.mHasDebugOutput && gDebugGL) @@ -897,15 +897,27 @@ void LLRender::init()  #endif  	} +    if (needs_vertex_buffer) +    { +        initVertexBuffer(); +    } +} -	llassert_always(mBuffer.isNull()) ; -	stop_glerror(); -	mBuffer = new LLVertexBuffer(immediate_mask, 0); -	mBuffer->allocateBuffer(4096, 0, TRUE); -	mBuffer->getVertexStrider(mVerticesp); -	mBuffer->getTexCoord0Strider(mTexcoordsp); -	mBuffer->getColorStrider(mColorsp); -	stop_glerror(); +void LLRender::initVertexBuffer() +{ +    llassert_always(mBuffer.isNull()); +    stop_glerror(); +    mBuffer = new LLVertexBuffer(immediate_mask, 0); +    mBuffer->allocateBuffer(4096, 0, TRUE); +    mBuffer->getVertexStrider(mVerticesp); +    mBuffer->getTexCoord0Strider(mTexcoordsp); +    mBuffer->getColorStrider(mColorsp); +    stop_glerror(); +} + +void LLRender::resetVertexBuffer() +{ +    mBuffer = NULL;  }  void LLRender::shutdown() @@ -923,7 +935,7 @@ void LLRender::shutdown()  		delete mLightState[i];  	}  	mLightState.clear(); -	mBuffer = NULL ; +    resetVertexBuffer();  }  void LLRender::refreshState(void) @@ -1625,25 +1637,34 @@ void LLRender::flush()  		mCount = 0; -		if (mBuffer->useVBOs() && !mBuffer->isLocked()) -		{ //hack to only flush the part of the buffer that was updated (relies on stream draw using buffersubdata) -			mBuffer->getVertexStrider(mVerticesp, 0, count); -			mBuffer->getTexCoord0Strider(mTexcoordsp, 0, count); -			mBuffer->getColorStrider(mColorsp, 0, count); -		} -		 -		mBuffer->flush(); -		mBuffer->setBuffer(immediate_mask); +        if (mBuffer) +        { +            if (mBuffer->useVBOs() && !mBuffer->isLocked()) +            { //hack to only flush the part of the buffer that was updated (relies on stream draw using buffersubdata) +                mBuffer->getVertexStrider(mVerticesp, 0, count); +                mBuffer->getTexCoord0Strider(mTexcoordsp, 0, count); +                mBuffer->getColorStrider(mColorsp, 0, count); +            } + +            mBuffer->flush(); +            mBuffer->setBuffer(immediate_mask); + +            if (mMode == LLRender::QUADS && sGLCoreProfile) +            { +                mBuffer->drawArrays(LLRender::TRIANGLES, 0, count); +                mQuadCycle = 1; +            } +            else +            { +                mBuffer->drawArrays(mMode, 0, count); +            } +        } +        else +        { +            // mBuffer is present in main thread and not present in an image thread +            LL_ERRS() << "A flush call from outside main rendering thread" << LL_ENDL; +        } -		if (mMode == LLRender::QUADS && sGLCoreProfile) -		{ -			mBuffer->drawArrays(LLRender::TRIANGLES, 0, count); -			mQuadCycle = 1; -		} -		else -		{ -			mBuffer->drawArrays(mMode, 0, count); -		}  		mVerticesp[0] = mVerticesp[count];  		mTexcoordsp[0] = mTexcoordsp[count]; diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index e2489876e4..9c36c230fb 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -354,7 +354,9 @@ public:  	LLRender();  	~LLRender(); -	void init() ; +    void init(bool needs_vertex_buffer); +    void initVertexBuffer(); +    void resetVertexBuffer();  	void shutdown();  	// Refreshes renderer state to the cached values diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 6338cab96a..be3e6ddff0 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -1055,7 +1055,7 @@ void LLVertexBuffer::releaseIndices()  bool LLVertexBuffer::createGLBuffer(U32 size)  { -	if (mGLBuffer) +	if (mGLBuffer || mMappedData)  	{  		destroyGLBuffer();  	} diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index baf8407fc6..3b3fe44984 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -265,7 +265,6 @@ public:  	bool getTangentStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);  	bool getTangentStrider(LLStrider<LLVector4a>& strider, S32 index=0, S32 count = -1, bool map_range = false);  	bool getColorStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false); -	bool getTextureIndexStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);  	bool getEmissiveStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);  	bool getWeightStrider(LLStrider<F32>& strider, S32 index=0, S32 count = -1, bool map_range = false);  	bool getWeight4Strider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8e565bbdca..33e8178593 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1998,7 +1998,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)  	}  	LLVertexBuffer::initClass(gSavedSettings.getBOOL("RenderVBOEnable"), gSavedSettings.getBOOL("RenderVBOMappingDisable"));  	LL_INFOS("RenderInit") << "LLVertexBuffer initialization done." << LL_ENDL ; -	gGL.init() ; +	gGL.init(true);  	if (LLFeatureManager::getInstance()->isSafe()  		|| (gSavedSettings.getS32("LastFeatureVersion") != LLFeatureManager::getInstance()->getVersion()) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 37851ce99b..5dfcb68562 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2810,6 +2810,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)  	if (detailed_update)  	{          U32 draw_order = 0; +        S32 attachment_selected = LLSelectMgr::getInstance()->getSelection()->getObjectCount() && LLSelectMgr::getInstance()->getSelection()->isAttachment();  		for (attachment_map_t::iterator iter = mAttachmentPoints.begin();   			 iter != mAttachmentPoints.end();  			 ++iter) @@ -2849,7 +2850,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)                      }                      // if selecting any attachments, update all of them as non-damped -                    if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() && LLSelectMgr::getInstance()->getSelection()->isAttachment()) +                    if (attachment_selected)                      {                          gPipeline.updateMoveNormalAsync(attached_object->mDrawable);                      } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index da16c8209f..db5c446e7a 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7238,6 +7238,7 @@ void LLPipeline::doResetVertexBuffers(bool forced)  	mResetVertexBuffers = false;  	mCubeVB = NULL; +    mDeferredVB = NULL;  	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();   			iter != LLWorld::getInstance()->getRegionList().end(); ++iter) @@ -7271,10 +7272,11 @@ void LLPipeline::doResetVertexBuffers(bool forced)  		LLPathingLib::getInstance()->cleanupVBOManager();  	}  	LLVOPartGroup::destroyGL(); +    gGL.resetVertexBuffer();  	SUBSYSTEM_CLEANUP(LLVertexBuffer); -	if (LLVertexBuffer::sGLCount > 0) +	if (LLVertexBuffer::sGLCount != 0)  	{  		LL_WARNS() << "VBO wipe failed -- " << LLVertexBuffer::sGLCount << " buffers remaining." << LL_ENDL;  	} @@ -7295,6 +7297,10 @@ void LLPipeline::doResetVertexBuffers(bool forced)  	LLPipeline::sTextureBindTest = gSavedSettings.getBOOL("RenderDebugTextureBind");  	LLVertexBuffer::initClass(LLVertexBuffer::sEnableVBOs, LLVertexBuffer::sDisableVBOMapping); +    gGL.initVertexBuffer(); + +    mDeferredVB = new LLVertexBuffer(DEFERRED_VB_MASK, 0); +    mDeferredVB->allocateBuffer(8, 0, true);  	LLVOPartGroup::restoreGL();  } | 
