diff options
| author | Dave Parks <davep@lindenlab.com> | 2011-07-10 02:29:39 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2011-07-10 02:29:39 -0500 | 
| commit | 268f3dbdea27d2549e69cd81334c1c8b0a057da4 (patch) | |
| tree | 0d873a6988fdb0fc9d875a619b4dc2a55cf1a08e /indra | |
| parent | e4d0d62e71de69d1685d00da571e9055e18fdc0c (diff) | |
SH-2038 Fix for some compiler errors from the apple tweaks -- also add a fence API (disabled for now).
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llrender/llgl.cpp | 31 | ||||
| -rw-r--r-- | indra/llrender/llgl.h | 1 | ||||
| -rw-r--r-- | indra/llrender/llglheaders.h | 39 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 109 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.h | 12 | 
5 files changed, 182 insertions, 10 deletions
| diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 02c975a17a..e07ff0015c 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -128,9 +128,21 @@ PFNGLGETBUFFERPARAMETERIVARBPROC	glGetBufferParameterivARB = NULL;  PFNGLGETBUFFERPOINTERVARBPROC		glGetBufferPointervARB = NULL;  // GL_ARB_map_buffer_range -PFNGLMAPBUFFERRANGEPROC			glMapBufferRange; -PFNGLFLUSHMAPPEDBUFFERRANGEPROC	glFlushMappedBufferRange; - +PFNGLMAPBUFFERRANGEPROC			glMapBufferRange = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEPROC	glFlushMappedBufferRange = NULL; + +// GL_ARB_sync +PFNGLFENCESYNCPROC				glFenceSync = NULL; +PFNGLISSYNCPROC					glIsSync = NULL; +PFNGLDELETESYNCPROC				glDeleteSync = NULL; +PFNGLCLIENTWAITSYNCPROC			glClientWaitSync = NULL; +PFNGLWAITSYNCPROC				glWaitSync = NULL; +PFNGLGETINTEGER64VPROC			glGetInteger64v = NULL; +PFNGLGETSYNCIVPROC				glGetSynciv = NULL; + +// GL_APPLE_flush_buffer_range +PFNGLBUFFERPARAMETERIAPPLEPROC	glBufferParameteriAPPLE = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE = NULL;  // vertex object prototypes  PFNGLNEWOBJECTBUFFERATIPROC			glNewObjectBufferATI = NULL; @@ -334,7 +346,7 @@ LLGLManager::LLGLManager() :  	mHasFramebufferObject(FALSE),  	mMaxSamples(0),  	mHasBlendFuncSeparate(FALSE), - +	mHasSync(FALSE),  	mHasVertexBufferObject(FALSE),  	mHasMapBufferRange(FALSE),  	mHasFlushBufferRange(FALSE), @@ -775,6 +787,7 @@ void LLGLManager::initExtensions()  	mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts);  	mHasOcclusionQuery2 = ExtensionExists("GL_ARB_occlusion_query2", gGLHExts.mSysExts);  	mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts); +	mHasSync = ExtensionExists("GL_ARB_sync", gGLHExts.mSysExts);  	mHasMapBufferRange = ExtensionExists("GL_ARB_map_buffer_range", gGLHExts.mSysExts);  	mHasFlushBufferRange = ExtensionExists("GL_APPLE_flush_buffer_range", gGLHExts.mSysExts);  	mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts); @@ -971,6 +984,16 @@ void LLGLManager::initExtensions()  			mHasVertexBufferObject = FALSE;  		}  	} +	if (mHasSync) +	{ +		glFenceSync = (PFNGLFENCESYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glFenceSync");
 +		glIsSync = (PFNGLISSYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glIsSync");
 +		glDeleteSync = (PFNGLDELETESYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteSync");
 +		glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glClientWaitSync");
 +		glWaitSync = (PFNGLWAITSYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glWaitSync");
 +		glGetInteger64v = (PFNGLGETINTEGER64VPROC) GLH_EXT_GET_PROC_ADDRESS("glGetInteger64v");
 +		glGetSynciv = (PFNGLGETSYNCIVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetSynciv"); +	}  	if (mHasMapBufferRange)  	{  		glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) GLH_EXT_GET_PROC_ADDRESS("glMapBufferRange"); diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 3e98c04321..d736133f3f 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -88,6 +88,7 @@ public:  	// ARB Extensions  	BOOL mHasVertexBufferObject; +	BOOL mHasSync;  	BOOL mHasMapBufferRange;  	BOOL mHasFlushBufferRange;  	BOOL mHasPBuffer; diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index f35f329f00..851a75629e 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -68,6 +68,19 @@ extern PFNGLUNMAPBUFFERARBPROC		glUnmapBufferARB;  extern PFNGLGETBUFFERPARAMETERIVARBPROC	glGetBufferParameterivARB;  extern PFNGLGETBUFFERPOINTERVARBPROC	glGetBufferPointervARB; +// GL_ARB_sync +extern PFNGLFENCESYNCPROC				glFenceSync; +extern PFNGLISSYNCPROC					glIsSync; +extern PFNGLDELETESYNCPROC				glDeleteSync; +extern PFNGLCLIENTWAITSYNCPROC			glClientWaitSync; +extern PFNGLWAITSYNCPROC				glWaitSync; +extern PFNGLGETINTEGER64VPROC			glGetInteger64v; +extern PFNGLGETSYNCIVPROC				glGetSynciv; + +// GL_APPLE_flush_buffer_range +extern PFNGLBUFFERPARAMETERIAPPLEPROC	glBufferParameteriAPPLE; +extern PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE; +  // GL_ARB_map_buffer_range  extern PFNGLMAPBUFFERRANGEPROC			glMapBufferRange;  extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC	glFlushMappedBufferRange; @@ -310,6 +323,19 @@ extern PFNGLUNMAPBUFFERARBPROC		glUnmapBufferARB;  extern PFNGLGETBUFFERPARAMETERIVARBPROC	glGetBufferParameterivARB;  extern PFNGLGETBUFFERPOINTERVARBPROC	glGetBufferPointervARB; +// GL_ARB_sync +extern PFNGLFENCESYNCPROC				glFenceSync; +extern PFNGLISSYNCPROC					glIsSync; +extern PFNGLDELETESYNCPROC				glDeleteSync; +extern PFNGLCLIENTWAITSYNCPROC			glClientWaitSync; +extern PFNGLWAITSYNCPROC				glWaitSync; +extern PFNGLGETINTEGER64VPROC			glGetInteger64v; +extern PFNGLGETSYNCIVPROC				glGetSynciv; + +// GL_APPLE_flush_buffer_range +extern PFNGLBUFFERPARAMETERIAPPLEPROC	glBufferParameteriAPPLE; +extern PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE; +  // GL_ARB_map_buffer_range  extern PFNGLMAPBUFFERRANGEPROC			glMapBufferRange;  extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC	glFlushMappedBufferRange; @@ -519,6 +545,19 @@ extern PFNGLUNMAPBUFFERARBPROC		glUnmapBufferARB;  extern PFNGLGETBUFFERPARAMETERIVARBPROC	glGetBufferParameterivARB;  extern PFNGLGETBUFFERPOINTERVARBPROC	glGetBufferPointervARB; +// GL_ARB_sync +extern PFNGLFENCESYNCPROC				glFenceSync; +extern PFNGLISSYNCPROC					glIsSync; +extern PFNGLDELETESYNCPROC				glDeleteSync; +extern PFNGLCLIENTWAITSYNCPROC			glClientWaitSync; +extern PFNGLWAITSYNCPROC				glWaitSync; +extern PFNGLGETINTEGER64VPROC			glGetInteger64v; +extern PFNGLGETSYNCIVPROC				glGetSynciv; + +// GL_APPLE_flush_buffer_range +extern PFNGLBUFFERPARAMETERIAPPLEPROC	glBufferParameteriAPPLE; +extern PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE; +  // GL_ARB_map_buffer_range  extern PFNGLMAPBUFFERRANGEPROC			glMapBufferRange;  extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC	glFlushMappedBufferRange; diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index db9c8f83f8..2a297bcc45 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -65,6 +65,50 @@ S32	LLVertexBuffer::sWeight4Loc = -1;  std::vector<U32> LLVertexBuffer::sDeleteList; +const U32 FENCE_WAIT_TIME_NANOSECONDS = 10000;  //1 ms + +class LLGLSyncFence : public LLGLFence +{ +public: +	GLsync mSync; +	 +	LLGLSyncFence() +	{ +		mSync = 0; +	} + +	~LLGLSyncFence() +	{ +		if (mSync) +		{ +			glDeleteSync(mSync); +		} +	} + +	void placeFence() +	{ +		if (mSync) +		{ +			glDeleteSync(mSync); +		} +		mSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); +	} + +	void wait() +	{ +		if (mSync) +		{ +			while (glClientWaitSync(mSync, 0, FENCE_WAIT_TIME_NANOSECONDS) == GL_TIMEOUT_EXPIRED) +			{ //track the number of times we've waited here +				static S32 waits = 0; +				waits++; +			} +		} +	} + + +}; +  S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =  {  	sizeof(LLVector4), // TYPE_VERTEX, @@ -309,6 +353,7 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi  	glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT,   		idx);  	stop_glerror(); +	placeFence();  }  void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const @@ -340,6 +385,7 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const  	glDrawElements(sGLMode[mode], count, GL_UNSIGNED_SHORT,  		((U16*) getIndicesPointer()) + indices_offset);  	stop_glerror(); +	placeFence();  }  void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const @@ -365,6 +411,7 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const  	stop_glerror();  	glDrawArrays(sGLMode[mode], first, count);  	stop_glerror(); +	placeFence();  }  //static @@ -444,9 +491,11 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :  	mFilthy(FALSE),  	mEmpty(TRUE),  	mResized(FALSE), -	mDynamicSize(FALSE) +	mDynamicSize(FALSE), +	mFence(NULL)  {  	LLMemType mt2(LLMemType::MTYPE_VERTEX_CONSTRUCTOR); +	mFence = NULL;  	if (!sEnableVBOs)  	{  		mUsage = 0 ;  @@ -527,9 +576,40 @@ LLVertexBuffer::~LLVertexBuffer()  	destroyGLIndices();  	sCount--; +	if (mFence) +	{ +		delete mFence; +	} +	 +	mFence = NULL; +  	llassert_always(!mMappedData && !mMappedIndexData) ;  }; +void LLVertexBuffer::placeFence() const +{ +	/*if (!mFence && useVBOs()) +	{ +		if (gGLManager.mHasSync) +		{ +			mFence = new LLGLSyncFence(); +		} +	} + +	if (mFence) +	{ +		mFence->placeFence(); +	}*/ +} + +void LLVertexBuffer::waitFence() const +{ +	/*if (mFence) +	{ +		mFence->wait(); +	}*/ +} +  //----------------------------------------------------------------------------  void LLVertexBuffer::genBuffer() @@ -967,7 +1047,6 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  	if (useVBOs())  	{ -  		if (sDisableVBOMapping || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)  		{  			if (count == -1) @@ -1019,6 +1098,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  			else  			{  				U8* src = NULL; +				waitFence();  				if (gGLManager.mHasMapBufferRange)  				{  					if (map_range) @@ -1026,13 +1106,20 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  #ifdef GL_ARB_map_buffer_range  						S32 offset = mOffsets[type] + sTypeSize[type]*index;  						S32 length = (sTypeSize[type]*count+0xF) & ~0xF; -						src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, offset, length, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_INVALIDATE_RANGE_BIT); +						src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, offset, length,  +							GL_MAP_WRITE_BIT |  +							GL_MAP_FLUSH_EXPLICIT_BIT |  +							GL_MAP_INVALIDATE_RANGE_BIT |  +							GL_MAP_UNSYNCHRONIZED_BIT);  #endif  					}  					else  					{  #ifdef GL_ARB_map_buffer_range -						src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, mSize, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT); +						src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, mSize,  +							GL_MAP_WRITE_BIT |  +							GL_MAP_FLUSH_EXPLICIT_BIT | +							GL_MAP_UNSYNCHRONIZED_BIT);  #endif  					}  				} @@ -1178,6 +1265,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  			else  			{  				U8* src = NULL; +				waitFence();  				if (gGLManager.mHasMapBufferRange)  				{  					if (map_range) @@ -1185,13 +1273,20 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  #ifdef GL_ARB_map_buffer_range  						S32 offset = sizeof(U16)*index;  						S32 length = sizeof(U16)*count; -						src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_INVALIDATE_RANGE_BIT); +						src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length,  +							GL_MAP_WRITE_BIT |  +							GL_MAP_FLUSH_EXPLICIT_BIT |  +							GL_MAP_INVALIDATE_RANGE_BIT | +							GL_MAP_UNSYNCHRONIZED_BIT);  #endif  					}  					else  					{  #ifdef GL_ARB_map_buffer_range -						src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, sizeof(U16)*mNumIndices, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT); +						src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, sizeof(U16)*mNumIndices,  +							GL_MAP_WRITE_BIT |  +							GL_MAP_FLUSH_EXPLICIT_BIT | +							GL_MAP_UNSYNCHRONIZED_BIT);  #endif  					}  				} @@ -1378,7 +1473,9 @@ void LLVertexBuffer::unmapBuffer(S32 type)  						}  						else if (gGLManager.mHasFlushBufferRange)  						{ +#ifdef GL_APPLE_flush_buffer_range  							glFlushMappedBufferRangeAPPLE(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length); +#endif  						}  						stop_glerror();  					} diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index aa5df305a6..cc5d11e1c2 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -70,6 +70,12 @@ protected:  	}  }; +class LLGLFence +{ +public: +	virtual void placeFence() = 0; +	virtual void wait() = 0; +};  //============================================================================  // base class  @@ -270,6 +276,12 @@ protected:  	std::vector<MappedRegion> mMappedVertexRegions;  	std::vector<MappedRegion> mMappedIndexRegions; +	mutable LLGLFence* mFence; + +	void placeFence() const; +	void waitFence() const; + +  public:  	static S32 sCount;  	static S32 sGLCount; | 
