[430/906] convolution: save some indirection grouping math and sampling

Thanks to Eric Anholt I've finally understood (at least I hope) how to
count texture indirections and save up some.  Texture sampling dependent
on the result of some math counts as an indirection phase. Grouped
texture lookups with no math involved count as a single indirection.
Math on the coordinates count as indirection.
So the best thing is to group all the math involving coordinates and
then do all the lookups.
This saves enough indirections to make glfilterblur and glow effect
work, albeit a bit slowly, on i915.
This commit is contained in:
Filippo Argiolas 2010-04-26 12:45:57 +02:00 committed by Matthew Waters
parent e7d083fcc0
commit 0cae67172a

View file

@ -308,13 +308,22 @@ const gchar *hconv9_fragment_source =
"uniform sampler2DRect tex;"
"uniform float kernel[9];"
"void main () {"
" vec2 texturecoord = gl_TexCoord[0].st;"
" texturecoord.s -= 4.0;"
" vec2 texturecoord[10];"
" float s = gl_TexCoord[0].s;"
" float t = gl_TexCoord[0].t;"
" texturecoord[0] = vec2(s-4.0, t);"
" texturecoord[1] = vec2(s-3.0, t);"
" texturecoord[2] = vec2(s-2.0, t);"
" texturecoord[3] = vec2(s-1.0, t);"
" texturecoord[4] = vec2(s, t);"
" texturecoord[5] = vec2(s+1.0, t);"
" texturecoord[6] = vec2(s+2.0, t);"
" texturecoord[7] = vec2(s+3.0, t);"
" texturecoord[8] = vec2(s+4.0, t);"
" int i;"
" vec4 sum = vec4 (0.0);"
" for (i = 0; i < 9; i++) { "
" vec4 neighbor = texture2DRect(tex, texturecoord); "
" ++texturecoord.s;"
" vec4 neighbor = texture2DRect(tex, texturecoord[i]); "
" sum += neighbor * kernel[i];"
" }"
" gl_FragColor = sum;"
@ -326,13 +335,22 @@ const gchar *vconv9_fragment_source =
"uniform sampler2DRect tex;"
"uniform float kernel[9];"
"void main () {"
" vec2 texturecoord = gl_TexCoord[0].st;"
" texturecoord.t -= 4.0;"
" vec2 texturecoord[9];"
" float s = gl_TexCoord[0].s;"
" float t = gl_TexCoord[0].t;"
" texturecoord[0] = vec2(s, t-4.0);"
" texturecoord[1] = vec2(s, t-3.0);"
" texturecoord[2] = vec2(s, t-2.0);"
" texturecoord[3] = vec2(s, t-1.0);"
" texturecoord[4] = vec2(s, t);"
" texturecoord[5] = vec2(s, t+1.0);"
" texturecoord[6] = vec2(s, t+2.0);"
" texturecoord[7] = vec2(s, t+3.0);"
" texturecoord[8] = vec2(s, t+4.0);"
" int i;"
" vec4 sum = vec4 (0.0);"
" for (i = 0; i < 9; i++) { "
" vec4 neighbor = texture2DRect(tex, texturecoord); "
" ++texturecoord.t;"
" vec4 neighbor = texture2DRect(tex, texturecoord[i]);"
" sum += neighbor * kernel[i]; "
" }"
" gl_FragColor = sum;"