diff options
Diffstat (limited to 'indra/llrender')
| -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 | 
5 files changed, 54 insertions, 32 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);  | 
