From ad4b559f9fb7c39a090898207c46d4c77d3560bf Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Fri, 24 Jun 2011 15:30:48 -0500
Subject: [PATCH] SH-1903 Fix for silly shader compiler error.

---
 indra/llrender/llshadermgr.cpp      | 29 +++++++++++++++++++++--------
 indra/newview/llviewershadermgr.cpp |  5 +++++
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 3910cd779c7..b4e7aaa9b45 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -542,6 +542,8 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 			}
 
 			text[count++] = strdup("\t}\n");
+			text[count++] = strdup("\treturn vec4(0,0,0,0);\n");
+			text[count++] = strdup("}\n");
 		}
 		else
 		{
@@ -562,10 +564,10 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 				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(0,0,0,0);\n");
-		text[count++] = strdup("}\n");
+			text[count++] = strdup("\treturn vec4(0,0,0,0);\n");
+			text[count++] = strdup("}\n");
+		}			
 	}
 
 	//copy file into memory
@@ -610,11 +612,6 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 		}
 	}
 		
-	//free memory
-	for (GLuint i = 0; i < count; i++)
-	{
-		free(text[i]);
-	}
 	if (error == GL_NO_ERROR)
 	{
 		//check for errors
@@ -628,6 +625,16 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 				//an error occured, print log
 				LL_WARNS("ShaderLoading") << "GLSL Compilation Error: (" << error << ") in " << filename << LL_ENDL;
 				dumpObjectLog(ret);
+
+				std::stringstream ostr;
+				//dump shader source for debugging
+				for (GLuint i = 0; i < count; i++)
+				{
+					ostr << i << ": " << text[i];
+				}
+
+				LL_WARNS("ShaderLoading") << "\n" << ostr.str() << llendl;
+
 				ret = 0;
 			}
 		}
@@ -638,6 +645,12 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 	}
 	stop_glerror();
 
+	//free memory
+	for (GLuint i = 0; i < count; i++)
+	{
+		free(text[i]);
+	}
+
 	//successfully loaded, save results
 	if (ret)
 	{
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 0e3a0ef507d..592923ee074 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -722,6 +722,11 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
 	shaders.reserve(13);
 	S32 ch = gGLManager.mNumTextureImageUnits-1;
 
+	if (gGLManager.mGLVersion < 3.1f)
+	{ //force to 1 texture index channel for old drivers
+		ch = 1;
+	}
+
 	std::vector<S32> index_channels;
 	index_channels.push_back(-1);	 shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl",		mVertexShaderLevel[SHADER_WINDLIGHT] ) );
 	index_channels.push_back(-1);	 shaders.push_back( make_pair( "windlight/gammaF.glsl",					mVertexShaderLevel[SHADER_WINDLIGHT]) );
-- 
GitLab