Index: /trunk/include/VBox/VBoxVideo.h
===================================================================
--- /trunk/include/VBox/VBoxVideo.h	(revision 26660)
+++ /trunk/include/VBox/VBoxVideo.h	(revision 26661)
@@ -1148,5 +1148,9 @@
      * VERR_xxx         - on error */
     int32_t  rc;
-    uint64_t phBuf;
+    union
+    {
+        uint64_t phBuf;
+        VBOXVIDEOOFFSET offVramBuf;
+    } Location;
 } VBOXVDMACBUF_DR, *PVBOXVDMACBUF_DR;
 
@@ -1167,6 +1171,6 @@
 typedef struct VBOXVDMACMD_DMA_PRESENT_BLT
 {
-    VBOXVIDEOOFFSET offSrc;
-    VBOXVIDEOOFFSET offDst;
+    uint64_t phSrc;
+    uint64_t phDst;
     VBOXVDMA_SURF_DESC srcDesc;
     VBOXVDMA_SURF_DESC dstDesc;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp	(revision 26660)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp	(revision 26661)
@@ -165,5 +165,5 @@
 }
 
-PVBOXVDMACBUF_DR vboxVdmaCBufDrCreate (PVBOXVDMAINFO pInfo, PVBOXVDMACMDBUF_INFO pBufInfo, uint32_t u32FenceId)
+PVBOXVDMACBUF_DR vboxVdmaCBufDrCreate (PVBOXVDMAINFO pInfo, PVBOXVDMACMDBUF_INFO pBufInfo)
 {
     PVBOXVDMACBUF_DR pCmdDr;
@@ -188,12 +188,12 @@
 
         if (!(pBufInfo->fFlags & VBOXVDMACBUF_FLAG_BUF_VRAM_OFFSET))
-            pCmdDr->phBuf = pBufInfo->Location.phBuf;
+            pCmdDr->Location.phBuf = pBufInfo->Location.phBuf;
         else
-            pCmdDr->phBuf = pBufInfo->Location.offVramBuf;
+            pCmdDr->Location.offVramBuf = pBufInfo->Location.offVramBuf;
     }
 
     pCmdDr->fFlags = pBufInfo->fFlags;
     pCmdDr->cbBuf = pBufInfo->cbBuf;
-    pCmdDr->u32FenceId = u32FenceId;
+    pCmdDr->u32FenceId = pBufInfo->u32FenceId;
 
     return pCmdDr;
@@ -259,9 +259,9 @@
 }
 
-int vboxVdmaCBufSubmit (PDEVICE_EXTENSION pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACMDBUF_INFO pBufInfo, uint32_t u32FenceId)
-{
-    dfprintf((__FUNCTION__"\n"));
-
-    PVBOXVDMACBUF_DR pdr = vboxVdmaCBufDrCreate (pInfo, pBufInfo, u32FenceId);
+int vboxVdmaCBufSubmit (PDEVICE_EXTENSION pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACMDBUF_INFO pBufInfo)
+{
+    dfprintf((__FUNCTION__"\n"));
+
+    PVBOXVDMACBUF_DR pdr = vboxVdmaCBufDrCreate (pInfo, pBufInfo);
     if (!pdr)
         return VERR_OUT_OF_RESOURCES;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h	(revision 26660)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h	(revision 26661)
@@ -38,4 +38,5 @@
         void *pvBuf;
     } Location;
+    uint32_t u32FenceId;
 } VBOXVDMACMDBUF_INFO, *PVBOXVDMACMDBUF_INFO;
 
@@ -45,5 +46,5 @@
 int vboxVdmaFlush (struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo);
 int vboxVdmaDestroy (struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo);
-int vboxVdmaCBufSubmit (struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACMDBUF_INFO pBufInfo, uint32_t u32FenceId);
+int vboxVdmaCBufSubmit (struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACMDBUF_INFO pBufInfo);
 
 #endif /* #ifndef ___VBoxVideoVdma_h___ */
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 26660)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 26661)
@@ -1202,8 +1202,7 @@
                             PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pAlloc = VBOXWDDM_ALLOCATION_BODY(pAllocInfo, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE);
                             PVBOXWDDM_ALLOCINFO_SHAREDPRIMARYSURFACE pAllocI = VBOXWDDM_ALLOCINFO_BODY(pAllocInfo, VBOXWDDM_ALLOCINFO_SHAREDPRIMARYSURFACE);
-//                            memcpy(&pAlloc->AllocInfo, pInfo, sizeof (pAlloc->AllocInfo));
                             pAlloc->RefreshRate = pAllocI->RefreshRate;
                             pAlloc->VidPnSourceId = pAllocI->VidPnSourceId;
-                            pAlloc->offAddress = VBOXVIDEOOFFSET_VOID;
+//                            pAlloc->offAddress = VBOXVIDEOOFFSET_VOID;
                             pAlloc->bVisible = FALSE;
 
@@ -1500,5 +1499,38 @@
     CONST DXGKARG_PATCH*  pPatch)
 {
-    return STATUS_NOT_IMPLEMENTED;
+    /* DxgkDdiPatch should be made pageable. */
+    PAGED_CODE();
+
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", hAdapter));
+
+    /* Value == 2 is Present
+     * Value == 4 is RedirectedPresent
+     * we do not expect any other flags to be set here */
+    Assert(pPatch->Flags.Value == 2 || pPatch->Flags.Value == 4);
+
+    uint8_t *pBuf = ((uint8_t *)pPatch->pDmaBuffer) + pPatch->DmaBufferPrivateDataSubmissionStartOffset;
+    for (UINT i = pPatch->PatchLocationListSubmissionStart; i < pPatch->PatchLocationListSubmissionLength; ++i)
+    {
+        const D3DDDI_PATCHLOCATIONLIST* pPatchList = &pPatch->pPatchLocationList[i];
+        Assert(pPatchList->AllocationIndex < pPatch->AllocationListSize);
+        const DXGK_ALLOCATIONLIST *pAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
+        if (pAllocationList->PhysicalAddress.QuadPart)
+        {
+            Assert(pPatchList->PatchOffset < (pPatch->DmaBufferPrivateDataSubmissionEndOffset - pPatch->DmaBufferPrivateDataSubmissionStartOffset));
+            *((PHYSICAL_ADDRESS*)(pBuf+pPatchList->PatchOffset)) = pAllocationList->PhysicalAddress;
+        }
+        else
+        {
+            /* sanity */
+            if (pPatch->Flags.Value == 2 || pPatch->Flags.Value == 4)
+                Assert(i == 0);
+        }
+    }
+
+    dfprintf(("<== "__FUNCTION__ ", context(0x%x)\n", hAdapter));
+
+    return Status;
 }
 
@@ -1509,5 +1541,39 @@
     CONST DXGKARG_SUBMITCOMMAND*  pSubmitCommand)
 {
-    return STATUS_NOT_IMPLEMENTED;
+    /* DxgkDdiSubmitCommand runs at dispatch, should not be pageable. */
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", hAdapter));
+
+    PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)hAdapter;
+    VBOXVDMACMDBUF_INFO BufInfo = {0};
+
+    Assert(pSubmitCommand->DmaBufferSegmentId);
+
+    /* the DMA command buffer is located in system RAM, the host will need to pick it from there */
+    //BufInfo.fFlags = 0; /* see VBOXVDMACBUF_FLAG_xx */
+    BufInfo.cbBuf =  pSubmitCommand->DmaBufferPrivateDataSubmissionEndOffset - pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset;
+    BufInfo.Location.phBuf = pSubmitCommand->DmaBufferPhysicalAddress.QuadPart + pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset;
+    BufInfo.u32FenceId = pSubmitCommand->SubmissionFenceId;
+
+    int rc = vboxVdmaCBufSubmit (pDevExt, &pDevExt->u.primary.Vdma, &BufInfo);
+    AssertRC(rc);
+    if (!RT_SUCCESS(rc))
+    {
+        switch (rc)
+        {
+            case VERR_OUT_OF_RESOURCES:
+                /* @todo: try flushing.. */
+                Status = STATUS_INSUFFICIENT_RESOURCES;
+                break;
+            default:
+                Status = STATUS_UNSUCCESSFUL;
+                break;
+        }
+    }
+
+    dfprintf(("<== "__FUNCTION__ ", context(0x%x)\n", hAdapter));
+
+    return Status;
 }
 
@@ -1527,5 +1593,15 @@
     DXGKARG_BUILDPAGINGBUFFER*  pBuildPagingBuffer)
 {
-    return STATUS_NOT_IMPLEMENTED;
+    /* DxgkDdiBuildPagingBuffer should be made pageable. */
+    PAGED_CODE();
+
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", hAdapter));
+
+    dfprintf(("<== "__FUNCTION__ ", context(0x%x)\n", hAdapter));
+
+    return Status;
+
 }
 
@@ -2225,9 +2301,12 @@
                     if (vboxWddmPixFormatConversionSupported(pSrcAlloc->u.SurfInfo.format, pDstAlloc->u.SurfInfo.format))
                     {
-                        memset(pPresent->pPatchLocationListOut, 0, 2*sizeof (D3DDDI_PATCHLOCATIONLIST));
-                        pPresent->pPatchLocationListOut->PatchOffset = VBOXVDMACMD_BODY_FIELD_OFFSET(UINT, VBOXVDMACMD_DMA_PRESENT_BLT, offSrc);
+                        memset(pPresent->pPatchLocationListOut, 0, 3*sizeof (D3DDDI_PATCHLOCATIONLIST));
+                        pPresent->pPatchLocationListOut->PatchOffset = 0;
                         ++pPresent->pPatchLocationListOut;
-                        pPresent->pPatchLocationListOut->PatchOffset = VBOXVDMACMD_BODY_FIELD_OFFSET(UINT, VBOXVDMACMD_DMA_PRESENT_BLT, offDst);
-                        pPresent->pPatchLocationListOut->AllocationIndex = 1;
+                        pPresent->pPatchLocationListOut->PatchOffset = VBOXVDMACMD_BODY_FIELD_OFFSET(UINT, VBOXVDMACMD_DMA_PRESENT_BLT, phSrc);
+                        pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_SOURCE_INDEX;
+                        ++pPresent->pPatchLocationListOut;
+                        pPresent->pPatchLocationListOut->PatchOffset = VBOXVDMACMD_BODY_FIELD_OFFSET(UINT, VBOXVDMACMD_DMA_PRESENT_BLT, phDst);
+                        pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_DESTINATION_INDEX;
                         ++pPresent->pPatchLocationListOut;
 
@@ -2235,6 +2314,6 @@
                         pCmd->u32CmdSpecific = 0;
                         PVBOXVDMACMD_DMA_PRESENT_BLT pTransfer = VBOXVDMACMD_BODY(pCmd, VBOXVDMACMD_DMA_PRESENT_BLT);
-                        pTransfer->offSrc = vboxWddmOffsetFromPhAddress(pSrc->PhysicalAddress);
-                        pTransfer->offDst = vboxWddmOffsetFromPhAddress(pDst->PhysicalAddress);
+                        pTransfer->phSrc = pSrc->PhysicalAddress.QuadPart;
+                        pTransfer->phDst = pDst->PhysicalAddress.QuadPart;
                         vboxWddmSurfDescFromAllocation(pSrcAlloc, &pTransfer->srcDesc);
                         vboxWddmSurfDescFromAllocation(pDstAlloc, &pTransfer->dstDesc);
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.h	(revision 26660)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.h	(revision 26661)
@@ -67,4 +67,6 @@
 {
     VBOXWDDM_ALLOC_TYPE enmType;
+    PHYSICAL_ADDRESS phAddress;
+    BOOLEAN bPagedIn;
     union
     {
@@ -83,5 +85,5 @@
     D3DDDI_RATIONAL RefreshRate;
     D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
-    VBOXVIDEOOFFSET offAddress;
+//    VBOXVIDEOOFFSET offAddress;
     BOOLEAN bVisible;
 } VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE, *PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE;
