Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp	(revision 55810)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp	(revision 55811)
@@ -3086,5 +3086,5 @@
                         VMSVGAFIFO_CHECK_3D_CMD_MIN_SIZE_BREAK(sizeof(*pCmd));
 
-                        rc = vmsvga3dShaderSet(pThis, pCmd->cid, pCmd->type, pCmd->shid);
+                        rc = vmsvga3dShaderSet(pThis, NULL, pCmd->cid, pCmd->type, pCmd->shid);
                         break;
                     }
Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp	(revision 55810)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp	(revision 55811)
@@ -339,5 +339,4 @@
     { /* likely */ } \
     else do { \
-        VMSVGA3D_GET_GL_ERROR(a_pContext); \
         VMSVGA3D_GL_COMPLAIN(a_pState, a_pContext, a_LogRelDetails); \
     } while (0)
@@ -504,5 +503,5 @@
     uint32_t                id;
 #ifdef VMSVGA3D_OGL_WITH_SHARED_CTX
-    uint32_t                idAssociatedContextUnused;
+    uint32_t                idWeakContextAssociation;
 #else
     uint32_t                idAssociatedContext;
@@ -536,5 +535,5 @@
     SSMFIELD_ENTRY(                 VMSVGA3DSURFACE, id),
 #ifdef VMSVGA3D_OGL_WITH_SHARED_CTX
-    SSMFIELD_ENTRY(                 VMSVGA3DSURFACE, idAssociatedContextUnused),
+    SSMFIELD_ENTRY(                 VMSVGA3DSURFACE, idWeakContextAssociation),
 #else
     SSMFIELD_ENTRY(                 VMSVGA3DSURFACE, idAssociatedContext),
@@ -635,5 +634,5 @@
 #define VMSVGA3D_UPDATE_MATERIAL        RT_BIT(6)
 
-typedef struct
+typedef struct VMSVGA3DCONTEXT
 {
     uint32_t                id;
@@ -2649,5 +2648,5 @@
     pSurface->id                    = sid;
 #ifdef VMSVGA3D_OGL_WITH_SHARED_CTX
-    pSurface->idAssociatedContextUnused = SVGA3D_INVALID_ID;
+    pSurface->idWeakContextAssociation = SVGA3D_INVALID_ID;
 #else
     pSurface->idAssociatedContext   = SVGA3D_INVALID_ID;
@@ -3896,7 +3895,12 @@
         Log(("vmsvga3dCommandPresent: rectangle %d src=(%d,%d) (%d,%d)(%d,%d)\n", i, pRect[i].srcx, pRect[i].srcy, pRect[i].x, pRect[i].y, pRect[i].x + pRect[i].w, pRect[i].y + pRect[i].h));
 
-    cid = SVGA3D_INVALID_ID;
     pContext = &pState->SharedCtx;
+# ifdef VMSVGA3D_OGL_WITH_SHARED_CTX_EXPERIMENT_1
+    if (   pSurface->idWeakContextAssociation < pState->cContexts
+        && pState->papContexts[pSurface->idWeakContextAssociation]->id == pSurface->idWeakContextAssociation)
+        pContext = pState->papContexts[pSurface->idWeakContextAssociation];
+# endif
     VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
+    cid = pContext->id;
 #else
     /* @todo stricter checks for associated context */
@@ -3917,4 +3921,5 @@
     VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
 #endif
+    VMSVGA3D_CLEAR_GL_ERRORS();
 
     /* Source surface different size? */
@@ -3970,10 +3975,10 @@
 #endif
 
-    glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTextureId);
+    VMSVGA3D_ASSERT_GL_CALL(glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTextureId), pState, pContext);
 
     oldVShader = pContext->state.shidVertex;
     oldPShader = pContext->state.shidPixel;
-    vmsvga3dShaderSet(pThis, cid, SVGA3D_SHADERTYPE_VS, SVGA_ID_INVALID);
-    vmsvga3dShaderSet(pThis, cid, SVGA3D_SHADERTYPE_PS, SVGA_ID_INVALID);
+    vmsvga3dShaderSet(pThis, pContext, cid, SVGA3D_SHADERTYPE_VS, SVGA_ID_INVALID);
+    vmsvga3dShaderSet(pThis, pContext, cid, SVGA3D_SHADERTYPE_PS, SVGA_ID_INVALID);
 
     /* Flush shader changes. */
@@ -3982,29 +3987,28 @@
 
     /* Activate the read and draw framebuffer objects. */
-    pState->ext.glBindFramebuffer(GL_READ_FRAMEBUFFER, pContext->idReadFramebuffer);
-    VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
-    pState->ext.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0 /* back buffer */);
-    VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
-
-    pState->ext.glActiveTexture(GL_TEXTURE0);
-    glEnable(GL_TEXTURE_2D);
-    glBindTexture(GL_TEXTURE_2D, pSurface->oglId.texture);
-    VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
-
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
-//    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-//    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+    VMSVGA3D_ASSERT_GL_CALL(pState->ext.glBindFramebuffer(GL_READ_FRAMEBUFFER, pContext->idReadFramebuffer), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(pState->ext.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0 /* back buffer */), pState, pContext);
+
+    VMSVGA3D_ASSERT_GL_CALL(pState->ext.glActiveTexture(GL_TEXTURE0), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glEnable(GL_TEXTURE_2D), pState, pContext);;
+    VMSVGA3D_ASSERT_GL_CALL(glBindTexture(GL_TEXTURE_2D, pSurface->oglId.texture), pState, pContext);
+
+    VMSVGA3D_ASSERT_GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR), pState, pContext);;
+
+#if 0
+    VMSVGA3D_ASSERT_GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP), pState, pContext);;
+    VMSVGA3D_ASSERT_GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP), pState, pContext);;
+#endif
 
     /* Reset the transformation matrices. */
-    glMatrixMode(GL_MODELVIEW);
-    glPushMatrix();
-    glLoadIdentity();
-    glMatrixMode(GL_PROJECTION);
-    glPushMatrix();
-    glLoadIdentity();
-    glScalef(1.0f, -1.0f, 1.0f);
-    glOrtho(0, pThis->svga.uWidth, pThis->svga.uHeight, 0, 0.0, -1.0);
+    VMSVGA3D_ASSERT_GL_CALL(glMatrixMode(GL_MODELVIEW), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glPushMatrix(), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glLoadIdentity(), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glMatrixMode(GL_PROJECTION), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glPushMatrix(), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glLoadIdentity(), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glScalef(1.0f, -1.0f, 1.0f), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glOrtho(0, pThis->svga.uWidth, pThis->svga.uHeight, 0, 0.0, -1.0), pState, pContext);
 
     for (uint32_t i = 0; i < cRects; i++)
@@ -4049,4 +4053,5 @@
 
         glBegin(GL_QUADS);
+
         /* bottom left */
         glTexCoord2f(left, bottom);
@@ -4065,23 +4070,21 @@
         glVertex2i(vertexRight, vertexBottom);
 
-        glEnd();
-        VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
+        VMSVGA3D_ASSERT_GL_CALL(glEnd(), pState, pContext);
     }
 
     /* Restore old settings. */
-    glMatrixMode(GL_PROJECTION);
-    glPopMatrix();
-    glMatrixMode(GL_MODELVIEW);
-    glPopMatrix();
-
-    //glPopAttrib();
-
-    glBindTexture(GL_TEXTURE_2D, oldTextureId);
-    vmsvga3dShaderSet(pThis, cid, SVGA3D_SHADERTYPE_VS, oldVShader);
-    vmsvga3dShaderSet(pThis, cid, SVGA3D_SHADERTYPE_PS, oldPShader);
+    VMSVGA3D_ASSERT_GL_CALL(glMatrixMode(GL_PROJECTION), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glPopMatrix(), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glMatrixMode(GL_MODELVIEW), pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(glPopMatrix(), pState, pContext);
+
+    //VMSVGA3D_ASSERT_GL_CALL(glPopAttrib(), pState, pContext);
+
+    VMSVGA3D_ASSERT_GL_CALL(glBindTexture(GL_TEXTURE_2D, oldTextureId), pState, pContext);
+    vmsvga3dShaderSet(pThis, pContext, cid, SVGA3D_SHADERTYPE_VS, oldVShader);
+    vmsvga3dShaderSet(pThis, pContext, cid, SVGA3D_SHADERTYPE_PS, oldPShader);
 
     /* Reset the frame buffer association */
-    pState->ext.glBindFramebuffer(GL_FRAMEBUFFER, pContext->idFramebuffer);
-    VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
+    VMSVGA3D_ASSERT_GL_CALL(pState->ext.glBindFramebuffer(GL_FRAMEBUFFER, pContext->idFramebuffer), pState, pContext);
 
 #else
@@ -5841,4 +5844,7 @@
             pContext = pState->papContexts[cid];
             VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
+# ifdef VMSVGA3D_OGL_WITH_SHARED_CTX_EXPERIMENT_1
+            pRenderTarget->idWeakContextAssociation = cid;
+# endif
 #else
             LogFlow(("vmsvga3dSetRenderTarget: sid=%x idAssociatedContext %#x -> %#x\n", pRenderTarget->id, pRenderTarget->idAssociatedContext, cid));
@@ -7570,7 +7576,6 @@
 }
 
-int vmsvga3dShaderSet(PVGASTATE pThis, uint32_t cid, SVGA3dShaderType type, uint32_t shid)
-{
-    PVMSVGA3DCONTEXT    pContext;
+int vmsvga3dShaderSet(PVGASTATE pThis, PVMSVGA3DCONTEXT pContext, uint32_t cid, SVGA3dShaderType type, uint32_t shid)
+{
     PVMSVGA3DSTATE      pState = (PVMSVGA3DSTATE)pThis->svga.p3dState;
     AssertReturn(pState, VERR_NO_MEMORY);
@@ -7579,11 +7584,13 @@
     Log(("vmsvga3dShaderSet cid=%x type=%s shid=%d\n", cid, (type == SVGA3D_SHADERTYPE_VS) ? "VERTEX" : "PIXEL", shid));
 
-    if (    cid >= pState->cContexts
-        ||  pState->papContexts[cid]->id != cid)
+    if (  !pContext
+        && cid < pState->cContexts
+        && pState->papContexts[cid]->id == cid)
+        pContext = pState->papContexts[cid];
+    else
     {
         Log(("vmsvga3dShaderSet invalid context id!\n"));
         return VERR_INVALID_PARAMETER;
     }
-    pContext = pState->papContexts[cid];
     VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
 
Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.h	(revision 55810)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.h	(revision 55811)
@@ -337,7 +337,7 @@
                 vmsvga3dSetViewPort(pThis, cid, &pContext->state.RectViewPort);
             if (pContext->state.u32UpdateFlags & VMSVGA3D_UPDATE_VERTEXSHADER)
-                vmsvga3dShaderSet(pThis, cid, SVGA3D_SHADERTYPE_VS, pContext->state.shidVertex);
+                vmsvga3dShaderSet(pThis, pContext, cid, SVGA3D_SHADERTYPE_VS, pContext->state.shidVertex);
             if (pContext->state.u32UpdateFlags & VMSVGA3D_UPDATE_PIXELSHADER)
-                vmsvga3dShaderSet(pThis, cid, SVGA3D_SHADERTYPE_PS, pContext->state.shidPixel);
+                vmsvga3dShaderSet(pThis, pContext, cid, SVGA3D_SHADERTYPE_PS, pContext->state.shidPixel);
         }
     }
Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp	(revision 55810)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp	(revision 55811)
@@ -249,5 +249,5 @@
 #define VMSVGA3D_UPDATE_MATERIAL        RT_BIT(6)
 
-typedef struct
+typedef struct VMSVGA3DCONTEXT
 {
     uint32_t                id;
@@ -3420,7 +3420,7 @@
                 vmsvga3dSetViewPort(pThis, cid, &pContext->state.RectViewPort);
             if (pContext->state.u32UpdateFlags & VMSVGA3D_UPDATE_VERTEXSHADER)
-                vmsvga3dShaderSet(pThis, cid, SVGA3D_SHADERTYPE_VS, pContext->state.shidVertex);
+                vmsvga3dShaderSet(pThis, pContext, cid, SVGA3D_SHADERTYPE_VS, pContext->state.shidVertex);
             if (pContext->state.u32UpdateFlags & VMSVGA3D_UPDATE_PIXELSHADER)
-                vmsvga3dShaderSet(pThis, cid, SVGA3D_SHADERTYPE_PS, pContext->state.shidPixel);
+                vmsvga3dShaderSet(pThis, pContext, cid, SVGA3D_SHADERTYPE_PS, pContext->state.shidPixel);
             /** @todo restore more state data */
 #endif /* #ifdef VMSVGA3D_DIRECT3D9_RESET */
@@ -5874,7 +5874,6 @@
 }
 
-int vmsvga3dShaderSet(PVGASTATE pThis, uint32_t cid, SVGA3dShaderType type, uint32_t shid)
-{
-    PVMSVGA3DCONTEXT    pContext;
+int vmsvga3dShaderSet(PVGASTATE pThis, PVMSVGA3DCONTEXT pContext, uint32_t cid, SVGA3dShaderType type, uint32_t shid)
+{
     PVMSVGA3DSTATE      pState = (PVMSVGA3DSTATE)pThis->svga.p3dState;
     AssertReturn(pState, VERR_NO_MEMORY);
@@ -5883,4 +5882,5 @@
     Log(("vmsvga3dShaderSet %x type=%s shid=%d\n", cid, (type == SVGA3D_SHADERTYPE_VS) ? "VERTEX" : "PIXEL", shid));
 
+    NOREF(pContext);
     if (    cid >= pState->cContexts
         ||  pState->papContexts[cid]->id != cid)
Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h	(revision 55810)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h	(revision 55811)
@@ -86,5 +86,5 @@
 int vmsvga3dShaderDefine(PVGASTATE pThis, uint32_t cid, uint32_t shid, SVGA3dShaderType type, uint32_t cbData, uint32_t *pShaderData);
 int vmsvga3dShaderDestroy(PVGASTATE pThis, uint32_t cid, uint32_t shid, SVGA3dShaderType type);
-int vmsvga3dShaderSet(PVGASTATE pThis, uint32_t cid, SVGA3dShaderType type, uint32_t shid);
+int vmsvga3dShaderSet(PVGASTATE pThis, struct VMSVGA3DCONTEXT *pContext, uint32_t cid, SVGA3dShaderType type, uint32_t shid);
 int vmsvga3dShaderSetConst(PVGASTATE pThis, uint32_t cid, uint32_t reg, SVGA3dShaderType type, SVGA3dShaderConstType ctype, uint32_t cRegisters, uint32_t *pValues);
 
