Index: /trunk/src/VBox/Frontends/VirtualBox/VirtualBoxShaders.qrc
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/VirtualBoxShaders.qrc	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/VirtualBoxShaders.qrc	(revision 22883)
@@ -9,4 +9,5 @@
     <file alias="ckeyDst_void.c">shaders/ckeyDst_void.c</file>
     <file alias="ckeyDst.c">shaders/ckeyDst.c</file>
+    <file alias="ckeyDst2.c">shaders/ckeyDst2.c</file>
     <file alias="mainOverlay.c">shaders/mainOverlay.c</file>
     <file alias="mainOverlayNoCKey.c">shaders/mainOverlayNoCKey.c</file>
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV.c	(revision 22883)
@@ -2,7 +2,7 @@
 uniform sampler2DRect uSrcTex;
 void vboxCConvApplyAYUV(vec4 color);
-void vboxCConv(int srcI)
+void vboxCConv()
 {
-    vec2 srcCoord = vec2(gl_TexCoord[srcI]);
+    vec2 srcCoord = vec2(gl_TexCoord[0]);
     vec4 color = texture2DRect(uSrcTex, srcCoord);
     vboxCConvApplyAYUV(color);
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV_void.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV_void.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV_void.c	(revision 22883)
@@ -1,2 +1,2 @@
-void vboxCConv(int srcI)
+void vboxCConv()
 {}
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvBGR.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvBGR.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvBGR.c	(revision 22883)
@@ -1,7 +1,7 @@
 #extension GL_ARB_texture_rectangle : enable
 uniform sampler2DRect uSrcTex;
-void vboxCConv(int srcI)
+void vboxCConv()
 {
-    vec2 srcCoord = vec2(gl_TexCoord[srcI]);
-    gl_FragColor = texture2DRect(uSrcTex, vec2(srcCoord.x, srcCoord.y));
+    vec2 srcCoord = vec2(gl_TexCoord[0]);
+    gl_FragColor = texture2DRect(uSrcTex, srcCoord);
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvBGR_void.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvBGR_void.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvBGR_void.c	(revision 22883)
@@ -1,2 +1,2 @@
-void vboxCConv(int srcI)
+void vboxCConv()
 {}
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY.c	(revision 22883)
@@ -2,9 +2,9 @@
 uniform sampler2DRect uSrcTex;
 void vboxCConvApplyAYUV(vec4 color);
-void vboxCConv(int srcI)
+void vboxCConv()
 {
-    vec2 srcCoord = vec2(gl_TexCoord[srcI]);
+    vec2 srcCoord = vec2(gl_TexCoord[0]);
     float x = srcCoord.x;
-    vec4 srcClr = texture2DRect(uSrcTex, vec2(x, srcCoord.y));
+    vec4 srcClr = texture2DRect(uSrcTex, srcCoord);
     float u = srcClr.b;
     float v = srcClr.r;
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY_void.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY_void.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY_void.c	(revision 22883)
@@ -1,2 +1,2 @@
-void vboxCConv(int srcI)
+void vboxCConv()
 {}
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2.c	(revision 22883)
@@ -2,7 +2,7 @@
 uniform sampler2DRect uSrcTex;
 void vboxCConvApplyAYUV(vec4 color);
-void vboxCConv(int srcI)
+void vboxCConv()
 {
-    vec2 srcCoord = vec2(gl_TexCoord[srcI]);
+    vec2 srcCoord = vec2(gl_TexCoord[0]);
     float x = srcCoord.x;
     vec4 srcClr = texture2DRect(uSrcTex, vec2(x, srcCoord.y));
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2_void.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2_void.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2_void.c	(revision 22883)
@@ -1,2 +1,2 @@
-void vboxCConv(int srcI)
+void vboxCConv()
 {}
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYV12.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYV12.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYV12.c	(revision 22883)
@@ -5,15 +5,14 @@
 float vboxSplitBGRA(vec4 color, float coord);
 void vboxCConvApplyAYUV(vec4 color);
-void vboxCConv(int srcI)
+void vboxCConv()
 {
-    vec2 coordY = vec2(gl_TexCoord[srcI]);
-    vec2 coordV = vec2(gl_TexCoord[srcI+1]);
-    vec2 coordU = vec2(gl_TexCoord[srcI+2]);
+    vec2 coordY = vec2(gl_TexCoord[0]);
+    vec2 coordV = vec2(gl_TexCoord[1]);
     vec4 clrY = texture2DRect(uSrcTex, vec2(coordY));
     vec4 clrV = texture2DRect(uVTex, vec2(coordV));
-    vec4 clrU = texture2DRect(uUTex, vec2(coordU));
+    vec4 clrU = texture2DRect(uUTex, vec2(coordV));
     float y = vboxSplitBGRA(clrY, coordY.x);
     float v = vboxSplitBGRA(clrV, coordV.x);
-    float u = vboxSplitBGRA(clrU, coordU.x);
+    float u = vboxSplitBGRA(clrU, coordV.x);
     vboxCConvApplyAYUV(vec4(u, y, 0.0, v));
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYV12_void.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYV12_void.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/cconvYV12_void.c	(revision 22883)
@@ -1,2 +1,2 @@
-void vboxCConv(int srcI)
+void vboxCConv()
 {}
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/ckeyDst.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/ckeyDst.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/ckeyDst.c	(revision 22883)
@@ -2,11 +2,10 @@
 uniform sampler2DRect uDstTex;
 uniform vec4 uDstClr;
-int vboxCKeyDst(void)
+void vboxCKeyDst(void)
 {
-    vec4 dstClr = texture2DRect(uDstTex, vec2(gl_TexCoord[0]));
+    vec4 dstClr = texture2DRect(uDstTex, vec2(gl_TexCoord[1]));
     vec3 difClr = dstClr.rgb - uDstClr.rgb;
     if(any(greaterThan(difClr, vec3(0.01, 0.01, 0.01)))
         || any(lessThan(difClr, vec3(-0.01, -0.01, -0.01))))
             discard;
-    return 1;
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/ckeyDst2.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/ckeyDst2.c	(revision 22883)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/ckeyDst2.c	(revision 22883)
@@ -0,0 +1,11 @@
+#extension GL_ARB_texture_rectangle : enable
+uniform sampler2DRect uDstTex;
+uniform vec4 uDstClr;
+void vboxCKeyDst(void)
+{
+    vec4 dstClr = texture2DRect(uDstTex, vec2(gl_TexCoord[2]));
+    vec3 difClr = dstClr.rgb - uDstClr.rgb;
+    if(any(greaterThan(difClr, vec3(0.01, 0.01, 0.01)))
+        || any(lessThan(difClr, vec3(-0.01, -0.01, -0.01))))
+            discard;
+}
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/ckeyDst_void.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/ckeyDst_void.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/ckeyDst_void.c	(revision 22883)
@@ -1,4 +1,3 @@
-int vboxCKeyDst(void)
+void vboxCKeyDst(void)
 {
-    return 0;
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/mainOverlay.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/mainOverlay.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/mainOverlay.c	(revision 22883)
@@ -1,7 +1,7 @@
-int vboxCKeyDst(void);
-void vboxCConv(int srcI);
+void vboxCKeyDst(void);
+void vboxCConv();
 void main(void)
 {
-	int srci = vboxCKeyDst();
-	vboxCConv(srci);
+    vboxCKeyDst();
+    vboxCConv();
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoCKey.c
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoCKey.c	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoCKey.c	(revision 22883)
@@ -1,5 +1,5 @@
-void vboxCConv(int srcI);
+void vboxCConv();
 void main(void)
 {
-    vboxCConv(0);
+    vboxCConv();
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp	(revision 22882)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp	(revision 22883)
@@ -1266,41 +1266,15 @@
     do
     {
+        GLint tex = 0;
         mUniSrcTex = vboxglGetUniformLocation(program(), "uSrcTex");
         Assert(mUniSrcTex != -1);
         if(mUniSrcTex == -1)
             break;
-        if(type() & VBOXVHWA_PROGRAM_DSTCOLORKEY)
-        {
-            VBOXQGL_CHECKERR(
-                    vboxglUniform1i(mUniSrcTex, 1);
-                    );
-            mSrcTex = 1;
-
-            mUniDstTex = vboxglGetUniformLocation(program(), "uDstTex");
-            Assert(mUniDstTex != -1);
-            if(mUniDstTex == -1)
-                break;
-            VBOXQGL_CHECKERR(
-                    vboxglUniform1i(mUniDstTex, 0);
-                    );
-            mDstTex = 0;
-            mUniDstLowerColor = vboxglGetUniformLocation(program(), "uDstClr");
-            Assert(mUniDstLowerColor != -1);
-            if(mUniDstLowerColor == -1)
-                break;
-
-            mDstLowerR = 0.0; mDstLowerG = 0.0; mDstLowerB = 0.0;
-
-            VBOXQGL_CHECKERR(
-                    vboxglUniform4f(mUniDstLowerColor, 0.0, 0.0, 0.0, 0.0);
-                    );
-        }
-        else
-        {
-            VBOXQGL_CHECKERR(
-                    vboxglUniform1i(mUniSrcTex, 1);
-                    );
-            mSrcTex = 0;
-        }
+
+        VBOXQGL_CHECKERR(
+                vboxglUniform1i(mUniSrcTex, tex);
+                );
+        mSrcTex = tex;
+        ++tex;
 
         if(type() & VBOXVHWA_PROGRAM_SRCCOLORKEY)
@@ -1323,8 +1297,5 @@
                 case FOURCC_YV12:
                 {
-                    GLint tex = mSrcTex + 1;
-
                     mUniVTex = vboxglGetUniformLocation(program(), "uVTex");
-
                     Assert(mUniVTex != -1);
                     if(mUniVTex == -1)
@@ -1335,6 +1306,5 @@
                             );
                     mVTex = tex;
-
-                    tex++;
+                    ++tex;
 
                     mUniUTex = vboxglGetUniformLocation(program(), "uUTex");
@@ -1342,9 +1312,9 @@
                     if(mUniUTex == -1)
                         break;
-
                     VBOXQGL_CHECKERR(
                             vboxglUniform1i(mUniUTex, tex);
                             );
                     mUTex = tex;
+                    ++tex;
 
                     break;
@@ -1358,4 +1328,29 @@
                     break;
             }
+        }
+
+        if(type() & VBOXVHWA_PROGRAM_DSTCOLORKEY)
+        {
+
+            mUniDstTex = vboxglGetUniformLocation(program(), "uDstTex");
+            Assert(mUniDstTex != -1);
+            if(mUniDstTex == -1)
+                break;
+            VBOXQGL_CHECKERR(
+                    vboxglUniform1i(mUniDstTex, tex);
+                    );
+            mDstTex = tex;
+            ++tex;
+
+            mUniDstLowerColor = vboxglGetUniformLocation(program(), "uDstClr");
+            Assert(mUniDstLowerColor != -1);
+            if(mUniDstLowerColor == -1)
+                break;
+
+            mDstLowerR = 0.0; mDstLowerG = 0.0; mDstLowerB = 0.0;
+
+            VBOXQGL_CHECKERR(
+                    vboxglUniform4f(mUniDstLowerColor, 0.0, 0.0, 0.0, 0.0);
+                    );
         }
 
@@ -1453,4 +1448,5 @@
         mShaderSplitBGRA(":/splitBGRA.c", GL_FRAGMENT_SHADER),
         mShaderCKeyDst(":/ckeyDst.c", GL_FRAGMENT_SHADER),
+        mShaderCKeyDst2(":/ckeyDst2.c", GL_FRAGMENT_SHADER),
 //        mShaderCKeyDstVoid(":/ckeyDst_void.c", GL_FRAGMENT_SHADER),
     //  mShaderCKeySrc;
@@ -1494,5 +1490,8 @@
     VBoxVHWAGlShader mShaderSplitBGRA;
 
+    /* expected the dst surface texture to be bound to the 1-st tex unit */
     VBoxVHWAGlShader mShaderCKeyDst;
+    /* expected the dst surface texture to be bound to the 2-nd tex unit */
+    VBoxVHWAGlShader mShaderCKeyDst2;
 //    VBoxVHWAGlShader mShaderCKeyDstVoid;
 //    VBoxVHWAGlShader mShaderCKeySrc;
@@ -1517,5 +1516,12 @@
     if(type &  VBOXVHWA_PROGRAM_DSTCOLORKEY)
     {
-        apShaders[cShaders++] = &mShaderCKeyDst;
+        if(fourcc == FOURCC_YV12)
+        {
+            apShaders[cShaders++] = &mShaderCKeyDst2;
+        }
+        else
+        {
+            apShaders[cShaders++] = &mShaderCKeyDst;
+        }
     }
 // ensure we don't have empty functions /* paranoya for for ATI on linux */
@@ -2573,40 +2579,33 @@
 //    VBOXQGL_CHECKERR(
             glBegin(GL_QUADS);
-            pDstTex->multiTexCoord(GL_TEXTURE0, bx1, by1);
+
             for(int i = 0; i < cSrcTex; i++)
             {
-//                vboxglMultiTexCoord2d(GL_TEXTURE1 + i, ((double)tx1)/mpTex[i]->texRect().width()/(width()/mpTex[i]->rect().width()),
-//                        ((double)ty1)/mpTex[i]->texRect().height()/(height()/mpTex[i]->rect().height()));
-                mpTex[i]->multiTexCoord(GL_TEXTURE1 + i, tx1/(t0width/mpTex[i]->rect().width()), ty1/(t0height/mpTex[i]->rect().height()));
-
+                mpTex[i]->multiTexCoord(GL_TEXTURE0 + i, tx1/(t0width/mpTex[i]->rect().width()), ty1/(t0height/mpTex[i]->rect().height()));
             }
+            pDstTex->multiTexCoord(GL_TEXTURE0 + cSrcTex, bx1, by1);
             glVertex2i(bx1, by1);
-            pDstTex->multiTexCoord(GL_TEXTURE0, bx1, by2);
+
             for(int i = 0; i < cSrcTex; i++)
             {
-//                vboxglMultiTexCoord2d(GL_TEXTURE1 + i, ((double)tx1)/mpTex[i]->texRect().width()/(width()/mpTex[i]->rect().width()),
-//                        ((double)ty2)/mpTex[i]->texRect().height()/(height()/mpTex[i]->rect().height()));
-                mpTex[i]->multiTexCoord(GL_TEXTURE1 + i, tx1/(t0width/mpTex[i]->rect().width()), ty2/(t0height/mpTex[i]->rect().height()));
-
+                mpTex[i]->multiTexCoord(GL_TEXTURE0 + i, tx1/(t0width/mpTex[i]->rect().width()), ty2/(t0height/mpTex[i]->rect().height()));
             }
+            pDstTex->multiTexCoord(GL_TEXTURE0 + cSrcTex, bx1, by2);
             glVertex2i(bx1, by2);
-            pDstTex->multiTexCoord(GL_TEXTURE0, bx2, by2);
+
             for(int i = 0; i < cSrcTex; i++)
             {
-//                vboxglMultiTexCoord2d(GL_TEXTURE1 + i, ((double)tx2)/mpTex[i]->texRect().width()/(width()/mpTex[i]->rect().width()),
-//                        ((double)ty2)/mpTex[i]->texRect().height()/(height()/mpTex[i]->rect().height()));
-                mpTex[i]->multiTexCoord(GL_TEXTURE1 + i, tx2/(t0width/mpTex[i]->rect().width()), ty2/(t0height/mpTex[i]->rect().height()));
-
+                mpTex[i]->multiTexCoord(GL_TEXTURE0 + i, tx2/(t0width/mpTex[i]->rect().width()), ty2/(t0height/mpTex[i]->rect().height()));
             }
+            pDstTex->multiTexCoord(GL_TEXTURE0 + cSrcTex, bx2, by2);
             glVertex2i(bx2, by2);
-            pDstTex->multiTexCoord(GL_TEXTURE0, bx2, by1);
+
             for(int i = 0; i < cSrcTex; i++)
             {
-//                vboxglMultiTexCoord2d(GL_TEXTURE1 + i, ((double)tx2)/mpTex[i]->texRect().width()/(width()/mpTex[i]->rect().width()),
-//                        ((double)ty1)/mpTex[i]->texRect().height()/(height()/mpTex[i]->rect().height()));
-                mpTex[i]->multiTexCoord(GL_TEXTURE1 + i, tx2/(t0width/mpTex[i]->rect().width()), ty1/(t0height/mpTex[i]->rect().height()));
-
+                mpTex[i]->multiTexCoord(GL_TEXTURE0 + i, tx2/(t0width/mpTex[i]->rect().width()), ty1/(t0height/mpTex[i]->rect().height()));
             }
+            pDstTex->multiTexCoord(GL_TEXTURE0 + cSrcTex, bx2, by1);
             glVertex2i(bx2, by1);
+
             glEnd();
 //            );
@@ -2747,25 +2746,29 @@
         if(bBindDst)
         {
-            vboxglActiveTexture(GL_TEXTURE1);
-            mpTex[0]->bind();
-            if(fourcc() == FOURCC_YV12)
-            {
-                vboxglActiveTexture(GL_TEXTURE1+1);
-                mpTex[1]->bind();
-                vboxglActiveTexture(GL_TEXTURE1 + 2);
-                mpTex[2]->bind();
-            }
-            vboxglActiveTexture(GL_TEXTURE0);
-            pPrimary->mpTex[0]->bind();
-            bInvokeMultiTex2 = true;
-        }
-        else
-        {
             if(fourcc() == FOURCC_YV12)
             {
                 vboxglActiveTexture(GL_TEXTURE1);
                 mpTex[1]->bind();
-                vboxglActiveTexture(GL_TEXTURE1 + 1);
+                vboxglActiveTexture(GL_TEXTURE1+1);
                 mpTex[2]->bind();
+
+                vboxglActiveTexture(GL_TEXTURE1+2);
+            }
+            else
+            {
+                vboxglActiveTexture(GL_TEXTURE1);
+            }
+            pPrimary->mpTex[0]->bind();
+
+            vboxglActiveTexture(GL_TEXTURE0);
+            mpTex[0]->bind();
+            bInvokeMultiTex2 = true;
+        }
+        else
+        {
+            if(fourcc() == FOURCC_YV12)
+            {
+                vboxglActiveTexture(GL_TEXTURE1);
+                mpTex[1]->bind();
                 vboxglActiveTexture(GL_TEXTURE0);
             }
@@ -2783,5 +2786,5 @@
     {
         doMultiTex2FB(&mVisibleTargRect, pPrimary->mpTex[0], &mVisibleSrcRect,
-                (fourcc() == FOURCC_YV12) ? 3 : 1);
+                (fourcc() == FOURCC_YV12) ? 2 : 1);
     }
     else
@@ -2789,5 +2792,5 @@
         if(fourcc() == FOURCC_YV12)
         {
-            doMultiTex2FB(&mVisibleTargRect, &mVisibleSrcRect, 3 );
+            doMultiTex2FB(&mVisibleTargRect, &mVisibleSrcRect, 2);
         }
         else
