Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA-cmd.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA-cmd.cpp	(revision 86885)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA-cmd.cpp	(revision 86886)
@@ -279,30 +279,6 @@
 # ifdef VBOX_WITH_VMSVGA3D
 /*
- * Stubs for old backends.
+ * Stub for old backends.
  */
-int vmsvga3dScreenTargetBind(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen, uint32_t sid)
-{
-    RT_NOREF(pThisCC, pScreen, sid);
-    return VERR_NOT_IMPLEMENTED;
-}
-
-int vmsvga3dScreenTargetUpdate(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen, SVGA3dRect const *pRect)
-{
-    RT_NOREF(pThisCC, pScreen, pRect);
-    return VERR_NOT_IMPLEMENTED;
-}
-
-int vmsvga3dSurfaceMap(PVGASTATECC pThisCC, SVGA3dSurfaceImageId const *pImage, SVGA3dBox const *pBox, VMSVGA3D_SURFACE_MAP enmMapType, VMSVGA3D_MAPPED_SURFACE *pMap)
-{
-    RT_NOREF(pThisCC, pImage, pBox, enmMapType, pMap);
-    return VERR_NOT_IMPLEMENTED;
-}
-
-int vmsvga3dSurfaceUnmap(PVGASTATECC pThisCC, SVGA3dSurfaceImageId const *pImage, VMSVGA3D_MAPPED_SURFACE *pMap, bool fWritten)
-{
-    RT_NOREF(pThisCC, pImage, pMap, fWritten);
-    return VERR_NOT_IMPLEMENTED;
-}
-
 int vmsvga3dQueryInterface(PVGASTATECC pThisCC, char const *pszInterfaceName, void *pvInterfaceFuncs, size_t cbInterfaceFuncs)
 {
@@ -1245,5 +1221,5 @@
         {
             VMSVGA3D_MAPPED_SURFACE map;
-            rc = vmsvga3dSurfaceMap(pThisCC, &pCmd->image, &pCmd->box, VMSVGA3D_SURFACE_MAP_WRITE_DISCARD, &map);
+            rc = pSvgaR3State->pFuncsMap->pfnSurfaceMap(pThisCC, &pCmd->image, &pCmd->box, VMSVGA3D_SURFACE_MAP_WRITE_DISCARD, &map);
             if (RT_SUCCESS(rc))
             {
@@ -1271,5 +1247,5 @@
                 // vmsvga3dMapWriteBmpFile(&map, "Dynamic");
 
-                vmsvga3dSurfaceUnmap(pThisCC, &pCmd->image, &map, /* fWritten =  */true);
+                pSvgaR3State->pFuncsMap->pfnSurfaceUnmap(pThisCC, &pCmd->image, &map, /* fWritten =  */true);
             }
         }
@@ -1441,5 +1417,5 @@
             {
                 VMSVGASCREENOBJECT *pScreen = &pSvgaR3State->aScreens[pCmd->stid];
-                rc = vmsvga3dScreenTargetBind(pThisCC, pScreen, pCmd->image.sid);
+                rc = pSvgaR3State->pFuncsGBO->pfnScreenTargetBind(pThisCC, pScreen, pCmd->image.sid);
                 AssertRC(rc);
             }
@@ -1485,5 +1461,5 @@
                     {
                         /* Copy the screen target surface to the backend's screen. */
-                        vmsvga3dScreenTargetUpdate(pThisCC, pScreen, &targetRect);
+                        pSvgaR3State->pFuncsGBO->pfnScreenTargetUpdate(pThisCC, pScreen, &targetRect);
                     }
                     else if (pScreen->pvScreenBitmap)
@@ -1491,5 +1467,5 @@
                         /* Copy the screen target surface to the memory buffer. */
                         VMSVGA3D_MAPPED_SURFACE map;
-                        rc = vmsvga3dSurfaceMap(pThisCC, &entryScreenTarget.image, NULL, VMSVGA3D_SURFACE_MAP_READ, &map);
+                        rc = pSvgaR3State->pFuncsMap->pfnSurfaceMap(pThisCC, &entryScreenTarget.image, NULL, VMSVGA3D_SURFACE_MAP_READ, &map);
                         if (RT_SUCCESS(rc))
                         {
@@ -1508,5 +1484,5 @@
                             }
 
-                            vmsvga3dSurfaceUnmap(pThisCC, &entryScreenTarget.image, &map, /* fWritten =  */ false);
+                            pSvgaR3State->pFuncsMap->pfnSurfaceUnmap(pThisCC, &entryScreenTarget.image, &map, /* fWritten =  */ false);
 
                             vmsvgaR3UpdateScreen(pThisCC, pScreen, pCmd->rect.x, pCmd->rect.y, pCmd->rect.w, pCmd->rect.h);
Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA-internal.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA-internal.h	(revision 86885)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA-internal.h	(revision 86886)
@@ -190,4 +190,6 @@
 
 # ifdef VBOX_WITH_VMSVGA3D
+    VMSVGA3DBACKENDFUNCSMAP *pFuncsMap;
+    VMSVGA3DBACKENDFUNCSGBO *pFuncsGBO;
     VMSVGA3DBACKENDFUNCSDX  *pFuncsDX;
 # endif
Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp	(revision 86885)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp	(revision 86886)
@@ -5666,4 +5666,8 @@
 
 # ifdef VBOX_WITH_VMSVGA3D
+    RTMemFree(pSVGAState->pFuncsMap);
+    pSVGAState->pFuncsMap = NULL;
+    RTMemFree(pSVGAState->pFuncsGBO);
+    pSVGAState->pFuncsGBO = NULL;
     RTMemFree(pSVGAState->pFuncsDX);
     pSVGAState->pFuncsDX = NULL;
@@ -5721,4 +5725,22 @@
 
         vmsvga3dQueryInterface(pThisCC, VMSVGA3D_BACKEND_INTERFACE_NAME_DX, pSVGAState->pFuncsDX, sizeof(VMSVGA3DBACKENDFUNCSDX));
+    }
+
+    rc = vmsvga3dQueryInterface(pThisCC, VMSVGA3D_BACKEND_INTERFACE_NAME_MAP, NULL, sizeof(VMSVGA3DBACKENDFUNCSMAP));
+    if (RT_SUCCESS(rc))
+    {
+        pSVGAState->pFuncsMap = (VMSVGA3DBACKENDFUNCSMAP *)RTMemAllocZ(sizeof(VMSVGA3DBACKENDFUNCSMAP));
+        AssertReturn(pSVGAState->pFuncsMap, VERR_NO_MEMORY);
+
+        vmsvga3dQueryInterface(pThisCC, VMSVGA3D_BACKEND_INTERFACE_NAME_MAP, pSVGAState->pFuncsMap, sizeof(VMSVGA3DBACKENDFUNCSMAP));
+    }
+
+    rc = vmsvga3dQueryInterface(pThisCC, VMSVGA3D_BACKEND_INTERFACE_NAME_GBO, NULL, sizeof(VMSVGA3DBACKENDFUNCSGBO));
+    if (RT_SUCCESS(rc))
+    {
+        pSVGAState->pFuncsGBO = (VMSVGA3DBACKENDFUNCSGBO *)RTMemAllocZ(sizeof(VMSVGA3DBACKENDFUNCSGBO));
+        AssertReturn(pSVGAState->pFuncsGBO, VERR_NO_MEMORY);
+
+        vmsvga3dQueryInterface(pThisCC, VMSVGA3D_BACKEND_INTERFACE_NAME_GBO, pSVGAState->pFuncsGBO, sizeof(VMSVGA3DBACKENDFUNCSGBO));
     }
 
@@ -5755,9 +5777,10 @@
         pThis->svga.u32DeviceCaps |= SVGA_CAP_COMMAND_BUFFERS /* Enable register based command buffer submission. */
 //                                  |  SVGA_CAP_CMD_BUFFERS_2   /* Support for SVGA_REG_CMD_PREPEND_LOW/HIGH */
-//                                  |  SVGA_CAP_GBOBJECTS       /* Enable guest-backed objects and surfaces. */
                                   ;
 
 # ifdef VBOX_WITH_VMSVGA3D
         PVMSVGAR3STATE pSVGAState = pThisCC->svga.pSvgaR3State;
+        if (pSVGAState->pFuncsGBO)
+           pThis->svga.u32DeviceCaps |= SVGA_CAP_GBOBJECTS;     /* Enable guest-backed objects and surfaces. */
         if (pSVGAState->pFuncsDX)
            pThis->svga.u32DeviceCaps |= SVGA_CAP_CMD_BUFFERS_3; /* AKA SVGA_CAP_DX. Enable support for DX commands, and command buffers in a mob. */
Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win-dx.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win-dx.cpp	(revision 86885)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win-dx.cpp	(revision 86886)
@@ -893,6 +893,6 @@
 
 
-int vmsvga3dSurfaceMap(PVGASTATECC pThisCC, SVGA3dSurfaceImageId const *pImage, SVGA3dBox const *pBox,
-                       VMSVGA3D_SURFACE_MAP enmMapType, VMSVGA3D_MAPPED_SURFACE *pMap)
+static DECLCALLBACK(int) vmsvga3dSurfaceMap(PVGASTATECC pThisCC, SVGA3dSurfaceImageId const *pImage, SVGA3dBox const *pBox,
+                                            VMSVGA3D_SURFACE_MAP enmMapType, VMSVGA3D_MAPPED_SURFACE *pMap)
 {
     PVMSVGA3DSTATE pState = pThisCC->svga.p3dState;
@@ -987,5 +987,5 @@
 
 
-int vmsvga3dSurfaceUnmap(PVGASTATECC pThisCC, SVGA3dSurfaceImageId const *pImage, VMSVGA3D_MAPPED_SURFACE *pMap, bool fWritten)
+static DECLCALLBACK(int) vmsvga3dSurfaceUnmap(PVGASTATECC pThisCC, SVGA3dSurfaceImageId const *pImage, VMSVGA3D_MAPPED_SURFACE *pMap, bool fWritten)
 {
     PVMSVGA3DSTATE pState = pThisCC->svga.p3dState;
@@ -1122,5 +1122,5 @@
 
 
-int vmsvga3dScreenTargetBind(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen, uint32_t sid)
+static DECLCALLBACK(int) vmsvga3dScreenTargetBind(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen, uint32_t sid)
 {
     int rc = VINF_SUCCESS;
@@ -1173,5 +1173,5 @@
 
 
-int vmsvga3dScreenTargetUpdate(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen, SVGA3dRect const *pRect)
+static DECLCALLBACK(int) vmsvga3dScreenTargetUpdate(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen, SVGA3dRect const *pRect)
 {
     VMSVGAHWSCREEN *pHwScreen = pScreen->pHwScreen;
@@ -3117,4 +3117,38 @@
         }
     }
+    else if (RTStrCmp(pszInterfaceName, VMSVGA3D_BACKEND_INTERFACE_NAME_MAP) == 0)
+    {
+        if (cbInterfaceFuncs == sizeof(VMSVGA3DBACKENDFUNCSMAP))
+        {
+            if (pvInterfaceFuncs)
+            {
+                VMSVGA3DBACKENDFUNCSMAP *p = (VMSVGA3DBACKENDFUNCSMAP *)pvInterfaceFuncs;
+                p->pfnSurfaceMap   = vmsvga3dSurfaceMap;
+                p->pfnSurfaceUnmap = vmsvga3dSurfaceUnmap;
+            }
+        }
+        else
+        {
+            AssertFailed();
+            rc = VERR_INVALID_PARAMETER;
+        }
+    }
+    else if (RTStrCmp(pszInterfaceName, VMSVGA3D_BACKEND_INTERFACE_NAME_GBO) == 0)
+    {
+        if (cbInterfaceFuncs == sizeof(VMSVGA3DBACKENDFUNCSGBO))
+        {
+            if (pvInterfaceFuncs)
+            {
+                VMSVGA3DBACKENDFUNCSGBO *p = (VMSVGA3DBACKENDFUNCSGBO *)pvInterfaceFuncs;
+                p->pfnScreenTargetBind   = vmsvga3dScreenTargetBind;
+                p->pfnScreenTargetUpdate = vmsvga3dScreenTargetUpdate;
+            }
+        }
+        else
+        {
+            AssertFailed();
+            rc = VERR_INVALID_PARAMETER;
+        }
+    }
     else
         rc = VERR_NOT_IMPLEMENTED;
Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h	(revision 86885)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h	(revision 86886)
@@ -130,10 +130,4 @@
 int vmsvga3dQueryWait(PVGASTATE pThis, PVGASTATECC pThisCC, uint32_t cid, SVGA3dQueryType type, SVGAGuestPtr guestResult);
 
-int vmsvga3dScreenTargetBind(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen, uint32_t sid);
-int vmsvga3dScreenTargetUpdate(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen, SVGA3dRect const *pRect);
-
-int vmsvga3dSurfaceMap(PVGASTATECC pThisCC, SVGA3dSurfaceImageId const *pImage, SVGA3dBox const *pBox, VMSVGA3D_SURFACE_MAP enmMapType, VMSVGA3D_MAPPED_SURFACE *pMap);
-int vmsvga3dSurfaceUnmap(PVGASTATECC pThisCC, SVGA3dSurfaceImageId const *pImage, VMSVGA3D_MAPPED_SURFACE *pMap, bool fWritten);
-
 /* DevVGA-SVGA3d-shared.h: */
 #if defined(RT_OS_WINDOWS) && defined(IN_RING3)
@@ -271,4 +265,19 @@
 const char *vmsvga3dPrimitiveType2String(SVGA3dPrimitiveType PrimitiveType);
 #endif
+
+
+#define VMSVGA3D_BACKEND_INTERFACE_NAME_GBO "GBO"
+typedef struct
+{
+    DECLCALLBACKMEMBER(int, pfnScreenTargetBind,   (PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen, uint32_t sid));
+    DECLCALLBACKMEMBER(int, pfnScreenTargetUpdate, (PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen, SVGA3dRect const *pRect));
+} VMSVGA3DBACKENDFUNCSGBO;
+
+#define VMSVGA3D_BACKEND_INTERFACE_NAME_MAP "MAP"
+typedef struct
+{
+    DECLCALLBACKMEMBER(int, pfnSurfaceMap,   (PVGASTATECC pThisCC, SVGA3dSurfaceImageId const *pImage, SVGA3dBox const *pBox, VMSVGA3D_SURFACE_MAP enmMapType, VMSVGA3D_MAPPED_SURFACE *pMap));
+    DECLCALLBACKMEMBER(int, pfnSurfaceUnmap, (PVGASTATECC pThisCC, SVGA3dSurfaceImageId const *pImage, VMSVGA3D_MAPPED_SURFACE *pMap, bool fWritten));
+} VMSVGA3DBACKENDFUNCSMAP;
 
 #define VMSVGA3D_BACKEND_INTERFACE_NAME_DX "DX"
