diff options
author | Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> | 2012-10-10 11:50:28 -0300 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-10-18 14:35:18 +0200 |
commit | 73d865091c6766664d2117852fbdc0ac8a0ecfd0 (patch) | |
tree | a37fb546facf85ad79ce0952fe02b48485377bfb /ext | |
parent | 846e77871bf45259687812a77c6c05f61c6007c5 (diff) |
eglglessink: GLSL: Planar YUV converters optimization
- Use consts for the transform's offset and cofficients values
- Use dot product instead of mult and add
- Avoid unneeded texture lookups
Diffstat (limited to 'ext')
-rw-r--r-- | ext/eglgles/gsteglglessink.c | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/ext/eglgles/gsteglglessink.c b/ext/eglgles/gsteglglessink.c index 1949b7985..c5495208c 100644 --- a/ext/eglgles/gsteglglessink.c +++ b/ext/eglgles/gsteglglessink.c @@ -264,18 +264,21 @@ static const char *frag_PLANAR_YUV_prog = { "precision mediump float;" "varying vec2 opos;" "uniform sampler2D Ytex,Utex,Vtex;" + "const vec3 offset = vec3(-0.0625, -0.5, -0.5);" + "const vec3 rcoeff = vec3(1.164, 0.000, 1.596);" + "const vec3 gcoeff = vec3(1.164,-0.391,-0.813);" + "const vec3 bcoeff = vec3(1.164, 2.018, 0.000);" "void main(void) {" - " float r,g,b,y,u,v;" + " float r,g,b;" + " vec3 yuv;" " vec2 nxy = opos.xy;" - " y=texture2D(Ytex,nxy).r;" - " u=texture2D(Utex,nxy).r;" - " v=texture2D(Vtex,nxy).r;" - " y=1.1643*(y-0.0625);" - " u=u-0.5;" - " v=v-0.5;" - " r=y+1.5958*v;" - " g=y-0.39173*u-0.81290*v;" - " b=y+2.017*u;" + " yuv.x=texture2D(Ytex,nxy).r;" + " yuv.y=texture2D(Utex,nxy).r;" + " yuv.z=texture2D(Vtex,nxy).r;" + " yuv += offset;" + " r = dot(yuv, rcoeff);" + " g = dot(yuv, gcoeff);" + " b = dot(yuv, bcoeff);" " gl_FragColor=vec4(r,g,b,1.0);" "}" }; @@ -285,18 +288,21 @@ static const char *frag_NV12_NV21_prog = { "precision mediump float;" "varying vec2 opos;" "uniform sampler2D Ytex,UVtex;" + "const vec3 offset = vec3(-0.0625, -0.5, -0.5);" + "const vec3 rcoeff = vec3(1.164, 0.000, 1.596);" + "const vec3 gcoeff = vec3(1.164,-0.391,-0.813);" + "const vec3 bcoeff = vec3(1.164, 2.018, 0.000);" "void main(void) {" - " float r,g,b,y,u,v;" + " float r,g,b;" + " vec3 yuv;" " vec2 nxy = opos.xy;" - " y=texture2D(Ytex,nxy).r;" - " u=texture2D(UVtex,nxy).%c;" - " v=texture2D(UVtex,nxy).%c;" - " y=1.1643*(y-0.0625);" - " u=u-0.5;" - " v=v-0.5;" - " r=y+1.5958*v;" - " g=y-0.39173*u-0.81290*v;" - " b=y+2.017*u;" + " yuv.x=texture2D(Ytex,nxy).r;" + " yuv.y=texture2D(UVtex,nxy).%c;" + " yuv.z=texture2D(UVtex,nxy).%c;" + " yuv += offset;" + " r = dot(yuv, rcoeff);" + " g = dot(yuv, gcoeff);" + " b = dot(yuv, bcoeff);" " gl_FragColor=vec4(r,g,b,1.0);" "}" }; |