mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-28 04:31:06 +00:00
[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:
parent
e7d083fcc0
commit
0cae67172a
1 changed files with 26 additions and 8 deletions
|
@ -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;"
|
||||
|
|
Loading…
Reference in a new issue