diff options
Diffstat (limited to 'indra/llrender')
| -rw-r--r-- | indra/llrender/llgl.cpp | 28 | ||||
| -rw-r--r-- | indra/llrender/llgl.h | 1 | ||||
| -rw-r--r-- | indra/llrender/llglheaders.h | 22 | ||||
| -rw-r--r-- | indra/llrender/llrender.cpp | 41 | ||||
| -rw-r--r-- | indra/llrender/llrender.h | 10 | 
5 files changed, 93 insertions, 9 deletions
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index a3f7a946ec..4c256f4b06 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -185,6 +185,9 @@ PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT =  // GL_EXT_framebuffer_blit  PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT = NULL; +// GL_EXT_blend_func_separate +PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT = NULL; +  // GL_ARB_draw_buffers  PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB = NULL; @@ -324,6 +327,7 @@ LLGLManager::LLGLManager() :  	mHasCompressedTextures(FALSE),  	mHasFramebufferObject(FALSE),  	mHasFramebufferMultisample(FALSE), +	mHasBlendFuncSeparate(FALSE),  	mHasVertexBufferObject(FALSE),  	mHasPBuffer(FALSE), @@ -633,6 +637,12 @@ void LLGLManager::initExtensions()  #else  	mHasDrawBuffers = FALSE;  # endif +# if GL_EXT_blend_func_separate +	mHasBlendFuncSeparate = TRUE; +#else +#error XXXXXX +	mHasBlendFuncSeparate = FALSE; +# endif  	mHasMipMapGeneration = FALSE;  	mHasSeparateSpecularColor = FALSE;  	mHasAnisotropic = FALSE; @@ -659,6 +669,7 @@ void LLGLManager::initExtensions()  		&& ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts);  	mHasFramebufferMultisample = mHasFramebufferObject && ExtensionExists("GL_EXT_framebuffer_multisample", gGLHExts.mSysExts);  	mHasDrawBuffers = ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts); +	mHasBlendFuncSeparate = ExtensionExists("GL_EXT_blend_func_separate", gGLHExts.mSysExts);  	mHasTextureRectangle = ExtensionExists("GL_ARB_texture_rectangle", gGLHExts.mSysExts);  #if !LL_DARWIN  	mHasPointParameters = !mIsATI && ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts); @@ -682,6 +693,7 @@ void LLGLManager::initExtensions()  		mHasFramebufferObject = FALSE;  		mHasFramebufferMultisample = FALSE;  		mHasDrawBuffers = FALSE; +		mHasBlendFuncSeparate = FALSE;  		mHasMipMapGeneration = FALSE;  		mHasSeparateSpecularColor = FALSE;  		mHasAnisotropic = FALSE; @@ -706,6 +718,7 @@ void LLGLManager::initExtensions()  		mHasShaderObjects = FALSE;  		mHasVertexShader = FALSE;  		mHasFragmentShader = FALSE; +		mHasBlendFuncSeparate = FALSE;  		LL_WARNS("RenderInit") << "GL extension support forced to SIMPLE level via LL_GL_BASICEXT" << LL_ENDL;  	}  	if (getenv("LL_GL_BLACKLIST"))	/* Flawfinder: ignore */ @@ -734,7 +747,8 @@ void LLGLManager::initExtensions()  		if (strchr(blacklist,'r')) mHasDrawBuffers = FALSE;//S  		if (strchr(blacklist,'s')) mHasFramebufferMultisample = FALSE;  		if (strchr(blacklist,'t')) mHasTextureRectangle = FALSE; - +		if (strchr(blacklist,'u')) mHasBlendFuncSeparate = FALSE;//S +		  	}  #endif // LL_LINUX || LL_SOLARIS @@ -782,6 +796,14 @@ void LLGLManager::initExtensions()  	{  		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_fragment_shader" << LL_ENDL;  	} +	if (!mHasBlendFuncSeparate) +	{ +		LL_INFOS("RenderInit") << "Couldn't initialize GL_EXT_blend_func_separate" << LL_ENDL; +	} +	if (!mHasDrawBuffers) +	{ +		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_draw_buffers" << LL_ENDL; +	}  	// Disable certain things due to known bugs  	if (mIsIntel && mHasMipMapGeneration) @@ -852,6 +874,10 @@ void LLGLManager::initExtensions()  	{  		glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDrawBuffersARB");  	} +	if (mHasBlendFuncSeparate) +	{ +		glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBlendFuncSeparateEXT"); +	}  #if (!LL_LINUX && !LL_SOLARIS) || LL_LINUX_NV_GL_HEADERS  	// This is expected to be a static symbol on Linux GL implementations, except if we use the nvidia headers - bah  	glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements"); diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 91421f3c95..0c2da7dd08 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -87,6 +87,7 @@ public:  	BOOL mHasCompressedTextures;  	BOOL mHasFramebufferObject;  	BOOL mHasFramebufferMultisample; +	BOOL mHasBlendFuncSeparate;  	// ARB Extensions  	BOOL mHasVertexBufferObject; diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index f33ae7d8f0..f6d35bc766 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -216,6 +216,9 @@ extern PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glGetCompressedTexImageARB;  extern PFNGLCOLORTABLEEXTPROC glColorTableEXT; +//GL_EXT_blend_func_separate +extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT; +  //GL_EXT_framebuffer_object  extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT;  extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT; @@ -249,7 +252,10 @@ extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;  # include "GL/glh_extensions.h"  # undef __APPLE__ -#elif LL_LINUX  +#elif LL_LINUX +//---------------------------------------------------------------------------- +// LL_LINUX +  //----------------------------------------------------------------------------  // Linux, MESA headers, but not necessarily assuming MESA runtime.  // quotes so we get libraries/.../GL/ version @@ -285,6 +291,7 @@ extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;  # define LL_LINUX_NV_GL_HEADERS 0  #endif // LL_LINUX && defined(WINGDIAPI) +  #if LL_LINUX_NV_GL_HEADERS  // Missing functions when using nvidia headers:  extern PFNGLACTIVETEXTUREARBPROC	glActiveTextureARB; @@ -445,6 +452,9 @@ extern PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB;  extern PFNGLCOMPRESSEDTEXIMAGE2DARBPROC glCompressedTexImage2DARB;  extern PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glGetCompressedTexImageARB; +//GL_EXT_blend_func_separate +extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT; +  //GL_EXT_framebuffer_object  extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT;  extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT; @@ -473,7 +483,10 @@ extern PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT;  //GL_ARB_draw_buffers  extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB; +  #elif LL_WINDOWS +//---------------------------------------------------------------------------- +// LL_WINDOWS  // windows gl headers depend on things like APIENTRY, so include windows.  #define WIN32_LEAN_AND_MEAN @@ -641,6 +654,9 @@ extern PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB;  extern PFNGLGETACTIVEATTRIBARBPROC glGetActiveAttribARB;  extern PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB; +//GL_EXT_blend_func_separate +extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT; +  //GL_EXT_framebuffer_object  extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT;  extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT; @@ -669,6 +685,7 @@ extern PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT;  //GL_ARB_draw_buffers  extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB; +  #elif LL_DARWIN  //----------------------------------------------------------------------------  // LL_DARWIN @@ -685,6 +702,9 @@ extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB;  // Note that they also must not be called on 10.3.9.  This should be taken care of by a runtime check for the existence of the GL extension.  #include <AvailabilityMacros.h> +//GL_EXT_blend_func_separate +extern void glBlendFuncSeparateEXT(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +  // GL_EXT_framebuffer_object  extern GLboolean glIsRenderbufferEXT(GLuint renderbuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;  extern void glBindRenderbufferEXT(GLenum target, GLuint renderbuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index c3540a717c..5597b23c69 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -778,8 +778,10 @@ LLRender::LLRender()  	mCurrAlphaFunc = CF_DEFAULT;  	mCurrAlphaFuncVal = 0.01f; -	mCurrBlendSFactor = BF_UNDEF; -	mCurrBlendDFactor = BF_UNDEF; +	mCurrBlendColorSFactor = BF_UNDEF; +	mCurrBlendAlphaSFactor = BF_UNDEF; +	mCurrBlendColorDFactor = BF_UNDEF; +	mCurrBlendAlphaDFactor = BF_UNDEF;  }  LLRender::~LLRender() @@ -995,15 +997,44 @@ void LLRender::blendFunc(eBlendFactor sfactor, eBlendFactor dfactor)  {  	llassert(sfactor < BF_UNDEF);  	llassert(dfactor < BF_UNDEF); -	if (mCurrBlendSFactor != sfactor || mCurrBlendDFactor != dfactor) +	if (mCurrBlendColorSFactor != sfactor || mCurrBlendColorDFactor != dfactor || +	    mCurrBlendAlphaSFactor != sfactor || mCurrBlendAlphaDFactor != dfactor)  	{ -		mCurrBlendSFactor = sfactor; -		mCurrBlendDFactor = dfactor; +		mCurrBlendColorSFactor = sfactor; +		mCurrBlendAlphaSFactor = sfactor; +		mCurrBlendColorDFactor = dfactor; +		mCurrBlendAlphaDFactor = dfactor;  		flush();  		glBlendFunc(sGLBlendFactor[sfactor], sGLBlendFactor[dfactor]);  	}  } +void LLRender::blendFunc(eBlendFactor color_sfactor, eBlendFactor color_dfactor, +			 eBlendFactor alpha_sfactor, eBlendFactor alpha_dfactor) +{ +	llassert(color_sfactor < BF_UNDEF); +	llassert(color_dfactor < BF_UNDEF); +	llassert(alpha_sfactor < BF_UNDEF); +	llassert(alpha_dfactor < BF_UNDEF); +	if (!gGLManager.mHasBlendFuncSeparate) +	{ +		LL_WARNS_ONCE("render") << "no glBlendFuncSeparateEXT(), using color-only blend func" << llendl; +		blendFunc(color_sfactor, color_dfactor); +		return; +	} +	if (mCurrBlendColorSFactor != color_sfactor || mCurrBlendColorDFactor != color_dfactor || +	    mCurrBlendAlphaSFactor != alpha_sfactor || mCurrBlendAlphaDFactor != alpha_dfactor) +	{ +		mCurrBlendColorSFactor = color_sfactor; +		mCurrBlendAlphaSFactor = alpha_sfactor; +		mCurrBlendColorDFactor = color_dfactor; +		mCurrBlendAlphaDFactor = alpha_dfactor; +		flush(); +		glBlendFuncSeparateEXT(sGLBlendFactor[color_sfactor], sGLBlendFactor[color_dfactor], +				       sGLBlendFactor[alpha_sfactor], sGLBlendFactor[alpha_dfactor]); +	} +} +  LLTexUnit* LLRender::getTexUnit(U32 index)  {  	if (index < mTexUnits.size()) diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index a90fbd4a5c..f6c87aa1db 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -323,7 +323,11 @@ public:  	void setAlphaRejectSettings(eCompareFunc func, F32 value = 0.01f); +	// applies blend func to both color and alpha  	void blendFunc(eBlendFactor sfactor, eBlendFactor dfactor); +	// applies separate blend functions to color and alpha +	void blendFunc(eBlendFactor color_sfactor, eBlendFactor color_dfactor, +		       eBlendFactor alpha_sfactor, eBlendFactor alpha_dfactor);  	LLTexUnit* getTexUnit(U32 index); @@ -362,8 +366,10 @@ private:  	std::vector<LLTexUnit*>		mTexUnits;  	LLTexUnit*			mDummyTexUnit; -	eBlendFactor mCurrBlendSFactor; -	eBlendFactor mCurrBlendDFactor; +	eBlendFactor mCurrBlendColorSFactor; +	eBlendFactor mCurrBlendColorDFactor; +	eBlendFactor mCurrBlendAlphaSFactor; +	eBlendFactor mCurrBlendAlphaDFactor;  	F32				mMaxAnisotropy;  | 
