From abdbf45aaa05f201afd9e2f6c6be87150be2c890 Mon Sep 17 00:00:00 2001
From: simon <none@none>
Date: Mon, 20 May 2013 11:18:12 -0700
Subject: [PATCH] MAINT-2616 : Updated my Intel driver and now have orange in
 buttons and Inventory pull down bar causing blinks to screen.  Pulled in FS
 code, Reviewed by Kelly

---
 indra/llrender/llglslshader.cpp               |  1 +
 indra/llrender/llglslshader.h                 |  3 ++
 indra/llrender/llrender2dutils.cpp            | 22 +++++++++-
 .../class1/interface/solidcolorIntelV.glsl    | 44 +++++++++++++++++++
 indra/newview/llselectmgr.cpp                 | 10 ++++-
 indra/newview/llviewershadermgr.cpp           | 19 ++++++++
 6 files changed, 96 insertions(+), 3 deletions(-)
 create mode 100644 indra/newview/app_settings/shaders/class1/interface/solidcolorIntelV.glsl

diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 298a03f32aa..8a0ca95a786 100755
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -57,6 +57,7 @@ bool LLGLSLShader::sNoFixedFunction = false;
 //UI shader -- declared here so llui_libtest will link properly
 LLGLSLShader	gUIProgram;
 LLGLSLShader	gSolidColorProgram;
+LLGLSLShader	gSolidColorProgramIntel;
 
 BOOL shouldChange(const LLVector4& v1, const LLVector4& v2)
 {
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 019d5a86d6c..cd097b8e0b9 100755
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -160,5 +160,8 @@ extern LLGLSLShader			gSolidColorProgram;
 //Alpha mask shader (declared here so llappearance can access properly)
 extern LLGLSLShader			gAlphaMaskProgram;
 
+// Solid color Shader for Intel Graphics
+extern LLGLSLShader			gSolidColorProgramIntel;
+
 
 #endif
diff --git a/indra/llrender/llrender2dutils.cpp b/indra/llrender/llrender2dutils.cpp
index d3cfbaf03a7..3c6848efaa4 100644
--- a/indra/llrender/llrender2dutils.cpp
+++ b/indra/llrender/llrender2dutils.cpp
@@ -443,7 +443,16 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
 	{
 		if (LLGLSLShader::sNoFixedFunction)
 		{
-			gSolidColorProgram.bind();
+			// When running with a intel gfx card, do not use the solidcolor?.glsl files. Instead use a custom one 
+			// for those cards. Passing color as a uniform and not a shader attribute
+			if(gGLManager.mIsIntel)
+			{
+				gSolidColorProgramIntel.bind();
+			}
+			else
+			{
+				gSolidColorProgram.bind();
+			}
 		}
 		else
 		{
@@ -454,7 +463,16 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
 
 	gGL.getTexUnit(0)->bind(image, true);
 
-	gGL.color4fv(color.mV);
+	// When running with a intel gfx card, do not use the solidcolor?.glsl files. Instead use a custom one 
+	// for those cards. Passing color as a uniform and not a shader attribute
+	if( solid_color && LLGLSLShader::sNoFixedFunction && gGLManager.mIsIntel )
+	{
+		gGL.diffuseColor4fv(color.mV);
+	}
+	else
+	{
+		gGL.color4fv(color.mV);
+	}
 	
 	const S32 NUM_VERTICES = 9 * 4; // 9 quads
 	LLVector2 uv[NUM_VERTICES];
diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorIntelV.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorIntelV.glsl
new file mode 100644
index 00000000000..dcf38c27ce2
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorIntelV.glsl
@@ -0,0 +1,44 @@
+/** 
+ * @file solidcolorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, 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$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+uniform vec4 color;
+ 
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+//	vertex_color = diffuse_color;
+	vertex_color = color;
+	vary_texcoord0 = texcoord0;
+}
+
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 4681efd3e59..02ace86b95f 100755
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -6051,7 +6051,15 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
 
 	if (shader)
 	{ //switch to "solid color" program for SH-2690 -- works around driver bug causing bad triangles when rendering silhouettes
-		gSolidColorProgram.bind();
+		if(gGLManager.mIsIntel)
+		{
+			gSolidColorProgramIntel.bind();
+			gGL.diffuseColor4fv(color.mV);
+		}
+		else
+		{
+			gSolidColorProgram.bind();
+		}
 	}
 
 	gGL.matrixMode(LLRender::MM_MODELVIEW);
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 7d7889845d4..ef5ccb51207 100755
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -640,6 +640,7 @@ void LLViewerShaderMgr::unloadShaders()
 	gTwoTextureAddProgram.unload();
 	gOneTextureNoColorProgram.unload();
 	gSolidColorProgram.unload();
+	gSolidColorProgramIntel.unload();
 
 	gObjectFullbrightNoColorProgram.unload();
 	gObjectFullbrightNoColorWaterProgram.unload();
@@ -2703,6 +2704,24 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
 		}
 	}
 
+	// When running with a intel gfx card, do not use the solidcolor?.glsl files. Instead use a custom one 
+	// for those cards. Passing color as a uniform and not a shader attribute
+	if (success)
+	{
+		gSolidColorProgramIntel.mName = "Solid Color Shader for Intel";
+		gSolidColorProgramIntel.mShaderFiles.clear();
+		gSolidColorProgramIntel.mShaderFiles.push_back(make_pair("interface/solidcolorIntelV.glsl", GL_VERTEX_SHADER_ARB));
+		gSolidColorProgramIntel.mShaderFiles.push_back(make_pair("interface/solidcolorF.glsl", GL_FRAGMENT_SHADER_ARB)); // The standard fragment shader is just fine. So keep it.
+		gSolidColorProgramIntel.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+		success = gSolidColorProgramIntel.createShader(NULL, NULL);
+		if (success)
+		{
+			gSolidColorProgramIntel.bind();
+			gSolidColorProgramIntel.uniform1i(sTex0, 0);
+			gSolidColorProgramIntel.unbind();
+		}
+	}
+
 	if (success)
 	{
 		gOcclusionProgram.mName = "Occlusion Shader";
-- 
GitLab