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.master
parent
91606c7b60
commit
4cfa59d3f1
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1055,7 +1055,7 @@ void LLVertexBuffer::releaseIndices()
|
|||
|
||||
bool LLVertexBuffer::createGLBuffer(U32 size)
|
||||
{
|
||||
if (mGLBuffer)
|
||||
if (mGLBuffer || mMappedData)
|
||||
{
|
||||
destroyGLBuffer();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue