Index: /trunk/src/VBox/Additions/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Additions/Makefile.kmk	(revision 75444)
+++ /trunk/src/VBox/Additions/Makefile.kmk	(revision 75445)
@@ -66,8 +66,8 @@
  endif
  ifeq ($(KBUILD_TARGET),win)
-  include $(PATH_SUB_CURRENT)/WINNT/Makefile.kmk
   ifdef VBOX_WITH_MESA3D
    include $(PATH_SUB_CURRENT)/3D/Makefile.kmk
   endif
+  include $(PATH_SUB_CURRENT)/WINNT/Makefile.kmk
  endif
  ifeq ($(KBUILD_TARGET),darwin)
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/Makefile.kmk	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/Makefile.kmk	(revision 75445)
@@ -87,4 +87,15 @@
    	$(PATH_TARGET)/VBoxWddmCat.dir/VBoxDispD3D-x86.dll
   endif # VBOXWDDM_WITH_DISPD3D
+
+  ifdef VBOX_WITH_MESA3D
+   VBoxWddm-inf_SOURCES += \
+   	$(PATH_TARGET)/VBoxWddmCat.dir/VBoxNine.dll \
+   	$(PATH_TARGET)/VBoxWddmCat.dir/VBoxSVGA.dll \
+   	$(PATH_TARGET)/VBoxWddmCat.dir/VBoxGL.dll
+   VBoxWddm-inf_SOURCES.amd64 += \
+   	$(PATH_TARGET)/VBoxWddmCat.dir/VBoxNine-x86.dll \
+   	$(PATH_TARGET)/VBoxWddmCat.dir/VBoxSVGA-x86.dll \
+   	$(PATH_TARGET)/VBoxWddmCat.dir/VBoxGL-x86.dll
+  endif
 
   ifdef VBOXWDDM_WITH_GL
@@ -117,4 +128,5 @@
 
  VBOXWDDM_EDIT_INF_DISPD3D_FN_ARG = $(if $(VBOXWDDM_WITH_DISPD3D),-e 's/^;dispd3d  *//', -e '/^;dispd3d /d')
+ VBOXWDDM_EDIT_INF_MESA3D_FN_ARG = $(if $(VBOX_WITH_MESA3D),-e 's/^;mesa3d  *//', -e '/^;mesa3d /d')
  VBOXWDDM_EDIT_INF_GL_FN_ARG      = $(if $(VBOXWDDM_WITH_GL),-e 's/^;gl  *//', -e '/^;gl /d')
  # Depends on VBOXWDDM_WITH_GL. ";icd" prefix is used for telling which lines are for OpenGL ICD
@@ -124,5 +136,5 @@
 		$(PATH_SUB_CURRENT)/mp/wddm/VBoxWddm.inf $(MAKEFILE_CURRENT) | $$(dir $$@)
 	$(call MSG_GENERATE,VBoxWddm-inf,$@,$<)
-	$(call VBOX_EDIT_INF_FN,$<,$@ $(VBOXWDDM_EDIT_INF_DISPD3D_FN_ARG) $(VBOXWDDM_EDIT_INF_GL_FN_ARG) $(VBOXWDDM_EDIT_INF_ICD_FN_ARG))
+	$(call VBOX_EDIT_INF_FN,$<,$@ $(VBOXWDDM_EDIT_INF_DISPD3D_FN_ARG) $(VBOXWDDM_EDIT_INF_MESA3D_FN_ARG) $(VBOXWDDM_EDIT_INF_GL_FN_ARG) $(VBOXWDDM_EDIT_INF_ICD_FN_ARG))
 
  $(PATH_TARGET)/VBoxWddmCat.dir/VBoxWddm.sys: $$(VBoxWddm_1_TARGET) | $$(dir $$@)
@@ -138,4 +150,22 @@
   endif
  endif # VBOXWDDM_WITH_DISPD3D
+
+ ifdef VBOX_WITH_MESA3D
+  $(PATH_TARGET)/VBoxWddmCat.dir/VBoxNine.dll: $$(VBoxNine_1_TARGET) | $$(dir $$@)
+	$(INSTALL) -m 644 $< $(@D)
+  $(PATH_TARGET)/VBoxWddmCat.dir/VBoxSVGA.dll: $$(VBoxSVGA_1_TARGET) | $$(dir $$@)
+	$(INSTALL) -m 644 $< $(@D)
+  $(PATH_TARGET)/VBoxWddmCat.dir/VBoxGL.dll: $$(VBoxGL_1_TARGET) | $$(dir $$@)
+	$(INSTALL) -m 644 $< $(@D)
+
+  ifeq ($(KBUILD_TARGET_ARCH),amd64)
+   $(PATH_TARGET)/VBoxWddmCat.dir/VBoxNine-x86.dll: $$(VBoxNine-x86_1_TARGET) | $$(dir $$@)
+	$(INSTALL) -m 644 $< $(@D)
+   $(PATH_TARGET)/VBoxWddmCat.dir/VBoxSVGA-x86.dll: $$(VBoxSVGA-x86_1_TARGET) | $$(dir $$@)
+	$(INSTALL) -m 644 $< $(@D)
+   $(PATH_TARGET)/VBoxWddmCat.dir/VBoxGL-x86.dll: $$(VBoxGL-x86_1_TARGET) | $$(dir $$@)
+	$(INSTALL) -m 644 $< $(@D)
+  endif
+ endif
 
  ifdef VBOXWDDM_WITH_GL
@@ -202,4 +232,12 @@
 		$(if $(VBOXWDDM_WITH_DISPD3D), $(PATH_TARGET)/VBoxWddmCat.dir/VBoxDispD3D.dll, ) \
 		$(if $(VBOXWDDM_WITH_DISPD3D), $(if-expr "$(KBUILD_TARGET_ARCH)" == "amd64", $(PATH_TARGET)/VBoxWddmCat.dir/VBoxDispD3D-x86.dll, ), ) \
+		$(if $(VBOX_WITH_MESA3D), \
+			$(PATH_TARGET)/VBoxWddmCat.dir/VBoxNine.dll \
+			$(PATH_TARGET)/VBoxWddmCat.dir/VBoxSVGA.dll \
+			$(PATH_TARGET)/VBoxWddmCat.dir/VBoxGL.dll \
+			$(if-expr "$(KBUILD_TARGET_ARCH)" == "amd64", \
+				$(PATH_TARGET)/VBoxWddmCat.dir/VBoxNine-x86.dll \
+				$(PATH_TARGET)/VBoxWddmCat.dir/VBoxSVGA-x86.dll \
+				$(PATH_TARGET)/VBoxWddmCat.dir/VBoxGL-x86.dll, ), ) \
 		$(if $(VBOXWDDM_WITH_GL),  $(PATH_TARGET)/VBoxWddmCat.dir/VBoxOGL.dll \
 					   $(PATH_TARGET)/VBoxWddmCat.dir/VBoxD3D9wddm.dll \
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h	(revision 75445)
@@ -263,4 +263,8 @@
     /* context created by VBoxTray to handle seamless operations */
     VBOXWDDM_CONTEXT_TYPE_CUSTOM_DISPIF_SEAMLESS
+#ifdef VBOX_WITH_MESA3D
+    /* Gallium driver context. */
+    , VBOXWDDM_CONTEXT_TYPE_GA_3D
+#endif
 } VBOXWDDM_CONTEXT_TYPE;
 
@@ -283,4 +287,11 @@
             uint64_t u64UmInfo;
         } vbox;
+#ifdef VBOX_WITH_MESA3D
+        struct
+        {
+            /* VBOXWDDM_F_GA_CONTEXT_* */
+            uint32_t u32Flags;
+        } vmsvga;
+#endif
     } u;
 } VBOXWDDM_CREATECONTEXT_INFO, *PVBOXWDDM_CREATECONTEXT_INFO;
@@ -506,4 +517,142 @@
 } VBOXDISPIFESCAPE_CRHGSMICTLCON_CALL, *PVBOXDISPIFESCAPE_CRHGSMICTLCON_CALL;
 
+#ifdef VBOX_WITH_MESA3D
+
+#define VBOXWDDM_F_GA_CONTEXT_EXTENDED 0x00000001
+#define VBOXWDDM_F_GA_CONTEXT_VGPU10   0x00000002
+
+#define VBOXESC_GAGETCID            0xA0000002
+#define VBOXESC_GAREGION            0xA0000003
+#define VBOXESC_GAPRESENT           0xA0000004
+#define VBOXESC_GASURFACEDEFINE     0xA0000005
+#define VBOXESC_GASURFACEDESTROY    0xA0000006
+#define VBOXESC_GASHAREDSID         0xA0000008
+#define VBOXESC_GAFENCECREATE       0xA0000020
+#define VBOXESC_GAFENCEQUERY        0xA0000021
+#define VBOXESC_GAFENCEWAIT         0xA0000022
+#define VBOXESC_GAFENCEUNREF        0xA0000023
+
+/* Get Gallium context id (cid) of the WDDM context. */
+typedef struct VBOXDISPIFESCAPE_GAGETCID
+{
+    VBOXDISPIFESCAPE EscapeHdr;
+    uint32_t u32Cid;
+} VBOXDISPIFESCAPE_GAGETCID;
+
+/* Create or delete a Guest Memory Region (GMR). */
+#define GA_REGION_CMD_CREATE  0
+#define GA_REGION_CMD_DESTROY 1
+typedef struct VBOXDISPIFESCAPE_GAREGION
+{
+    VBOXDISPIFESCAPE EscapeHdr;
+    uint32_t u32Command;
+    uint32_t u32GmrId;
+    uint32_t u32NumPages;
+    uint32_t u32Reserved;
+    uint64_t u64UserAddress;
+} VBOXDISPIFESCAPE_GAREGION;
+
+/* Debug helper. Present the specified surface by copying to the guest screen VRAM. */
+typedef struct VBOXDISPIFESCAPE_GAPRESENT
+{
+    VBOXDISPIFESCAPE EscapeHdr;
+    uint32_t u32Sid;
+    uint32_t u32Width;
+    uint32_t u32Height;
+} VBOXDISPIFESCAPE_GAPRESENT;
+
+/* Create a host surface. */
+typedef struct VBOXDISPIFESCAPE_GASURFACEDEFINE
+{
+    VBOXDISPIFESCAPE EscapeHdr;
+    uint32_t u32Sid; /* Returned surface id. */
+    uint32_t cbReq;  /* Size of data after cSizes field. */
+    uint32_t cSizes; /* Number of GASURFSIZE structures. */
+    /* GASURFCREATE */
+    /* GASURFSIZE[cSizes] */
+} VBOXDISPIFESCAPE_GASURFACEDEFINE;
+
+/* Delete a host surface. */
+typedef struct VBOXDISPIFESCAPE_GASURFACEDESTROY
+{
+    VBOXDISPIFESCAPE EscapeHdr;
+    uint32_t u32Sid;
+} VBOXDISPIFESCAPE_GASURFACEDESTROY;
+
+/* Inform the miniport that 'u32Sid' actually maps to 'u32SharedSid'.
+ * If 'u32SharedSid' is ~0, then remove the mapping.
+ */
+typedef struct VBOXDISPIFESCAPE_GASHAREDSID
+{
+    VBOXDISPIFESCAPE EscapeHdr;
+    uint32_t u32Sid;
+    uint32_t u32SharedSid;
+} VBOXDISPIFESCAPE_GASHAREDSID;
+
+/* Create a user mode fence object. */
+typedef struct VBOXDISPIFESCAPE_GAFENCECREATE
+{
+    VBOXDISPIFESCAPE EscapeHdr;
+
+    /* IN: The miniport's handle of the fence.
+     * Assigned by the miniport. Not DXGK fence id!
+     */
+    uint32_t u32FenceHandle;
+} VBOXDISPIFESCAPE_GAFENCECREATE;
+
+/* Query a user mode fence object state. */
+#define GA_FENCE_STATUS_NULL      0 /* Fence not found */
+#define GA_FENCE_STATUS_IDLE      1
+#define GA_FENCE_STATUS_SUBMITTED 2
+#define GA_FENCE_STATUS_SIGNALED  3
+typedef struct VBOXDISPIFESCAPE_GAFENCEQUERY
+{
+    VBOXDISPIFESCAPE EscapeHdr;
+
+    /* IN: The miniport's handle of the fence.
+     * Assigned by the miniport. Not DXGK fence id!
+     */
+    uint32_t u32FenceHandle;
+
+    /* OUT: The miniport's sequence number associated with the command buffer.
+     */
+    uint32_t u32SubmittedSeqNo;
+
+    /* OUT: The miniport's sequence number associated with the last command buffer completed on host.
+     */
+    uint32_t u32ProcessedSeqNo;
+
+    /* OUT: GA_FENCE_STATUS_*. */
+    uint32_t u32FenceStatus;
+} VBOXDISPIFESCAPE_GAFENCEQUERY;
+
+/* Wait on a user mode fence object. */
+typedef struct VBOXDISPIFESCAPE_GAFENCEWAIT
+{
+    VBOXDISPIFESCAPE EscapeHdr;
+
+    /* IN: The miniport's handle of the fence.
+     * Assigned by the miniport. Not DXGK fence id!
+     */
+    uint32_t u32FenceHandle;
+
+    /* IN: Timeout in microseconds.
+     */
+    uint32_t u32TimeoutUS;
+} VBOXDISPIFESCAPE_GAFENCEWAIT;
+
+/* Delete a user mode fence object. */
+typedef struct VBOXDISPIFESCAPE_GAFENCEUNREF
+{
+    VBOXDISPIFESCAPE EscapeHdr;
+
+    /* IN: The miniport's handle of the fence.
+     * Assigned by the miniport. Not DXGK fence id!
+     */
+    uint32_t u32FenceHandle;
+} VBOXDISPIFESCAPE_GAFENCEUNREF;
+
+#include <VBoxGaHWInfo.h>
+#endif /* VBOX_WITH_MESA3D */
 
 /* D3DDDICB_QUERYADAPTERINFO::pPrivateDriverData */
@@ -523,4 +672,11 @@
             uint32_t    u32VBox3DCaps;   /* CR_VBOX_CAP_* */
         } vbox;
+#ifdef VBOX_WITH_MESA3D
+        struct
+        {
+            /* VBOXVIDEO_HWTYPE_VMSVGA */
+            VBOXGAHWINFO HWInfo;
+        } vmsvga;
+#endif
     } u;
 } VBOXWDDM_QAI;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/Makefile.kmk	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/Makefile.kmk	(revision 75445)
@@ -18,4 +18,10 @@
 SUB_DEPTH = ../../../../../../..
 include $(KBUILD_PATH)/subheader.kmk
+
+ifdef VBOX_WITH_MESA3D
+ ifndef VBOX_MESA3D_CONFIG_KMK_INCLUDED
+  include $(PATH_ROOT)/src/VBox/Additions/3D/Config.kmk
+ endif
+endif
 
 #
@@ -135,4 +141,31 @@
 	$(VBOX_PATH_ADDITIONS_LIB)/VBoxCrHgsmi$(VBOX_SUFF_LIB)
 
+ifdef VBOX_WITH_MESA3D
+VBoxDispD3D_DEFS     += VBOX_WITH_MESA3D
+VBoxDispD3D_INCS     += \
+	$(VBOX_PATH_MESA)/src/gallium/include \
+	$(VBOX_PATH_MESA)/src \
+	$(VBOX_PATH_MESA)/include/c99 \
+	$(VBOX_PATH_MESA)/include \
+	$(VBOX_PATH_3D)/win/include \
+	$(VBOX_PATH_VMSVGA_INC)
+VBoxDispD3D_SOURCES  += \
+	wddm/gallium/GaDrvEnvWddm.cpp \
+	wddm/gallium/GaWddm.cpp \
+	wddm/gallium/GaDdi.cpp \
+	wddm/gallium/Present.cpp \
+	wddm/gallium/VBoxGallium.cpp \
+	wddm/gallium/VBoxGaD3DDevice9Ex.cpp \
+	wddm/gallium/VBoxD3DAdapter9.c
+
+ ifdef VBOX_WITH_MESA3D_D3DTEST
+VBoxDispD3D_DEFS     += VBOX_WITH_MESA3D_D3DTEST
+VBoxDispD3D_SOURCES  += \
+	wddm/gallium/test/d3dhlp.cpp \
+	wddm/gallium/test/d3d9render.cpp \
+	wddm/gallium/GaDrvTest.cpp
+ endif
+endif
+
 #
 # 64-bit systems needs a 32-bit version of VBoxDispD3D.
@@ -165,4 +198,7 @@
 	$(PATH_ROOT)/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/shared \
 	$(VBOX_GRAPHICS_INCS)
+ifdef VBOX_WITH_MESA3D
+VBoxCrHgsmi_INCS     += $(VBOX_PATH_3D)/win/include
+endif
 VBoxCrHgsmi_SOURCES     = \
 	wddm/VBoxCrHgsmi.cpp \
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 75445)
@@ -5804,4 +5804,11 @@
             if (pDevice->pAdapter->enmHwType == VBOXVIDEO_HWTYPE_VBOX)
                 pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9Term((IDirect3DDevice9Ex *)pDevice->pDevice9If);
+#ifdef VBOX_WITH_MESA3D
+            else if (pDevice->pAdapter->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+            {
+                pDevice->pDevice9If->Release();
+                pDevice->pDevice9If = NULL;
+            }
+#endif
         }
     }
@@ -6350,4 +6357,37 @@
         pCreateData->pDeviceFuncs->pfnRename = NULL; //vboxWddmDDevRename;
 
+#ifdef VBOX_WITH_MESA3D
+        /** @todo For now just override functions which are already implemented for Gallium backend.
+         * The plan is to have only OpenAdapter as common function between old Chromium and new Gallium code.
+         * Adapter and device callbacks will be reimplemented for Gallium, because this will simplify
+         * the Gallium-only code and keep the old code unchanged.
+         * Currently the common callbacks do things which Gallium does not need: vboxWddmDal*, etc.
+         *
+         * See gallium\GaDdi.h for list of GaDdi* functions which are already implemented.
+         */
+        if (pAdapter->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+        {
+            pDevice->pfnCreateDirect3DDevice = GaD3DIfDeviceCreate;
+            pDevice->pfnCreateSharedPrimary  = GaD3DIfCreateSharedPrimary;
+
+            pCreateData->pDeviceFuncs->pfnDrawPrimitive          = GaDdiDrawPrimitive;
+            pCreateData->pDeviceFuncs->pfnDrawIndexedPrimitive   = GaDdiDrawIndexedPrimitive;
+            pCreateData->pDeviceFuncs->pfnDrawPrimitive2         = GaDdiDrawPrimitive2;
+            pCreateData->pDeviceFuncs->pfnDrawIndexedPrimitive2  = GaDdiDrawIndexedPrimitive2;
+            pCreateData->pDeviceFuncs->pfnBlt                    = GaDdiBlt;
+            pCreateData->pDeviceFuncs->pfnTexBlt                 = GaDdiTexBlt;
+            pCreateData->pDeviceFuncs->pfnVolBlt                 = GaDdiVolBlt;
+            pCreateData->pDeviceFuncs->pfnFlush                  = GaDdiFlush;
+            pCreateData->pDeviceFuncs->pfnPresent                = GaDdiPresent;
+            pCreateData->pDeviceFuncs->pfnLock                   = GaDdiLock;
+            pCreateData->pDeviceFuncs->pfnUnlock                 = GaDdiUnlock;
+            pCreateData->pDeviceFuncs->pfnCreateVertexShaderFunc = GaDdiCreateVertexShaderFunc;
+            pCreateData->pDeviceFuncs->pfnCreatePixelShader      = GaDdiCreatePixelShader;
+            pCreateData->pDeviceFuncs->pfnCreateResource         = GaDdiCreateResource;
+            pCreateData->pDeviceFuncs->pfnDestroyResource        = GaDdiDestroyResource;
+            pCreateData->pDeviceFuncs->pfnOpenResource           = GaDdiOpenResource;
+        }
+#endif
+
         VBOXDISPPROFILE_DDI_INIT_DEV(pDevice);
 #ifdef VBOX_WDDMDISP_WITH_PROFILE
@@ -6371,5 +6411,15 @@
                     VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice);
 
+#ifdef VBOX_WITH_MESA3D
+                    if (pAdapter->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+                    {
+                        RT_ZERO(pDevice->DefaultContext);
+                        hr = S_OK;
+                    }
+                    else
+                        hr = vboxDispCmCtxCreate(pDevice, &pDevice->DefaultContext);
+#else
                     hr = vboxDispCmCtxCreate(pDevice, &pDevice->DefaultContext);
+#endif
                     Assert(hr == S_OK);
                     if (hr == S_OK)
@@ -6460,4 +6510,13 @@
     }
 
+#if defined(VBOX_WITH_MESA3D) && defined(VBOX_WITH_MESA3D_D3DTEST)
+    /* Built-in gallium backend test for early development stages.
+     * Use it only with kernel debugger attached to the VM.
+     */
+    extern void GaDrvTest(IGalliumStack *pGalliumStack, PVBOXWDDMDISP_DEVICE pDevice);
+    if (SUCCEEDED(hr))
+       GaDrvTest(pAdapter->D3D.pGalliumStack, pDevice);
+#endif
+
     vboxVDbgPrint(("<== "__FUNCTION__", hAdapter(0x%p)\n", hAdapter));
 
@@ -6574,4 +6633,9 @@
     if (pAdapter->enmHwType == VBOXVIDEO_HWTYPE_VBOX)
         pAdapter->u32VBox3DCaps = pAdapterInfo->u.vbox.u32VBox3DCaps;
+#ifdef VBOX_WITH_MESA3D
+    /** @todo Remove the hack. u32VBox3DCaps should not be used with Gallium. */
+    else if (pAdapter->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+        pAdapter->u32VBox3DCaps = CR_VBOX_CAP_TEX_PRESENT | CR_VBOX_CAP_CMDVBVA;
+#endif
     pAdapter->AdapterInfo = *pAdapterInfo;
 #ifdef VBOX_WITH_VIDEOHWACCEL
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h	(revision 75445)
@@ -297,4 +297,7 @@
     VBOXWDDM_SURFACE_DESC SurfDesc;
     PVBOXWDDMDISP_SWAPCHAIN pSwapchain;
+#ifdef VBOX_WITH_MESA3D
+    uint32_t hostID;
+#endif
 } VBOXWDDMDISP_ALLOCATION, *PVBOXWDDMDISP_ALLOCATION;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp	(revision 75445)
@@ -1257,4 +1257,8 @@
 }
 
+#ifdef VBOX_WITH_MESA3D
+HRESULT GaWddmD3DBackendOpen(PVBOXWDDMDISP_D3D pD3D, VBOXWDDM_QAI const *pAdapterInfo);
+#endif
+
 static HRESULT vboxDispD3DGlobalDoOpen(PVBOXWDDMDISP_D3D pD3D, VBOXWDDM_QAI const *pAdapterInfo)
 {
@@ -1264,4 +1268,8 @@
     if (pAdapterInfo->enmHwType == VBOXVIDEO_HWTYPE_VBOX)
         hr = vboxDispD3DGlobalDoOpenWine(pD3D);
+#ifdef VBOX_WITH_MESA3D
+    else if (pAdapterInfo->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+        hr = GaWddmD3DBackendOpen(pD3D, pAdapterInfo);
+#endif
     else
         hr = E_FAIL;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h	(revision 75445)
@@ -18,4 +18,8 @@
 #ifndef ___VBoxDispD3DIf_h___
 #define ___VBoxDispD3DIf_h___
+
+#ifdef VBOX_WITH_MESA3D
+#include "gallium/VBoxGallium.h"
+#endif
 
 /* D3D headers */
@@ -91,4 +95,8 @@
     VBOXDISPD3D D3D;
 
+#ifdef VBOX_WITH_MESA3D
+    /* Gallium backend. */
+    IGalliumStack *pGalliumStack;
+#endif
 } VBOXWDDMDISP_D3D;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp	(revision 75445)
@@ -333,4 +333,9 @@
     if (Query.enmHwType == VBOXVIDEO_HWTYPE_VBOX)
         *pu32Caps = Query.u.vbox.u32VBox3DCaps;
+#ifdef VBOX_WITH_MESA3D
+    /** @todo Remove the hack. u32VBox3DCaps should not be used with Gallium. */
+    else if (Query.enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+        *pu32Caps = CR_VBOX_CAP_TEX_PRESENT | CR_VBOX_CAP_CMDVBVA;
+#endif
     else
         *pu32Caps = 0;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/Makefile.kmk	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/Makefile.kmk	(revision 75445)
@@ -18,4 +18,10 @@
 SUB_DEPTH = ../../../../../../..
 include $(KBUILD_PATH)/subheader.kmk
+
+ifdef VBOX_WITH_MESA3D
+ ifndef VBOX_MESA3D_CONFIG_KMK_INCLUDED
+  include $(PATH_ROOT)/src/VBox/Additions/3D/Config.kmk
+ endif
+endif
 
 #
@@ -162,4 +168,19 @@
  	$(PATH_SDK_$(VBOX_WINDDK_GST_W8)_LIB)/memcmp.lib
 
+ ifdef VBOX_WITH_MESA3D
+  VBoxWddm_DEFS           += VBOX_WITH_MESA3D
+  VBoxWddm_DEFS           += __STDC_VERSION__=0    # for mesa include/c99_compat.h
+  VBoxWddm_DEFS           += WIN9X_COMPAT_SPINLOCK # to avoid multiple KeInitializeSpinLock on amd64
+  VBoxWddm_INCS           += \
+  	$(VBOX_PATH_3D)/win/include \
+  	$(VBOX_PATH_VMSVGA_INC)
+  VBoxWddm_SOURCES        += \
+  	wddm/gallium/Svga.cpp \
+  	wddm/gallium/SvgaCmd.cpp \
+  	wddm/gallium/SvgaFifo.cpp \
+  	wddm/gallium/SvgaHw.cpp \
+  	wddm/gallium/VBoxMPGaWddm.cpp
+ endif
+
 endif # VBOX_WITH_WDDM
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h	(revision 75445)
@@ -41,6 +41,17 @@
     ULONG cbVRAM;
     ULONG ulApertureSize;
+#ifdef VBOX_WITH_MESA3D
+    PHYSICAL_ADDRESS phFIFO;
+    ULONG cbFIFO;
+    PHYSICAL_ADDRESS phIO;
+    ULONG cbIO;
+#endif
 } VBOXWDDM_HWRESOURCES, *PVBOXWDDM_HWRESOURCES;
-#endif
+
+#ifdef VBOX_WITH_MESA3D
+typedef struct VBOXWDDM_EXT_GA *PVBOXWDDM_EXT_GA;
+#endif
+
+#endif /* VBOX_WDDM_MINIPORT */
 
 #define VBOXMP_MAX_VIDEO_MODES 128
@@ -217,4 +228,8 @@
 #endif
 
+#ifdef VBOX_WITH_MESA3D
+   PVBOXWDDM_EXT_GA pGa;                       /* Pointer to Gallium backend data. */
+#endif
+
 } VBOXMP_DEVEXT, *PVBOXMP_DEVEXT;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 75445)
@@ -45,7 +45,12 @@
 #endif
 
+#ifndef VBOX_WITH_MESA3D
 /* one page size */
 #define VBOXWDDM_C_DMA_BUFFER_SIZE         0x1000
 #define VBOXWDDM_C_DMA_PRIVATEDATA_SIZE    0x4000
+#else
+#define VBOXWDDM_C_DMA_BUFFER_SIZE         0x10000
+#define VBOXWDDM_C_DMA_PRIVATEDATA_SIZE    0x8000
+#endif
 #define VBOXWDDM_C_ALLOC_LIST_SIZE         0xc00
 #define VBOXWDDM_C_PATH_LOCATION_LIST_SIZE 0xc00
@@ -279,4 +284,7 @@
     VBOXVIDEOCM_CTX CmContext;
     VBOXVIDEOCM_ALLOC_CONTEXT AllocContext;
+#ifdef VBOX_WITH_MESA3D
+    uint32_t u32Cid;               /* SVGA context id of this context. */
+#endif
 } VBOXWDDM_CONTEXT, *PVBOXWDDM_CONTEXT;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 75445)
@@ -32,4 +32,8 @@
 #include <VBoxVideoVBE.h>
 #include <VBox/Version.h>
+
+#ifdef VBOX_WITH_MESA3D
+#include "gallium/VBoxMPGaWddm.h"
+#endif
 
 #include <stdio.h>
@@ -759,10 +763,25 @@
                    {
                        case CmResourceTypePort:
+#ifdef VBOX_WITH_MESA3D
+                           AssertBreak(pHwResources->phIO.QuadPart == 0);
+                           pHwResources->phIO = pPRc->u.Port.Start;
+                           pHwResources->cbIO = pPRc->u.Port.Length;
+#endif
                            break;
                        case CmResourceTypeInterrupt:
                            break;
                        case CmResourceTypeMemory:
+#ifdef VBOX_WITH_MESA3D
+                           if (pHwResources->phVRAM.QuadPart)
+                           {
+                               AssertBreak(pHwResources->phFIFO.QuadPart == 0);
+                               pHwResources->phFIFO = pPRc->u.Memory.Start;
+                               pHwResources->cbFIFO = pPRc->u.Memory.Length;
+                               break;
+                           }
+#else
                            /* we assume there is one memory segment */
                            AssertBreak(pHwResources->phVRAM.QuadPart == 0);
+#endif
                            pHwResources->phVRAM = pPRc->u.Memory.Start;
                            Assert(pHwResources->phVRAM.QuadPart != 0);
@@ -826,4 +845,8 @@
         pDevExt->f3DEnabled = VBoxMpCrCtlConIs3DSupported();
     }
+    else if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+    {
+        pDevExt->f3DEnabled = f3DSupported;
+    }
     else
     {
@@ -1172,4 +1195,15 @@
 #endif
                 }
+#ifdef VBOX_WITH_MESA3D
+                else if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+                {
+                    if (pDevExt->f3DEnabled)
+                    {
+                        pDevExt->fTexPresentEnabled = TRUE;
+                        pDevExt->fCmdVbvaEnabled = TRUE;
+                        pDevExt->fComplexTopologiesEnabled = FALSE; /** @todo Enable after implementing multimonitor support. */
+                    }
+                }
+#endif /* VBOX_WITH_MESA3D */
                 else
                 {
@@ -1331,4 +1365,20 @@
 
                     VBoxWddmVModesInit(pDevExt);
+
+#ifdef VBOX_WITH_MESA3D
+                    if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+                    {
+                        LOGREL(("WDDM: VRAM %#RX64/%#RX32, FIFO %#RX64/%#RX32, IO %#RX64/%#RX32",
+                                pDevExt->HwResources.phVRAM.QuadPart, pDevExt->HwResources.cbVRAM,
+                                pDevExt->HwResources.phFIFO.QuadPart, pDevExt->HwResources.cbFIFO,
+                                pDevExt->HwResources.phIO.QuadPart, pDevExt->HwResources.cbIO));
+
+                        Status = GaAdapterStart(pDevExt);
+                        if (Status == STATUS_SUCCESS)
+                        { /* likely */ }
+                        else
+                            LOGREL(("WDDM: GaAdapterStart failed Status(0x%x)", Status));
+                    }
+#endif
                 }
                 else
@@ -1375,4 +1425,11 @@
     PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)MiniportDeviceContext;
     NTSTATUS Status = STATUS_SUCCESS;
+
+#ifdef VBOX_WITH_MESA3D
+     if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+     {
+         GaAdapterStop(pDevExt);
+     }
+#endif
 
 #ifdef VBOX_WITH_CROGL
@@ -1522,9 +1579,20 @@
     PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)MiniportDeviceContext;
     BOOLEAN bOur = FALSE;
+#ifdef VBOX_WITH_MESA3D
+    BOOLEAN bSvga = FALSE;
+    if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+    {
+        bSvga = GaDxgkDdiInterruptRoutine(MiniportDeviceContext, MessageNumber);
+    }
+#endif
     bool bNeedDpc = FALSE;
     if (!VBoxCommonFromDeviceExt(pDevExt)->hostCtx.pfHostFlags) /* If HGSMI is enabled at all. */
     {
         WARN(("ISR called with hgsmi disabled!"));
+#ifdef VBOX_WITH_MESA3D
+        return bSvga;
+#else
         return FALSE;
+#endif
     }
 
@@ -1537,5 +1605,5 @@
 
     uint32_t flags = VBoxCommonFromDeviceExt(pDevExt)->hostCtx.pfHostFlags->u32HostFlags;
-    bOur = (flags & HGSMIHOSTFLAGS_IRQ);
+    bOur = RT_BOOL(flags & HGSMIHOSTFLAGS_IRQ);
 
     if (bOur)
@@ -1649,5 +1717,9 @@
         pDevExt->u.primary.DxgkInterface.DxgkCbQueueDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle);
 
+#ifdef VBOX_WITH_MESA3D
+    return bSvga || bOur;
+#else
     return bOur;
+#endif
 }
 #endif
@@ -1899,4 +1971,11 @@
     pDevExt->u.primary.DxgkInterface.DxgkCbNotifyDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle);
 
+#ifdef VBOX_WITH_MESA3D
+    if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+    {
+        GaDxgkDdiDpcRoutine(MiniportDeviceContext);
+    }
+#endif
+
     if (ASMAtomicReadU32(&pDevExt->fCompletingCommands))
     {
@@ -2259,4 +2338,18 @@
                 /** @todo this correlates with pCaps->SchedulingCaps.MultiEngineAware */
                 pCaps->GpuEngineTopology.NbAsymetricProcessingNodes = VBOXWDDM_NUM_NODES;
+#ifdef VBOX_WITH_MESA3D
+                if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+                {
+                    /* The Gallium node has NodeOrdinal == 0, because:
+                     *   GDI context is created with it;
+                     *   we generate commands for the context;
+                     *   there seems to be no easy way to distinguish which node a fence was completed for.
+                     *
+                     * GDI context is used for example for copying between D3DKMDT_STANDARDALLOCATION_SHADOWSURFACE
+                     * and D3DKMDT_STANDARDALLOCATION_SHAREDPRIMARYSURFACE.
+                     */
+                    pCaps->GpuEngineTopology.NbAsymetricProcessingNodes = 1;
+                }
+#endif
 
                 if (VBoxQueryWinVersion(NULL) >= WINVERSION_8)
@@ -2343,4 +2436,9 @@
 #endif
                     }
+#ifdef VBOX_WITH_MESA3D
+                    else if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+                        GaQueryInfo(pDevExt->pGa, pDevExt->enmHwType, &pQAI->u.vmsvga.HWInfo);
+#endif
+
 #ifdef VBOX_WITH_VIDEOHWACCEL
                     pQAI->cInfos = VBoxCommonFromDeviceExt(pDevExt)->cDisplays;
@@ -2409,4 +2507,15 @@
 
     pCreateDevice->pInfo = NULL;
+
+#ifdef VBOX_WITH_MESA3D
+     if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+     {
+         Status = GaDeviceCreate(pDevExt->pGa, pDevice);
+         if (Status != STATUS_SUCCESS)
+         {
+             vboxWddmMemFree(pDevice);
+         }
+     }
+#endif
 
     LOGF(("LEAVE, context(0x%x), Status(0x%x)", hAdapter, Status));
@@ -3072,4 +3181,11 @@
     PAGED_CODE();
 
+#ifdef VBOX_WITH_MESA3D
+    if (((PVBOXMP_DEVEXT)hAdapter)->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+    {
+        return GaDxgkDdiPatch(hAdapter, pPatch);
+    }
+#endif
+
     LOGF(("ENTER, context(0x%x)", hAdapter));
 
@@ -3303,4 +3419,11 @@
     /* DxgkDdiSubmitCommand runs at dispatch, should not be pageable. */
 
+#ifdef VBOX_WITH_MESA3D
+    if (((PVBOXMP_DEVEXT)hAdapter)->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+    {
+        return GaDxgkDdiSubmitCommand(hAdapter, pSubmitCommand);
+    }
+#endif
+
 //    LOGF(("ENTER, context(0x%x)", hAdapter));
 
@@ -3626,4 +3749,10 @@
     CONST DXGKARG_PREEMPTCOMMAND*  pPreemptCommand)
 {
+#ifdef VBOX_WITH_MESA3D
+    if (((PVBOXMP_DEVEXT)hAdapter)->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+    {
+        return GaDxgkDdiPreemptCommand(hAdapter, pPreemptCommand);
+    }
+#endif
     LOGF(("ENTER, hAdapter(0x%x)", hAdapter));
 
@@ -3667,4 +3796,11 @@
     DXGKARG_BUILDPAGINGBUFFER*  pBuildPagingBuffer)
 {
+#ifdef VBOX_WITH_MESA3D
+    if (((PVBOXMP_DEVEXT)hAdapter)->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+    {
+        return GaDxgkDdiBuildPagingBuffer(hAdapter, pBuildPagingBuffer);
+    }
+#endif
+
     RT_NOREF(hAdapter);
     /* DxgkDdiBuildPagingBuffer should be made pageable. */
@@ -4563,4 +4699,9 @@
                     if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VBOX)
                         pEscapeHdr->u32CmdSpecific = VBoxMpCrGetHostCaps();
+#ifdef VBOX_WITH_MESA3D
+                    else if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+                        /** @todo User-mode driver probably should not need it in Gallium mode. */
+                        pEscapeHdr->u32CmdSpecific = CR_VBOX_CAP_TEX_PRESENT | CR_VBOX_CAP_CMDVBVA;
+#endif
                     else
                         pEscapeHdr->u32CmdSpecific = 0;
@@ -5059,4 +5200,9 @@
             }
             default:
+#ifdef VBOX_WITH_MESA3D
+                Status = GaDxgkDdiEscape(hAdapter, pEscape);
+                if (NT_SUCCESS(Status) || Status != STATUS_NOT_SUPPORTED)
+                    break;
+#endif
                 WARN(("unsupported escape code (0x%x)", pEscapeHdr->escapeCode));
                 break;
@@ -5114,4 +5260,10 @@
     DXGKARG_QUERYCURRENTFENCE*  pCurrentFence)
 {
+#ifdef VBOX_WITH_MESA3D
+    if (((PVBOXMP_DEVEXT)hAdapter)->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+    {
+        return GaDxgkDdiQueryCurrentFence(hAdapter, pCurrentFence);
+    }
+#endif
     LOGF(("ENTER, hAdapter(0x%x)", hAdapter));
 
@@ -5338,4 +5490,10 @@
     }
 
+#ifdef VBOX_WITH_MESA3D
+    GaScreenDefine(pDevExt->pGa, (uint32_t)pSetVidPnSourceAddress->PrimaryAddress.QuadPart,
+                   pSetVidPnSourceAddress->VidPnSourceId,
+                   pSource->AllocData.SurfDesc.width, pSource->AllocData.SurfDesc.height);
+#endif
+
     pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION;
 
@@ -5669,4 +5827,13 @@
 
     vboxVDbgBreakFv();
+
+#ifdef VBOX_WITH_MESA3D
+    PVBOXWDDM_DEVICE pDevice = (PVBOXWDDM_DEVICE)hDevice;
+    PVBOXMP_DEVEXT pDevExt = pDevice->pAdapter;
+    if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+    {
+        GaDeviceDestroy(pDevExt->pGa, pDevice);
+    }
+#endif
 
     vboxWddmMemFree(hDevice);
@@ -5855,4 +6022,11 @@
 //    LOGF(("ENTER, hContext(0x%x)", hContext));
     vboxVDbgBreakF();
+
+#ifdef VBOX_WITH_MESA3D
+    if (GaContextHwTypeIs((PVBOXWDDM_CONTEXT)hContext, VBOXVIDEO_HWTYPE_VMSVGA))
+    {
+        return GaDxgkDdiRender(hContext, pRender);
+    }
+#endif
 
     if (pRender->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR))
@@ -6273,4 +6447,10 @@
 
     vboxVDbgBreakFv();
+#ifdef VBOX_WITH_MESA3D
+    if (GaContextHwTypeIs((PVBOXWDDM_CONTEXT)hContext, VBOXVIDEO_HWTYPE_VMSVGA))
+    {
+        return GaDxgkDdiPresent(hContext, pPresent);
+    }
+#endif
 
 #ifdef VBOX_STRICT
@@ -7057,4 +7237,12 @@
                         break;
                     }
+#ifdef VBOX_WITH_MESA3D
+                    case VBOXWDDM_CONTEXT_TYPE_GA_3D:
+                    {
+                        pContext->enmType = VBOXWDDM_CONTEXT_TYPE_GA_3D;
+                        Status = GaContextCreate(pDevExt->pGa, pInfo, pContext);
+                        break;
+                    }
+#endif
                     default:
                     {
@@ -7141,4 +7329,11 @@
             break;
         }
+#ifdef VBOX_WITH_MESA3D
+        case VBOXWDDM_CONTEXT_TYPE_GA_3D:
+        {
+            Status = GaContextDestroy(pDevExt->pGa, pContext);
+            break;
+        }
+#endif
         default:
             break;
@@ -7318,4 +7513,16 @@
     if (bUpdateRectInited && pSource->bVisible)
     {
+#ifdef VBOX_WITH_MESA3D
+        if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+        {
+            /** @todo BLIT_GMRFB_TO_SCREEN */
+            GaUpdate(pDevExt->pGa,
+                     UpdateRect.left,
+                     UpdateRect.top,
+                     UpdateRect.right - UpdateRect.left,
+                     UpdateRect.bottom - UpdateRect.top);
+        }
+        else
+#endif
         VBOXVBVA_OP_WITHLOCK(ReportDirtyRect, pDevExt, pSource, &UpdateRect);
     }
@@ -7695,4 +7902,8 @@
 #endif
         }
+        else if (enmHwType == VBOXVIDEO_HWTYPE_VMSVGA)
+        {
+            fCmdVbva = TRUE;
+        }
         else
         {
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxWddm.inf
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxWddm.inf	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxWddm.inf	(revision 75445)
@@ -55,7 +55,13 @@
 [VBoxVideo.Display]
 ;dispd3d VBoxDispD3D.dll,,,0x00004000  ; COPYFLG_IN_USE_TRY_RENAME
+;mesa3d VBoxNine.dll,,,0x00004000     ; COPYFLG_IN_USE_TRY_RENAME
+;mesa3d VBoxSVGA.dll,,,0x00004000     ; COPYFLG_IN_USE_TRY_RENAME
+;mesa3d VBoxGL.dll,,,0x00004000       ; COPYFLG_IN_USE_TRY_RENAME
 
 ;amd64 [VBoxVideo.Display_wow64]
 ;amd64 ;dispd3d VBoxDispD3D-x86.dll,,,0x00004000  ; COPYFLG_IN_USE_TRY_RENAME
+;amd64 ;mesa3d VBoxNine-x86.dll,,,0x00004000     ; COPYFLG_IN_USE_TRY_RENAME
+;amd64 ;mesa3d VBoxSVGA-x86.dll,,,0x00004000     ; COPYFLG_IN_USE_TRY_RENAME
+;amd64 ;mesa3d VBoxGL-x86.dll,,,0x00004000       ; COPYFLG_IN_USE_TRY_RENAME
 
 [VBoxVideo.GL]
@@ -119,5 +125,11 @@
 VBoxWddm.sys = 1
 ;amd64 ;dispd3d VBoxDispD3D-x86.dll = 1
+;amd64 ;mesa3d VBoxNine-x86.dll = 1
+;amd64 ;mesa3d VBoxSVGA-x86.dll = 1
+;amd64 ;mesa3d VBoxGL-x86.dll = 1
 ;dispd3d VBoxDispD3D.dll = 1
+;mesa3d VBoxNine.dll = 1
+;mesa3d VBoxSVGA.dll = 1
+;mesa3d VBoxGL.dll = 1
 ;amd64 ;gl VBoxOGL-x86.dll = 1
 ;gl VBoxOGL.dll = 1
Index: /trunk/src/VBox/Additions/WINNT/Installer/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Installer/Makefile.kmk	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Installer/Makefile.kmk	(revision 75445)
@@ -134,4 +134,10 @@
 	$(PATH_STAGE_BIN)/additions/VBoxWddm.inf \
 	$(PATH_STAGE_BIN)/additions/VBoxDispD3D.dll
+ ifdef VBOX_WITH_MESA3D
+DRIVER_FILES += \
+	$(PATH_STAGE_BIN)/additions/VBoxNine.dll \
+	$(PATH_STAGE_BIN)/additions/VBoxSVGA.dll \
+	$(PATH_STAGE_BIN)/additions/VBoxGL.dll
+ endif
  ifdef VBOX_WITH_CROGL
 DRIVER_FILES += \
@@ -146,4 +152,10 @@
 DRIVER_FILES += \
 	$(PATH_STAGE_BIN)/additions/VBoxDispD3D-x86.dll
+  ifdef VBOX_WITH_MESA3D
+DRIVER_FILES += \
+	$(PATH_STAGE_BIN)/additions/VBoxNine-x86.dll \
+	$(PATH_STAGE_BIN)/additions/VBoxSVGA-x86.dll \
+	$(PATH_STAGE_BIN)/additions/VBoxGL-x86.dll
+  endif
   ifdef VBOX_WITH_CROGL
 DRIVER_FILES += \
@@ -184,4 +196,5 @@
 	-E 'VBOX_WITH_LICENSE_INSTALL_RTF=$(if $(VBOX_BRAND_LICENSE_RTF),1,0)' \
 	-E 'VBOX_WITH_WDDM=$(if $(VBOX_WITH_WDDM),1,0)' \
+	-E 'VBOX_WITH_MESA3D=$(if $(VBOX_WITH_MESA3D),1,0)' \
 	-E 'VBOX_BRAND_WIN_ADD_INST_DLGBMP=$(subst /,\,$(VBOX_BRAND_WIN_ADD_INST_DLGBMP))' \
 	-E 'VBOX_BRAND_LICENSE_RTF=$(subst /,\,$(VBOX_BRAND_LICENSE_RTF))' \
Index: /trunk/src/VBox/Additions/WINNT/Installer/VBoxGuestAdditionsCommon.nsh
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Installer/VBoxGuestAdditionsCommon.nsh	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Installer/VBoxGuestAdditionsCommon.nsh	(revision 75445)
@@ -107,4 +107,9 @@
   FILE "$%PATH_OUT%\bin\additions\VBoxWddm.inf"
   FILE "$%PATH_OUT%\bin\additions\VBoxDispD3D.dll"
+  !if $%VBOX_WITH_MESA3D% == "1"
+    FILE "$%PATH_OUT%\bin\additions\VBoxNine.dll"
+    FILE "$%PATH_OUT%\bin\additions\VBoxSVGA.dll"
+    FILE "$%PATH_OUT%\bin\additions\VBoxGL.dll"
+  !endif
 
   !if $%VBOX_WITH_CROGL% == "1"
@@ -123,4 +128,9 @@
   !if $%BUILD_TARGET_ARCH% == "amd64"
     FILE "$%PATH_OUT%\bin\additions\VBoxDispD3D-x86.dll"
+    !if $%VBOX_WITH_MESA3D% == "1"
+      FILE "$%PATH_OUT%\bin\additions\VBoxNine-x86.dll"
+      FILE "$%PATH_OUT%\bin\additions\VBoxSVGA-x86.dll"
+      FILE "$%PATH_OUT%\bin\additions\VBoxGL-x86.dll"
+    !endif
 
     !if $%VBOX_WITH_CROGL% == "1"
Index: /trunk/src/VBox/Additions/WINNT/Installer/VBoxGuestAdditionsW2KXP.nsh
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Installer/VBoxGuestAdditionsW2KXP.nsh	(revision 75444)
+++ /trunk/src/VBox/Additions/WINNT/Installer/VBoxGuestAdditionsW2KXP.nsh	(revision 75445)
@@ -240,4 +240,9 @@
 
     FILE "$%PATH_OUT%\bin\additions\VBoxDispD3D.dll"
+    !if $%VBOX_WITH_MESA3D% == "1"
+      FILE "$%PATH_OUT%\bin\additions\VBoxNine.dll"
+      FILE "$%PATH_OUT%\bin\additions\VBoxSVGA.dll"
+      FILE "$%PATH_OUT%\bin\additions\VBoxGL.dll"
+    !endif
 
     !if $%VBOX_WITH_CROGL% == "1"
@@ -256,4 +261,9 @@
     !if $%BUILD_TARGET_ARCH% == "amd64"
       FILE "$%PATH_OUT%\bin\additions\VBoxDispD3D-x86.dll"
+      !if $%VBOX_WITH_MESA3D% == "1"
+        FILE "$%PATH_OUT%\bin\additions\VBoxNine-x86.dll"
+        FILE "$%PATH_OUT%\bin\additions\VBoxSVGA-x86.dll"
+        FILE "$%PATH_OUT%\bin\additions\VBoxGL-x86.dll"
+      !endif
 
       !if $%VBOX_WITH_CROGL% == "1"
@@ -525,4 +535,9 @@
   ; Obsolete files end
   Delete /REBOOTOK "$%PATH_OUT%\bin\additions\VBoxDispD3D.dll"
+  !if $%VBOX_WITH_MESA3D% == "1"
+    Delete /REBOOTOK "$%PATH_OUT%\bin\additions\VBoxNine.dll"
+    Delete /REBOOTOK "$%PATH_OUT%\bin\additions\VBoxSVGA.dll"
+    Delete /REBOOTOK "$%PATH_OUT%\bin\additions\VBoxGL.dll"
+  !endif
 
     Delete /REBOOTOK "$%PATH_OUT%\bin\additions\VBoxOGLarrayspu.dll"
@@ -541,4 +556,9 @@
   !if $%BUILD_TARGET_ARCH% == "amd64"
     Delete /REBOOTOK "$%PATH_OUT%\bin\additions\VBoxDispD3D-x86.dll"
+    !if $%VBOX_WITH_MESA3D% == "1"
+      Delete /REBOOTOK "$%PATH_OUT%\bin\additions\VBoxNine-x86.dll"
+      Delete /REBOOTOK "$%PATH_OUT%\bin\additions\VBoxSVGA-x86.dll"
+      Delete /REBOOTOK "$%PATH_OUT%\bin\additions\VBoxGL-x86.dll"
+    !endif
 
       Delete /REBOOTOK "$%PATH_OUT%\bin\additions\VBoxOGLarrayspu-x86.dll"
@@ -609,4 +629,9 @@
 
   Delete /REBOOTOK "$g_strSystemDir\VBoxDispD3D.dll"
+  !if $%VBOX_WITH_MESA3D% == "1"
+    Delete /REBOOTOK "$g_strSystemDir\VBoxNine.dll"
+    Delete /REBOOTOK "$g_strSystemDir\VBoxSVGA.dll"
+    Delete /REBOOTOK "$g_strSystemDir\VBoxGL.dll"
+  !endif
 !endif ; $%VBOX_WITH_WDDM% == "1"
 
