diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 191c9862f08254d6de740cae7209e3b684ec9e55..594edd43d567d995bd428e19686fcc6d058989e1 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -280,6 +280,7 @@ void LLGLSLShader::unload()
 	mTexture.clear();
 	mUniform.clear();
 	mShaderFiles.clear();
+	mDefines.clear();
 
 	if (mProgramObject)
 	{
diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
index 7752189e1da258ca85d3314235bcf139d5c1203f..09a2d4467a47387b49e664d9bceefb4b54130d99 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
@@ -622,6 +622,13 @@ void main()
 
 #else
 	frag_data[0] = final_color;
+
+#ifdef UGLY_MAC_HACK
+	// magic spec exp clamp fixes rendering artifacts on older mac GF drivers
+	//
+	final_specular = min(final_specular, vec4(1.0f, 1.0f, 1.0f, 0.125f));
+#endif
+
 	frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent.
 	frag_data[2] = final_normal; // XY = Normal.  Z = Env. intensity.
 #endif
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 218bbbe6dc0af0e74d47070081c11079ef1b5047..3afbc6adca57f86ebdcfe15e5c2074cc608089d9 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -1210,8 +1210,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredSkinnedAlphaProgram.mFeatures.isAlphaLighting = true;
 		gDeferredSkinnedAlphaProgram.mFeatures.disableTextureIndex = true;
 		gDeferredSkinnedAlphaProgram.mShaderFiles.clear();
-		gDeferredSkinnedAlphaProgram.mDefines.clear();
-
 		gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));
 		gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
 		gDeferredSkinnedAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
@@ -1262,6 +1260,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 			gDeferredMaterialProgram[i].addPermutation("HAS_SUN_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0");
 			bool has_skin = i & 0x10;
 			gDeferredMaterialProgram[i].addPermutation("HAS_SKIN",has_skin ? "1" : "0");
+
+		#if LL_DARWIN
+			// include spec exp clamp to fix older mac rendering artifacts
+			//
+			if (gGLManager.mIsMobileGF)
+			{
+				gDeferredMaterialProgram[i].addPermutation("UGLY_MAC_HACK","1");
+			}
+		#endif
+
 			if (has_skin)
 			{
 				gDeferredMaterialProgram[i].mFeatures.hasObjectSkinning = true;
@@ -1409,8 +1417,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		}
 			
 		gDeferredAlphaProgram.mShaderFiles.clear();
-		gDeferredAlphaProgram.mDefines.clear();
-
 		gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));
 		gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
 		gDeferredSkinnedAlphaProgram.addPermutation("USE_INDEXED_TEX", "1");