diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
index e8279241d1bb523663cbfdf2cb86721f34d66f50..d071801e2d33449e11e37adbe768701446f81971 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
@@ -67,20 +67,16 @@ vec4 getPosition(vec2 pos_screen)
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
index 70cc88420942020c1b0c5cff106c2f7464b6cb12..f58c69deaad21e89f9fb2605046de9f593f6a3d8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
@@ -429,20 +429,16 @@ VARYING vec2 vary_texcoord0;
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)
@@ -692,13 +688,6 @@ void main()
 
 #else
 	frag_data[0] = final_color;
-
-#ifdef SINGLE_FP_ONLY
-	// "Not so HD" range on older cards; make it fit!
-	//
-	final_specular = final_specular * vec4(0.25f);
-#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/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
index 0d86840c1c885b4ca2381935087961ad539e421f..e27250e13e34705b7149d741cdb0421467875cb7 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
@@ -59,20 +59,16 @@ uniform mat4 inv_proj;
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
index f4d174729d5e99fea44d7f31fef9f9c37b925758..ca3fcdcadb89ceba13a106ca0b6cc14daa23dcc5 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
@@ -70,20 +70,16 @@ uniform mat4 inv_proj;
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
index 1313ba582ff91011a69d915616d120f45ad1c6c1..850988a6045d3028ed34b51f955809801ae2cbbc 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
@@ -57,20 +57,16 @@ uniform vec4 viewport;
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 3e3e0a5a5d533fee20f9efa8e0532a01732cd5f5..e94201df416f2684ccf833e4184a7582fcc45cf7 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -79,16 +79,18 @@ uniform mat4 inv_proj;
 uniform vec2 screen_res;
 
 #ifdef SINGLE_FP_ONLY
+vec2 encode_normal(vec3 n)
+{
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
+}
+
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1-f/2;
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec3 decode_normal (vec2 enc)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
index adfe012e4da8b11574c4be54a1410c47e541f8a7..879953b4761ada4700e279ede7176cf11ec8ae80 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
@@ -68,20 +68,16 @@ uniform mat4 inv_proj;
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
index 7fcbb1aa8596eb73bac9c4afbeac2674404b8937..6d3b3e23de38e88c6ba17c399d0c3a1617627a1e 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
@@ -52,20 +52,16 @@ uniform vec2 screen_res;
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
index f7023be1503ca03ebc0236f6bfcc0a6606bef5de..db60c8ea514df3da5edeccb88b13b8bc2277eb2a 100755
--- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
@@ -71,20 +71,16 @@ uniform mat4 inv_proj;
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index 6e3564127769d17d30a4bf728727e2c74a3f3637..08b456dd967400c43e0ce5e7c7748e252f758fe3 100755
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -81,20 +81,16 @@ uniform vec2 screen_res;
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
index 0436c807102c114434f7dc4a26e8254e54b2002f..4fc9a6ad87e51bc7eb964749d2e3cb6b57f1f300 100755
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
@@ -71,20 +71,16 @@ uniform mat4 inv_proj;
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
index 640701572d932b01bf3040bea1e45714f34ec2c4..c1ed32f7e7c74b3bb51ac54d793af9e326f5417c 100755
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
@@ -68,20 +68,16 @@ uniform float spot_shadow_offset;
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
index 6db26cec4cb137230965629a6fb59196bef9fdd6..8a029109a676f896960c215af8737e7e88c732e6 100755
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
@@ -69,20 +69,16 @@ uniform float spot_shadow_offset;
 #ifdef SINGLE_FP_ONLY
 vec2 encode_normal(vec3 n)
 {
-	float f = sqrt(2 * n.z + 2);
-	return (n.xy / vec2(f)) + vec2(0.5f);
+	vec2 sn;
+	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 }
 
 vec3 decode_normal (vec2 enc)
 {
-    vec2 fenc = enc - 0.5f;
-    float f = dot(fenc,fenc);
-    f = clamp(f,0.0f,1.0f);
-    float g = sqrt(1-f);
-    vec3 n;
-    n.xy = fenc*g;
-    n.z = 1.0f - (f * 0.5f);
-    return normalize(n);
+	vec3 n;
+	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
+	n.z = sqrt(1.0f - dot(n.xy,n.xy));
+	return n;
 }
 #else
 vec2 encode_normal(vec3 n)