Fix a thread safety issue in the GL image worker.
LLViewerTexture::mNeedsCreateTexture needs to be an attomic bool since it is written both in the main thread and in the GL image worker thread. We can now enable threaded bump maps creation as a result of this fix. I have read the CLA Document and I hereby sign the CLAmeow-7.2.2
parent
b841dadc65
commit
d776638417
|
|
@ -77,7 +77,9 @@ static S32 cube_channel = -1;
|
|||
static S32 diffuse_channel = -1;
|
||||
static S32 bump_channel = -1;
|
||||
|
||||
#define LL_BUMPLIST_MULTITHREADED 0 // TODO -- figure out why this doesn't work
|
||||
// Enabled after changing LLViewerTexture::mNeedsCreateTexture to an
|
||||
// LLAtomicBool; this should work just fine, now. HB
|
||||
#define LL_BUMPLIST_MULTITHREADED 1
|
||||
|
||||
// static
|
||||
void LLStandardBumpmap::init()
|
||||
|
|
|
|||
|
|
@ -1118,7 +1118,7 @@ void LLViewerFetchedTexture::init(bool firstinit)
|
|||
mLoadedCallbackDesiredDiscardLevel = S8_MAX;
|
||||
mPauseLoadedCallBacks = FALSE;
|
||||
|
||||
mNeedsCreateTexture = FALSE;
|
||||
mNeedsCreateTexture = false;
|
||||
|
||||
mIsRawImageValid = FALSE;
|
||||
mRawDiscardLevel = INVALID_DISCARD_LEVEL;
|
||||
|
|
@ -1400,12 +1400,12 @@ void LLViewerFetchedTexture::addToCreateTexture()
|
|||
{
|
||||
//just update some variables, not to create a real GL texture.
|
||||
createGLTexture(mRawDiscardLevel, mRawImage, 0, FALSE);
|
||||
mNeedsCreateTexture = FALSE;
|
||||
mNeedsCreateTexture = false;
|
||||
destroyRawImage();
|
||||
}
|
||||
else if(!force_update && getDiscardLevel() > -1 && getDiscardLevel() <= mRawDiscardLevel)
|
||||
{
|
||||
mNeedsCreateTexture = FALSE;
|
||||
mNeedsCreateTexture = false;
|
||||
destroyRawImage();
|
||||
}
|
||||
else
|
||||
|
|
@ -1441,7 +1441,7 @@ void LLViewerFetchedTexture::addToCreateTexture()
|
|||
mRawDiscardLevel += i;
|
||||
if(mRawDiscardLevel >= getDiscardLevel() && getDiscardLevel() > 0)
|
||||
{
|
||||
mNeedsCreateTexture = FALSE;
|
||||
mNeedsCreateTexture = false;
|
||||
destroyRawImage();
|
||||
return;
|
||||
}
|
||||
|
|
@ -1473,7 +1473,7 @@ BOOL LLViewerFetchedTexture::preCreateTexture(S32 usename/*= 0*/)
|
|||
destroyRawImage();
|
||||
return FALSE;
|
||||
}
|
||||
mNeedsCreateTexture = FALSE;
|
||||
mNeedsCreateTexture = false;
|
||||
|
||||
if (mRawImage.isNull())
|
||||
{
|
||||
|
|
@ -1609,14 +1609,14 @@ void LLViewerFetchedTexture::postCreateTexture()
|
|||
destroyRawImage();
|
||||
}
|
||||
|
||||
mNeedsCreateTexture = FALSE;
|
||||
mNeedsCreateTexture = false;
|
||||
}
|
||||
|
||||
void LLViewerFetchedTexture::scheduleCreateTexture()
|
||||
{
|
||||
if (!mNeedsCreateTexture)
|
||||
{
|
||||
mNeedsCreateTexture = TRUE;
|
||||
mNeedsCreateTexture = true;
|
||||
if (preCreateTexture())
|
||||
{
|
||||
#if LL_IMAGEGL_THREAD_CHECK
|
||||
|
|
@ -1630,7 +1630,7 @@ void LLViewerFetchedTexture::scheduleCreateTexture()
|
|||
memcpy(data_copy, data, size);
|
||||
}
|
||||
#endif
|
||||
mNeedsCreateTexture = TRUE;
|
||||
mNeedsCreateTexture = true;
|
||||
auto mainq = LLImageGLThread::sEnabled ? mMainQueue.lock() : nullptr;
|
||||
if (mainq)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#ifndef LL_LLVIEWERTEXTURE_H
|
||||
#define LL_LLVIEWERTEXTURE_H
|
||||
|
||||
#include "llatomic.h"
|
||||
#include "llgltexture.h"
|
||||
#include "lltimer.h"
|
||||
#include "llframetimer.h"
|
||||
|
|
@ -528,7 +529,9 @@ protected:
|
|||
LLFrameTimer mStopFetchingTimer; // Time since mDecodePriority == 0.f.
|
||||
|
||||
BOOL mInImageList; // TRUE if image is in list (in which case don't reset priority!)
|
||||
BOOL mNeedsCreateTexture;
|
||||
// This needs to be atomic, since it is written both in the main thread
|
||||
// and in the GL image worker thread... HB
|
||||
LLAtomicBool mNeedsCreateTexture;
|
||||
|
||||
BOOL mForSculpt ; //a flag if the texture is used as sculpt data.
|
||||
BOOL mIsFetched ; //is loaded from remote or from cache, not generated locally.
|
||||
|
|
|
|||
Loading…
Reference in New Issue