From a8860f6ba1205a7b3623d4572f30b2cbb5c79ced Mon Sep 17 00:00:00 2001 From: eihrul Date: Tue, 9 Feb 2010 04:53:49 +0000 Subject: [PATCH] yet faster VSDCT instruction sequences git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9947 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_rmain.c | 24 +++++++++--------------- r_shadow.c | 10 +++++----- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/gl_rmain.c b/gl_rmain.c index a5f3513f..2ccf7b19 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -1064,11 +1064,9 @@ static const char *builtinshaderstring = "vec3 GetShadowMapTC2D(vec3 dir)\n" "{\n" " vec3 adir = abs(dir);\n" -" float ma = max(max(adir.x, adir.y), adir.z);\n" +" vec2 aparams = ShadowMap_Parameters.xy / max(max(adir.x, adir.y), adir.z);\n" " vec4 proj = textureCube(Texture_CubeProjection, dir);\n" -" vec3 stc = vec3(mix(dir.xy, dir.zz, proj.xy) * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" -" stc += vec3(proj.zw * ShadowMap_Parameters.y, ShadowMap_Parameters.z);\n" -" return stc;\n" +" return vec3(mix(dir.xy, dir.zz, proj.xy) * aparams.x + proj.zw * ShadowMap_Parameters.z, aparams.y + ShadowMap_Parameters.w);\n" "}\n" "# else\n" "vec3 GetShadowMapTC2D(vec3 dir)\n" @@ -1078,9 +1076,8 @@ static const char *builtinshaderstring = " vec4 proj = vec4(dir, 2.5);\n" " if (adir.x > ma) { ma = adir.x; proj = vec4(dir.zyx, 0.5); }\n" " if (adir.y > ma) { ma = adir.y; proj = vec4(dir.xzy, 1.5); }\n" -" vec3 stc = vec3(proj.xy * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" -" stc += vec3(vec2(proj.z < 0.0 ? 1.5 : 0.5, proj.w) * ShadowMap_Parameters.y, ShadowMap_Parameters.z);\n" -" return stc;\n" +" vec2 aparams = ShadowMap_Parameters.xy / ma;\n" +" return vec3(proj.xy * aparams.x + vec2(proj.z < 0.0 ? 1.5 : 0.5, proj.w) * ShadowMap_Parameters.z, aparams.y + ShadowMap_Parameters.w);\n" "}\n" "# endif\n" "# endif\n" @@ -2190,11 +2187,9 @@ const char *builtincgshaderstring = "float3 GetShadowMapTC2D(float3 dir, float4 ShadowMap_Parameters, samplerCUBE Texture_CubeProjection)\n" "{\n" " float3 adir = abs(dir);\n" -" float ma = max(max(adir.x, adir.y), adir.z);\n" -" float4 proj = texCUBE(Texture_CubeProjection, dir);\n" -" float3 stc = float3(lerp(dir.xy, dir.zz, proj.xy) * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" -" stc += float3(proj.zw * ShadowMap_Parameters.y, ShadowMap_Parameters.z);\n" -" return stc;\n" +" float2 aparams = ShadowMap_Parameters.xy / max(max(adir.x, adir.y), adir.z);\n" +" float4 proj = texCUBEe(Texture_CubeProjection, dir);\n" +" return float3(mix(dir.xy, dir.zz, proj.xy) * aparams.x + proj.zw * ShadowMap_Parameters.z, aparams.y + ShadowMap_Parameters.w);\n" "}\n" "# else\n" "float3 GetShadowMapTC2D(float3 dir, float4 ShadowMap_Parameters)\n" @@ -2204,9 +2199,8 @@ const char *builtincgshaderstring = " float4 proj = float4(dir, 2.5);\n" " if (adir.x > ma) { ma = adir.x; proj = float4(dir.zyx, 0.5); }\n" " if (adir.y > ma) { ma = adir.y; proj = float4(dir.xzy, 1.5); }\n" -" float3 stc = float3(proj.xy * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" -" stc += float3(vec2(proj.z < 0.0 ? 1.5 : 0.5, proj.w) * ShadowMap_Parameters.y, ShadowMap_Parameters.z);\n" -" return stc;\n" +" float2 aparams = ShadowMap_Parameters.xy / ma;\n" +" return float3(proj.xy * aparams.x + float2(proj.z < 0.0 ? 1.5 : 0.5, proj.w) * ShadowMap_Parameters.z, aparams.y + ShadowMap_Parameters.w);\n" "}\n" "# endif\n" "# endif\n" diff --git a/r_shadow.c b/r_shadow.c index 1a426936..6410fec5 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -2108,15 +2108,15 @@ void R_Shadow_RenderMode_ShadowMap(int side, int clear, int size) nearclip = r_shadow_shadowmapping_nearclip.value / rsurface.rtlight->radius; farclip = 1.0f; bias = r_shadow_shadowmapping_bias.value * nearclip * (1024.0f / size);// * rsurface.rtlight->radius; - r_shadow_shadowmap_parameters[2] = 0.5f + 0.5f * (farclip + nearclip) / (farclip - nearclip); - r_shadow_shadowmap_parameters[3] = -nearclip * farclip / (farclip - nearclip) - 0.5f * bias; + r_shadow_shadowmap_parameters[1] = -nearclip * farclip / (farclip - nearclip) - 0.5f * bias; + r_shadow_shadowmap_parameters[3] = 0.5f + 0.5f * (farclip + nearclip) / (farclip - nearclip); r_shadow_shadowmapside = side; r_shadow_shadowmapsize = size; switch (r_shadow_shadowmode) { case R_SHADOW_SHADOWMODE_SHADOWMAP2D: r_shadow_shadowmap_parameters[0] = 0.5f * (size - r_shadow_shadowmapborder); - r_shadow_shadowmap_parameters[1] = r_shadow_shadowmapvsdct ? 2.5f*size : size; + r_shadow_shadowmap_parameters[2] = r_shadow_shadowmapvsdct ? 2.5f*size : size; R_Viewport_InitRectSideView(&viewport, &rsurface.rtlight->matrix_lighttoworld, side, size, r_shadow_shadowmapborder, nearclip, farclip, NULL); if (r_shadow_rendermode == R_SHADOW_RENDERMODE_SHADOWMAP2D) goto init_done; @@ -2133,7 +2133,7 @@ void R_Shadow_RenderMode_ShadowMap(int side, int clear, int size) break; case R_SHADOW_SHADOWMODE_SHADOWMAPRECTANGLE: r_shadow_shadowmap_parameters[0] = 0.5f * (size - r_shadow_shadowmapborder); - r_shadow_shadowmap_parameters[1] = r_shadow_shadowmapvsdct ? 2.5f*size : size; + r_shadow_shadowmap_parameters[2] = r_shadow_shadowmapvsdct ? 2.5f*size : size; R_Viewport_InitRectSideView(&viewport, &rsurface.rtlight->matrix_lighttoworld, side, size, r_shadow_shadowmapborder, nearclip, farclip, NULL); if (r_shadow_rendermode == R_SHADOW_RENDERMODE_SHADOWMAPRECTANGLE) goto init_done; @@ -2150,7 +2150,7 @@ void R_Shadow_RenderMode_ShadowMap(int side, int clear, int size) break; case R_SHADOW_SHADOWMODE_SHADOWMAPCUBESIDE: r_shadow_shadowmap_parameters[0] = 1.0f; - r_shadow_shadowmap_parameters[1] = 1.0f; + r_shadow_shadowmap_parameters[2] = 1.0f; R_Viewport_InitCubeSideView(&viewport, &rsurface.rtlight->matrix_lighttoworld, side, size, nearclip, farclip, NULL); if (r_shadow_rendermode == R_SHADOW_RENDERMODE_SHADOWMAPCUBESIDE) goto init_done; -- 2.39.2