diff options
Diffstat (limited to 'indra/llrender/llshadermgr.cpp')
| -rw-r--r-- | indra/llrender/llshadermgr.cpp | 120 | 
1 files changed, 64 insertions, 56 deletions
| diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 908443e8cf..7d384450e6 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -575,34 +575,46 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade  	GLcharARB* text[4096];  	GLuint count = 0; -	F32 version = gGLManager.mGLVersion; - -//hack to never use GLSL > 1.20 on OSX -#if LL_DARWIN -	version = llmin(version, 2.9f); -#endif - -	if (version < 2.1f) -	{ -		text[count++] = strdup("#version 110\n"); -		text[count++] = strdup("#define ATTRIBUTE attribute\n"); -		text[count++] = strdup("#define VARYING varying\n"); -	} -	else if (version < 3.3f) +	S32 major_version = gGLManager.mGLSLVersionMajor; +	S32 minor_version = gGLManager.mGLSLVersionMinor; +	 +	if (major_version == 1 && minor_version < 30)  	{ -		//set version to 1.20 -		text[count++] = strdup("#version 120\n"); -		text[count++] = strdup("#define FXAA_GLSL_120 1\n"); -		text[count++] = strdup("#define FXAA_FAST_PIXEL_OFFSET 0\n"); -		text[count++] = strdup("#define ATTRIBUTE attribute\n"); -		text[count++] = strdup("#define VARYING varying\n"); +		if (minor_version < 10) +		{ +			//should NEVER get here -- if major version is 1 and minor version is less than 10,  +			// viewer should never attempt to use shaders, continuing will result in undefined behavior +			llerrs << "Unsupported GLSL Version." << llendl; +		} + +		if (minor_version <= 19) +		{ +			text[count++] = strdup("#version 110\n"); +			text[count++] = strdup("#define ATTRIBUTE attribute\n"); +			text[count++] = strdup("#define VARYING varying\n"); +			text[count++] = strdup("#define VARYING_FLAT varying\n"); +		} +		else if (minor_version <= 29) +		{ +			//set version to 1.20 +			text[count++] = strdup("#version 120\n"); +			text[count++] = strdup("#define FXAA_GLSL_120 1\n"); +			text[count++] = strdup("#define FXAA_FAST_PIXEL_OFFSET 0\n"); +			text[count++] = strdup("#define ATTRIBUTE attribute\n"); +			text[count++] = strdup("#define VARYING varying\n"); +			text[count++] = strdup("#define VARYING_FLAT varying\n"); +		}  	}  	else  	{   -		if (version < 4.f) +		if (major_version < 4)  		{  			//set version to 1.30  			text[count++] = strdup("#version 130\n"); + +			//some implementations of GLSL 1.30 require integer precision be explicitly declared +			text[count++] = strdup("precision mediump int;\n"); +			text[count++] = strdup("precision highp float;\n");  		}  		else  		{ //set version to 400 @@ -618,16 +630,25 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade  		{ //"varying" state is "out" in a vertex program, "in" in a fragment program   			// ("varying" is deprecated after version 1.20)  			text[count++] = strdup("#define VARYING out\n"); +			text[count++] = strdup("#define VARYING_FLAT flat out\n");  		}  		else  		{  			text[count++] = strdup("#define VARYING in\n"); +			text[count++] = strdup("#define VARYING_FLAT flat in\n");  		}  		//backwards compatibility with legacy texture lookup syntax +		text[count++] = strdup("#define texture2D texture\n");  		text[count++] = strdup("#define textureCube texture\n");  		text[count++] = strdup("#define texture2DLod textureLod\n");  		text[count++] = strdup("#define	shadow2D(a,b) vec2(texture(a,b))\n"); + +		if (major_version > 1 || minor_version >= 40) +		{ //GLSL 1.40 replaces texture2DRect et al with texture +			text[count++] = strdup("#define texture2DRect texture\n"); +			text[count++] = strdup("#define shadow2DRect(a,b) vec2(texture(a,b))\n"); +		}  	}  	//copy preprocessor definitions into buffer @@ -651,22 +672,24 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade  		.  		uniform sampler2D texN; -		VARYING float vary_texture_index; +		VARYING_FLAT ivec4 vary_texture_index; + +		vec4 ret = vec4(1,0,1,1);  		vec4 diffuseLookup(vec2 texcoord)  		{ -			switch (int(vary_texture_index+0.25)) +			switch (vary_texture_index.r))  			{ -				case 0: return texture2D(tex0, texcoord); -				case 1: return texture2D(tex1, texcoord); -				case 2: return texture2D(tex2, texcoord); +				case 0: ret = texture2D(tex0, texcoord); break; +				case 1: ret = texture2D(tex1, texcoord); break; +				case 2: ret = texture2D(tex2, texcoord); break;  				.  				.  				. -				case N: return texture2D(texN, texcoord); +				case N: return texture2D(texN, texcoord); break;  			} -			return vec4(0,0,0,0); +			return ret;  		}  		*/ @@ -679,7 +702,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade  		if (texture_index_channels > 1)  		{ -			text[count++] = strdup("VARYING float vary_texture_index;\n"); +			text[count++] = strdup("VARYING_FLAT ivec4 vary_texture_index;\n");  		}  		text[count++] = strdup("vec4 diffuseLookup(vec2 texcoord)\n"); @@ -691,45 +714,28 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade  			text[count++] = strdup("return texture2D(tex0, texcoord);\n");  			text[count++] = strdup("}\n");  		} -		else if (gGLManager.mGLVersion >= 3.f) -		{  -			text[count++] = strdup("\tswitch (int(vary_texture_index+0.25))\n"); +		else if (major_version > 1 || minor_version >= 30) +		{  //switches are supported in GLSL 1.30 and later +			text[count++] = strdup("\tvec4 ret = vec4(1,0,1,1);\n"); +			text[count++] = strdup("\tswitch (vary_texture_index.r)\n");  			text[count++] = strdup("\t{\n");  			//switch body  			for (S32 i = 0; i < texture_index_channels; ++i)  			{ -				std::string case_str = llformat("\t\tcase %d: return texture2D(tex%d, texcoord);\n", i, i); +				std::string case_str = llformat("\t\tcase %d: ret = texture2D(tex%d, texcoord); break;\n", i, i);  				text[count++] = strdup(case_str.c_str());  			}  			text[count++] = strdup("\t}\n"); -			text[count++] = strdup("\treturn vec4(1,0,1,1);\n"); +			text[count++] = strdup("\treturn ret;\n");  			text[count++] = strdup("}\n");  		}  		else -		{ -			//switches aren't supported, make block that looks like: -			/* -				int ti = int(vary_texture_index+0.25); -				if (ti == 0) return texture2D(tex0, texcoord); -				if (ti == 1) return texture2D(tex1, texcoord); -				. -				. -				. -				if (ti == N) return texture2D(texN, texcoord); -			*/ -				 -			text[count++] = strdup("int ti = int(vary_texture_index+0.25);\n"); -			for (S32 i = 0; i < texture_index_channels; ++i) -			{ -				std::string if_str = llformat("if (ti == %d) return texture2D(tex%d, texcoord);\n", i, i); -				text[count++] = strdup(if_str.c_str()); -			} - -			text[count++] = strdup("\treturn vec4(1,0,1,1);\n"); -			text[count++] = strdup("}\n"); -		}			 +		{ //should never get here.  Indexed texture rendering requires GLSL 1.30 or later  +			// (for passing integers between vertex and fragment shaders) +			llerrs << "Indexed texture rendering requires GLSL 1.30 or later." << llendl; +		}  	}  	//copy file into memory @@ -1070,6 +1076,8 @@ void LLShaderMgr::initAttribsAndUniforms()  	mReservedUniforms.push_back("magnification");  	mReservedUniforms.push_back("max_cof");  	mReservedUniforms.push_back("res_scale"); +	mReservedUniforms.push_back("dof_width"); +	mReservedUniforms.push_back("dof_height");  	mReservedUniforms.push_back("depthMap");  	mReservedUniforms.push_back("shadowMap0"); | 
