diff options
Diffstat (limited to 'indra/llrender')
| -rw-r--r-- | indra/llrender/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/llrender/llgl.h | 17 | ||||
| -rw-r--r-- | indra/llrender/llglcommonfunc.cpp | 37 | ||||
| -rw-r--r-- | indra/llrender/llglcommonfunc.h | 30 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.cpp | 62 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.h | 11 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 16 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.h | 4 | 
8 files changed, 146 insertions, 33 deletions
| diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt index 331f988382..07a0d8c402 100644 --- a/indra/llrender/CMakeLists.txt +++ b/indra/llrender/CMakeLists.txt @@ -51,6 +51,7 @@ set(llrender_SOURCE_FILES      lltexture.cpp      lluiimage.cpp      llvertexbuffer.cpp +    llglcommonfunc.cpp      )  set(llrender_HEADER_FILES @@ -78,6 +79,7 @@ set(llrender_HEADER_FILES      lltexture.h      lluiimage.h      llvertexbuffer.h +    llglcommonfunc.h      )  set_source_files_properties(${llrender_HEADER_FILES} diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index aa98b3f6bc..4c4302d05b 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -256,6 +256,9 @@ void clear_glerror();  	if the existing GL state does not match the expected GL state.  */ + +#include "boost/function.hpp" +  class LLGLState  {  public: @@ -297,6 +300,20 @@ public:  	LLGLEnableAlphaReject(bool enable);  }; +// Enable with functor +class LLGLEnableFunc : LLGLState +{ +public: +	LLGLEnableFunc(LLGLenum state, bool enable, boost::function<void()> func) +		: LLGLState(state, enable) +	{ +		if (enable) +		{ +			func(); +		} +	} +}; +  /// TODO: Being deprecated.  class LLGLEnable : public LLGLState  { diff --git a/indra/llrender/llglcommonfunc.cpp b/indra/llrender/llglcommonfunc.cpp new file mode 100644 index 0000000000..e9ec28927f --- /dev/null +++ b/indra/llrender/llglcommonfunc.cpp @@ -0,0 +1,37 @@ +/** +* @file llglcommonfunc.cpp +* @brief Implementation of the LLGLCommonFunc. +* +* $LicenseInfo:firstyear=2001&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2010, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#include "llglheaders.h" +#include "llglcommonfunc.h" + +namespace LLGLCommonFunc  +{ +	void selected_stencil_test() +	{ +		glStencilFunc(GL_ALWAYS, 2, 0xffff); +		glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); +	} +} diff --git a/indra/llrender/llglcommonfunc.h b/indra/llrender/llglcommonfunc.h new file mode 100644 index 0000000000..f1f8ff7bc4 --- /dev/null +++ b/indra/llrender/llglcommonfunc.h @@ -0,0 +1,30 @@ +/** +* @file llphoenixfunc.h +* @brief File include common opengl code snippets +* +* $LicenseInfo:firstyear=2003&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2010, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +namespace LLGLCommonFunc +{ +	void selected_stencil_test(); +} diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 970502f2d6..4702042ab9 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -537,7 +537,11 @@ BOOL LLGLSLShader::mapAttributes(const std::vector<LLStaticHashedString> * attri      mAttribute.clear();      U32 numAttributes = (attributes == NULL) ? 0 : attributes->size(); +#if LL_RELEASE_WITH_DEBUG_INFO +    mAttribute.resize(LLShaderMgr::instance()->mReservedAttribs.size() + numAttributes, { -1, NULL }); +#else      mAttribute.resize(LLShaderMgr::instance()->mReservedAttribs.size() + numAttributes, -1); +#endif      if (res)      { //read back channel locations @@ -551,7 +555,11 @@ BOOL LLGLSLShader::mapAttributes(const std::vector<LLStaticHashedString> * attri              S32 index = glGetAttribLocationARB(mProgramObject, (const GLcharARB *)name);              if (index != -1)              { +#if LL_RELEASE_WITH_DEBUG_INFO +                mAttribute[i] = { index, name }; +#else                  mAttribute[i] = index; +#endif                  mAttributeMask |= 1 << i;                  LL_DEBUGS("ShaderLoading") << "Attribute " << name << " assigned to channel " << index << LL_ENDL;              } @@ -744,24 +752,25 @@ BOOL LLGLSLShader::mapUniforms(const vector<LLStaticHashedString> * uniforms)  	, even if the "diffuseMap" will be appear and use first in shader code.  	As example where this situation appear see: "Deferred Material Shader 28/29/30/31" -	And tickets: MAINT-4165, MAINT-4839, MAINT-3568 +	And tickets: MAINT-4165, MAINT-4839, MAINT-3568, MAINT-6437  	*/  	S32 diffuseMap = glGetUniformLocationARB(mProgramObject, "diffuseMap"); +	S32 specularMap = glGetUniformLocationARB(mProgramObject, "specularMap");  	S32 bumpMap = glGetUniformLocationARB(mProgramObject, "bumpMap");  	S32 environmentMap = glGetUniformLocationARB(mProgramObject, "environmentMap");  	std::set<S32> skip_index; -	if (-1 != diffuseMap && (-1 != bumpMap || -1 != environmentMap)) +	if (-1 != diffuseMap && (-1 != specularMap || -1 != bumpMap || -1 != environmentMap))  	{  		GLenum type;  		GLsizei length;  		GLint size = -1;  		char name[1024]; -		diffuseMap = bumpMap = environmentMap = -1; +		diffuseMap = specularMap = bumpMap = environmentMap = -1;  		for (S32 i = 0; i < activeCount; i++)  		{ @@ -775,6 +784,18 @@ BOOL LLGLSLShader::mapUniforms(const vector<LLStaticHashedString> * uniforms)  				continue;  			} +			if (-1 == specularMap && std::string(name) == "specularMap") +			{ +				specularMap = i; +				continue; +			} + +			if (-1 == specularMap && std::string(name) == "specularMap") +			{ +				specularMap = i; +				continue; +			} +  			if (-1 == bumpMap && std::string(name) == "bumpMap")  			{  				bumpMap = i; @@ -788,34 +809,29 @@ BOOL LLGLSLShader::mapUniforms(const vector<LLStaticHashedString> * uniforms)  			}  		} +		bool specularDiff = specularMap < diffuseMap && -1 != specularMap;  		bool bumpLessDiff = bumpMap < diffuseMap && -1 != bumpMap;  		bool envLessDiff = environmentMap < diffuseMap && -1 != environmentMap; -		if (bumpLessDiff && envLessDiff) +		if (specularDiff || bumpLessDiff || envLessDiff)  		{  			mapUniform(diffuseMap, uniforms); -			mapUniform(bumpMap, uniforms); -			mapUniform(environmentMap, uniforms); -  			skip_index.insert(diffuseMap); -			skip_index.insert(bumpMap); -			skip_index.insert(environmentMap); -		} -		else if (bumpLessDiff) -		{ -			mapUniform(diffuseMap, uniforms); -			mapUniform(bumpMap, uniforms); -			skip_index.insert(diffuseMap); -			skip_index.insert(bumpMap); -		} -		else if (envLessDiff) -		{ -			mapUniform(diffuseMap, uniforms); -			mapUniform(environmentMap, uniforms); +			if (-1 != specularMap) { +				mapUniform(specularMap, uniforms); +				skip_index.insert(specularMap); +			} -			skip_index.insert(diffuseMap); -			skip_index.insert(environmentMap); +			if (-1 != bumpMap) { +				mapUniform(bumpMap, uniforms); +				skip_index.insert(bumpMap); +			} + +			if (-1 != environmentMap) { +				mapUniform(environmentMap, uniforms); +				skip_index.insert(environmentMap); +			}  		}  	} diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 6f10d122cb..b56b914013 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -167,7 +167,18 @@ public:  	U32 mLightHash;  	GLhandleARB mProgramObject; +#if LL_RELEASE_WITH_DEBUG_INFO +	struct attr_name +	{ +		GLint loc; +		const char *name; +		void operator = (GLint _loc) { loc = _loc; } +		operator GLint () { return loc; } +	}; +	std::vector<attr_name> mAttribute; //lookup table of attribute enum to attribute channel +#else  	std::vector<GLint> mAttribute; //lookup table of attribute enum to attribute channel +#endif  	U32 mAttributeMask;  //mask of which reserved attributes are set (lines up with LLVertexBuffer::getTypeMask())  	std::vector<GLint> mUniform;   //lookup table of uniform enum to uniform location  	LLStaticStringTable<GLint> mUniformMap; //lookup map of uniform name to uniform location diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index f10301b42d..0c9bd8298b 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -324,7 +324,7 @@ void LLVBOPool::cleanup()  //NOTE: each component must be AT LEAST 4 bytes in size to avoid a performance penalty on AMD hardware -S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] = +const S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =  {  	sizeof(LLVector4), // TYPE_VERTEX,  	sizeof(LLVector4), // TYPE_NORMAL, @@ -341,7 +341,7 @@ S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =  	sizeof(LLVector4), // TYPE_TEXTURE_INDEX (actually exists as position.w), no extra data, but stride is 16 bytes  }; -static std::string vb_type_name[] = +static const std::string vb_type_name[] =  {  	"TYPE_VERTEX",  	"TYPE_NORMAL", @@ -360,7 +360,7 @@ static std::string vb_type_name[] =  	"TYPE_INDEX",	  }; -U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] =  +const U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] =  {  	GL_TRIANGLES,  	GL_TRIANGLE_STRIP, @@ -509,7 +509,7 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)  				}  			} -			U32 map_tc[] =  +			static const U32 map_tc[] =   			{  				MAP_TEXCOORD1,  				MAP_TEXCOORD2, @@ -1390,7 +1390,7 @@ void LLVertexBuffer::setupVertexArray()  #endif  	sGLRenderArray = mGLArray; -	U32 attrib_size[] =  +	static const U32 attrib_size[] =   	{  		3, //TYPE_VERTEX,  		3, //TYPE_NORMAL, @@ -1407,7 +1407,7 @@ void LLVertexBuffer::setupVertexArray()  		1, //TYPE_TEXTURE_INDEX  	}; -	U32 attrib_type[] = +	static const U32 attrib_type[] =  	{  		GL_FLOAT, //TYPE_VERTEX,  		GL_FLOAT, //TYPE_NORMAL, @@ -1424,7 +1424,7 @@ void LLVertexBuffer::setupVertexArray()  		GL_UNSIGNED_INT, //TYPE_TEXTURE_INDEX  	}; -	bool attrib_integer[] =  +	static const bool attrib_integer[] =  	{  		false, //TYPE_VERTEX,  		false, //TYPE_NORMAL, @@ -1441,7 +1441,7 @@ void LLVertexBuffer::setupVertexArray()  		true, //TYPE_TEXTURE_INDEX  	}; -	U32 attrib_normalized[] = +	static const U32 attrib_normalized[] =  	{  		GL_FALSE, //TYPE_VERTEX,  		GL_FALSE, //TYPE_NORMAL, diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index bd27296eb6..c89d7e3958 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -341,8 +341,8 @@ public:  	static bool sDisableVBOMapping; //disable glMapBufferARB  	static bool sEnableVBOs; -	static S32 sTypeSize[TYPE_MAX]; -	static U32 sGLMode[LLRender::NUM_MODES]; +	static const S32 sTypeSize[TYPE_MAX]; +	static const U32 sGLMode[LLRender::NUM_MODES];  	static U32 sGLRenderBuffer;  	static U32 sGLRenderArray;  	static U32 sGLRenderIndices; | 
