From e2ab893f00f6244a9459fa6ad08281146069070a Mon Sep 17 00:00:00 2001
From: eihrul <eihrul@d7cf8633-e32d-0410-b094-e92efae38249>
Date: Sat, 19 May 2012 04:17:00 +0000
Subject: [PATCH] use texture gather emulation for the shadowmap sampler path,
 and use it by default instead of texture gather

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11820 d7cf8633-e32d-0410-b094-e92efae38249
---
 r_shadow.c    |  8 ++++----
 shader_glsl.h | 10 +++++++---
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/r_shadow.c b/r_shadow.c
index d4cf86b7..0e12a967 100644
--- a/r_shadow.c
+++ b/r_shadow.c
@@ -462,13 +462,13 @@ static void R_Shadow_SetShadowMode(void)
 			{
 				if (!r_fb.usedepthtextures)
 					r_shadow_shadowmappcf = 1;
-				else if(vid.support.amd_texture_texture4 || vid.support.arb_texture_gather)
-					r_shadow_shadowmappcf = 1;
-				else if(strstr(gl_vendor, "NVIDIA") || strstr(gl_renderer, "Radeon HD")) 
+				else if((strstr(gl_vendor, "NVIDIA") || strstr(gl_renderer, "Radeon HD")) && vid.support.arb_shadow && r_shadow_shadowmapshadowsampler) 
 				{
-					r_shadow_shadowmapsampler = vid.support.arb_shadow && r_shadow_shadowmapshadowsampler;
+					r_shadow_shadowmapsampler = true;
 					r_shadow_shadowmappcf = 1;
 				}
+                else if(vid.support.amd_texture_texture4 || vid.support.arb_texture_gather)
+                    r_shadow_shadowmappcf = 1;
 				else if((strstr(gl_vendor, "ATI") || strstr(gl_vendor, "Advanced Micro Devices")) && !strstr(gl_renderer, "Mesa") && !strstr(gl_version, "Mesa")) 
 					r_shadow_shadowmappcf = 1;
 				else 
diff --git a/shader_glsl.h b/shader_glsl.h
index d3b258de..dbc19d57 100644
--- a/shader_glsl.h
+++ b/shader_glsl.h
@@ -883,9 +883,13 @@
 "#  else\n"
 "#   ifdef USESHADOWSAMPLER\n"
 "#     ifdef USESHADOWMAPPCF\n"
-"#       define texval(x, y) dp_shadow2D(Texture_ShadowMap2D, vec3(center + vec2(x, y)*ShadowMap_TextureScale, shadowmaptc.z))  \n"
-"	vec2 center = shadowmaptc.xy*ShadowMap_TextureScale;\n"
-"	f = dot(vec4(0.25), vec4(texval(-0.4, 1.0), texval(-1.0, -0.4), texval(0.4, -1.0), texval(1.0, 0.4)));\n"
+"#       define texval(off) dp_shadow2D(Texture_ShadowMap2D, vec3((center + off)*ShadowMap_TextureScale, shadowmaptc.z))  \n"
+"	vec2 offset = fract(shadowmaptc.xy - 0.5), center = shadowmaptc.xy - offset;\n"
+"	vec4 size = vec4(offset + 1.0, 2.0 - offset), weight = vec4(2.0 - 1.0 / size.xy, 1.0 / size.zw - 1.0);\n"
+"	f = (1.0/9.0)*dot(size.zxzx*size.wwyy, vec4(texval(weight.zw), texval(weight.xw), texval(weight.zy), texval(weight.xy)));\n"
+"//#       define texval(x, y) dp_shadow2D(Texture_ShadowMap2D, vec3(center + vec2(x, y)*ShadowMap_TextureScale, shadowmaptc.z))  \n"
+"//	vec2 center = shadowmaptc.xy*ShadowMap_TextureScale;\n"
+"//	f = dot(vec4(0.25), vec4(texval(-0.4, 1.0), texval(-1.0, -0.4), texval(0.4, -1.0), texval(1.0, 0.4)));\n"
 "#     else\n"
 "	f = dp_shadow2D(Texture_ShadowMap2D, vec3(shadowmaptc.xy*ShadowMap_TextureScale, shadowmaptc.z));\n"
 "#     endif\n"
-- 
2.39.5