eglglessink: GLSL: Planar YUV converters optimization
authorReynaldo H. Verdejo Pinochet <reynaldo@collabora.com>
Wed, 10 Oct 2012 14:50:28 +0000 (11:50 -0300)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 18 Oct 2012 12:35:18 +0000 (14:35 +0200)
- Use consts for the transform's offset and cofficients values
- Use dot product instead of mult and add
- Avoid unneeded texture lookups

ext/eglgles/gsteglglessink.c

index 1949b79..c549520 100644 (file)
@@ -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);"
       "}"
 };