- Timestamp:
- Jun 24, 2013 2:30:18 PM (12 years ago)
- Location:
- trunk/src/VBox
- Files:
-
- 1 deleted
- 44 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h
r46662 r46757 35 35 36 36 /* One would increase this whenever definitions in this file are changed */ 37 #define VBOXVIDEOIF_VERSION 1 637 #define VBOXVIDEOIF_VERSION 17 38 38 39 39 #define VBOXWDDM_NODE_ID_SYSTEM 0 … … 424 424 VBOXDISP_KMHANDLE hSwapchainKm; /* in, NULL if new is being created */ 425 425 VBOXDISP_UMHANDLE hSwapchainUm; /* in, UMD private data */ 426 DWORD winHostID; 426 427 RECT Rect; 427 428 UINT u32Reserved; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/Makefile.kmk
r46236 r46757 116 116 wddm/VBoxDispD3DIf.cpp \ 117 117 wddm/VBoxDispCm.cpp \ 118 wddm/VBoxDispMp.cpp \119 118 wddm/VBoxScreen.cpp \ 120 wddm/VBoxDispMpTst.cpp \121 119 wddm/VBoxDispKmt.cpp \ 122 120 wddm/VBoxDispDbg.cpp \ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
r46662 r46757 598 598 Buf.SwapchainInfo.SwapchainInfo.hSwapchainKm = pSwapchain->hSwapchainKm; 599 599 Buf.SwapchainInfo.SwapchainInfo.hSwapchainUm = (VBOXDISP_UMHANDLE)pSwapchain; 600 HRESULT hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DSwapchain9GetHostWinID(pSwapchain->pSwapChainIf, &Buf.SwapchainInfo.SwapchainInfo.winHostID); 601 if (FAILED(hr)) 602 { 603 WARN(("pfnVBoxWineExD3DSwapchain9GetHostWinID failed, hr 0x%x", hr)); 604 return hr; 605 } 606 Assert(Buf.SwapchainInfo.SwapchainInfo.winHostID); 600 607 // Buf.SwapchainInfo.SwapchainInfo.Rect; 601 608 // Buf.SwapchainInfo.SwapchainInfo.u32Reserved; … … 611 618 612 619 Assert(cAllocsKm == Buf.SwapchainInfo.SwapchainInfo.cAllocs || !cAllocsKm); 613 HRESULT hr = S_OK;614 620 if (cAllocsKm == Buf.SwapchainInfo.SwapchainInfo.cAllocs) 615 621 { … … 680 686 /* first do a Km destroy to ensure all km->um region submissions are completed */ 681 687 vboxWddmSwapchainKmDestroy(pDevice, pSwapchain); 682 vboxDispMpInternalCancel(&pDevice->DefaultContext, pSwapchain);683 688 vboxWddmSwapchainDestroyIf(pDevice, pSwapchain); 684 689 vboxWddmSwapchainInit(pSwapchain); … … 1812 1817 if (hr == S_OK) 1813 1818 { 1814 hr = vboxDispMpInternalInit(); 1815 Assert(hr == S_OK); 1816 if (hr == S_OK) 1817 { 1818 VBoxDispD3DGlobalInit(); 1819 vboxVDbgPrint(("VBoxDispD3D: DLL loaded OK\n")); 1820 return TRUE; 1821 } 1819 VBoxDispD3DGlobalInit(); 1820 vboxVDbgPrint(("VBoxDispD3D: DLL loaded OK\n")); 1821 return TRUE; 1822 1822 } 1823 1823 // VbglR3Term(); … … 1836 1836 vboxVDbgVEHandlerUnregister(); 1837 1837 #endif 1838 HRESULT hr = vboxDisp MpInternalTerm();1838 HRESULT hr = vboxDispCmTerm(); 1839 1839 Assert(hr == S_OK); 1840 1840 if (hr == S_OK) 1841 1841 { 1842 hr = vboxDispCmTerm();1843 Assert(hr == S_OK);1844 if (hr == S_OK)1845 {1846 1842 // VbglR3Term(); 1847 /// @todo RTR3Term(); 1848 VBoxDispD3DGlobalTerm(); 1849 return TRUE; 1850 } 1843 /// @todo RTR3Term(); 1844 VBoxDispD3DGlobalTerm(); 1845 return TRUE; 1851 1846 } 1852 1847 … … 4509 4504 } 4510 4505 #endif 4506 pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9FlushToHost((IDirect3DDevice9Ex*)pDevice->pDevice9If); 4511 4507 PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource; 4512 4508 Assert(pRc); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.def
r44529 r46757 17 17 EXPORTS 18 18 OpenAdapter 19 VBoxDispMpGetCallbacks -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D64.def
r44529 r46757 19 19 EXPORTS 20 20 OpenAdapter 21 VBoxDispMpGetCallbacks -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp
r46662 r46757 148 148 break; 149 149 } 150 151 pD3D->pfnVBoxWineExD3DSwapchain9GetHostWinID = (PFNVBOXWINEEXD3DSWAPCHAIN9_GETHOSTWINID)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DSwapchain9GetHostWinID"); 152 if (!pD3D->pfnVBoxWineExD3DSwapchain9GetHostWinID) 153 { 154 WARN(("no VBoxWineExD3DSwapchain9GetHostWinID")); 155 break; 156 } 157 150 158 return S_OK; 151 159 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h
r46662 r46757 81 81 PFNVBOXWINEEXD3DSURF9_GETHOSTID pfnVBoxWineExD3DSurf9GetHostId; 82 82 83 PFNVBOXWINEEXD3DSWAPCHAIN9_GETHOSTWINID pfnVBoxWineExD3DSwapchain9GetHostWinID; 84 83 85 /* module handle */ 84 86 HMODULE hD3DLib; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispMp.cpp
r44529 r46757 19 19 #include "VBoxDispD3DCmn.h" 20 20 #include "VBoxDispMp.h" 21 21 #if 0 22 22 #include <iprt/assert.h> 23 23 … … 294 294 return hr; 295 295 } 296 #endif /* 0 */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispMp.h
r44529 r46757 26 26 #include "../../common/wddm/VBoxMPIf.h" 27 27 28 #if 0 28 29 typedef struct VBOXDISPMP_REGIONS 29 30 { … … 81 82 typedef VBOXDISPMP_DECL(HRESULT) FNVBOXDISPMP_GETCALLBACKS(uint32_t u32Version, PVBOXDISPMP_CALLBACKS pCallbacks); 82 83 typedef FNVBOXDISPMP_GETCALLBACKS *PFNVBOXDISPMP_GETCALLBACKS; 83 84 #endif /* 0 */ 84 85 #endif /* #ifndef ___VBoxDispMp_h___ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispMpInternal.h
r38114 r46757 22 22 #include <windows.h> 23 23 24 #if 0 24 25 HRESULT vboxDispMpInternalInit(); 25 26 HRESULT vboxDispMpInternalTerm(); 26 27 HRESULT vboxDispMpInternalCancel(struct VBOXWDDMDISP_CONTEXT *pContext, struct VBOXWDDMDISP_SWAPCHAIN *pSwapchain); 28 #endif 27 29 28 30 #endif /* #ifndef ___VBoxDispMpInternal_h__ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispProfile.h
r44529 r46757 78 78 // m_pName, m_cCalls, 79 79 // m_cTime, m_cTime/1000, m_cTime/1000000)); 80 VBOXDISPPROFILE_DUMP(("'%s' [0x%p]: \t%d\t%u\t%u\t%u\t%u\t%u", m_pName, pvObj, 80 81 // VBOXDISPPROFILE_DUMP(("'%s' [0x%p]: \t%d\t%u\t%u\t%u\t%f\t%f", m_pName, pvObj, 82 // m_cCalls, 83 // (uint32_t)m_cTime, (uint32_t)(m_cTime/1000), (uint32_t)(m_cTime/1000000), 84 // (((double)m_cTime)/cTotalEntriesTime), 85 // (((double)m_cTime)/cTotalTime))); 86 87 VBOXDISPPROFILE_DUMP(("'%s' [0x%p]: \t%d\t%u\t%f\t%f", m_pName, pvObj, 81 88 m_cCalls, 82 (uint32_t)m_cTime, (uint32_t)(m_cTime/1000), (uint32_t)(m_cTime/1000000), 83 (uint32_t)(((double)m_cTime)/cTotalEntriesTime), 84 (uint32_t)(((double)m_cTime)/cTotalTime))); 89 (uint32_t)(m_cTime/1000000), 90 (((double)m_cTime)/cTotalEntriesTime), 91 (((double)m_cTime)/cTotalTime))); 92 85 93 } 86 94 private: -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/dbg/DumpD3DCaps9.cpp
r46236 r46757 618 618 619 619 static DWORD g_aCaps1[] = { 620 0x00000001, 0x00000000, 0x00000000, 0x60020000,621 0x00000320, 0x80000001, 0x00000003, 0x0059aff0,622 0x000a0ff2, 0x07322191, 0x000000ff, 0x00003fff,623 0x000023ff, 0x000000ff, 0x00084208, 0x0007ec85,624 0x07030700, 0x07030700, 0x03030300, 0x0000001f,625 0x0000001f, 0x0000001f, 0x00001000, 0x00001000,626 627 0x3f800000, 0x00000000, 0x00000000, 0x00000000,628 0x00000000, 0x00000000, 0x000001ff, 0x00100008,629 0x03feffff, 0x00000008, 0x00000008, 0x0000003b,630 0x00000008, 0x00000006, 0x00000001, 0x00000000,631 632 633 634 0x00000000, 0x00000000, 0x00000001, 0x0000000f,635 0x00000001, 0x03000300, 0x00000000, 0x00000000,636 0x0000001f, 0x00000001, 0x00000000, 0x00000000,637 0x00000100, 0x00000000, 0x00000060, 0x00000000,638 620 0x00000001, 0x00000000, 0x00020000, 0xe0000000, 621 0x00000320, 0x80000001, 0x00000003, 0x0019aff0, 622 0x000f4ff2, 0x07736191, 0x000000ff, 0x00003fff, 623 0x000023ff, 0x000000ff, 0x00084208, 0x0001ecc5, 624 0x07030700, 0x07030700, 0x03030300, 0x0000003f, 625 0x0000003f, 0x0000001f, 0x00001000, 0x00001000, 626 0x00000100, 0x00008000, 0x00001000, 0x00000010, 627 0x3f800000, 0xc6000000, 0xc6000000, 0x46000000, 628 0x46000000, 0x00000000, 0x000001ff, 0x00100008, 629 0x03feffff, 0x00000008, 0x00000008, 0x0000013b, 630 0x00000008, 0x00000006, 0x00000000, 0x00000000, 631 0x437f0000, 0x000fffff, 0x000fffff, 0x00000010, 632 0x00000400, 0xfffe0200, 0x00000080, 0xffff0200, 633 0x41000000, 0x00000051, 0x00000000, 0x00000000, 634 0x00000000, 0x00000000, 0x00000001, 0x0000030f, 635 0x00000001, 0x03000300, 0x00000000, 0x00000018, 636 0x00000020, 0x00000001, 0x00000000, 0x00000018, 637 0x00000020, 0x00000000, 0x00000060, 0x01000100, 638 0x0000ffff, 0x00000200, 0x00000000, 0x00000000 639 639 }; 640 640 641 641 642 642 static DWORD g_aCaps2[] = { 643 644 645 0x000a0ff2, 0x07322191, 0x000000ff, 0x00003fff,646 647 648 649 650 651 652 0x03feffff, 0x00000008, 0x00000008, 0x0000003b,653 0x00000008, 0x00000006, 0x00000001, 0x00000000,654 655 656 657 658 659 660 661 643 0x00000001, 0x00000000, 0x00000000, 0x60020000, 644 0x00000320, 0x80000001, 0x00000003, 0x0019aff0, 645 0x000a0ff2, 0x07332191, 0x000000ff, 0x00003fff, 646 0x000023ff, 0x000000ff, 0x00084208, 0x0001ec85, 647 0x07030700, 0x07030700, 0x03030300, 0x0000001f, 648 0x0000001f, 0x0000001f, 0x00001000, 0x00001000, 649 0x00000100, 0x00008000, 0x00001000, 0x00000010, 650 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 651 0x00000000, 0x00000000, 0x000001ff, 0x00100008, 652 0x03feffff, 0x00000008, 0x00000008, 0x0000013b, 653 0x00000008, 0x00000006, 0x00000000, 0x00000000, 654 0x437f0000, 0x000fffff, 0x000fffff, 0x00000010, 655 0x00000400, 0xfffe0200, 0x00000080, 0xffff0200, 656 0x41000000, 0x00000051, 0x00000000, 0x00000000, 657 0x00000000, 0x00000000, 0x00000001, 0x0000000f, 658 0x00000001, 0x03000300, 0x00000000, 0x00000000, 659 0x0000001f, 0x00000001, 0x00000000, 0x00000000, 660 0x00000100, 0x00000000, 0x00000060, 0x00000000, 661 0x0000ffff, 0x00000200, 0x00000000, 0x00000000 662 662 }; 663 663 … … 934 934 D3DCAPSSOURCE_TYPE_NULL, 935 935 D3DCAPSSOURCE_TYPE_LOCAL, 936 D3DCAPSSOURCE_TYPE_FILE 936 D3DCAPSSOURCE_TYPE_FILE, 937 D3DCAPSSOURCE_TYPE_NONE 937 938 } D3DCAPSSOURCE_TYPE; 938 939 … … 977 978 return NULL; 978 979 } 980 case D3DCAPSSOURCE_TYPE_NONE: 981 return NULL; 979 982 default: 980 983 { … … 988 991 } 989 992 993 static void vboxUmdDumpDword(DWORD *pvData, DWORD cData) 994 { 995 char aBuf[16*4]; 996 DWORD dw1, dw2, dw3, dw4; 997 for (UINT i = 0; i < (cData & (~3)); i+=4) 998 { 999 dw1 = *pvData++; 1000 dw2 = *pvData++; 1001 dw3 = *pvData++; 1002 dw4 = *pvData++; 1003 sprintf(aBuf, "0x%08x, 0x%08x, 0x%08x, 0x%08x,\n", dw1, dw2, dw3, dw4); 1004 Log(("%s", aBuf)); 1005 } 1006 1007 cData = cData % 4; 1008 switch (cData) 1009 { 1010 case 3: 1011 dw1 = *pvData++; 1012 dw2 = *pvData++; 1013 dw3 = *pvData++; 1014 sprintf(aBuf, "0x%08x, 0x%08x, 0x%08x\n", dw1, dw2, dw3); 1015 Log(("%s", aBuf)); 1016 break; 1017 case 2: 1018 dw1 = *pvData++; 1019 dw2 = *pvData++; 1020 sprintf(aBuf, "0x%08x, 0x%08x\n", dw1, dw2); 1021 Log(("%s", aBuf)); 1022 break; 1023 case 1: 1024 dw1 = *pvData++; 1025 sprintf(aBuf, "0x%8x\n", dw1); 1026 Log(("%s", aBuf)); 1027 break; 1028 default: 1029 break; 1030 } 1031 } 1032 990 1033 int main() 991 1034 { … … 1006 1049 D3DCAPS9 Caps1, Caps2; 1007 1050 D3DCAPS9 *pCaps1, *pCaps2; 1008 D3DCAPSSOURCE_TYPE enmCaps1 = D3DCAPSSOURCE_TYPE_EMBEDDED 2;1009 D3DCAPSSOURCE_TYPE enmCaps2 = D3DCAPSSOURCE_TYPE_EMBEDDED 1;1051 D3DCAPSSOURCE_TYPE enmCaps1 = D3DCAPSSOURCE_TYPE_EMBEDDED1; 1052 D3DCAPSSOURCE_TYPE enmCaps2 = D3DCAPSSOURCE_TYPE_EMBEDDED2; 1010 1053 1011 1054 pCaps1 = selectCaps(&Caps1, (D3DCAPS9*)g_aCaps1, (D3DCAPS9*)g_aCaps2, enmCaps1); … … 1016 1059 } 1017 1060 1018 pCaps2 = selectCaps(&Caps2, (D3DCAPS9*)g_aCaps1, (D3DCAPS9*)g_aCaps2, enmCaps2); 1019 if (!pCaps2) 1020 { 1021 Log(("Failed to select Caps2")); 1022 return 1; 1023 } 1024 1025 diffCaps((D3DCAPS9*)g_aCaps2, (D3DCAPS9*)g_aCaps1); 1061 if (D3DCAPSSOURCE_TYPE_NONE != enmCaps2) 1062 { 1063 pCaps2 = selectCaps(&Caps2, (D3DCAPS9*)g_aCaps1, (D3DCAPS9*)g_aCaps2, enmCaps2); 1064 if (!pCaps2) 1065 { 1066 Log(("Failed to select Caps2")); 1067 return 1; 1068 } 1069 1070 diffCaps((D3DCAPS9*)pCaps1, (D3DCAPS9*)pCaps2); 1071 } 1072 else 1073 { 1074 vboxUmdDumpDword((DWORD*)pCaps1, sizeof (*pCaps1) / sizeof (DWORD)); 1075 } 1026 1076 return 0; 1027 1077 } -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/Makefile.kmk
r43489 r46757 88 88 endif 89 89 VBoxVideoWddm_DEFS += LOG_TO_BACKDOOR 90 ifdef VBOX_WITH_CROGL91 VBoxVideoWddm_DEFS += VBOX_WITH_CROGL92 endif93 90 ifdef VBOX_VDMA_WITH_WATCHDOG 94 91 VBoxVideoWddm_DEFS += VBOX_VDMA_WITH_WATCHDOG 95 92 endif 96 97 93 VBoxVideoWddm_INCS += \ 98 94 ../../../include \ … … 122 118 common/VBoxMPVidModes.cpp \ 123 119 $(PATH_ROOT)/src/VBox/Additions/common/VBoxVideo/HGSMIBase.cpp \ 124 $(PATH_ROOT)/src/VBox/Additions/common/VBoxVideo/Modesetting.cpp 125 if defined(VBOX_WITH_CROGL) && defined(VBOX_WDDM_WITH_CRCMD) 120 $(PATH_ROOT)/src/VBox/Additions/common/VBoxVideo/Modesetting.cpp \ 121 $(PATH_ROOT)/src/VBox/GuestHost/OpenGL/util/vreg.cpp 122 if defined(VBOX_WITH_CROGL) 126 123 VBoxVideoWddm_SOURCES += \ 127 124 $(PATH_ROOT)/src/VBox/GuestHost/OpenGL/packer/pack_buffer.c \ 128 125 $(PATH_ROOT)/src/VBox/GuestHost/OpenGL/packer/pack_bounds.c \ 126 $(PATH_ROOT)/src/VBox/GuestHost/OpenGL/packer/pack_visibleregion.c \ 127 $(PATH_ROOT)/src/VBox/GuestHost/OpenGL/packer/pack_misc.c \ 129 128 $(VBOX_PATH_CROGL_GENFILES)/pack_bounds_swap.c \ 130 129 wddm/VBoxMPCrUtil.cpp 131 VBoxVideoWddm_DEFS += VBOX_W DDM_WITH_CRCMD130 VBoxVideoWddm_DEFS += VBOX_WITH_CROGL 132 131 endif 133 132 ifdef VBOXWDDM_WITH_VBVA -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h
r45037 r46757 106 106 LIST_ENTRY SwapchainList3D; 107 107 /* mutex for context list operations */ 108 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS109 108 KSPIN_LOCK ContextLock; 110 #else111 FAST_MUTEX ContextMutex;112 #endif113 109 KSPIN_LOCK SynchLock; 114 110 volatile uint32_t cContexts3D; … … 119 115 volatile BOOLEAN fRenderToShadowDisabled; 120 116 117 BOOLEAN fTexPresentEnabled; 118 121 119 VBOXMP_CRCTLCON CrCtlCon; 122 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS123 120 VBOXMP_CRSHGSMITRANSPORT CrHgsmiTransport; 124 #endif125 121 126 122 VBOXWDDM_GLOBAL_POINTER_INFO PointerInfo; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCr.cpp
r43489 r46757 24 24 #ifdef VBOX_WITH_CROGL 25 25 #include <cr_protocol.h> 26 27 # ifdef VBOX_WDDM_WITH_CRCMD28 26 29 27 static void* vboxMpCrShgsmiBufferAlloc(PVBOXMP_DEVEXT pDevExt, HGSMISIZE cbData) … … 480 478 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[0]; 481 479 Assert(pBufCmd->cbBuffer == sizeof (CRVBOXHGSMIWRITE)); 482 CRVBOXHGSMIWRITE * pWr = (CRVBOXHGSMIWRITE*)vboxMpCrShgsmiTransportBufFromOffset(pCon, pBufCmd->offBuffer);483 480 PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION pfnCompletion = (PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION)pBufCmd->u64GuestData; 484 481 … … 486 483 if (RT_SUCCESS(rc)) 487 484 { 488 rc = p Wr->hdr.result;485 rc = pCmd->hdr.result; 489 486 if (!RT_SUCCESS(rc)) 490 487 { … … 588 585 CRVBOXHGSMIWRITE *pCmd = &pWrData->Cmd; 589 586 590 pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_ VRAM_OFFSET;587 pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_FOLLOWS_DR; 591 588 pDr->cbBuf = cbCmd; 592 589 pDr->rc = VERR_NOT_IMPLEMENTED; 593 pDr->Location.offVramBuf = vboxMpCrShgsmiTransportBufOffset(pCon, pCmd);590 // pDr->Location.offVramBuf = vboxMpCrShgsmiTransportBufOffset(pCon, pCmd); 594 591 595 592 pHdr->enmType = VBOXVDMACMD_TYPE_CHROMIUM_CMD; … … 600 597 pCmd->hdr.result = VERR_WRONG_ORDER; 601 598 pCmd->hdr.u32ClientID = u32ClientID; 602 pCmd->hdr.u32Function = SHCRGL_GUEST_FN_WRITE _READ;599 pCmd->hdr.u32Function = SHCRGL_GUEST_FN_WRITE; 603 600 // pCmd->hdr.u32Reserved = 0; 604 601 pCmd->iBuffer = 1; 605 602 606 603 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[0]; 607 pBufCmd->offBuffer = vbox MpCrShgsmiTransportBufOffset(pCon, pCmd);604 pBufCmd->offBuffer = vboxVdmaCBufDrPtrOffset(&pDevExt->u.primary.Vdma, pCmd); 608 605 pBufCmd->cbBuffer = sizeof (*pCmd); 609 606 pBufCmd->u32GuestData = 0; … … 643 640 } 644 641 645 # endif646 642 #endif 647 643 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCr.h
r43489 r46757 37 37 int VBoxMpCrCtlConCallUserData(PVBOXMP_CRCTLCON pCrCtlCon, struct VBoxGuestHGCMCallInfo *pData, uint32_t cbData); 38 38 39 #ifdef VBOX_WDDM_WITH_CRCMD40 39 # include <cr_pack.h> 41 40 … … 218 217 } 219 218 } 220 221 #define VBOXMP_CRCMD_SIZE_WINDOWPOSITION 20 222 #define VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(_cRects) (16 + _cRects * 4 * sizeof(GLint)) 223 224 #endif 219 #define VBOXMP_CRCMD_HEADER_SIZE sizeof (CRMessageOpcodes) 220 /* last +4 below is 4-aligned comand opcode size (i.e. ((1 + 3) & ~3)) */ 221 #define VBOXMP_CRCMD_SIZE_WINDOWPOSITION (20 + 4) 222 #define VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(_cRects) (16 + (_cRects) * 4 * sizeof (GLint) + 4) 223 #define VBOXMP_CRCMD_SIZE_VBOXTEXPRESENT(_cRects) (28 + (_cRects) * 4 * sizeof (GLint) + 4) 224 #define VBOXMP_CRCMD_SIZE_WINDOWSHOW (16 + 4) 225 #define VBOXMP_CRCMD_SIZE_WINDOWSIZE (20 + 4) 226 225 227 #endif /* #ifndef ___VBoxMPCr_h__ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCrUtil.cpp
r42029 r46757 32 32 DECLEXPORT(int) crMemcmp( const void *p1, const void *p2, unsigned int bytes ); 33 33 DECLEXPORT(void) crDebug(const char *format, ... ); 34 #ifndef DEBUG_misha 34 35 DECLEXPORT(void) crWarning(const char *format, ... ); 36 #endif 37 35 38 DECLEXPORT(void) crInfo(const char *format, ... ); 36 39 DECLEXPORT(void) crError(const char *format, ... ); … … 74 77 } 75 78 79 #ifndef DEBUG_misha 76 80 DECLEXPORT(void) crWarning(const char *format, ... ) 77 81 { 78 82 79 83 } 84 #endif 80 85 81 86 DECLEXPORT(void) crInfo(const char *format, ... ) -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp
r45132 r46757 194 194 pSwapchain->width = w; 195 195 pSwapchain->height = h; 196 VBox WddmVrListInit(&pSwapchain->VisibleRegions);196 VBoxVrListInit(&pSwapchain->VisibleRegions); 197 197 } 198 198 return pSwapchain; … … 225 225 if (!cRefs) 226 226 { 227 VBox WddmVrListClear(&pSwapchain->VisibleRegions);227 VBoxVrListClear(&pSwapchain->VisibleRegions); 228 228 vboxWddmMemFree(pSwapchain); 229 229 } … … 313 313 vboxWddmSwapchainAllocRemoveAllInternal(pDevExt, pSwapchain, TRUE); 314 314 315 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS316 Assert(pSwapchain->pContext);317 if (pSwapchain->pContext)318 {319 NTSTATUS tmpStatus = vboxVdmaGgCmdCancel(pDevExt, pSwapchain->pContext, pSwapchain);320 if (tmpStatus != STATUS_SUCCESS)321 {322 WARN(("vboxVdmaGgCmdCancel returned Status (0x%x)", tmpStatus));323 }324 }325 #endif326 327 315 vboxWddmSwapchainRelease(pSwapchain); 328 316 } … … 350 338 RemoveEntryList(&pSwapchain->DevExtListEntry); 351 339 pSwapchain->hSwapchainKm = NULL; 352 VBox WddmVrListClear(&pSwapchain->VisibleRegions);340 VBoxVrListClear(&pSwapchain->VisibleRegions); 353 341 vboxWddmSwapchainRelease(pSwapchain); 354 342 } … … 412 400 if (cbSize < RT_OFFSETOF(VBOXDISPIFESCAPE_SWAPCHAININFO, SwapchainInfo.ahAllocs[pSwapchainInfo->SwapchainInfo.cAllocs])) 413 401 return STATUS_INVALID_PARAMETER; 402 403 if (!pSwapchainInfo->SwapchainInfo.winHostID) 404 { 405 WARN(("Zero winHostID specified!")); 406 return STATUS_INVALID_PARAMETER; 407 } 414 408 415 409 PVBOXWDDM_SWAPCHAIN pSwapchain = NULL; … … 499 493 // memset(&pSwapchain->ViewRect, 0, sizeof (pSwapchain->ViewRect)); 500 494 /* @todo: do we really need to zero this up here ? */ 501 VBox WddmVrListClear(&pSwapchain->VisibleRegions);495 VBoxVrListClear(&pSwapchain->VisibleRegions); 502 496 503 497 vboxWddmSwapchainAllocRemoveAll(pDevExt, pSwapchain); … … 510 504 } 511 505 pSwapchain->hSwapchainUm = pSwapchainInfo->SwapchainInfo.hSwapchainUm; 506 if (pSwapchain->winHostID != pSwapchainInfo->SwapchainInfo.winHostID) 507 { 508 pSwapchain->fExposed = FALSE; 509 pSwapchain->winHostID = pSwapchainInfo->SwapchainInfo.winHostID; 510 } 512 511 } 513 512 else … … 1409 1408 break; 1410 1409 1410 Assert(0); 1411 1411 1412 Status = vboxVideoAMgrCtxAllocDestroy(pCtx, pRef->hSessionHandle); 1412 1413 Assert(Status == STATUS_SUCCESS); … … 1605 1606 #endif 1606 1607 1607 1608 /* visible rects */1609 typedef struct VBOXWDDMVR_REG1610 {1611 LIST_ENTRY ListEntry;1612 RECT Rect;1613 } VBOXWDDMVR_REG, *PVBOXWDDMVR_REG;1614 1615 #define PVBOXWDDMVR_REG_FROM_ENTRY(_pEntry) ((PVBOXWDDMVR_REG)(((uint8_t*)(_pEntry)) - RT_OFFSETOF(VBOXWDDMVR_REG, ListEntry)))1616 1617 #ifdef DEBUG_misha1618 //# define VBOXVDBG_VR_LAL_DISABLE1619 #endif1620 1621 #ifndef VBOXVDBG_VR_LAL_DISABLE1622 static LOOKASIDE_LIST_EX g_VBoxWddmVrLookasideList;1623 #endif1624 1625 static PVBOXWDDMVR_REG vboxWddmVrRegCreate()1626 {1627 #ifndef VBOXVDBG_VR_LAL_DISABLE1628 PVBOXWDDMVR_REG pReg = (PVBOXWDDMVR_REG)ExAllocateFromLookasideListEx(&g_VBoxWddmVrLookasideList);1629 if (!pReg)1630 {1631 WARN(("ExAllocateFromLookasideListEx failed!"));1632 }1633 return pReg;1634 #else1635 return (PVBOXWDDMVR_REG)vboxWddmMemAlloc(sizeof (VBOXWDDMVR_REG));1636 #endif1637 }1638 1639 static void vboxWddmVrRegTerm(PVBOXWDDMVR_REG pReg)1640 {1641 #ifndef VBOXVDBG_VR_LAL_DISABLE1642 ExFreeToLookasideListEx(&g_VBoxWddmVrLookasideList, pReg);1643 #else1644 vboxWddmMemFree(pReg);1645 #endif1646 }1647 1648 void VBoxWddmVrListClear(PVBOXWDDMVR_LIST pList)1649 {1650 PLIST_ENTRY pNext;1651 for (PLIST_ENTRY pEntry = pList->ListHead.Flink; pEntry != &pList->ListHead; pEntry = pNext)1652 {1653 pNext = pEntry->Flink;1654 PVBOXWDDMVR_REG pReg = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry);1655 vboxWddmVrRegTerm(pReg);1656 }1657 VBoxWddmVrListInit(pList);1658 }1659 1660 #define VBOXWDDMVR_MEMTAG 'vDBV'1661 1662 NTSTATUS VBoxWddmVrInit()1663 {1664 #ifndef VBOXVDBG_VR_LAL_DISABLE1665 NTSTATUS Status = ExInitializeLookasideListEx(&g_VBoxWddmVrLookasideList,1666 NULL, /* PALLOCATE_FUNCTION_EX Allocate */1667 NULL, /* PFREE_FUNCTION_EX Free */1668 NonPagedPool,1669 0, /* ULONG Flags */1670 sizeof (VBOXWDDMVR_REG),1671 VBOXWDDMVR_MEMTAG,1672 0 /* USHORT Depth - reserved, must be null */1673 );1674 if (!NT_SUCCESS(Status))1675 {1676 WARN(("ExInitializeLookasideListEx failed, Status (0x%x)", Status));1677 return Status;1678 }1679 #endif1680 1681 return STATUS_SUCCESS;1682 }1683 1684 void VBoxWddmVrTerm()1685 {1686 #ifndef VBOXVDBG_VR_LAL_DISABLE1687 ExDeleteLookasideListEx(&g_VBoxWddmVrLookasideList);1688 #endif1689 }1690 1691 typedef DECLCALLBACK(int) FNVBOXWDDMVR_CB_COMPARATOR(const VBOXWDDMVR_REG *pReg1, const VBOXWDDMVR_REG *pReg2);1692 typedef FNVBOXWDDMVR_CB_COMPARATOR *PFNVBOXWDDMVR_CB_COMPARATOR;1693 1694 static DECLCALLBACK(int) vboxWddmVrRegNonintersectedComparator(const RECT* pRect1, const RECT* pRect2)1695 {1696 Assert(!vboxWddmRectIsIntersect(pRect1, pRect2));1697 if (pRect1->top != pRect2->top)1698 return pRect1->top - pRect2->top;1699 return pRect1->left - pRect2->left;1700 }1701 1702 #ifdef DEBUG_misha1703 static void vboxWddmVrDbgListDoVerify(PVBOXWDDMVR_LIST pList)1704 {1705 PLIST_ENTRY pEntry1 = pList->ListHead.Flink;1706 1707 for (PLIST_ENTRY pEntry1 = pList->ListHead.Flink; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->Flink)1708 {1709 PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);1710 for (PLIST_ENTRY pEntry2 = pEntry1->Flink; pEntry2 != &pList->ListHead; pEntry2 = pEntry2->Flink)1711 {1712 PVBOXWDDMVR_REG pReg2 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry2);1713 Assert(vboxWddmVrRegNonintersectedComparator(&pReg1->Rect, &pReg2->Rect) < 0);1714 }1715 }1716 }1717 1718 #define vboxWddmVrDbgListVerify vboxWddmVrDbgListDoVerify1719 #else1720 #define vboxWddmVrDbgListVerify(_p) do {} while (0)1721 #endif1722 1723 static NTSTATUS vboxWddmVrListUniteIntersection(PVBOXWDDMVR_LIST pList, PVBOXWDDMVR_LIST pIntersection);1724 1725 #define VBOXWDDMVR_INVALID_COORD (~0UL)1726 1727 DECLINLINE(void) vboxWddmVrListRegAdd(PVBOXWDDMVR_LIST pList, PVBOXWDDMVR_REG pReg, PLIST_ENTRY pPlace, BOOLEAN fAfter)1728 {1729 if (fAfter)1730 InsertHeadList(pPlace, &pReg->ListEntry);1731 else1732 InsertTailList(pPlace, &pReg->ListEntry);1733 ++pList->cEntries;1734 vboxWddmVrDbgListVerify(pList);1735 }1736 1737 DECLINLINE(void) vboxWddmVrListRegRemove(PVBOXWDDMVR_LIST pList, PVBOXWDDMVR_REG pReg)1738 {1739 RemoveEntryList(&pReg->ListEntry);1740 --pList->cEntries;1741 }1742 1743 static void vboxWddmVrListRegAddOrder(PVBOXWDDMVR_LIST pList, PLIST_ENTRY pMemberEntry, PVBOXWDDMVR_REG pReg)1744 {1745 do1746 {1747 if (pMemberEntry != &pList->ListHead)1748 {1749 PVBOXWDDMVR_REG pMemberReg = PVBOXWDDMVR_REG_FROM_ENTRY(pMemberEntry);1750 if (vboxWddmVrRegNonintersectedComparator(&pMemberReg->Rect, &pReg->Rect) < 0)1751 {1752 pMemberEntry = pMemberEntry->Flink;1753 continue;1754 }1755 }1756 vboxWddmVrListRegAdd(pList, pReg, pMemberEntry, FALSE);1757 break;1758 } while (1);1759 }1760 1761 static void vboxWddmVrListAddNonintersected(PVBOXWDDMVR_LIST pList1, PVBOXWDDMVR_LIST pList2)1762 {1763 PLIST_ENTRY pEntry1 = pList1->ListHead.Flink;1764 1765 for (PLIST_ENTRY pEntry2 = pList2->ListHead.Flink; pEntry2 != &pList2->ListHead; pEntry2 = pList2->ListHead.Flink)1766 {1767 PVBOXWDDMVR_REG pReg2 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry2);1768 do {1769 if (pEntry1 != &pList1->ListHead)1770 {1771 PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);1772 if (vboxWddmVrRegNonintersectedComparator(&pReg1->Rect, &pReg2->Rect) < 0)1773 {1774 pEntry1 = pEntry1->Flink;1775 continue;1776 }1777 }1778 vboxWddmVrListRegRemove(pList2, pReg2);1779 vboxWddmVrListRegAdd(pList1, pReg2, pEntry1, FALSE);1780 break;1781 } while (1);1782 }1783 1784 Assert(VBoxWddmVrListIsEmpty(pList2));1785 }1786 1787 static NTSTATUS vboxWddmVrListRegIntersectSubstNoJoin(PVBOXWDDMVR_LIST pList1, PVBOXWDDMVR_REG pReg1, const RECT * pRect2)1788 {1789 UINT topLim = VBOXWDDMVR_INVALID_COORD;1790 UINT bottomLim = VBOXWDDMVR_INVALID_COORD;1791 LIST_ENTRY List;1792 PVBOXWDDMVR_REG pBottomReg = NULL;1793 #ifdef DEBUG_misha1794 RECT tmpRect = pReg1->Rect;1795 vboxWddmVrDbgListVerify(pList1);1796 #endif1797 1798 InitializeListHead(&List);1799 1800 Assert(vboxWddmRectIsIntersect(&pReg1->Rect, pRect2));1801 1802 if (pReg1->Rect.top < pRect2->top)1803 {1804 Assert(pRect2->top < pReg1->Rect.bottom);1805 PVBOXWDDMVR_REG pRegResult = vboxWddmVrRegCreate();1806 pRegResult->Rect.top = pReg1->Rect.top;1807 pRegResult->Rect.left = pReg1->Rect.left;1808 pRegResult->Rect.bottom = pRect2->top;1809 pRegResult->Rect.right = pReg1->Rect.right;1810 topLim = pRect2->top;1811 InsertTailList(&List, &pRegResult->ListEntry);1812 }1813 1814 if (pReg1->Rect.bottom > pRect2->bottom)1815 {1816 Assert(pRect2->bottom > pReg1->Rect.top);1817 PVBOXWDDMVR_REG pRegResult = vboxWddmVrRegCreate();1818 pRegResult->Rect.top = pRect2->bottom;1819 pRegResult->Rect.left = pReg1->Rect.left;1820 pRegResult->Rect.bottom = pReg1->Rect.bottom;1821 pRegResult->Rect.right = pReg1->Rect.right;1822 bottomLim = pRect2->bottom;1823 pBottomReg = pRegResult;1824 }1825 1826 if (pReg1->Rect.left < pRect2->left)1827 {1828 Assert(pRect2->left < pReg1->Rect.right);1829 PVBOXWDDMVR_REG pRegResult = vboxWddmVrRegCreate();1830 pRegResult->Rect.top = topLim == VBOXWDDMVR_INVALID_COORD ? pReg1->Rect.top : topLim;1831 pRegResult->Rect.left = pReg1->Rect.left;1832 pRegResult->Rect.bottom = bottomLim == VBOXWDDMVR_INVALID_COORD ? pReg1->Rect.bottom : bottomLim;1833 pRegResult->Rect.right = pRect2->left;1834 InsertTailList(&List, &pRegResult->ListEntry);1835 }1836 1837 if (pReg1->Rect.right > pRect2->right)1838 {1839 Assert(pRect2->right > pReg1->Rect.left);1840 PVBOXWDDMVR_REG pRegResult = vboxWddmVrRegCreate();1841 pRegResult->Rect.top = topLim == VBOXWDDMVR_INVALID_COORD ? pReg1->Rect.top : topLim;1842 pRegResult->Rect.left = pRect2->right;1843 pRegResult->Rect.bottom = bottomLim == VBOXWDDMVR_INVALID_COORD ? pReg1->Rect.bottom : bottomLim;1844 pRegResult->Rect.right = pReg1->Rect.right;1845 InsertTailList(&List, &pRegResult->ListEntry);1846 }1847 1848 if (pBottomReg)1849 InsertTailList(&List, &pBottomReg->ListEntry);1850 1851 PLIST_ENTRY pMemberEntry = pReg1->ListEntry.Flink;1852 vboxWddmVrListRegRemove(pList1, pReg1);1853 vboxWddmVrRegTerm(pReg1);1854 1855 if (IsListEmpty(&List))1856 return STATUS_SUCCESS; /* the region is covered by the pRect2 */1857 1858 PLIST_ENTRY pEntry = List.Flink, pNext;1859 for (; pEntry != &List; pEntry = pNext)1860 {1861 pNext = pEntry->Flink;1862 PVBOXWDDMVR_REG pReg = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry);1863 1864 vboxWddmVrListRegAddOrder(pList1, pMemberEntry, pReg);1865 pMemberEntry = pEntry->Flink; /* the following elements should go after the given pEntry since they are ordered already */1866 }1867 return STATUS_SUCCESS;1868 }1869 1870 typedef DECLCALLBACK(PLIST_ENTRY) FNVBOXWDDMVR_CB_INTERSECTED_VISITOR(PVBOXWDDMVR_LIST pList1, PVBOXWDDMVR_REG pReg1, const RECT * pRect2, void *pvContext, PLIST_ENTRY *ppNext);1871 typedef FNVBOXWDDMVR_CB_INTERSECTED_VISITOR *PFNVBOXWDDMVR_CB_INTERSECTED_VISITOR;1872 1873 static void vboxWddmVrListVisitIntersected(PVBOXWDDMVR_LIST pList1, UINT cRects, const RECT *aRects, PFNVBOXWDDMVR_CB_INTERSECTED_VISITOR pfnVisitor, void* pvVisitor)1874 {1875 PLIST_ENTRY pEntry1 = pList1->ListHead.Flink;1876 PLIST_ENTRY pNext1;1877 UINT iFirst2 = 0;1878 1879 for (; pEntry1 != &pList1->ListHead; pEntry1 = pNext1)1880 {1881 pNext1 = pEntry1->Flink;1882 PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);1883 for (UINT i = iFirst2; i < cRects; ++i)1884 {1885 const RECT *pRect2 = &aRects[i];1886 if (pReg1->Rect.bottom <= pRect2->top)1887 continue;1888 else if (pRect2->bottom <= pReg1->Rect.top)1889 continue;1890 /* y coords intersect */1891 else if (pReg1->Rect.right <= pRect2->left)1892 continue;1893 else if (pRect2->right <= pReg1->Rect.left)1894 continue;1895 /* x coords intersect */1896 1897 /* the visitor can modify the list 1, apply necessary adjustments after it */1898 PLIST_ENTRY pEntry1 = pfnVisitor (pList1, pReg1, pRect2, pvVisitor, &pNext1);1899 if (pEntry1 == &pList1->ListHead)1900 break;1901 }1902 }1903 }1904 1905 1906 static void vboxWddmVrListJoinRectsHV(PVBOXWDDMVR_LIST pList, BOOLEAN fHorizontal)1907 {1908 PLIST_ENTRY pNext1, pNext2;1909 1910 for (PLIST_ENTRY pEntry1 = pList->ListHead.Flink; pEntry1 != &pList->ListHead; pEntry1 = pNext1)1911 {1912 PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);1913 pNext1 = pEntry1->Flink;1914 for (PLIST_ENTRY pEntry2 = pEntry1->Flink; pEntry2 != &pList->ListHead; pEntry2 = pNext2)1915 {1916 PVBOXWDDMVR_REG pReg2 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry2);1917 pNext2 = pEntry2->Flink;1918 if (fHorizontal)1919 {1920 if (pReg1->Rect.top == pReg2->Rect.top)1921 {1922 if (pReg1->Rect.right == pReg2->Rect.left)1923 {1924 /* join rectangles */1925 vboxWddmVrListRegRemove(pList, pReg2);1926 if (pReg1->Rect.bottom > pReg2->Rect.bottom)1927 {1928 LONG oldRight1 = pReg1->Rect.right;1929 LONG oldBottom1 = pReg1->Rect.bottom;1930 pReg1->Rect.right = pReg2->Rect.right;1931 pReg1->Rect.bottom = pReg2->Rect.bottom;1932 1933 vboxWddmVrDbgListVerify(pList);1934 1935 pReg2->Rect.left = pReg1->Rect.left;1936 pReg2->Rect.top = pReg1->Rect.bottom;1937 pReg2->Rect.right = oldRight1;1938 pReg2->Rect.bottom = oldBottom1;1939 vboxWddmVrListRegAddOrder(pList, pReg1->ListEntry.Flink, pReg2);1940 /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension1941 * and thus can match one of the previous rects */1942 pNext1 = pList->ListHead.Flink;1943 break;1944 }1945 else if (pReg1->Rect.bottom < pReg2->Rect.bottom)1946 {1947 pReg1->Rect.right = pReg2->Rect.right;1948 vboxWddmVrDbgListVerify(pList);1949 pReg2->Rect.top = pReg1->Rect.bottom;1950 vboxWddmVrListRegAddOrder(pList, pReg1->ListEntry.Flink, pReg2);1951 /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension1952 * and thus can match one of the previous rects */1953 pNext1 = pList->ListHead.Flink;1954 break;1955 }1956 else1957 {1958 pReg1->Rect.right = pReg2->Rect.right;1959 vboxWddmVrDbgListVerify(pList);1960 /* reset the pNext1 since it could be the pReg2 being destroyed */1961 pNext1 = pEntry1->Flink;1962 /* pNext2 stays the same since it is pReg2->ListEntry.pNext, which is kept intact */1963 vboxWddmVrRegTerm(pReg2);1964 }1965 }1966 continue;1967 }1968 else if (pReg1->Rect.bottom == pReg2->Rect.bottom)1969 {1970 Assert(pReg1->Rect.top < pReg2->Rect.top); /* <- since pReg1 > pReg2 && pReg1->Rect.top != pReg2->Rect.top*/1971 if (pReg1->Rect.right == pReg2->Rect.left)1972 {1973 /* join rectangles */1974 vboxWddmVrListRegRemove(pList, pReg2);1975 1976 pReg1->Rect.bottom = pReg2->Rect.top;1977 vboxWddmVrDbgListVerify(pList);1978 pReg2->Rect.left = pReg1->Rect.left;1979 1980 vboxWddmVrListRegAddOrder(pList, pReg2->ListEntry.Flink, pReg2);1981 1982 /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension1983 * and thus can match one of the previous rects */1984 pNext1 = pList->ListHead.Flink;1985 break;1986 }1987 else if (pReg1->Rect.left == pReg2->Rect.right)1988 {1989 /* join rectangles */1990 vboxWddmVrListRegRemove(pList, pReg2);1991 1992 pReg1->Rect.bottom = pReg2->Rect.top;1993 vboxWddmVrDbgListVerify(pList);1994 pReg2->Rect.right = pReg1->Rect.right;1995 1996 vboxWddmVrListRegAddOrder(pList, pReg2->ListEntry.Flink, pReg2);1997 1998 /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension1999 * and thus can match one of the previous rects */2000 pNext1 = pList->ListHead.Flink;2001 break;2002 }2003 continue;2004 }2005 }2006 else2007 {2008 if (pReg1->Rect.bottom == pReg2->Rect.top)2009 {2010 if (pReg1->Rect.left == pReg2->Rect.left)2011 {2012 if (pReg1->Rect.right == pReg2->Rect.right)2013 {2014 /* join rects */2015 vboxWddmVrListRegRemove(pList, pReg2);2016 2017 pReg1->Rect.bottom = pReg2->Rect.bottom;2018 vboxWddmVrDbgListVerify(pList);2019 2020 /* reset the pNext1 since it could be the pReg2 being destroyed */2021 pNext1 = pEntry1->Flink;2022 /* pNext2 stays the same since it is pReg2->ListEntry.pNext, which is kept intact */2023 vboxWddmVrRegTerm(pReg2);2024 continue;2025 }2026 /* no more to be done for for pReg1 */2027 break;2028 }2029 else if (pReg1->Rect.right > pReg2->Rect.left)2030 {2031 /* no more to be done for for pReg1 */2032 break;2033 }2034 2035 continue;2036 }2037 else if (pReg1->Rect.bottom < pReg2->Rect.top)2038 {2039 /* no more to be done for for pReg1 */2040 break;2041 }2042 }2043 }2044 }2045 }2046 2047 static void vboxWddmVrListJoinRects(PVBOXWDDMVR_LIST pList)2048 {2049 vboxWddmVrListJoinRectsHV(pList, TRUE);2050 vboxWddmVrListJoinRectsHV(pList, FALSE);2051 }2052 2053 typedef struct VBOXWDDMVR_CBDATA_SUBST2054 {2055 NTSTATUS Status;2056 BOOLEAN fChanged;2057 } VBOXWDDMVR_CBDATA_SUBST, *PVBOXWDDMVR_CBDATA_SUBST;2058 2059 static DECLCALLBACK(PLIST_ENTRY) vboxWddmVrListSubstNoJoinCb(PVBOXWDDMVR_LIST pList, PVBOXWDDMVR_REG pReg1, const RECT *pRect2, void *pvContext, PLIST_ENTRY *ppNext)2060 {2061 PVBOXWDDMVR_CBDATA_SUBST pData = (PVBOXWDDMVR_CBDATA_SUBST)pvContext;2062 /* store the prev to get the new Flink out of it*/2063 PLIST_ENTRY pPrev = pReg1->ListEntry.Blink;2064 pData->fChanged = TRUE;2065 2066 Assert(vboxWddmRectIsIntersect(&pReg1->Rect, pRect2));2067 2068 /* NOTE: the pReg1 will be invalid after the vboxWddmVrListRegIntersectSubstNoJoin call!!! */2069 NTSTATUS Status = vboxWddmVrListRegIntersectSubstNoJoin(pList, pReg1, pRect2);2070 if (NT_SUCCESS(Status))2071 {2072 *ppNext = pPrev->Flink;2073 return &pList->ListHead;2074 }2075 WARN(("vboxWddmVrListRegIntersectSubstNoJoin failed!"));2076 Assert(!NT_SUCCESS(Status));2077 pData->Status = Status;2078 *ppNext = &pList->ListHead;2079 return &pList->ListHead;2080 }2081 2082 static NTSTATUS vboxWddmVrListSubstNoJoin(PVBOXWDDMVR_LIST pList, UINT cRects, const RECT *aRects, BOOLEAN *pfChanged)2083 {2084 if (VBoxWddmVrListIsEmpty(pList))2085 return STATUS_SUCCESS;2086 2087 VBOXWDDMVR_CBDATA_SUBST Data;2088 Data.Status = STATUS_SUCCESS;2089 Data.fChanged = FALSE;2090 2091 *pfChanged = FALSE;2092 2093 vboxWddmVrListVisitIntersected(pList, cRects, aRects, vboxWddmVrListSubstNoJoinCb, &Data);2094 if (!NT_SUCCESS(Data.Status))2095 {2096 WARN(("vboxWddmVrListVisitIntersected failed!"));2097 return Data.Status;2098 }2099 2100 *pfChanged = Data.fChanged;2101 return STATUS_SUCCESS;2102 }2103 2104 #if 02105 static const RECT* vboxWddmVrRectsOrder(UINT cRects, const RECT *aRects)2106 {2107 #ifdef DEBUG2108 {2109 for (UINT i = 0; i < cRects; ++i)2110 {2111 RECT *pRectI = &aRects[i];2112 for (UINT j = i + 1; j < cRects; ++j)2113 {2114 RECT *pRectJ = &aRects[j];2115 Assert(!vboxWddmRectIsIntersect(pRectI, pRectJ));2116 }2117 }2118 }2119 #endif2120 2121 RECT * pRects = (RECT *)aRects;2122 /* check if rects are ordered already */2123 for (UINT i = 0; i < cRects - 1; ++i)2124 {2125 RECT *pRect1 = &pRects[i];2126 RECT *pRect2 = &pRects[i+1];2127 if (vboxWddmVrRegNonintersectedComparator(pRect1, pRect2) < 0)2128 continue;2129 2130 WARN(("rects are unoreded!"));2131 2132 if (pRects == aRects)2133 {2134 pRects = (RECT *)vboxWddmMemAlloc(sizeof (RECT) * cRects);2135 if (!pRects)2136 {2137 WARN(("vboxWddmMemAlloc failed!"));2138 return NULL;2139 }2140 2141 memcpy(pRects, aRects, sizeof (RECT) * cRects);2142 }2143 2144 Assert(pRects != aRects);2145 2146 int j = (int)i - 1;2147 do {2148 RECT Tmp = *pRect1;2149 *pRect1 = *pRect2;2150 *pRect2 = Tmp;2151 2152 if (j < 0)2153 break;2154 2155 if (vboxWddmVrRegNonintersectedComparator(pRect1, pRect1-1) > 0)2156 break;2157 2158 pRect2 = pRect1--;2159 --j;2160 } while (1);2161 }2162 2163 return pRects;2164 }2165 #endif2166 2167 void VBoxWddmVrListTranslate(PVBOXWDDMVR_LIST pList, LONG x, LONG y)2168 {2169 for (PLIST_ENTRY pEntry1 = pList->ListHead.Flink; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->Flink)2170 {2171 PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);2172 vboxWddmRectTranslate(&pReg1->Rect, x, y);2173 }2174 }2175 2176 NTSTATUS VBoxWddmVrListRectsSubst(PVBOXWDDMVR_LIST pList, UINT cRects, const RECT *aRects, BOOLEAN *pfChanged)2177 {2178 #if 02179 const RECT *pRects = vboxWddmVrRectsOrder(cRects, aRects);2180 if (!pRects)2181 {2182 WARN(("vboxWddmVrRectsOrder failed!"));2183 return STATUS_NO_MEMORY;2184 }2185 #endif2186 2187 NTSTATUS Status = vboxWddmVrListSubstNoJoin(pList, cRects, aRects, pfChanged);2188 if (!NT_SUCCESS(Status))2189 {2190 WARN(("vboxWddmVrListSubstNoJoin failed!"));2191 goto done;2192 }2193 2194 if (!*pfChanged)2195 goto done;2196 2197 vboxWddmVrListJoinRects(pList);2198 2199 done:2200 #if 02201 if (pRects != aRects)2202 vboxWddmMemFree(pRects);2203 #endif2204 return Status;2205 }2206 2207 NTSTATUS VBoxWddmVrListRectsAdd(PVBOXWDDMVR_LIST pList, UINT cRects, const RECT *aRects, BOOLEAN *pfChanged)2208 {2209 UINT cCovered = 0;2210 2211 #if 02212 #ifdef DEBUG2213 {2214 for (UINT i = 0; i < cRects; ++i)2215 {2216 RECT *pRectI = &aRects[i];2217 for (UINT j = i + 1; j < cRects; ++j)2218 {2219 RECT *pRectJ = &aRects[j];2220 Assert(!vboxWddmRectIsIntersect(pRectI, pRectJ));2221 }2222 }2223 }2224 #endif2225 #endif2226 2227 /* early sort out the case when there are no new rects */2228 for (UINT i = 0; i < cRects; ++i)2229 {2230 for (PLIST_ENTRY pEntry1 = pList->ListHead.Flink; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->Flink)2231 {2232 PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);2233 if (vboxWddmRectIsCoveres(&pReg1->Rect, &aRects[i]))2234 {2235 cCovered++;2236 break;2237 }2238 }2239 }2240 2241 if (cCovered == cRects)2242 {2243 *pfChanged = FALSE;2244 return STATUS_SUCCESS;2245 }2246 2247 /* rects are not covered, need to go the slow way */2248 2249 VBOXWDDMVR_LIST DiffList;2250 VBoxWddmVrListInit(&DiffList);2251 PRECT pListRects = NULL;2252 UINT cAllocatedRects = 0;2253 BOOLEAN fNeedRectreate = TRUE;2254 BOOLEAN fChanged = FALSE;2255 NTSTATUS Status = STATUS_SUCCESS;2256 2257 for (UINT i = 0; i < cRects; ++i)2258 {2259 PVBOXWDDMVR_REG pReg = vboxWddmVrRegCreate();2260 if (!pReg)2261 {2262 WARN(("vboxWddmVrRegCreate failed!"));2263 Status = STATUS_NO_MEMORY;2264 break;2265 }2266 pReg->Rect = aRects[i];2267 2268 UINT cListRects = VBoxWddmVrListRectsCount(pList);2269 if (!cListRects)2270 {2271 vboxWddmVrListRegAdd(pList, pReg, &pList->ListHead, FALSE);2272 fChanged = TRUE;2273 continue;2274 }2275 else2276 {2277 Assert(VBoxWddmVrListIsEmpty(&DiffList));2278 vboxWddmVrListRegAdd(&DiffList, pReg, &DiffList.ListHead, FALSE);2279 }2280 2281 if (cAllocatedRects < cListRects)2282 {2283 cAllocatedRects = cListRects + cRects;2284 Assert(fNeedRectreate);2285 if (pListRects)2286 vboxWddmMemFree(pListRects);2287 pListRects = (PRECT)vboxWddmMemAlloc(sizeof (RECT) * cAllocatedRects);2288 if (!pListRects)2289 {2290 WARN(("vboxWddmMemAllocZero failed!"));2291 Status = STATUS_NO_MEMORY;2292 break;2293 }2294 }2295 2296 2297 if (fNeedRectreate)2298 {2299 Status = VBoxWddmVrListRectsGet(pList, cListRects, pListRects);2300 Assert(Status == STATUS_SUCCESS);2301 fNeedRectreate = FALSE;2302 }2303 2304 BOOLEAN fDummyChanged = FALSE;2305 Status = vboxWddmVrListSubstNoJoin(&DiffList, cListRects, pListRects, &fDummyChanged);2306 if (!NT_SUCCESS(Status))2307 {2308 WARN(("vboxWddmVrListSubstNoJoin failed!"));2309 Status = STATUS_NO_MEMORY;2310 break;2311 }2312 2313 if (!VBoxWddmVrListIsEmpty(&DiffList))2314 {2315 vboxWddmVrListAddNonintersected(pList, &DiffList);2316 fNeedRectreate = TRUE;2317 fChanged = TRUE;2318 }2319 2320 Assert(VBoxWddmVrListIsEmpty(&DiffList));2321 }2322 2323 if (pListRects)2324 vboxWddmMemFree(pListRects);2325 2326 Assert(VBoxWddmVrListIsEmpty(&DiffList) || Status != STATUS_SUCCESS);2327 VBoxWddmVrListClear(&DiffList);2328 2329 if (fChanged)2330 vboxWddmVrListJoinRects(pList);2331 2332 *pfChanged = fChanged;2333 2334 return STATUS_SUCCESS;2335 }2336 2337 NTSTATUS VBoxWddmVrListRectsGet(PVBOXWDDMVR_LIST pList, UINT cRects, PRECT aRects)2338 {2339 if (cRects < VBoxWddmVrListRectsCount(pList))2340 return STATUS_BUFFER_TOO_SMALL;2341 2342 UINT i = 0;2343 for (PLIST_ENTRY pEntry1 = pList->ListHead.Flink; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->Flink, ++i)2344 {2345 PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);2346 aRects[i] = pReg1->Rect;2347 }2348 return STATUS_SUCCESS;2349 }2350 2351 1608 NTSTATUS vboxWddmDrvCfgInit(PUNICODE_STRING pRegStr) 2352 1609 { -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.h
r45132 r46757 164 164 #endif 165 165 166 /* visible rects */167 typedef struct VBOXWDDMVR_LIST168 {169 LIST_ENTRY ListHead;170 UINT cEntries;171 } VBOXWDDMVR_LIST, *PVBOXWDDMVR_LIST;172 173 DECLINLINE(UINT) VBoxWddmVrListRectsCount(PVBOXWDDMVR_LIST pList)174 {175 return pList->cEntries;176 }177 178 DECLINLINE(BOOLEAN) VBoxWddmVrListIsEmpty(PVBOXWDDMVR_LIST pList)179 {180 return !VBoxWddmVrListRectsCount(pList);181 }182 183 DECLINLINE(void) VBoxWddmVrListInit(PVBOXWDDMVR_LIST pList)184 {185 InitializeListHead(&pList->ListHead);186 pList->cEntries = 0;187 }188 189 void VBoxWddmVrListClear(PVBOXWDDMVR_LIST pList);190 191 void VBoxWddmVrListTranslate(PVBOXWDDMVR_LIST pList, LONG x, LONG y);192 193 NTSTATUS VBoxWddmVrListRectsAdd(PVBOXWDDMVR_LIST pList, UINT cRects, const RECT *aRects, BOOLEAN *pfChanged);194 NTSTATUS VBoxWddmVrListRectsSubst(PVBOXWDDMVR_LIST pList, UINT cRects, const RECT *aRects, BOOLEAN *pfChanged);195 NTSTATUS VBoxWddmVrListRectsGet(PVBOXWDDMVR_LIST pList, UINT cRects, PRECT aRects);196 197 NTSTATUS VBoxWddmVrInit();198 void VBoxWddmVrTerm();199 200 166 NTSTATUS vboxWddmDrvCfgInit(PUNICODE_STRING pRegStr); 201 167 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPShgsmi.h
r44529 r46757 49 49 void VBoxSHGSMICommandCancelSynch(PVBOXSHGSMI pHeap, const VBOXSHGSMIHEADER* pHeader); 50 50 51 DECLINLINE(HGSMIOFFSET) VBoxSHGSMICommandOffset( PVBOXSHGSMI pHeap, const VBOXSHGSMIHEADER* pHeader)51 DECLINLINE(HGSMIOFFSET) VBoxSHGSMICommandOffset(const PVBOXSHGSMI pHeap, const VBOXSHGSMIHEADER* pHeader) 52 52 { 53 53 return HGSMIHeapBufferOffset(&pHeap->Heap, (void*)pHeader); 54 } 55 56 /* allows getting VRAM offset of arbitrary pointer within the SHGSMI command 57 * if invalid pointer is passed in, behavior is undefined */ 58 DECLINLINE(HGSMIOFFSET) VBoxSHGSMICommandPtrOffset(const PVBOXSHGSMI pHeap, const void * pvPtr) 59 { 60 return HGSMIPointerToOffset (&pHeap->Heap.area, (const HGSMIBUFFERHEADER *)pvPtr); 54 61 } 55 62 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
r46662 r46757 33 33 #include "VBoxMPCr.h" 34 34 35 #include <cr_vreg.h> 36 37 35 38 #if 0 36 39 #include <iprt/avl.h> … … 112 115 BOOLEAN bVisible; 113 116 char fGhSynced; 117 /* specifies whether the source has 3D overlay data visible */ 118 BOOLEAN fHas3DVrs; 119 VBOXVR_LIST VrList; 114 120 VBOXVBVAINFO Vbva; 115 121 #ifdef VBOX_WITH_VIDEOHWACCEL … … 222 228 VBOXDISP_UMHANDLE hSwapchainUm; 223 229 VBOXDISP_KMHANDLE hSwapchainKm; 230 UINT winHostID; 231 BOOLEAN fExposed; 224 232 POINT Pos; 225 233 UINT width; 226 234 UINT height; 227 VBOX WDDMVR_LIST VisibleRegions;235 VBOXVR_LIST VisibleRegions; 228 236 }VBOXWDDM_SWAPCHAIN, *PVBOXWDDM_SWAPCHAIN; 229 237 … … 237 245 BOOLEAN fRenderFromShadowDisabled; 238 246 uint32_t u32CrConClientID; 239 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS240 247 VBOXMP_CRPACKER CrPacker; 241 #endif242 248 VBOXWDDM_HTABLE Swapchains; 243 249 VBOXVIDEOCM_CTX CmContext; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp
r45132 r46757 22 22 #include "VBoxMPVhwa.h" 23 23 #include <iprt/asm.h> 24 #include "VBoxMPCr.h" 25 26 # include <packer.h> 24 27 25 28 NTSTATUS vboxVdmaPipeConstruct(PVBOXVDMAPIPE pPipe) … … 213 216 } 214 217 215 PVBOXVDMAPIPE_CMD_DR vboxVdmaGgCmdCreate(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_TYPE enmType, uint32_t cbCmd)216 {217 PVBOXVDMAPIPE_CMD_DR pHdr;218 #ifdef VBOX_WDDM_IRQ_COMPLETION219 if (enmType == VBOXVDMAPIPE_CMD_TYPE_DMACMD)220 {221 UINT cbAlloc = VBOXVDMACMD_SIZE_FROMBODYSIZE(cbCmd);222 VBOXVDMACBUF_DR* pDr = vboxVdmaCBufDrCreate(&pDevExt->u.primary.Vdma, cbAlloc);223 if (!pDr)224 {225 WARN(("dr allocation failed"));226 return NULL;227 }228 pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_FOLLOWS_DR;229 pDr->cbBuf = VBOXVDMACMD_HEADER_SIZE();230 pDr->rc = VINF_SUCCESS;231 232 233 PVBOXVDMACMD pDmaHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD);234 pDmaHdr->enmType = VBOXVDMACMD_TYPE_DMA_NOP;235 pDmaHdr->u32CmdSpecific = 0;236 237 pHdr = VBOXVDMACMD_BODY(pDmaHdr, VBOXVDMAPIPE_CMD_DR);238 }239 else240 #endif241 {242 pHdr = (PVBOXVDMAPIPE_CMD_DR)vboxWddmMemAllocZero(cbCmd);243 if (!pHdr)244 {245 WARN(("cmd allocation failed"));246 return NULL;247 }248 }249 pHdr->enmType = enmType;250 pHdr->cRefs = 1;251 return pHdr;252 }253 254 #ifdef VBOX_WDDM_IRQ_COMPLETION255 DECLINLINE(VBOXVDMACBUF_DR*) vboxVdmaGgCmdDmaGetDr(PVBOXVDMAPIPE_CMD_DMACMD pDr)256 {257 VBOXVDMACMD* pDmaCmd = VBOXVDMACMD_FROM_BODY(pDr);258 VBOXVDMACBUF_DR* pDmaDr = VBOXVDMACBUF_DR_FROM_TAIL(pDmaCmd);259 return pDmaDr;260 }261 262 DECLINLINE(PVBOXVDMADDI_CMD) vboxVdmaGgCmdDmaGetDdiCmd(PVBOXVDMAPIPE_CMD_DMACMD pDr)263 {264 VBOXVDMACBUF_DR* pDmaDr = vboxVdmaGgCmdDmaGetDr(pDr);265 return VBOXVDMADDI_CMD_FROM_BUF_DR(pDmaDr);266 }267 268 #endif269 270 void vboxVdmaGgCmdDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pDr)271 {272 #ifdef VBOX_WDDM_IRQ_COMPLETION273 if (pDr->enmType == VBOXVDMAPIPE_CMD_TYPE_DMACMD)274 {275 VBOXVDMACBUF_DR* pDmaDr = vboxVdmaGgCmdDmaGetDr((PVBOXVDMAPIPE_CMD_DMACMD)pDr);276 vboxVdmaCBufDrFree(&pDevExt->u.primary.Vdma, pDmaDr);277 return;278 }279 #endif280 vboxWddmMemFree(pDr);281 }282 283 DECLCALLBACK(VOID) vboxVdmaGgDdiCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext)284 {285 vboxVdmaGgCmdRelease(pDevExt, (PVBOXVDMAPIPE_CMD_DR)pvContext);286 }287 288 /**289 * helper function used for system thread creation290 */291 static NTSTATUS vboxVdmaGgThreadCreate(PKTHREAD * ppThread, PKSTART_ROUTINE pStartRoutine, PVOID pStartContext)292 {293 NTSTATUS fStatus;294 HANDLE hThread;295 OBJECT_ATTRIBUTES fObjectAttributes;296 297 Assert(KeGetCurrentIrql() == PASSIVE_LEVEL);298 299 InitializeObjectAttributes(&fObjectAttributes, NULL, OBJ_KERNEL_HANDLE,300 NULL, NULL);301 302 fStatus = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS,303 &fObjectAttributes, NULL, NULL,304 (PKSTART_ROUTINE) pStartRoutine, pStartContext);305 if (!NT_SUCCESS(fStatus))306 return fStatus;307 308 ObReferenceObjectByHandle(hThread, THREAD_ALL_ACCESS, NULL,309 KernelMode, (PVOID*) ppThread, NULL);310 ZwClose(hThread);311 return STATUS_SUCCESS;312 }313 314 218 DECLINLINE(void) vboxVdmaDirtyRectsCalcIntersection(const RECT *pArea, const VBOXWDDM_RECTS_INFO *pRects, PVBOXWDDM_RECTS_INFO pResult) 315 219 { … … 380 284 } 381 285 286 static VOID vboxWddmBltPipeRectsTranslate(VBOXVDMAPIPE_RECTS *pRects, int x, int y) 287 { 288 vboxWddmRectTranslate(&pRects->ContextRect, x, y); 289 290 for (UINT i = 0; i < pRects->UpdateRects.cRects; ++i) 291 { 292 vboxWddmRectTranslate(&pRects->UpdateRects.aRects[i], x, y); 293 } 294 } 295 296 static VBOXVDMAPIPE_RECTS * vboxWddmBltPipeRectsDup(const VBOXVDMAPIPE_RECTS *pRects) 297 { 298 const size_t cbDup = RT_OFFSETOF(VBOXVDMAPIPE_RECTS, UpdateRects.aRects[pRects->UpdateRects.cRects]); 299 VBOXVDMAPIPE_RECTS *pDup = (VBOXVDMAPIPE_RECTS*)vboxWddmMemAllocZero(cbDup); 300 if (!pDup) 301 { 302 WARN(("vboxWddmMemAllocZero failed")); 303 return NULL; 304 } 305 memcpy(pDup, pRects, cbDup); 306 return pDup; 307 } 308 309 typedef struct VBOXMP_VDMACR_WRITECOMPLETION 310 { 311 void *pvBufferToFree; 312 } VBOXMP_VDMACR_WRITECOMPLETION, *PVBOXMP_VDMACR_WRITECOMPLETION; 313 314 static DECLCALLBACK(void) vboxVdmaCrWriteCompletion(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvCtx) 315 { 316 PVBOXMP_VDMACR_WRITECOMPLETION pData = (PVBOXMP_VDMACR_WRITECOMPLETION)pvCtx; 317 void* pvBufferToFree = pData->pvBufferToFree; 318 if (pvBufferToFree) 319 VBoxMpCrShgsmiTransportBufFree(pCon, pvBufferToFree); 320 321 VBoxMpCrShgsmiTransportCmdTermWriteAsync(pCon, pvCtx); 322 } 323 324 NTSTATUS vboxVdmaCrSubmitWriteAsync(PVBOXMP_DEVEXT pDevExt, VBOXMP_CRPACKER *pCrPacker, uint32_t u32CrConClientID) 325 { 326 Assert(u32CrConClientID); 327 NTSTATUS Status = STATUS_SUCCESS; 328 uint32_t cbBuffer; 329 void * pvPackBuffer; 330 void * pvBuffer = VBoxMpCrPackerTxBufferComplete(pCrPacker, &cbBuffer, &pvPackBuffer); 331 if (pvBuffer) 332 { 333 PVBOXMP_VDMACR_WRITECOMPLETION pvCompletionData = (PVBOXMP_VDMACR_WRITECOMPLETION)VBoxMpCrShgsmiTransportCmdCreateWriteAsync(&pDevExt->CrHgsmiTransport, u32CrConClientID, pvBuffer, cbBuffer, 334 vboxVdmaCrWriteCompletion, sizeof (*pvCompletionData)); 335 if (pvCompletionData) 336 { 337 pvCompletionData->pvBufferToFree = pvPackBuffer; 338 int rc = VBoxMpCrShgsmiTransportCmdSubmitWriteAsync(&pDevExt->CrHgsmiTransport, pvCompletionData); 339 if (!RT_SUCCESS(rc)) 340 { 341 WARN(("VBoxMpCrShgsmiTransportCmdSubmitWriteAsync failed, rc %d", rc)); 342 Status = STATUS_UNSUCCESSFUL; 343 } 344 } 345 else 346 { 347 WARN(("VBoxMpCrShgsmiTransportCmdCreateWriteAsync failed")); 348 Status = STATUS_NO_MEMORY; 349 } 350 } 351 352 return Status; 353 } 354 355 static NTSTATUS vboxVdmaVRegGet(PVBOXWDDM_SWAPCHAIN pSwapchain, const RTRECT *pCtxRect, uint32_t *pcVRects, RTRECT **ppVRectsBuff, uint32_t *pcVRectsBuff) 356 { 357 RTRECT *pVRectsBuff = *ppVRectsBuff; 358 uint32_t cVRectsBuff = *pcVRectsBuff; 359 uint32_t cVRects = VBoxVrListRectsCount(&pSwapchain->VisibleRegions); 360 if (cVRectsBuff < cVRects) 361 { 362 if (pVRectsBuff) 363 vboxWddmMemFree(pVRectsBuff); 364 pVRectsBuff = (RTRECT*)vboxWddmMemAlloc(cVRects * sizeof (pVRectsBuff[0])); 365 if (!pVRectsBuff) 366 { 367 WARN(("vboxWddmMemAlloc failed")); 368 *pcVRectsBuff = 0; 369 *ppVRectsBuff = NULL; 370 *pcVRects = NULL; 371 return STATUS_NO_MEMORY; 372 } 373 374 cVRectsBuff = cVRects; 375 *pcVRectsBuff = cVRectsBuff; 376 *ppVRectsBuff = pVRectsBuff; 377 } 378 379 int rc = VBoxVrListRectsGet(&pSwapchain->VisibleRegions, cVRects, pVRectsBuff); 380 AssertRC(rc); 381 if (pCtxRect->xLeft || pCtxRect->yTop) 382 { 383 for (UINT i = 0; i < cVRects; ++i) 384 { 385 VBoxRectTranslate(&pVRectsBuff[i], -pCtxRect->xLeft, -pCtxRect->yTop); 386 } 387 } 388 389 *pcVRects = cVRects; 390 return STATUS_SUCCESS; 391 } 392 393 382 394 /** 383 395 * @param pDevExt 384 396 */ 385 static NTSTATUS vboxVdmaGgDirtyRectsProcess(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXWDDM_SWAPCHAIN pSwapchain, RECT *pSrcRect, VBOXVDMAPIPE_RECTS *pContextRects 386 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 387 , PVBOXMP_CRPACKER pPacker 388 #endif 389 ) 390 { 391 PVBOXWDDM_RECTS_INFO pRects = &pContextRects->UpdateRects; 397 static NTSTATUS vboxVdmaProcessVRegCmdLegacy(PVBOXMP_DEVEXT pDevExt, 398 PVBOXWDDM_CONTEXT pContext, 399 PVBOXWDDM_SOURCE pSource, 400 PVBOXWDDM_SWAPCHAIN pSwapchain, 401 const RECT *pSrcRect, 402 const VBOXVDMAPIPE_RECTS *pContextRects) 403 { 404 VBOXVDMAPIPE_RECTS *pRectsToFree = NULL; 405 POINT pos = pSource->VScreenPos; 406 if (pos.x || pos.y) 407 { 408 pRectsToFree = vboxWddmBltPipeRectsDup(pContextRects); 409 /* note: do NOT translate the src rect since it is used for screen pos calculation */ 410 vboxWddmBltPipeRectsTranslate(pRectsToFree, pos.x, pos.y); 411 pContextRects = pRectsToFree; 412 } 413 const VBOXWDDM_RECTS_INFO *pRects = &pContextRects->UpdateRects; 392 414 NTSTATUS Status = STATUS_SUCCESS; 393 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 394 PVBOXVIDEOCM_CMD_RECTS_INTERNAL pCmdInternal = NULL; 395 #else 396 void *pvCommandBuffer = NULL; 397 #endif 398 uint32_t cbCmdInternal = VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pRects->cRects); 399 BOOLEAN fCurChanged = FALSE, fCurRectChanged = FALSE; 415 int rc; 416 bool fCurChanged = FALSE, fCurRectChanged = FALSE; 400 417 POINT CurPos; 401 Assert(KeGetCurrentIrql() < DISPATCH_LEVEL); 418 RTRECT *pVRectsBuff = NULL; 419 uint32_t cVRectsBuff = 0; 402 420 VBOXWDDM_CTXLOCK_DATA 403 421 … … 413 431 #if 0 414 432 if (pSwapchain->Pos.x != VBOXWDDM_INVALID_COORD) 415 VBox WddmVrListTranslate(&pSwapchain->VisibleRegions, pSwapchain->Pos.x - CurPos.x, pSwapchain->Pos.y - CurPos.y);433 VBoxVrListTranslate(&pSwapchain->VisibleRegions, pSwapchain->Pos.x - CurPos.x, pSwapchain->Pos.y - CurPos.y); 416 434 else 417 435 #endif 418 VBox WddmVrListClear(&pSwapchain->VisibleRegions);436 VBoxVrListClear(&pSwapchain->VisibleRegions); 419 437 fCurRectChanged = TRUE; 420 438 pSwapchain->Pos = CurPos; 421 439 } 422 440 423 Status = VBoxWddmVrListRectsAdd(&pSwapchain->VisibleRegions, pRects->cRects, pRects->aRects, &fCurChanged); 424 if (!NT_SUCCESS(Status)) 425 { 426 WARN(("VBoxWddmVrListRectsAdd failed!")); 441 rc = VBoxVrListRectsAdd(&pSwapchain->VisibleRegions, pRects->cRects, (const RTRECT*)pRects->aRects, &fCurChanged); 442 if (!RT_SUCCESS(rc)) 443 { 444 WARN(("VBoxWddmVrListRectsAdd failed, rc %d!", rc)); 445 Status = STATUS_UNSUCCESSFUL; 427 446 goto done; 428 447 } … … 435 454 } 436 455 437 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS438 456 /* before posting the add visible rects diff, we need to first hide rects for other windows */ 439 457 … … 443 461 { 444 462 PVBOXWDDM_SWAPCHAIN pCurSwapchain = VBOXWDDMENTRY_2_SWAPCHAIN(pCur); 445 BOOLEAN fChanged = FALSE; 446 447 Status = VBoxWddmVrListRectsSubst(&pCurSwapchain->VisibleRegions, pRects->cRects, pRects->aRects, &fChanged); 463 PVBOXWDDM_CONTEXT pCurContext = pCurSwapchain->pContext; 464 PVBOXMP_CRPACKER pCurPacker = &pCurContext->CrPacker; 465 bool fChanged = FALSE; 466 467 rc = VBoxVrListRectsSubst(&pCurSwapchain->VisibleRegions, pRects->cRects, (const RTRECT*)pRects->aRects, &fChanged); 468 if (!RT_SUCCESS(rc)) 469 { 470 WARN(("VBoxWddmVrListRectsAdd failed, rc %d!", rc)); 471 Status = STATUS_UNSUCCESSFUL; 472 goto done; 473 } 474 475 if (!fChanged) 476 continue; 477 478 uint32_t cVRects; 479 RTRECT CurCtxRect; 480 CurCtxRect.xLeft = pCurSwapchain->Pos.x; 481 CurCtxRect.yTop = pCurSwapchain->Pos.y; 482 CurCtxRect.xRight = CurCtxRect.xLeft + pCurSwapchain->width; 483 CurCtxRect.yBottom = CurCtxRect.yTop + pCurSwapchain->height; 484 Status = vboxVdmaVRegGet(pCurSwapchain, &CurCtxRect, &cVRects, &pVRectsBuff, &cVRectsBuff); 448 485 if (!NT_SUCCESS(Status)) 449 486 { 450 WARN(("vbox WddmVrListRectsAdd failed!"));487 WARN(("vboxVdmaVRegGet Status 0x%x", Status)); 451 488 goto done; 452 489 } 453 490 454 if (!fChanged) 455 continue; 456 457 if (!pCmdInternal) 491 void *pvCommandBuffer = NULL; 492 uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE; 493 cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(cVRects); 494 495 pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommandBuffer); 496 if (!pvCommandBuffer) 458 497 { 459 pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pCurSwapchain->pContext->CmContext, cbCmdInternal); 460 if (!pCmdInternal) 461 { 462 WARN(("vboxVideoCmCmdCreate failed!")); 463 Status = STATUS_NO_MEMORY; 464 goto done; 465 } 498 WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!")); 499 Status = VERR_OUT_OF_RESOURCES; 500 goto done; 466 501 } 467 else 502 503 VBoxMpCrPackerTxBufferInit(pCurPacker, pvCommandBuffer, cbCommandBuffer, 1); 504 505 Assert(pCurSwapchain->winHostID); 506 crPackWindowVisibleRegion(&pCurPacker->CrPacker, pCurSwapchain->winHostID, cVRects, (GLint*)pVRectsBuff); 507 508 Status = vboxVdmaCrSubmitWriteAsync(pDevExt, pCurPacker, pCurContext->u32CrConClientID); 509 if (!NT_SUCCESS(Status)) 468 510 { 469 pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdReinitForContext(pCmdInternal, &pCurSwapchain->pContext->CmContext); 511 WARN(("vboxVdmaCrSubmitWriteAsync failed Status 0x%x", Status)); 512 VBoxMpCrShgsmiTransportBufFree(&pDevExt->CrHgsmiTransport, pvCommandBuffer); 470 513 } 471 472 pCmdInternal->Cmd.fFlags.Value = 0; 473 pCmdInternal->Cmd.fFlags.bAddHiddenRects = 1; 474 memcpy(&pCmdInternal->Cmd.RectsInfo, pRects, RT_OFFSETOF(VBOXWDDM_RECTS_INFO, aRects[pRects->cRects])); 475 476 pCmdInternal->hSwapchainUm = pCurSwapchain->hSwapchainUm; 477 478 vboxVideoCmCmdSubmit(pCmdInternal, VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pCmdInternal->Cmd.RectsInfo.cRects)); 479 pCmdInternal = NULL; 480 } 481 } 482 #endif 514 } 515 } 516 483 517 if (!pSwapchain) 484 518 goto done; 485 519 486 RECT *pVisRects; 487 488 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 489 uint32_t cbCommandBuffer = 0, cCommands = 0; 490 ++cCommand; 491 cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(pRects->cRects); 492 #endif 520 PVBOXMP_CRPACKER pPacker = &pContext->CrPacker; 521 uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE, cCommands = 0; 522 523 uint32_t cVRects; 524 Status = vboxVdmaVRegGet(pSwapchain, (const RTRECT *)&pContextRects->ContextRect, &cVRects, &pVRectsBuff, &cVRectsBuff); 525 if (!NT_SUCCESS(Status)) 526 { 527 WARN(("vboxVdmaVRegGet Status 0x%x", Status)); 528 goto done; 529 } 530 531 ++cCommands; 532 cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(cVRects); 533 493 534 if (fCurRectChanged && fCurChanged) 494 535 { 495 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 496 ++cCommand; 536 ++cCommands; 497 537 cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWPOSITION; 498 499 pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommand); 500 if (!pvCommandBuffer) 501 { 502 WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!")); 503 Status = STATUS_NO_MEMORY; 504 goto done; 505 } 506 VBoxMpCrPackerTxBufferInit(pPacker,pvCommandBuffer, cbCommandBuffer, cCommands); 507 crPackWindowPosition(&pPacker->CrPacker, window, CurPos.x, CurPos.y); 508 #else 509 cbCmdInternal = VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pRects->cRects + 1); 510 if (pCmdInternal) 511 vboxVideoCmCmdRelease(pCmdInternal); 512 pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pContext->CmContext, cbCmdInternal); 513 pCmdInternal->Cmd.fFlags.Value = 0; 514 pCmdInternal->Cmd.fFlags.bSetViewRect = 1; 515 pCmdInternal->Cmd.fFlags.bAddVisibleRects = 1; 516 pCmdInternal->Cmd.RectsInfo.cRects = pRects->cRects + 1; 517 pCmdInternal->Cmd.RectsInfo.aRects[0].left = CurPos.x; 518 pCmdInternal->Cmd.RectsInfo.aRects[0].top = CurPos.y; 519 pCmdInternal->Cmd.RectsInfo.aRects[0].right = CurPos.x + pSwapchain->width; 520 pCmdInternal->Cmd.RectsInfo.aRects[0].bottom = CurPos.y + pSwapchain->height; 521 pVisRects = &pCmdInternal->Cmd.RectsInfo.aRects[1]; 522 #endif 523 } 524 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 525 else 526 { 527 if (!pCmdInternal) 528 { 529 Assert(pContext == pSwapchain->pContext); 530 pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pContext->CmContext, cbCmdInternal); 531 if (!pCmdInternal) 532 { 533 WARN(("vboxVideoCmCmdCreate failed!")); 534 Status = STATUS_NO_MEMORY; 535 goto done; 536 } 537 } 538 else 539 { 540 pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdReinitForContext(pCmdInternal, &pContext->CmContext); 541 } 542 543 pCmdInternal->Cmd.fFlags.Value = 0; 544 pCmdInternal->Cmd.fFlags.bAddVisibleRects = 1; 545 pCmdInternal->Cmd.RectsInfo.cRects = pRects->cRects; 546 pVisRects = &pCmdInternal->Cmd.RectsInfo.aRects[0]; 547 } 548 549 pCmdInternal->hSwapchainUm = pSwapchain->hSwapchainUm; 550 551 if (pRects->cRects) 552 memcpy(pVisRects, pRects->aRects, sizeof (RECT) * pRects->cRects); 553 554 vboxVideoCmCmdSubmit(pCmdInternal, VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pCmdInternal->Cmd.RectsInfo.cRects)); 555 pCmdInternal = NULL; 556 #else 538 } 539 540 if (!pSwapchain->fExposed) 541 { 542 ++cCommands; 543 cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWSHOW; 544 ++cCommands; 545 cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWSIZE; 546 } 547 548 void *pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommandBuffer); 557 549 if (!pvCommandBuffer) 558 550 { 559 pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommand); 560 if (!pvCommandBuffer) 561 { 562 WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!")); 563 Status = STATUS_NO_MEMORY; 564 goto done; 565 } 566 VBoxMpCrPackerTxBufferInit(pPacker,pvCommandBuffer, cbCommandBuffer, cCommands); 567 } 568 crPackWindowVisibleRegion(&pPacker->CrPacker, window, pRects->cRects, (GLint*)pRects->aRects); 569 #endif 551 WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!")); 552 Status = STATUS_NO_MEMORY; 553 goto done; 554 } 555 556 VBoxMpCrPackerTxBufferInit(pPacker,pvCommandBuffer, cbCommandBuffer, cCommands); 557 558 Assert(pSwapchain->winHostID); 559 560 if (fCurRectChanged && fCurChanged) 561 crPackWindowPosition(&pPacker->CrPacker, pSwapchain->winHostID, CurPos.x, CurPos.y); 562 563 if (!pSwapchain->fExposed) 564 { 565 crPackWindowSize(&pPacker->CrPacker, pSwapchain->winHostID, pSwapchain->width, pSwapchain->height); 566 crPackWindowShow(&pPacker->CrPacker, pSwapchain->winHostID, TRUE); 567 pSwapchain->fExposed = TRUE; 568 } 569 570 crPackWindowVisibleRegion(&pPacker->CrPacker, pSwapchain->winHostID, cVRects, (GLint*)pVRectsBuff); 571 572 Status = vboxVdmaCrSubmitWriteAsync(pDevExt, pPacker, pContext->u32CrConClientID); 573 if (!NT_SUCCESS(Status)) 574 { 575 WARN(("vboxVdmaCrSubmitWriteAsync failed Status 0x%x", Status)); 576 VBoxMpCrShgsmiTransportBufFree(&pDevExt->CrHgsmiTransport, pvCommandBuffer); 577 } 570 578 571 579 done: 572 580 VBOXWDDM_CTXLOCK_UNLOCK(pDevExt); 573 581 574 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 575 if (pCmdInternal) 576 vboxVideoCmCmdRelease(pCmdInternal); 577 #endif 578 return Status; 579 } 580 581 static NTSTATUS vboxVdmaGgDmaColorFill(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL pCF) 582 if (pRectsToFree) 583 vboxWddmMemFree(pRectsToFree); 584 585 if (pVRectsBuff) 586 vboxWddmMemFree(pVRectsBuff); 587 588 return Status; 589 } 590 591 static NTSTATUS vboxVdmaGgDmaColorFill(PVBOXMP_DEVEXT pDevExt, VBOXVDMA_CLRFILL *pCF) 582 592 { 583 593 NTSTATUS Status = STATUS_UNSUCCESSFUL; … … 585 595 if (pDevExt->pvVisibleVram) 586 596 { 587 PVBOXWDDM_ALLOCATION pAlloc = pCF-> ClrFill.Alloc.pAlloc;597 PVBOXWDDM_ALLOCATION pAlloc = pCF->Alloc.pAlloc; 588 598 Assert(pAlloc->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID); 589 599 if (pAlloc->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID) … … 599 609 { 600 610 uint8_t bytestPP = bpp >> 3; 601 for (UINT i = 0; i < pCF-> ClrFill.Rects.cRects; ++i)611 for (UINT i = 0; i < pCF->Rects.cRects; ++i) 602 612 { 603 RECT *pRect = &pCF-> ClrFill.Rects.aRects[i];613 RECT *pRect = &pCF->Rects.aRects[i]; 604 614 for (LONG ir = pRect->top; ir < pRect->bottom; ++ir) 605 615 { … … 612 622 for (UINT j = 0; j < cRaw; ++j) 613 623 { 614 *pvU32Mem = pCF->C lrFill.Color;624 *pvU32Mem = pCF->Color; 615 625 ++pvU32Mem; 616 626 } … … 637 647 if (!vboxWddmRectIsEmpty(&UnionRect)) 638 648 { 639 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pCF-> ClrFill.Alloc.pAlloc->AllocData.SurfDesc.VidPnSourceId];649 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pCF->Alloc.pAlloc->AllocData.SurfDesc.VidPnSourceId]; 640 650 uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled); 641 651 if (!cUnlockedVBVADisabled) … … 783 793 } 784 794 785 static VOID vboxWddmBltPipeRectsTranslate(VBOXVDMAPIPE_RECTS *pRects, int x, int y) 786 { 787 vboxWddmRectTranslate(&pRects->ContextRect, x, y); 788 789 for (UINT i = 0; i < pRects->UpdateRects.cRects; ++i) 790 { 791 vboxWddmRectTranslate(&pRects->UpdateRects.aRects[i], x, y); 792 } 793 } 794 795 static NTSTATUS vboxVdmaGgDmaCmdProcessFast(PVBOXMP_DEVEXT pDevExt 796 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 797 , VBOXVDMAPIPE_CMD_DMACMD *pDmaCmd 798 #else 799 , PVBOXWDDM_CONTEXT pContext 800 , PVBOXWDDM_DMA_PRIVATEDATA_BASEHDR *pDmaCmd 801 , VBOXVDMAPIPE_FLAGS_DMACMD fFlags 802 , uint32_t u32FenceId 803 #endif 804 ) 805 { 795 static NTSTATUS vboxVdmaSubitVBoxTexPresent(PVBOXMP_DEVEXT pDevExt, 796 VBOXMP_CRPACKER *pCrPacker, 797 uint32_t u32CrConClientID, 798 uint32_t hostID, 799 uint32_t cfg, 800 int32_t posX, 801 int32_t posY, 802 uint32_t cRects, 803 const RTRECT*paRects) 804 { 805 uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE + VBOXMP_CRCMD_SIZE_VBOXTEXPRESENT(cRects); 806 uint32_t cCommands = 1; 807 void *pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommandBuffer); 808 if (!pvCommandBuffer) 809 { 810 WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!")); 811 return VERR_OUT_OF_RESOURCES; 812 } 813 814 VBoxMpCrPackerTxBufferInit(pCrPacker, pvCommandBuffer, cbCommandBuffer, cCommands); 815 816 crPackVBoxTexPresent(&pCrPacker->CrPacker, hostID, cfg, posX, posY, cRects, (int32_t*)paRects); 817 818 NTSTATUS Status = vboxVdmaCrSubmitWriteAsync(pDevExt, pCrPacker, u32CrConClientID); 819 if (!NT_SUCCESS(Status)) 820 { 821 WARN(("vboxVdmaCrSubmitWriteAsync failed Status 0x%x", Status)); 822 VBoxMpCrShgsmiTransportBufFree(&pDevExt->CrHgsmiTransport, pvCommandBuffer); 823 } 824 825 return Status; 826 } 827 828 static NTSTATUS vboxVdmaProcessVRegCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, 829 VBOXWDDM_DMA_ALLOCINFO *pSrcAllocInfo, 830 VBOXWDDM_DMA_ALLOCINFO *pDstAllocInfo, 831 const RECT *pSrcRect, const VBOXVDMAPIPE_RECTS *pDstRects) 832 { 833 D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId = pDstAllocInfo->srcId; 834 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[srcId]; 806 835 NTSTATUS Status = STATUS_SUCCESS; 807 DXGK_INTERRUPT_TYPE enmComplType = DXGK_INTERRUPT_DMA_COMPLETED; 808 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 809 PVBOXWDDM_CONTEXT pContext = pDmaCmd->pContext; 810 VBOXVDMAPIPE_FLAGS_DMACMD fFlags = pDmaCmd->fFlags; 811 #else 812 BOOLEAN fCompleteCmd = TRUE; 813 #endif 814 switch (pDmaCmd->enmCmd) 815 { 816 case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT: 817 { 818 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 819 PVBOXVDMAPIPE_CMD_DMACMD_BLT pBlt = (PVBOXVDMAPIPE_CMD_DMACMD_BLT)pDmaCmd; 820 #else 821 PVBOXWDDM_DMA_PRIVATEDATA_BLT pBlt = (PVBOXWDDM_DMA_PRIVATEDATA_BLT)pDmaCmd; 822 #endif 823 PVBOXWDDM_ALLOCATION pDstAlloc = pBlt->Blt.DstAlloc.pAlloc; 824 PVBOXWDDM_ALLOCATION pSrcAlloc = pBlt->Blt.SrcAlloc.pAlloc; 825 826 if (fFlags.fRealOp) 836 837 if (pDevExt->fTexPresentEnabled) 838 { 839 /* we care only about screen regions */ 840 PVBOXWDDM_ALLOCATION pDstAlloc = pDstAllocInfo->pAlloc; 841 PVBOXWDDM_ALLOCATION pSrcAlloc = pSrcAllocInfo->pAlloc; 842 843 if (pDstAlloc != pSource->pPrimaryAllocation) 844 { 845 WARN(("non-primary allocation passed to vboxWddmSubmitBltCmd!")); 846 return STATUS_NOT_SUPPORTED; 847 } 848 849 uint32_t hostID = pSrcAlloc->hostID; 850 int rc; 851 if (hostID) 852 { 853 Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D); 854 int32_t posX = pDstRects->ContextRect.left - pSrcRect->left; 855 int32_t posY = pDstRects->ContextRect.top - pSrcRect->top; 856 857 Status = vboxVdmaSubitVBoxTexPresent(pDevExt, &pContext->CrPacker, pContext->u32CrConClientID, hostID, srcId, posX, posY, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects); 858 if (NT_SUCCESS(Status)) 827 859 { 828 vboxVdmaGgDmaBlt(pDevExt, &pBlt->Blt); 829 830 if (VBOXWDDM_IS_FB_ALLOCATION(pDevExt, pDstAlloc) 831 && pDstAlloc->bVisible) 860 rc = VBoxVrListRectsSubst(&pSource->VrList, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects, NULL); 861 if (RT_SUCCESS(rc)) 862 pSource->fHas3DVrs = TRUE; 863 else 864 WARN(("VBoxVrListRectsSubst failed rc %d, ignoring..", rc)); 865 } 866 else 867 WARN(("vboxVdmaSubitVBoxTexPresent failed Status 0x%x", Status)); 868 } 869 else if (pSource->pPrimaryAllocation == pDstAlloc) 870 { 871 bool fChanged = false; 872 Assert(pDstAlloc->bVisible); 873 rc = VBoxVrListRectsAdd(&pSource->VrList, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects, &fChanged); 874 if (RT_SUCCESS(rc)) 875 { 876 if (fChanged) 832 877 { 833 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->AllocData.SurfDesc.VidPnSourceId]; 834 Assert(pDstAlloc->AllocData.SurfDesc.VidPnSourceId < VBOX_VIDEO_MAX_SCREENS); 835 Assert(pSource->pPrimaryAllocation == pDstAlloc); 836 837 RECT UpdateRect; 838 UpdateRect = pBlt->Blt.DstRects.UpdateRects.aRects[0]; 839 for (UINT i = 1; i < pBlt->Blt.DstRects.UpdateRects.cRects; ++i) 878 Status = vboxVdmaSubitVBoxTexPresent(pDevExt, &pContext->CrPacker, pContext->u32CrConClientID, hostID, srcId, 0, 0, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects); 879 if (NT_SUCCESS(Status)) 840 880 { 841 vboxWddmRectUnite(&UpdateRect, &pBlt->Blt.DstRects.UpdateRects.aRects[i]); 842 } 843 844 uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled); 845 if (!cUnlockedVBVADisabled) 846 { 847 VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &UpdateRect); 881 if (pSource->fHas3DVrs) 882 { 883 if (VBoxVrListRectsCount(&pSource->VrList) == 1) 884 { 885 RTRECT Rect; 886 VBoxVrListRectsGet(&pSource->VrList, 1, &Rect); 887 if (Rect.xLeft == 0 888 && Rect.yTop == 0 889 && Rect.xRight == pDstAlloc->AllocData.SurfDesc.width 890 && Rect.yBottom == pDstAlloc->AllocData.SurfDesc.height) 891 { 892 pSource->fHas3DVrs = FALSE; 893 } 894 } 895 } 848 896 } 849 897 else 850 { 851 VBOXVBVA_OP_WITHLOCK(ReportDirtyRect, pDevExt, pSource, &UpdateRect); 852 } 898 WARN(("vboxVdmaSubitVBoxTexPresent failed Status 0x%x", Status)); 853 899 } 854 900 } 855 856 if (fFlags.fVisibleRegions) 857 { 858 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 859 Status = STATUS_MORE_PROCESSING_REQUIRED; 860 vboxWddmAllocationRetain(pDstAlloc); 861 vboxWddmAllocationRetain(pSrcAlloc); 862 #else 863 Status = vboxVdmaGgDmaCmdProcessSlow(pDevExt, pContext, pDmaCmd, fFlags, u32FenceId); 864 fCompleteCmd = FALSE; 865 #endif 866 } 867 break; 868 } 869 870 case VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP: 871 { 872 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 873 PVBOXVDMAPIPE_CMD_DMACMD_FLIP pFlip = (PVBOXVDMAPIPE_CMD_DMACMD_FLIP)pDmaCmd; 874 #else 875 PVBOXVDMAPIPE_CMD_DMACMD_FLIP pFlip = (PVBOXVDMAPIPE_CMD_DMACMD_FLIP)pDmaCmd; 876 #endif 877 Assert(fFlags.fVisibleRegions); 878 Assert(!fFlags.fRealOp); 879 PVBOXWDDM_ALLOCATION pAlloc = pFlip->Flip.Alloc.pAlloc; 880 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId]; 881 vboxWddmAssignPrimary(pDevExt, pSource, pAlloc, pAlloc->AllocData.SurfDesc.VidPnSourceId); 882 if (fFlags.fVisibleRegions) 883 { 884 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 885 Status = STATUS_MORE_PROCESSING_REQUIRED; 886 vboxWddmAllocationRetain(pFlip->Flip.Alloc.pAlloc); 887 #else 888 Status = vboxVdmaGgDmaCmdProcessSlow(pDevExt, pContext, pDmaCmd, fFlags, u32FenceId); 889 fCompleteCmd = FALSE; 890 #endif 891 } 892 893 break; 894 } 895 case VBOXVDMACMD_TYPE_DMA_PRESENT_CLRFILL: 896 { 897 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 898 PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL pCF = (PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL)pDmaCmd; 899 #else 900 PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL pCF = (PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL)pDmaCmd; 901 #endif 902 Assert(fFlags.fRealOp); 903 Assert(!fFlags.fVisibleRegions); 904 Status = vboxVdmaGgDmaColorFill(pDevExt, pCF); 905 Assert(Status == STATUS_SUCCESS); 906 break; 907 } 908 909 default: 910 Assert(0); 911 break; 912 } 913 914 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 915 /* Corresponding Release is done by dma command completion handler */ 916 vboxVdmaGgCmdAddRef(&pDmaCmd->Hdr); 917 918 NTSTATUS tmpStatus = vboxVdmaGgCmdDmaNotifyCompleted(pDevExt, pDmaCmd, enmComplType); 919 if (!NT_SUCCESS(tmpStatus)) 920 { 921 WARN(("vboxVdmaGgCmdDmaNotifyCompleted failed, Status 0x%x", tmpStatus)); 922 /* the command was NOT submitted, and thus will not be released, release it here */ 923 vboxVdmaGgCmdRelease(pDevExt, &pDmaCmd->Hdr); 924 Status = tmpStatus; 925 } 926 #else 927 if (fCompleteCmd) 928 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, u32FenceId, enmComplType); 929 #endif 930 return Status; 931 } 932 933 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 934 typedef struct VBOXMP_VDMACR_WRITECOMPLETION 935 { 936 void *pvBufferToFree; 937 } VBOXMP_VDMACR_WRITECOMPLETION, *PVBOXMP_VDMACR_WRITECOMPLETION; 938 939 static DECLCALLBACK(void) vboxVdmaCrWriteCompletion(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvCtx) 940 { 941 PVBOXMP_VDMACR_WRITECOMPLETION pData = (PVBOXMP_VDMACR_WRITECOMPLETION)pvCtx; 942 void* pvBufferToFree = pData->pvBufferToFree; 943 if (pvBufferToFree) 944 VBoxMpCrShgsmiTransportBufFree(pCon, pvBufferToFree); 945 946 VBoxMpCrShgsmiTransportCmdTermWriteAsync(pCon, pvCtx); 947 } 948 #endif 949 950 static NTSTATUS vboxVdmaGgDmaCmdProcessSlow(PVBOXMP_DEVEXT pDevExt 951 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 952 , VBOXVDMAPIPE_CMD_DMACMD *pDmaCmd 953 #else 954 , PVBOXWDDM_CONTEXT pContext 955 , PVBOXWDDM_DMA_PRIVATEDATA_BASEHDR *pDmaCmd 956 , VBOXVDMAPIPE_FLAGS_DMACMD fFlags 957 , uint32_t u32FenceId 958 #endif 959 ) 901 else 902 WARN(("VBoxVrListRectsAdd failed rc %d, ignoring..", rc)); 903 } 904 else 905 { 906 WARN(("unexpected")); 907 Status = STATUS_INVALID_PARAMETER; 908 } 909 } 910 else 911 { 912 PVBOXWDDM_ALLOCATION pSrcAlloc = pSrcAllocInfo->pAlloc; 913 PVBOXWDDM_SWAPCHAIN pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pSrcAlloc); 914 915 if (pSwapchain) 916 { 917 Assert(pSrcAlloc->AllocData.SurfDesc.width == pSwapchain->width); 918 Assert(pSrcAlloc->AllocData.SurfDesc.height == pSwapchain->height); 919 } 920 921 Status = vboxVdmaProcessVRegCmdLegacy(pDevExt, pContext, pSource, pSwapchain, pSrcRect, pDstRects); 922 if (!NT_SUCCESS(Status)) 923 WARN(("vboxVdmaProcessVRegCmdLegacy failed Status 0x%x", Status)); 924 925 if (pSwapchain) 926 vboxWddmSwapchainRelease(pSwapchain); 927 } 928 929 return Status; 930 } 931 932 NTSTATUS vboxVdmaProcessBltCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, VBOXWDDM_DMA_PRIVATEDATA_BLT *pBlt, VBOXVDMAPIPE_FLAGS_DMACMD fBltFlags) 960 933 { 961 934 NTSTATUS Status = STATUS_SUCCESS; 962 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 963 PVBOXWDDM_CONTEXT pContext = pDmaCmd->pContext; 964 VBOXVDMAPIPE_FLAGS_DMACMD fFlags = pDmaCmd->fFlags; 965 #else 966 PVBOXMP_CRPACKER pPacker = &pContext->CrPacker; 967 #endif 968 DXGK_INTERRUPT_TYPE enmComplType = DXGK_INTERRUPT_DMA_COMPLETED; 969 970 Assert(fFlags.Value); 971 Assert(!fFlags.fRealOp); 972 973 switch (pDmaCmd->enmCmd) 974 { 975 case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT: 976 { 977 PVBOXVDMAPIPE_CMD_DMACMD_BLT pBlt = (PVBOXVDMAPIPE_CMD_DMACMD_BLT)pDmaCmd; 978 PVBOXWDDM_ALLOCATION pDstAlloc = pBlt->Blt.DstAlloc.pAlloc; 979 PVBOXWDDM_ALLOCATION pSrcAlloc = pBlt->Blt.SrcAlloc.pAlloc; 980 BOOLEAN bComplete = TRUE; 935 936 if (fBltFlags.fRealOp) 937 { 938 PVBOXWDDM_ALLOCATION pDstAlloc = pBlt->Blt.DstAlloc.pAlloc; 939 PVBOXWDDM_ALLOCATION pSrcAlloc = pBlt->Blt.SrcAlloc.pAlloc; 940 941 vboxVdmaGgDmaBlt(pDevExt, &pBlt->Blt); 942 943 if (VBOXWDDM_IS_FB_ALLOCATION(pDevExt, pDstAlloc) 944 && pDstAlloc->bVisible) 945 { 981 946 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->AllocData.SurfDesc.VidPnSourceId]; 982 947 Assert(pDstAlloc->AllocData.SurfDesc.VidPnSourceId < VBOX_VIDEO_MAX_SCREENS); 983 984 if (fFlags.fVisibleRegions) 948 Assert(pSource->pPrimaryAllocation == pDstAlloc); 949 950 RECT UpdateRect; 951 UpdateRect = pBlt->Blt.DstRects.UpdateRects.aRects[0]; 952 for (UINT i = 1; i < pBlt->Blt.DstRects.UpdateRects.cRects; ++i) 985 953 { 986 PVBOXWDDM_SWAPCHAIN pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pSrcAlloc); 987 POINT pos = pSource->VScreenPos; 988 if (pos.x || pos.y) 989 { 990 /* note: do NOT translate the src rect since it is used for screen pos calculation */ 991 vboxWddmBltPipeRectsTranslate(&pBlt->Blt.DstRects, pos.x, pos.y); 992 } 993 994 Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pContext, pSwapchain, &pBlt->Blt.SrcRect, &pBlt->Blt.DstRects 995 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 996 , pPacker 997 #endif 998 ); 999 Assert(Status == STATUS_SUCCESS); 1000 1001 if (pSwapchain) 1002 vboxWddmSwapchainRelease(pSwapchain); 954 vboxWddmRectUnite(&UpdateRect, &pBlt->Blt.DstRects.UpdateRects.aRects[i]); 955 } 956 957 uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled); 958 if (!cUnlockedVBVADisabled) 959 { 960 VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &UpdateRect); 1003 961 } 1004 962 else 1005 963 { 1006 WARN(("not expected!"));964 VBOXVBVA_OP_WITHLOCK(ReportDirtyRect, pDevExt, pSource, &UpdateRect); 1007 965 } 1008 1009 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 1010 vboxWddmAllocationRelease(pDstAlloc); 1011 vboxWddmAllocationRelease(pSrcAlloc); 1012 #endif 1013 1014 break; 1015 } 1016 1017 case VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP: 1018 { 1019 PVBOXVDMAPIPE_CMD_DMACMD_FLIP pFlip = (PVBOXVDMAPIPE_CMD_DMACMD_FLIP)pDmaCmd; 1020 PVBOXWDDM_ALLOCATION pAlloc = pFlip->Flip.Alloc.pAlloc; 1021 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId]; 1022 if (fFlags.fVisibleRegions) 1023 { 1024 PVBOXWDDM_SWAPCHAIN pSwapchain; 1025 pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pAlloc); 1026 if (pSwapchain) 1027 { 1028 POINT pos = pSource->VScreenPos; 1029 RECT SrcRect; 1030 VBOXVDMAPIPE_RECTS Rects; 1031 SrcRect.left = 0; 1032 SrcRect.top = 0; 1033 SrcRect.right = pAlloc->AllocData.SurfDesc.width; 1034 SrcRect.bottom = pAlloc->AllocData.SurfDesc.height; 1035 Rects.ContextRect.left = pos.x; 1036 Rects.ContextRect.top = pos.y; 1037 Rects.ContextRect.right = pAlloc->AllocData.SurfDesc.width + pos.x; 1038 Rects.ContextRect.bottom = pAlloc->AllocData.SurfDesc.height + pos.y; 1039 Rects.UpdateRects.cRects = 1; 1040 Rects.UpdateRects.aRects[0] = Rects.ContextRect; 1041 Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pContext, pSwapchain, &SrcRect, &Rects 1042 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 1043 , pPacker 1044 #endif 1045 ); 1046 Assert(Status == STATUS_SUCCESS); 1047 vboxWddmSwapchainRelease(pSwapchain); 1048 } 1049 } 1050 else 1051 { 1052 WARN(("not expected!")); 1053 } 1054 1055 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 1056 vboxWddmAllocationRelease(pAlloc); 1057 #endif 1058 1059 break; 1060 } 1061 1062 default: 1063 { 1064 WARN(("not expected!")); 1065 break; 1066 } 1067 } 1068 1069 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 1070 vboxVdmaGgCmdRelease(pDevExt, &pDmaCmd->Hdr); 1071 #else 1072 uint32_t cbBuffer 1073 void * pvPackBuffer; 1074 void * pvBuffer = VBoxMpCrPackerTxBufferComplete(pPacker, &cbBuffer, &pvPackBuffer); 1075 if (pvBuffer) 1076 { 1077 PVBOXMP_VDMACR_WRITECOMPLETION pvCompletionData = VBoxMpCrShgsmiTransportCmdCreateWriteAsync(&pDevExt->CrHgsmiTransport, pContext->u32CrConClientID, pvBuffer, cbBuffer, 1078 vboxVdmaCrWriteCompletion, sizeof (*pvCompletionData)); 1079 if (pvCompletionData) 1080 { 1081 int rc = VBoxMpCrShgsmiTransportCmdSubmitWriteAsync(&pDevExt->CrHgsmiTransport, pvCompletionData); 1082 if (!RT_SUCCESS(rc)) 1083 { 1084 WARN(("VBoxMpCrShgsmiTransportCmdSubmitWriteAsync failed, rc %d", rc)); 1085 Status = STATUS_UNSUCCESSFUL; 1086 } 1087 } 1088 else 1089 { 1090 WARN(("VBoxMpCrShgsmiTransportCmdCreateWriteAsync failed")); 1091 Status = STATUS_NO_MEMORY; 1092 } 1093 } 1094 1095 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, u32FenceId, DXGK_INTERRUPT_DMA_COMPLETED); 1096 if (!NT_SUCCESS(Status)) 1097 { 1098 WARN(("vboxVdmaDdiCmdFenceComplete failed, Status 0x%x", Status)); 1099 } 1100 #endif 1101 1102 return Status; 1103 } 1104 1105 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 1106 static DECLCALLBACK(UINT) vboxVdmaGgCmdCancelVisitor(PVBOXVIDEOCM_CTX pContext, PVOID pvCmd, uint32_t cbCmd, PVOID pvVisitor) 1107 { 1108 PVBOXWDDM_SWAPCHAIN pSwapchain = (PVBOXWDDM_SWAPCHAIN)pvVisitor; 1109 if (!pSwapchain) 1110 return VBOXVIDEOCMCMDVISITOR_RETURN_RMCMD; 1111 PVBOXVIDEOCM_CMD_RECTS_INTERNAL pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)pvCmd; 1112 if (pCmdInternal->hSwapchainUm == pSwapchain->hSwapchainUm) 1113 return VBOXVIDEOCMCMDVISITOR_RETURN_RMCMD; 1114 return 0; 1115 } 1116 1117 static VOID vboxVdmaGgWorkerThread(PVOID pvUser) 1118 { 1119 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)pvUser; 1120 PVBOXVDMAGG pVdma = &pDevExt->u.primary.Vdma.DmaGg; 1121 1122 NTSTATUS Status = vboxVdmaPipeSvrOpen(&pVdma->CmdPipe); 1123 Assert(Status == STATUS_SUCCESS); 1124 if (Status == STATUS_SUCCESS) 1125 { 1126 do 1127 { 1128 LIST_ENTRY CmdList; 1129 Status = vboxVdmaPipeSvrCmdGetList(&pVdma->CmdPipe, &CmdList); 1130 Assert(Status == STATUS_SUCCESS || Status == STATUS_PIPE_CLOSING); 1131 if (Status == STATUS_SUCCESS) 1132 { 1133 for (PLIST_ENTRY pCur = CmdList.Blink; pCur != &CmdList;) 1134 { 1135 PVBOXVDMAPIPE_CMD_DR pDr = VBOXVDMAPIPE_CMD_DR_FROM_ENTRY(pCur); 1136 RemoveEntryList(pCur); 1137 pCur = CmdList.Blink; 1138 switch (pDr->enmType) 1139 { 1140 case VBOXVDMAPIPE_CMD_TYPE_DMACMD: 1141 { 1142 PVBOXVDMAPIPE_CMD_DMACMD pDmaCmd = (PVBOXVDMAPIPE_CMD_DMACMD)pDr; 1143 Status = vboxVdmaGgDmaCmdProcessSlow(pDevExt, pDmaCmd); 1144 Assert(Status == STATUS_SUCCESS); 1145 } break; 1146 #if 0 1147 case VBOXVDMAPIPE_CMD_TYPE_RECTSINFO: 1148 { 1149 PVBOXVDMAPIPE_CMD_RECTSINFO pRects = (PVBOXVDMAPIPE_CMD_RECTSINFO)pDr; 1150 Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pRects->pContext, pRects->pSwapchain, &pRects->ContextsRects); 1151 Assert(Status == STATUS_SUCCESS); 1152 vboxVdmaGgCmdRelease(pDevExt, pDr); 1153 break; 1154 } 1155 #endif 1156 case VBOXVDMAPIPE_CMD_TYPE_FINISH: 1157 { 1158 PVBOXVDMAPIPE_CMD_FINISH pCmd = (PVBOXVDMAPIPE_CMD_FINISH)pDr; 1159 PVBOXWDDM_CONTEXT pContext = pCmd->pContext; 1160 Assert(pCmd->pEvent); 1161 Status = vboxVideoCmCmdSubmitCompleteEvent(&pContext->CmContext, pCmd->pEvent); 1162 if (Status != STATUS_SUCCESS) 1163 { 1164 WARN(("vboxVideoCmCmdWaitCompleted failedm Status (0x%x)", Status)); 1165 } 1166 vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr); 1167 break; 1168 } 1169 case VBOXVDMAPIPE_CMD_TYPE_CANCEL: 1170 { 1171 PVBOXVDMAPIPE_CMD_CANCEL pCmd = (PVBOXVDMAPIPE_CMD_CANCEL)pDr; 1172 PVBOXWDDM_CONTEXT pContext = pCmd->pContext; 1173 Status = vboxVideoCmCmdVisit(&pContext->CmContext, FALSE, vboxVdmaGgCmdCancelVisitor, pCmd->pSwapchain); 1174 if (Status != STATUS_SUCCESS) 1175 { 1176 WARN(("vboxVideoCmCmdWaitCompleted failedm Status (0x%x)", Status)); 1177 } 1178 Assert(pCmd->pEvent); 1179 KeSetEvent(pCmd->pEvent, 0, FALSE); 1180 vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr); 1181 break; 1182 } 1183 default: 1184 AssertBreakpoint(); 1185 } 1186 } 1187 } 1188 else 1189 break; 1190 } while (1); 1191 } 1192 1193 /* always try to close the pipe to make sure the client side is notified */ 1194 Status = vboxVdmaPipeSvrClose(&pVdma->CmdPipe); 1195 Assert(Status == STATUS_SUCCESS); 1196 } 1197 1198 NTSTATUS vboxVdmaGgConstruct(PVBOXMP_DEVEXT pDevExt) 1199 { 1200 PVBOXVDMAGG pVdma = &pDevExt->u.primary.Vdma.DmaGg; 1201 NTSTATUS Status = vboxVdmaPipeConstruct(&pVdma->CmdPipe); 1202 Assert(Status == STATUS_SUCCESS); 1203 if (Status == STATUS_SUCCESS) 1204 { 1205 Status = vboxVdmaGgThreadCreate(&pVdma->pThread, vboxVdmaGgWorkerThread, pDevExt); 1206 Assert(Status == STATUS_SUCCESS); 1207 if (Status == STATUS_SUCCESS) 1208 return STATUS_SUCCESS; 1209 1210 NTSTATUS tmpStatus = vboxVdmaPipeDestruct(&pVdma->CmdPipe); 1211 Assert(tmpStatus == STATUS_SUCCESS); 1212 } 1213 1214 /* we're here ONLY in case of an error */ 1215 Assert(Status != STATUS_SUCCESS); 1216 return Status; 1217 } 1218 1219 NTSTATUS vboxVdmaGgDestruct(PVBOXMP_DEVEXT pDevExt) 1220 { 1221 PVBOXVDMAGG pVdma = &pDevExt->u.primary.Vdma.DmaGg; 1222 /* this informs the server thread that it should complete all current commands and exit */ 1223 NTSTATUS Status = vboxVdmaPipeCltClose(&pVdma->CmdPipe); 1224 Assert(Status == STATUS_SUCCESS); 1225 if (Status == STATUS_SUCCESS) 1226 { 1227 Status = KeWaitForSingleObject(pVdma->pThread, Executive, KernelMode, FALSE, NULL /* PLARGE_INTEGER Timeout */); 1228 Assert(Status == STATUS_SUCCESS); 1229 if (Status == STATUS_SUCCESS) 1230 { 1231 Status = vboxVdmaPipeDestruct(&pVdma->CmdPipe); 1232 Assert(Status == STATUS_SUCCESS); 1233 } 1234 } 1235 1236 return Status; 1237 } 1238 1239 NTSTATUS vboxVdmaGgCmdSubmit(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pCmd) 1240 { 1241 switch (pCmd->enmType) 1242 { 1243 case VBOXVDMAPIPE_CMD_TYPE_DMACMD: 1244 { 1245 PVBOXVDMAPIPE_CMD_DMACMD pDmaCmd = (PVBOXVDMAPIPE_CMD_DMACMD)pCmd; 1246 NTSTATUS Status = vboxVdmaGgDmaCmdProcessFast(pDevExt, pDmaCmd); 1247 if (Status == STATUS_MORE_PROCESSING_REQUIRED) 1248 break; 1249 return Status; 1250 } 1251 default: 1252 break; 1253 } 1254 /* corresponding Release is done by the pipe command handler */ 1255 vboxVdmaGgCmdAddRef(pCmd); 1256 return vboxVdmaPipeCltCmdPut(&pDevExt->u.primary.Vdma.DmaGg.CmdPipe, &pCmd->PipeHdr); 1257 } 1258 1259 NTSTATUS vboxVdmaGgCmdDmaNotifySubmitted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DMACMD pCmd) 1260 { 1261 PVBOXVDMADDI_CMD pDdiCmd; 1262 #ifdef VBOX_WDDM_IRQ_COMPLETION 1263 pDdiCmd = vboxVdmaGgCmdDmaGetDdiCmd(pCmd); 1264 #else 1265 pDdiCmd = &pCmd->DdiCmd; 1266 #endif 1267 NTSTATUS Status = vboxVdmaDdiCmdSubmitted(pDevExt, pDdiCmd); 1268 Assert(Status == STATUS_SUCCESS); 1269 return Status; 1270 } 1271 1272 NTSTATUS vboxVdmaGgCmdDmaNotifyCompleted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DMACMD pCmd, DXGK_INTERRUPT_TYPE enmComplType) 1273 { 1274 #ifdef VBOX_WDDM_IRQ_COMPLETION 1275 VBOXVDMACBUF_DR* pDr = vboxVdmaGgCmdDmaGetDr(pCmd); 1276 int rc = vboxVdmaCBufDrSubmit(pDevExt, &pDevExt->u.primary.Vdma, pDr); 1277 Assert(rc == VINF_SUCCESS); 1278 if (RT_SUCCESS(rc)) 1279 { 1280 return STATUS_SUCCESS; 1281 } 1282 return STATUS_UNSUCCESSFUL; 1283 #else 1284 return vboxVdmaDdiCmdCompleted(pDevExt, &pCmd->DdiCmd, enmComplType); 1285 #endif 1286 } 1287 1288 VOID vboxVdmaGgCmdDmaNotifyInit(PVBOXVDMAPIPE_CMD_DMACMD pCmd, 1289 uint32_t u32NodeOrdinal, uint32_t u32FenceId, 1290 PFNVBOXVDMADDICMDCOMPLETE_DPC pfnComplete, PVOID pvComplete) 1291 { 1292 PVBOXVDMADDI_CMD pDdiCmd; 1293 #ifdef VBOX_WDDM_IRQ_COMPLETION 1294 pDdiCmd = vboxVdmaGgCmdDmaGetDdiCmd(pCmd); 1295 #else 1296 pDdiCmd = &pCmd->DdiCmd; 1297 #endif 1298 vboxVdmaDdiCmdInit(pDdiCmd, u32NodeOrdinal, u32FenceId, pfnComplete, pvComplete); 1299 } 1300 1301 NTSTATUS vboxVdmaGgCmdFinish(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PKEVENT pEvent) 966 } 967 } 968 969 if (fBltFlags.fVisibleRegions) 970 { 971 Status = vboxVdmaProcessVRegCmd(pDevExt, pContext, &pBlt->Blt.SrcAlloc, &pBlt->Blt.DstAlloc, &pBlt->Blt.SrcRect, &pBlt->Blt.DstRects); 972 if (!NT_SUCCESS(Status)) 973 WARN(("vboxVdmaProcessVRegCmd failed Status 0x%x", Status)); 974 } 975 976 return Status; 977 } 978 979 NTSTATUS vboxVdmaProcessFlipCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip, VBOXVDMAPIPE_FLAGS_DMACMD fFlags) 1302 980 { 1303 981 NTSTATUS Status = STATUS_SUCCESS; 1304 1305 PVBOXVDMAPIPE_CMD_FINISH pCmd = (PVBOXVDMAPIPE_CMD_FINISH)vboxVdmaGgCmdCreate(pDevExt, VBOXVDMAPIPE_CMD_TYPE_FINISH, sizeof (*pCmd)); 1306 if (pCmd) 1307 { 1308 pCmd->pContext = pContext; 1309 pCmd->pEvent = pEvent; 1310 Status = vboxVdmaGgCmdSubmit(pDevExt, &pCmd->Hdr); 982 PVBOXWDDM_ALLOCATION pAlloc = pFlip->Flip.Alloc.pAlloc; 983 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId]; 984 vboxWddmAssignPrimary(pDevExt, pSource, pAlloc, pAlloc->AllocData.SurfDesc.VidPnSourceId); 985 Assert(!fFlags.fRealOp); 986 if (fFlags.fVisibleRegions) 987 { 988 RECT SrcRect; 989 VBOXVDMAPIPE_RECTS Rects; 990 SrcRect.left = 0; 991 SrcRect.top = 0; 992 SrcRect.right = pAlloc->AllocData.SurfDesc.width; 993 SrcRect.bottom = pAlloc->AllocData.SurfDesc.height; 994 Rects.ContextRect.left = 0; 995 Rects.ContextRect.top = 0; 996 Rects.ContextRect.right = pAlloc->AllocData.SurfDesc.width; 997 Rects.ContextRect.bottom = pAlloc->AllocData.SurfDesc.height; 998 Rects.UpdateRects.cRects = 1; 999 Rects.UpdateRects.aRects[0] = Rects.ContextRect; 1000 1001 Status = vboxVdmaProcessVRegCmd(pDevExt, pContext, &pFlip->Flip.Alloc, &pFlip->Flip.Alloc, &SrcRect, &Rects); 1311 1002 if (!NT_SUCCESS(Status)) 1312 { 1313 WARN(("vboxVdmaGgCmdSubmit returned 0x%x", Status)); 1314 } 1315 vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr); 1003 WARN(("vboxVdmaProcessVRegCmd failed Status 0x%x", Status)); 1316 1004 } 1317 1005 else 1318 { 1319 WARN(("vboxVdmaGgCmdCreate failed")); 1320 Status = STATUS_NO_MEMORY; 1321 } 1322 return Status; 1323 } 1324 1325 NTSTATUS vboxVdmaGgCmdCancel(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PVBOXWDDM_SWAPCHAIN pSwapchain) 1006 WARN(("unexpected flip request")); 1007 1008 return Status; 1009 } 1010 1011 NTSTATUS vboxVdmaProcessClrFillCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, VBOXWDDM_DMA_PRIVATEDATA_CLRFILL *pCF, VBOXVDMAPIPE_FLAGS_DMACMD fFlags) 1326 1012 { 1327 1013 NTSTATUS Status = STATUS_SUCCESS; 1328 1329 PVBOXVDMAPIPE_CMD_CANCEL pCmd = (PVBOXVDMAPIPE_CMD_CANCEL)vboxVdmaGgCmdCreate(pDevExt, VBOXVDMAPIPE_CMD_TYPE_CANCEL, sizeof (*pCmd)); 1330 if (pCmd) 1331 { 1332 KEVENT Event; 1333 KeInitializeEvent(&Event, NotificationEvent, FALSE); 1334 pCmd->pContext = pContext; 1335 pCmd->pSwapchain = pSwapchain; 1336 pCmd->pEvent = &Event; 1337 Status = vboxVdmaGgCmdSubmit(pDevExt, &pCmd->Hdr); 1338 if (NT_SUCCESS(Status)) 1339 { 1340 Status = KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); 1341 Assert(Status == STATUS_SUCCESS); 1342 } 1343 else 1344 { 1345 WARN(("vboxVdmaGgCmdSubmit returned 0x%x", Status)); 1346 } 1347 vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr); 1014 Assert(!fFlags.fVisibleRegions); 1015 1016 if (fFlags.fRealOp) 1017 { 1018 Status = vboxVdmaGgDmaColorFill(pDevExt, &pCF->ClrFill); 1019 if (!NT_SUCCESS(Status)) 1020 WARN(("vboxVdmaProcessVRegCmd failed Status 0x%x", Status)); 1348 1021 } 1349 1022 else 1350 { 1351 WARN(("vboxVdmaGgCmdCreate failed")); 1352 Status = STATUS_NO_MEMORY; 1353 } 1354 return Status; 1355 } 1356 #else /* if defined VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS */ 1357 NTSTATUS vboxVdmaGgCmdProcess(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pCmd) 1358 { 1359 switch (pCmd->enmType) 1360 { 1361 case VBOXVDMAPIPE_CMD_TYPE_DMACMD: 1362 { 1363 PVBOXVDMAPIPE_CMD_DMACMD pDmaCmd = (PVBOXVDMAPIPE_CMD_DMACMD)pCmd; 1364 NTSTATUS Status = vboxVdmaGgDmaCmdProcessFast(pDevExt, pDmaCmd); 1365 if (Status == STATUS_MORE_PROCESSING_REQUIRED) 1366 break; 1367 return Status; 1368 } 1369 default: 1370 break; 1371 } 1372 /* corresponding Release is done by the pipe command handler */ 1373 vboxVdmaGgCmdAddRef(pCmd); 1374 return vboxVdmaPipeCltCmdPut(&pDevExt->u.primary.Vdma.DmaGg.CmdPipe, &pCmd->PipeHdr); 1375 } 1376 1377 #endif 1378 1379 /* end */ 1023 WARN(("unexpected clrfill request")); 1024 1025 return Status; 1026 } 1027 1380 1028 1381 1029 #ifdef VBOX_WITH_VDMA … … 1509 1157 #endif 1510 1158 { 1511 NTSTATUS Status = vboxVdmaGgConstruct(pDevExt); 1512 Assert(Status == STATUS_SUCCESS); 1513 if (Status == STATUS_SUCCESS) 1514 return VINF_SUCCESS; 1515 rc = VERR_GENERAL_FAILURE; 1159 return VINF_SUCCESS; 1516 1160 } 1517 1161 #ifdef VBOX_WITH_VDMA … … 1578 1222 { 1579 1223 int rc = VINF_SUCCESS; 1580 NTSTATUS Status = vboxVdmaGgDestruct(pDevExt); 1581 Assert(Status == STATUS_SUCCESS); 1582 if (Status == STATUS_SUCCESS) 1583 { 1584 Assert(!pInfo->fEnabled); 1585 if (pInfo->fEnabled) 1586 rc = vboxVdmaDisable (pDevExt, pInfo); 1224 Assert(!pInfo->fEnabled); 1225 if (pInfo->fEnabled) 1226 rc = vboxVdmaDisable (pDevExt, pInfo); 1587 1227 #ifdef VBOX_WITH_VDMA 1588 1589 1228 VBoxSHGSMITerm(&pInfo->CmdHeap); 1229 VBoxMPCmnUnmapAdapterMemory(VBoxCommonFromDeviceExt(pDevExt), (void**)&pInfo->CmdHeap.Heap.area.pu8Base); 1590 1230 #endif 1591 }1592 else1593 rc = VERR_GENERAL_FAILURE;1594 1231 return rc; 1595 1232 } -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.h
r44529 r46757 220 220 UINT fRealOp : 1; 221 221 UINT fVisibleRegions : 1; 222 UINT Reserve 222 UINT Reserved : 30; 223 223 }; 224 224 UINT Value; … … 295 295 UINT uLastCompletedPagingBufferCmdFenceId; 296 296 BOOL fEnabled; 297 /* dma-related commands list processed on the guest w/o host part involvement (guest-guest commands) */298 VBOXVDMAGG DmaGg;299 297 } VBOXVDMAINFO, *PVBOXVDMAINFO; 300 298 … … 313 311 #ifdef VBOX_WITH_VDMA 314 312 int vboxVdmaFlush(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo); 313 DECLINLINE(HGSMIOFFSET) vboxVdmaCBufDrPtrOffset(const PVBOXVDMAINFO pInfo, const void* pvPtr) 314 { 315 return VBoxSHGSMICommandPtrOffset(&pInfo->CmdHeap, pvPtr); 316 } 315 317 int vboxVdmaCBufDrSubmit(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACBUF_DR pDr); 316 318 int vboxVdmaCBufDrSubmitSynch(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACBUF_DR pDr); … … 326 328 #define VBOXVDMACBUF_DR_FROM_DDI_CMD(_pCmd) ((PVBOXVDMACBUF_DR)(((uint8_t*)(_pCmd)) - RT_OFFSETOF(VBOXVDMACBUF_DR, aGuestData))) 327 329 328 #endif329 NTSTATUS vboxVdmaGgCmdSubmit(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pCmd);330 PVBOXVDMAPIPE_CMD_DR vboxVdmaGgCmdCreate(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_TYPE enmType, uint32_t cbCmd);331 DECLINLINE(void) vboxVdmaGgCmdAddRef(PVBOXVDMAPIPE_CMD_DR pDr)332 {333 ASMAtomicIncU32(&pDr->cRefs);334 }335 void vboxVdmaGgCmdDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pDr);336 DECLINLINE(void) vboxVdmaGgCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pDr)337 {338 uint32_t cRefs = ASMAtomicDecU32(&pDr->cRefs);339 Assert(cRefs < UINT32_MAX/2);340 if (!cRefs)341 vboxVdmaGgCmdDestroy(pDevExt, pDr);342 }343 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS344 NTSTATUS vboxVdmaGgCmdFinish(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, PKEVENT pEvent);345 NTSTATUS vboxVdmaGgCmdCancel(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PVBOXWDDM_SWAPCHAIN pSwapchain);346 330 #endif 347 331 … … 358 342 359 343 #define VBOXVDMAPIPE_CMD_DR_FROM_DDI_CMD(_pCmd) ((PVBOXVDMAPIPE_CMD_DR)(((uint8_t*)(_pCmd)) - RT_OFFSETOF(VBOXVDMAPIPE_CMD_DR, DdiCmd))) 360 DECLCALLBACK(VOID) vboxVdmaGgDdiCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext); 344 345 NTSTATUS vboxVdmaProcessBltCmd(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, struct VBOXWDDM_DMA_PRIVATEDATA_BLT *pBlt, struct VBOXVDMAPIPE_FLAGS_DMACMD fBltFlags); 346 NTSTATUS vboxVdmaProcessFlipCmd(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, struct VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip, struct VBOXVDMAPIPE_FLAGS_DMACMD fFlags); 347 NTSTATUS vboxVdmaProcessClrFillCmd(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, struct VBOXWDDM_DMA_PRIVATEDATA_CLRFILL *pCF, struct VBOXVDMAPIPE_FLAGS_DMACMD fFlags); 348 361 349 #endif /* #ifndef ___VBoxMPVdma_h___ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r46662 r46757 1165 1165 VBoxWddmSlInit(pDevExt); 1166 1166 1167 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS1168 1167 VBoxMpCrShgsmiTransportCreate(&pDevExt->CrHgsmiTransport, pDevExt); 1169 #endif 1168 /* @todo: implement detection */ 1169 pDevExt->fTexPresentEnabled = FALSE; 1170 1170 1171 1171 for (UINT i = 0; i < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) … … 1173 1173 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i]; 1174 1174 KeInitializeSpinLock(&pSource->AllocationLock); 1175 VBoxVrListInit(&pSource->VrList); 1175 1176 } 1176 1177 … … 1258 1259 NTSTATUS Status = STATUS_SUCCESS; 1259 1260 1260 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS1261 1261 VBoxMpCrShgsmiTransportTerm(&pDevExt->CrHgsmiTransport); 1262 #endif1263 1262 1264 1263 VBoxWddmSlTerm(pDevExt); … … 1799 1798 VbglTerminate(); 1800 1799 1801 VBox WddmVrTerm();1800 VBoxVrTerm(); 1802 1801 1803 1802 PRTLOGGER pLogger = RTLogRelSetDefaultInstance(NULL); … … 2897 2896 } 2898 2897 2899 static NTSTATUS vboxWddmSubmitCmd(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_DMACMD *pCmd)2900 {2901 NTSTATUS Status = vboxVdmaGgCmdDmaNotifySubmitted(pDevExt, pCmd);2902 Assert(Status == STATUS_SUCCESS);2903 if (Status == STATUS_SUCCESS)2904 {2905 NTSTATUS submStatus = vboxVdmaGgCmdSubmit(pDevExt, &pCmd->Hdr);2906 Assert(submStatus == STATUS_SUCCESS);2907 if (submStatus != STATUS_SUCCESS)2908 {2909 vboxVdmaGgCmdDmaNotifyCompleted(pDevExt, pCmd, DXGK_INTERRUPT_DMA_FAULTED);2910 }2911 }2912 else2913 {2914 vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr);2915 }2916 return Status;2917 }2918 2919 static NTSTATUS vboxWddmSubmitBltCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, UINT u32FenceId, PVBOXWDDM_DMA_PRIVATEDATA_BLT pBlt, VBOXVDMAPIPE_FLAGS_DMACMD fBltFlags)2920 {2921 NTSTATUS Status = STATUS_SUCCESS;2922 PVBOXVDMAPIPE_CMD_DMACMD_BLT pBltCmd = (PVBOXVDMAPIPE_CMD_DMACMD_BLT)vboxVdmaGgCmdCreate(pDevExt, VBOXVDMAPIPE_CMD_TYPE_DMACMD, RT_OFFSETOF(VBOXVDMAPIPE_CMD_DMACMD_BLT, Blt.DstRects.UpdateRects.aRects[pBlt->Blt.DstRects.UpdateRects.cRects]));2923 Assert(pBltCmd);2924 if (pBltCmd)2925 {2926 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pBlt->Blt.DstAlloc.srcId];2927 vboxVdmaGgCmdDmaNotifyInit(&pBltCmd->Hdr, pContext->NodeOrdinal, u32FenceId, vboxVdmaGgDdiCmdRelease, pBltCmd);2928 pBltCmd->Hdr.fFlags = fBltFlags;2929 pBltCmd->Hdr.pContext = pContext;2930 pBltCmd->Hdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_BLT;2931 memcpy(&pBltCmd->Blt, &pBlt->Blt, RT_OFFSETOF(VBOXVDMA_BLT, DstRects.UpdateRects.aRects[pBlt->Blt.DstRects.UpdateRects.cRects]));2932 Status = vboxWddmSubmitCmd(pDevExt, &pBltCmd->Hdr);2933 if (Status != STATUS_SUCCESS)2934 {2935 WARN(("vboxWddmSubmitCmd failed, Status 0x%x", Status));2936 Status = STATUS_SUCCESS;2937 }2938 vboxVdmaGgCmdRelease(pDevExt, &pBltCmd->Hdr.Hdr);2939 }2940 else2941 {2942 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, u32FenceId, DXGK_INTERRUPT_DMA_FAULTED);2943 }2944 return Status;2945 }2946 2947 2898 #ifdef VBOX_WITH_CRHGSMI 2948 2899 DECLCALLBACK(VOID) vboxWddmDmaCompleteChromiumCmd(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext) … … 3181 3132 3182 3133 if (fBltFlags.Value) 3183 { 3184 Status = vboxWddmSubmitBltCmd(pDevExt, pContext, pSubmitCommand->SubmissionFenceId, pBlt, fBltFlags); 3185 } 3186 else 3187 { 3188 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, DXGK_INTERRUPT_DMA_COMPLETED); 3189 } 3134 Status = vboxVdmaProcessBltCmd(pDevExt, pContext, pBlt, fBltFlags); 3135 3136 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, 3137 NT_SUCCESS(Status) ? DXGK_INTERRUPT_DMA_COMPLETED : DXGK_INTERRUPT_DMA_FAULTED); 3190 3138 break; 3191 3139 } … … 3247 3195 VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip = (VBOXWDDM_DMA_PRIVATEDATA_FLIP*)pPrivateDataBase; 3248 3196 vboxWddmAddrSetVram(&pFlip->Flip.Alloc.pAlloc->AllocData.Addr, pFlip->Flip.Alloc.segmentIdAlloc, pFlip->Flip.Alloc.offAlloc); 3249 PVBOXVDMAPIPE_CMD_DMACMD_FLIP pFlipCmd = (PVBOXVDMAPIPE_CMD_DMACMD_FLIP)vboxVdmaGgCmdCreate(pDevExt, 3250 VBOXVDMAPIPE_CMD_TYPE_DMACMD, sizeof (VBOXVDMAPIPE_CMD_DMACMD_FLIP)); 3251 Assert(pFlipCmd); 3252 if (pFlipCmd) 3253 { 3254 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pFlip->Flip.Alloc.srcId]; 3255 vboxVdmaGgCmdDmaNotifyInit(&pFlipCmd->Hdr, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, vboxVdmaGgDdiCmdRelease, pFlipCmd); 3256 pFlipCmd->Hdr.fFlags.Value = 0; 3257 pFlipCmd->Hdr.fFlags.fVisibleRegions = 1; 3258 pFlipCmd->Hdr.pContext = pContext; 3259 pFlipCmd->Hdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP; 3260 memcpy(&pFlipCmd->Flip, &pFlip->Flip, sizeof (pFlipCmd->Flip)); 3261 Status = vboxWddmSubmitCmd(pDevExt, &pFlipCmd->Hdr); 3262 if (Status != STATUS_SUCCESS) 3263 WARN(("vboxWddmSubmitCmd failed, Status 0x%x", Status)); 3264 vboxVdmaGgCmdRelease(pDevExt, &pFlipCmd->Hdr.Hdr); 3265 } 3197 VBOXVDMAPIPE_FLAGS_DMACMD fFlags; 3198 fFlags.Value = 0; 3199 3200 if (pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D) 3201 fFlags.fVisibleRegions = 1; 3266 3202 else 3267 { 3268 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, DXGK_INTERRUPT_DMA_FAULTED); 3269 Assert(Status == STATUS_SUCCESS); 3270 } 3203 WARN(("unexpected flip cmd")); 3204 3205 if (fFlags.Value) 3206 Status = vboxVdmaProcessFlipCmd(pDevExt, pContext, pFlip, fFlags); 3207 3208 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, 3209 NT_SUCCESS(Status) ? DXGK_INTERRUPT_DMA_COMPLETED : DXGK_INTERRUPT_DMA_FAULTED); 3271 3210 break; 3272 3211 } … … 3275 3214 PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL pCF = (PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL)pPrivateDataBase; 3276 3215 vboxWddmAddrSetVram(&pCF->ClrFill.Alloc.pAlloc->AllocData.Addr, pCF->ClrFill.Alloc.segmentIdAlloc, pCF->ClrFill.Alloc.offAlloc); 3277 PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL pCFCmd = (PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL)vboxVdmaGgCmdCreate(pDevExt, 3278 VBOXVDMAPIPE_CMD_TYPE_DMACMD, RT_OFFSETOF(VBOXVDMAPIPE_CMD_DMACMD_CLRFILL, ClrFill.Rects.aRects[pCF->ClrFill.Rects.cRects])); 3279 Assert(pCFCmd); 3280 if (pCFCmd) 3281 { 3282 vboxVdmaGgCmdDmaNotifyInit(&pCFCmd->Hdr, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, vboxVdmaGgDdiCmdRelease, pCFCmd); 3283 pCFCmd->Hdr.fFlags.Value = 0; 3284 pCFCmd->Hdr.fFlags.fRealOp = 1; 3285 pCFCmd->Hdr.pContext = pContext; 3286 pCFCmd->Hdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_CLRFILL; 3287 memcpy(&pCFCmd->ClrFill, &pCF->ClrFill, RT_OFFSETOF(VBOXVDMA_CLRFILL, Rects.aRects[pCF->ClrFill.Rects.cRects])); 3288 Status = vboxWddmSubmitCmd(pDevExt, &pCFCmd->Hdr); 3289 if (Status != STATUS_SUCCESS) 3290 WARN(("vboxWddmSubmitCmd failed, Status 0x%x", Status)); 3291 vboxVdmaGgCmdRelease(pDevExt, &pCFCmd->Hdr.Hdr); 3292 3293 } 3294 else 3295 { 3296 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, DXGK_INTERRUPT_DMA_FAULTED); 3297 Assert(Status == STATUS_SUCCESS); 3298 } 3299 3216 VBOXVDMAPIPE_FLAGS_DMACMD fFlags; 3217 fFlags.Value = 0; 3218 fFlags.fRealOp = 1; 3219 3220 if (fFlags.Value) 3221 Status = vboxVdmaProcessClrFillCmd(pDevExt, pContext, pCF, fFlags); 3222 3223 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, 3224 NT_SUCCESS(Status) ? DXGK_INTERRUPT_DMA_COMPLETED : DXGK_INTERRUPT_DMA_FAULTED); 3300 3225 break; 3301 3226 } … … 5740 5665 { 5741 5666 cbCmd -= cbRects; 5742 memcpy(&pBlt->Blt.DstRects.UpdateRects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbRects);5667 memcpy(&pBlt->Blt.DstRects.UpdateRects.aRects[pPresent->MultipassOffset], &pPresent->pDstSubRects[pPresent->MultipassOffset], cbRects); 5743 5668 pBlt->Blt.DstRects.UpdateRects.cRects += cbRects/sizeof (RECT); 5744 5669 } … … 5747 5672 UINT cbFitingRects = (cbCmd/sizeof (RECT)) * sizeof (RECT); 5748 5673 Assert(cbFitingRects); 5749 memcpy(&pBlt->Blt.DstRects.UpdateRects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbFitingRects);5674 memcpy(&pBlt->Blt.DstRects.UpdateRects.aRects[pPresent->MultipassOffset], &pPresent->pDstSubRects[pPresent->MultipassOffset], cbFitingRects); 5750 5675 cbCmd -= cbFitingRects; 5751 5676 pPresent->MultipassOffset += cbFitingRects/sizeof (RECT); … … 6186 6111 if (RT_SUCCESS(rc)) 6187 6112 { 6188 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS6189 6113 VBoxMpCrPackerInit(&pContext->CrPacker); 6190 #endif6191 6114 } 6192 6115 else … … 6814 6737 if (NT_SUCCESS(Status)) 6815 6738 { 6816 Status = VBoxWddmVrInit();6817 if ( NT_SUCCESS(Status))6739 rc = VBoxVrInit(); 6740 if (RT_SUCCESS(rc)) 6818 6741 { 6819 6742 #ifdef VBOX_WDDM_WIN8 … … 6831 6754 return Status; 6832 6755 6833 VBox WddmVrTerm();6756 VBoxVrTerm(); 6834 6757 } 6835 6758 else 6836 WARN(("VBoxWddmVrInit failed, Status(0x%x)", Status)); 6759 { 6760 WARN(("VBoxVrInit failed, rc(%d)", rc)); 6761 Status = STATUS_UNSUCCESSFUL; 6762 } 6837 6763 } 6838 6764 else -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h
r44529 r46757 167 167 vboxWddmAllocationRetain(pAllocation); 168 168 } 169 170 if (pAllocation && pAllocation->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE) 171 { 172 RTRECT Rect; 173 Rect.xLeft = 0; 174 Rect.yTop = 0; 175 Rect.xRight = pAllocation->AllocData.SurfDesc.width; 176 Rect.yBottom = pAllocation->AllocData.SurfDesc.height; 177 178 VBoxVrListRectsSet(&pSource->VrList, 1, &Rect, NULL); 179 } 180 else 181 VBoxVrListClear(&pSource->VrList); 182 183 pSource->fHas3DVrs = FALSE; 169 184 170 185 KIRQL OldIrql; … … 218 233 #endif 219 234 220 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 221 # define VBOXWDDM_CTXLOCK_INIT(_p) do { \ 235 #define VBOXWDDM_CTXLOCK_INIT(_p) do { \ 222 236 KeInitializeSpinLock(&(_p)->ContextLock); \ 223 237 } while (0) 224 # 225 # 238 #define VBOXWDDM_CTXLOCK_DATA KIRQL _ctxLockOldIrql; 239 #define VBOXWDDM_CTXLOCK_LOCK(_p) do { \ 226 240 KeAcquireSpinLock(&(_p)->ContextLock, &_ctxLockOldIrql); \ 227 241 } while (0) 228 # 242 #define VBOXWDDM_CTXLOCK_UNLOCK(_p) do { \ 229 243 KeReleaseSpinLock(&(_p)->ContextLock, _ctxLockOldIrql); \ 230 244 } while (0) 231 #else232 # define VBOXWDDM_CTXLOCK_INIT(_p) do { \233 ExInitializeFastMutex(&(_p)->ContextMutex); \234 } while (0)235 # define VBOXWDDM_CTXLOCK_LOCK(_p) do { \236 ExAcquireFastMutex(&(_p)->ContextMutex); \237 } while (0)238 # define VBOXWDDM_CTXLOCK_UNLOCK(_p) do { \239 ExReleaseFastMutex(&(_p)->ContextMutex); \240 } while (0)241 # define VBOXWDDM_CTXLOCK_DATA242 #endif243 245 244 246 #endif /* #ifndef ___VBoxMPWddm_h___ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/d3d9/d3d9wddm.def
r46662 r46757 23 23 VBoxWineExD3DDev9VolTexBlt 24 24 VBoxWineExD3DSurf9GetHostId 25 VBoxWineExD3DSwapchain9GetHostWinID -
trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/d3d9/swapchain.c
r46521 r46757 306 306 return hr; 307 307 } 308 309 VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSwapchain9GetHostWinID(IDirect3DSwapChain9 *iface, DWORD *pID) 310 { 311 struct d3d9_swapchain *swapchain = impl_from_IDirect3DSwapChain9(iface); 312 HRESULT hr; 313 wined3d_mutex_lock(); 314 hr = wined3d_swapchain_get_host_win_id(swapchain->wined3d_swapchain, pID); 315 wined3d_mutex_unlock(); 316 return hr; 317 } 308 318 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/VBoxWineEx.h
r46662 r46757 84 84 typedef FNVBOXWINEEXD3DSWAPCHAIN9_PRESENT *PFNVBOXWINEEXD3DSWAPCHAIN9_PRESENT; 85 85 86 typedef VBOXWINEEX_DECL(HRESULT) FNVBOXWINEEXD3DSWAPCHAIN9_GETHOSTWINID(IDirect3DSwapChain9 *iface, DWORD *pID); 87 typedef FNVBOXWINEEXD3DSWAPCHAIN9_GETHOSTWINID *PFNVBOXWINEEXD3DSWAPCHAIN9_GETHOSTWINID; 88 86 89 #ifdef __cplusplus 87 90 extern "C" … … 125 128 VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSurf9GetHostId(IDirect3DSurface9 *iface, uint32_t *pu32Id); 126 129 130 /* used for backwards compatibility purposes only with older host versions not supportgin new present mechanism */ 127 131 VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSwapchain9Present(IDirect3DSwapChain9 *iface, 128 132 IDirect3DSurface9 *surf); /* use the given surface as a frontbuffer content source */ 133 134 VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSwapchain9GetHostWinID(IDirect3DSwapChain9 *iface, DWORD *pID); 129 135 130 136 typedef struct VBOXWINEEX_D3DPRESENT_PARAMETERS -
trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/swapchain.c
r46521 r46757 1535 1535 return S_OK; 1536 1536 } 1537 #endif 1537 1538 HRESULT CDECL wined3d_swapchain_get_host_win_id(struct wined3d_swapchain *swapchain, DWORD *pID) 1539 { 1540 DWORD id = (DWORD)pVBoxGetWindowId(swapchain->hDC); 1541 if (!id) 1542 { 1543 ERR("failed to get id for hdc 0x%x", swapchain->hDC); 1544 return E_FAIL; 1545 } 1546 *pID = id; 1547 return S_OK; 1548 } 1549 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/wined3d_gl.h
r46521 r46757 184 184 HGLRC (WINAPI *pVBoxCreateContext)(HDC, struct VBOXUHGSMI*) DECLSPEC_HIDDEN; 185 185 void (WINAPI *pVBoxFlushToHost)(HGLRC) DECLSPEC_HIDDEN; 186 GLint (WINAPI *pVBoxGetWindowId)(HDC) DECLSPEC_HIDDEN; 186 187 187 188 … … 190 191 # define VBOX_GL_FUNCS_GEN \ 191 192 VBOX_USE_FUNC(VBoxCreateContext) \ 192 VBOX_USE_FUNC(VBoxFlushToHost) 193 VBOX_USE_FUNC(VBoxFlushToHost) \ 194 VBOX_USE_FUNC(VBoxGetWindowId) 193 195 194 196 # define VBOX_GL_EXT_FUNCS_GEN \ -
trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/wined3dwddm.def
r46662 r46757 259 259 wined3d_swapchain_present_rt 260 260 wined3d_surface_get_host_id 261 wined3d_swapchain_get_host_win_id -
trunk/src/VBox/Additions/common/crOpenGL/load.c
r46627 r46757 782 782 } 783 783 784 typedef struct VBOXCR_UPDATEWNDCB785 {786 VBOXDISPMP_REGIONS Regions;787 bool fSendUpdateMsg;788 } VBOXCR_UPDATEWNDCB, *PVBOXCR_UPDATEWNDCB;789 790 static void stubSyncTrUpdateWindowCB(unsigned long key, void *data1, void *data2)791 {792 WindowInfo *pWindow = (WindowInfo *) data1;793 PVBOXCR_UPDATEWNDCB pCbData = (PVBOXCR_UPDATEWNDCB) data2;794 VBOXDISPMP_REGIONS *pRegions = &pCbData->Regions;795 bool bChanged = false, bDoMap = false;796 HRGN hNewRgn = INVALID_HANDLE_VALUE;797 798 if (pRegions->hWnd != pWindow->hWnd)799 {800 return;801 }802 803 stub.spu->dispatch_table.VBoxPackSetInjectID(pWindow->u32ClientID);804 805 if (!stubSystemWindowExist(pWindow))806 {807 stubDestroyWindow(0, (GLint)pWindow->hWnd);808 return;809 }810 811 if (pRegions->pRegions->fFlags.bAddVisibleRects || pRegions->pRegions->fFlags.bSetViewRect)812 {813 if (!pWindow->mapped)814 {815 bDoMap = true;816 }817 818 /* ensure data integrity */819 Assert(!pRegions->pRegions->fFlags.bAddHiddenRects);820 821 if (pRegions->pRegions->fFlags.bSetViewRect)822 {823 int winX, winY;824 unsigned int winW, winH;825 BOOL bRc;826 827 winX = pRegions->pRegions->RectsInfo.aRects[0].left;828 winY = pRegions->pRegions->RectsInfo.aRects[0].top;829 winW = pRegions->pRegions->RectsInfo.aRects[0].right - winX;830 winH = pRegions->pRegions->RectsInfo.aRects[0].bottom - winY;831 832 if (stub.trackWindowPos && (bDoMap || winX!=pWindow->x || winY!=pWindow->y))833 {834 crDebug("Dispatched WindowPosition (%i)", pWindow->spuWindow);835 stub.spuDispatch.WindowPosition(pWindow->spuWindow, winX, winY);836 pWindow->x = winX;837 pWindow->y = winY;838 bChanged = true;839 }840 841 if (stub.trackWindowSize && (bDoMap || winW!=pWindow->width || winH!=pWindow->height))842 {843 crDebug("Dispatched WindowSize (%i)", pWindow->spuWindow);844 stub.spuDispatch.WindowSize(pWindow->spuWindow, winW, winH);845 pWindow->width = winW;846 pWindow->height = winH;847 bChanged = true;848 }849 850 bRc = MoveWindow(pRegions->hWnd, winX, winY, winW, winH, FALSE /*BOOL bRepaint*/);851 if (!bRc)852 {853 DWORD winEr = GetLastError();854 crWarning("stubSyncTrUpdateWindowCB: MoveWindow failed winEr(%d)", winEr);855 }856 }857 858 if (pRegions->pRegions->fFlags.bAddVisibleRects)859 {860 hNewRgn = stubMakeRegionFromRects(pRegions->pRegions, pRegions->pRegions->fFlags.bSetViewRect ? 1 : 0);861 }862 }863 else if (!pRegions->pRegions->fFlags.bHide)864 {865 Assert(pRegions->pRegions->fFlags.bAddHiddenRects);866 hNewRgn = stubMakeRegionFromRects(pRegions->pRegions, 0);867 }868 else869 {870 Assert(pRegions->pRegions->fFlags.bAddHiddenRects);871 hNewRgn = CreateRectRgn(pWindow->x, pWindow->y, pWindow->x + pWindow->width, pWindow->y + pWindow->height);872 }873 874 if (hNewRgn!=INVALID_HANDLE_VALUE)875 {876 if (pRegions->pRegions->fFlags.bAddVisibleRects)877 {878 HRGN hEmptyRgn = CreateRectRgn(0, 0, 0, 0);879 880 if (hEmptyRgn!=INVALID_HANDLE_VALUE)881 {882 if (pWindow->hVisibleRegion==INVALID_HANDLE_VALUE || EqualRgn(pWindow->hVisibleRegion, hEmptyRgn))883 {884 pCbData->fSendUpdateMsg = true;885 }886 887 DeleteObject(hEmptyRgn);888 }889 else890 {891 crWarning("Failed to created empty region!");892 }893 }894 895 OffsetRgn(hNewRgn, -pWindow->x, -pWindow->y);896 897 if (pWindow->hVisibleRegion!=INVALID_HANDLE_VALUE)898 {899 CombineRgn(hNewRgn, pWindow->hVisibleRegion, hNewRgn,900 pRegions->pRegions->fFlags.bAddHiddenRects ? RGN_DIFF:RGN_OR);901 902 if (!EqualRgn(pWindow->hVisibleRegion, hNewRgn))903 {904 DeleteObject(pWindow->hVisibleRegion);905 pWindow->hVisibleRegion = hNewRgn;906 stubDispatchVisibleRegions(pWindow);907 bChanged = true;908 }909 else910 {911 DeleteObject(hNewRgn);912 }913 }914 else915 {916 if (pRegions->pRegions->fFlags.bAddVisibleRects)917 {918 pWindow->hVisibleRegion = hNewRgn;919 stubDispatchVisibleRegions(pWindow);920 bChanged = true;921 }922 }923 }924 925 if (bDoMap)926 {927 pWindow->mapped = GL_TRUE;928 bChanged = true;929 crDebug("Dispatched: WindowShow(%i, %i)", pWindow->spuWindow, pWindow->mapped);930 stub.spu->dispatch_table.WindowShow(pWindow->spuWindow, pWindow->mapped);931 }932 933 if (bChanged)934 {935 stub.spu->dispatch_table.Flush();936 }937 }938 784 # endif /* VBOX_WITH_WDDM */ 939 785 … … 973 819 MSG msg; 974 820 # ifdef VBOX_WITH_WDDM 975 static VBOXDISPMP_CALLBACKS VBoxDispMpTstCallbacks = {NULL, NULL, NULL};976 821 HMODULE hVBoxD3D = NULL; 977 VBOXCR_UPDATEWNDCB RegionsData;978 822 HRESULT hr; 979 823 GLint spuConnection = 0; … … 996 840 if (hVBoxD3D) 997 841 { 998 PFNVBOXDISPMP_GETCALLBACKS pfnVBoxDispMpGetCallbacks;999 pfnVBoxDispMpGetCallbacks = (PFNVBOXDISPMP_GETCALLBACKS)GetProcAddress(hVBoxD3D, TEXT("VBoxDispMpGetCallbacks"));1000 if (pfnVBoxDispMpGetCallbacks)1001 {1002 hr = pfnVBoxDispMpGetCallbacks(VBOXDISPMP_VERSION, &VBoxDispMpTstCallbacks);1003 if (S_OK==hr)1004 {1005 CRASSERT(VBoxDispMpTstCallbacks.pfnEnableEvents);1006 CRASSERT(VBoxDispMpTstCallbacks.pfnDisableEvents);1007 CRASSERT(VBoxDispMpTstCallbacks.pfnGetRegions);1008 1009 hr = VBoxDispMpTstCallbacks.pfnEnableEvents();1010 if (hr != S_OK)1011 {1012 crWarning("VBoxDispMpTstCallbacks.pfnEnableEvents failed");1013 }1014 else1015 {1016 842 crDebug("running with " VBOX_MODNAME_DISPD3D); 1017 843 stub.trackWindowVisibleRgn = 0; 1018 844 stub.bRunningUnderWDDM = true; 1019 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS1020 crError("should not be here, visible rects should be processed in miniport!");1021 #endif1022 }1023 }1024 else1025 {1026 crWarning("VBoxDispMpGetCallbacks failed");1027 }1028 }1029 845 } 1030 846 # endif /* VBOX_WITH_WDDM */ … … 1052 868 { 1053 869 # ifdef VBOX_WITH_WDDM 1054 if ( VBoxDispMpTstCallbacks.pfnGetRegions)870 if (stub.bRunningUnderWDDM) 1055 871 { 1056 hr = VBoxDispMpTstCallbacks.pfnGetRegions(&RegionsData.Regions, 50); 1057 if (S_OK==hr) 1058 { 1059 RegionsData.fSendUpdateMsg = false; 1060 # if 0 1061 uint32_t i; 1062 crDebug(">>>Regions for HWND(0x%x)>>>", RegionsData.Regions.hWnd); 1063 crDebug("Flags(0x%x)", RegionsData.Regions.pRegions->fFlags.Value); 1064 for (i = 0; i < RegionsData.Regions.pRegions->RectsInfo.cRects; ++i) 1065 { 1066 RECT *pRect = &RegionsData.Regions.pRegions->RectsInfo.aRects[i]; 1067 crDebug("Rect(%d): left(%d), top(%d), right(%d), bottom(%d)", i, pRect->left, pRect->top, pRect->right, pRect->bottom); 1068 } 1069 crDebug("<<<<<"); 1070 # endif 1071 /*hacky way to make sure window wouldn't be deleted in another thread as we hold hashtable lock here*/ 1072 crHashtableWalk(stub.windowTable, stubSyncTrUpdateWindowCB, &RegionsData); 1073 if (RegionsData.fSendUpdateMsg) 1074 { 1075 SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, SMTO_NORMAL, 1000, NULL); 1076 } 1077 } 1078 else 1079 { 1080 if (WAIT_TIMEOUT!=hr) 1081 { 1082 crWarning("VBoxDispMpTstCallbacks.pfnGetRegions failed with 0x%x", hr); 1083 } 1084 crHashtableWalk(stub.windowTable, stubSyncTrCheckWindowsCB, NULL); 1085 } 872 1086 873 } 1087 874 else … … 1114 901 1115 902 #ifdef VBOX_WITH_WDDM 1116 if (VBoxDispMpTstCallbacks.pfnDisableEvents)1117 {1118 VBoxDispMpTstCallbacks.pfnDisableEvents();1119 }1120 903 if (spuConnection) 1121 904 { … … 1170 953 disable_sync = 1; 1171 954 } 1172 #elif defined(WINDOWS) && defined(VBOX_WITH_WDDM) && defined(VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS)1173 if ( GetModuleHandle(VBOX_MODNAME_DISPD3D))955 #elif defined(WINDOWS) && defined(VBOX_WITH_WDDM) 956 if (stub.bNewPresent) 1174 957 { 1175 958 disable_sync = 1; 1176 crDebug("running with "VBOX_MODNAME_DISPD3D);959 crDebug("running with %s", VBOX_MODNAME_DISPD3D); 1177 960 stub.trackWindowVisibleRgn = 0; 1178 961 stub.bRunningUnderWDDM = true; … … 1423 1206 } 1424 1207 else 1208 { 1209 /* @todo: impl proper detection */ 1210 #ifndef DEBUG_misha 1211 stub.bNewPresent = true; 1212 #endif 1213 1425 1214 crNetFreeConnection(ns.conn); 1215 } 1426 1216 1427 1217 break; -
trunk/src/VBox/Additions/common/crOpenGL/stub.h
r46528 r46757 261 261 # ifdef VBOX_WITH_WDDM 262 262 bool bRunningUnderWDDM; 263 bool bNewPresent; 263 264 # endif 264 265 #endif -
trunk/src/VBox/GuestHost/OpenGL/include/cr_error.h
r41928 r46757 28 28 29 29 DECLEXPORT(void) crDebug(const char *format, ... ) PRINTF; 30 #ifdef DEBUG_misha 31 typedef void FNCRDEBUG(const char *format, ... ) PRINTF; 32 typedef FNCRDEBUG *PFNCRDEBUG; 33 DECLINLINE(PFNCRDEBUG) crGetDebug() {return crDebug;} 34 # define crWarning (RT_BREAKPOINT(), crDebug) 35 #else 30 36 DECLEXPORT(void) crWarning(const char *format, ... ) PRINTF; 37 #endif 31 38 DECLEXPORT(void) crInfo(const char *format, ... ) PRINTF; 32 39 -
trunk/src/VBox/GuestHost/OpenGL/include/cr_pack.h
r43487 r46757 145 145 #undef CR_UNALIGNED_ACCESS_OKAY 146 146 #endif 147 #ifndef IN_RING0 147 148 extern DECLEXPORT(void) crWriteUnalignedDouble( void *buffer, double d ); 148 149 extern DECLEXPORT(void) crWriteSwappedDouble( void *buffer, double d ); 150 #endif 149 151 150 152 extern DECLEXPORT(void) *crPackAlloc( CR_PACKER_CONTEXT_ARGDECL unsigned int len ); … … 309 311 WRITE_DATA( offset, GLdouble, data ) 310 312 #else 311 #define WRITE_DOUBLE( offset, data ) \ 312 crWriteUnalignedDouble( data_ptr + (offset), (data) ) 313 #endif 314 313 # ifndef IN_RING0 314 # define WRITE_DOUBLE( offset, data ) \ 315 crWriteUnalignedDouble( data_ptr + (offset), (data) ) 316 # else 317 # define WRITE_DOUBLE( offset, data ) \ 318 AssertReleaseFailed() 319 # endif 320 #endif 321 322 #ifndef IN_RING0 315 323 #define WRITE_SWAPPED_DOUBLE( offset, data ) \ 316 324 crWriteSwappedDouble( data_ptr + (offset), (data) ) 325 #else 326 #define WRITE_SWAPPED_DOUBLE( offset, data ) \ 327 AssertReleaseFailed() 328 #endif 317 329 318 330 #define WRITE_OPCODE( pc, opcode ) \ -
trunk/src/VBox/GuestHost/OpenGL/include/cr_vreg.h
r45251 r46757 72 72 } 73 73 74 DECLINLINE(void) VBoxRectTranslated(const RTRECT * pRect, int32_t x, int32_t y, RTRECT *pResult) 75 { 76 *pResult = *pRect; 77 VBoxRectTranslate(pResult, x, y); 78 } 79 74 80 DECLINLINE(void) VBoxRectMove(RTRECT * pRect, int32_t x, int32_t y) 75 81 { … … 80 86 pRect->xRight = w + x; 81 87 pRect->yBottom = h + y; 88 } 89 90 DECLINLINE(void) VBoxRectMoved(const RTRECT * pRect, int32_t x, int32_t y, RTRECT *pResult) 91 { 92 *pResult = *pRect; 93 VBoxRectMove(pResult, x, y); 82 94 } 83 95 … … 281 293 { 282 294 VBOXVR_COMPOSITOR Compositor; 295 #ifndef IN_RING0 283 296 float StretchX; 284 297 float StretchY; 298 #endif 285 299 uint32_t cRects; 286 300 uint32_t cRectsBuffer; 287 301 PRTRECT paSrcRects; 288 302 PRTRECT paDstRects; 303 #ifndef IN_RING0 289 304 RTCRITSECT CritSect; 305 #endif 290 306 } VBOXVR_SCR_COMPOSITOR, *PVBOXVR_SCR_COMPOSITOR; 291 307 … … 351 367 VBOXVREGDECL(int) CrVrScrCompositorInit(PVBOXVR_SCR_COMPOSITOR pCompositor); 352 368 VBOXVREGDECL(void) CrVrScrCompositorTerm(PVBOXVR_SCR_COMPOSITOR pCompositor); 369 #ifndef IN_RING0 353 370 VBOXVREGDECL(void) CrVrScrCompositorSetStretching(PVBOXVR_SCR_COMPOSITOR pCompositor, float StretchX, float StretchY); 371 #endif 354 372 /* regions are valid until the next CrVrScrCompositor call */ 355 373 VBOXVREGDECL(int) CrVrScrCompositorRegionsGet(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions); … … 378 396 } 379 397 398 #ifndef IN_RING0 380 399 DECLINLINE(int) CrVrScrCompositorLock(PVBOXVR_SCR_COMPOSITOR pCompositor) 381 400 { … … 391 410 return rc; 392 411 } 393 412 #endif 394 413 RT_C_DECLS_END 395 414 -
trunk/src/VBox/GuestHost/OpenGL/packer/pack_buffer.c
r43487 r46757 243 243 244 244 #ifdef IN_RING0 245 if(!num_opcodes) 245 if(num_opcodes) 246 { 247 num_opcodes = (num_opcodes + 0x3) & (~0x3); 248 } 249 else 246 250 #endif 247 251 { -
trunk/src/VBox/GuestHost/OpenGL/packer/pack_misc.c
r33475 r46757 8 8 #include "cr_error.h" 9 9 10 void PACK_APIENTRY crPackChromiumParametervCR( GLenum target, GLenum type, GLsizei count, const GLvoid *values)10 void PACK_APIENTRY crPackChromiumParametervCR(CR_PACKER_CONTEXT_ARGDECL GLenum target, GLenum type, GLsizei count, const GLvoid *values) 11 11 { 12 12 CR_GET_PACKER_CONTEXT(pc); … … 30 30 params_length = sizeof(GLint) * count; 31 31 break; 32 #ifndef IN_RING0 32 33 case GL_FLOAT: 33 34 params_length = sizeof(GLfloat) * count; 34 35 break; 36 #endif 35 37 #if 0 36 38 case GL_DOUBLE: … … 75 77 } 76 78 break; 79 #ifndef IN_RING0 77 80 case GL_FLOAT: 78 81 for (i = 0; i < count; i++, pos += sizeof(GLfloat)) { … … 80 83 } 81 84 break; 85 #endif 82 86 #if 0 83 87 case GL_DOUBLE: … … 96 100 } 97 101 98 void PACK_APIENTRY crPackDeleteQueriesARB(GLsizei n, const GLuint * ids) 102 #ifndef IN_RING0 103 void PACK_APIENTRY crPackDeleteQueriesARB(CR_PACKER_CONTEXT_ARGDECL GLsizei n, const GLuint * ids) 99 104 { 100 105 unsigned char *data_ptr; … … 108 113 crPackFree(data_ptr); 109 114 } 115 #endif 116 117 void PACK_APIENTRY crPackVBoxTexPresent( CR_PACKER_CONTEXT_ARGDECL GLuint texture, GLuint cfg, GLint xPos, GLint yPos, GLint cRects, const GLint * pRects ) 118 { 119 GLint i, size, cnt; 120 121 CR_GET_PACKER_CONTEXT(pc); 122 unsigned char *data_ptr; 123 (void) pc; 124 size = 28 + cRects * 4 * sizeof(GLint); 125 CR_GET_BUFFERED_POINTER( pc, size ); 126 WRITE_DATA( 0, GLint, size ); 127 WRITE_DATA( 4, GLenum, CR_VBOXTEXPRESENT_EXTEND_OPCODE ); 128 WRITE_DATA( 8, GLint, texture ); 129 WRITE_DATA( 12, GLint, cfg ); 130 WRITE_DATA( 16, GLint, xPos ); 131 WRITE_DATA( 20, GLint, yPos ); 132 WRITE_DATA( 24, GLint, cRects ); 133 134 cnt = 28; 135 for (i=0; i<cRects; ++i) 136 { 137 WRITE_DATA(cnt, GLint, (GLint) pRects[4*i+0]); 138 WRITE_DATA(cnt+4, GLint, (GLint) pRects[4*i+1]); 139 WRITE_DATA(cnt+8, GLint, (GLint) pRects[4*i+2]); 140 WRITE_DATA(cnt+12, GLint, (GLint) pRects[4*i+3]); 141 cnt += 16; 142 } 143 WRITE_OPCODE( pc, CR_EXTEND_OPCODE ); 144 CR_UNLOCK_PACKER_CONTEXT(pc); 145 } 146 147 void PACK_APIENTRY crPackWindowPosition( CR_PACKER_CONTEXT_ARGDECL GLint window, GLint x, GLint y ) 148 { 149 CR_GET_PACKER_CONTEXT(pc); 150 unsigned char *data_ptr; 151 (void) pc; 152 CR_GET_BUFFERED_POINTER( pc, 20 ); 153 WRITE_DATA( 0, GLint, 20 ); 154 WRITE_DATA( 4, GLenum, CR_WINDOWPOSITION_EXTEND_OPCODE ); 155 WRITE_DATA( 8, GLint, window ); 156 WRITE_DATA( 12, GLint, x ); 157 WRITE_DATA( 16, GLint, y ); 158 WRITE_OPCODE( pc, CR_EXTEND_OPCODE ); 159 CR_UNLOCK_PACKER_CONTEXT(pc); 160 } 161 162 void PACK_APIENTRY crPackWindowShow( CR_PACKER_CONTEXT_ARGDECL GLint window, GLint flag ) 163 { 164 CR_GET_PACKER_CONTEXT(pc); 165 unsigned char *data_ptr; 166 (void) pc; 167 CR_GET_BUFFERED_POINTER( pc, 16 ); 168 WRITE_DATA( 0, GLint, 16 ); 169 WRITE_DATA( 4, GLenum, CR_WINDOWSHOW_EXTEND_OPCODE ); 170 WRITE_DATA( 8, GLint, window ); 171 WRITE_DATA( 12, GLint, flag ); 172 WRITE_OPCODE( pc, CR_EXTEND_OPCODE ); 173 CR_UNLOCK_PACKER_CONTEXT(pc); 174 } 175 176 void PACK_APIENTRY crPackWindowSize( CR_PACKER_CONTEXT_ARGDECL GLint window, GLint w, GLint h ) 177 { 178 CR_GET_PACKER_CONTEXT(pc); 179 unsigned char *data_ptr; 180 (void) pc; 181 CR_GET_BUFFERED_POINTER( pc, 20 ); 182 WRITE_DATA( 0, GLint, 20 ); 183 WRITE_DATA( 4, GLenum, CR_WINDOWSIZE_EXTEND_OPCODE ); 184 WRITE_DATA( 8, GLint, window ); 185 WRITE_DATA( 12, GLint, w ); 186 WRITE_DATA( 16, GLint, h ); 187 WRITE_OPCODE( pc, CR_EXTEND_OPCODE ); 188 CR_UNLOCK_PACKER_CONTEXT(pc); 189 } -
trunk/src/VBox/GuestHost/OpenGL/packer/packer.h
r15532 r46757 19 19 #include "cr_mem.h" 20 20 21 #ifndef IN_RING0 21 22 extern void __PackError( int line, const char *file, GLenum error, const char *info ); 23 #else 24 # define __PackError( line, file, error, info) do { AssertReleaseFailed(); } while (0) 25 #endif 22 26 23 27 #endif /* CR_PACKER_H */ -
trunk/src/VBox/GuestHost/OpenGL/packer/packer_special
r27244 r46757 177 177 UniformMatrix3x4fv 178 178 UniformMatrix4x3fv 179 VBoxTexPresent 180 WindowPosition 181 WindowShow 182 WindowSize -
trunk/src/VBox/GuestHost/OpenGL/util/error.c
r41635 r46757 246 246 } 247 247 248 #ifdef DEBUG_misha 249 # undef crWarning 250 #endif 248 251 DECLEXPORT(void) crWarning(const char *format, ... ) 249 252 { … … 496 499 #else 497 500 if (!output 498 # ifndef DEBUG_misha499 501 || output==stderr 500 # endif501 502 ) 502 503 { … … 505 506 else 506 507 { 507 # ifndef DEBUG_misha508 508 LogRel(("%s\n", txt)); 509 # endif510 509 outputChromiumMessage(output, txt); 511 510 } -
trunk/src/VBox/GuestHost/OpenGL/util/vreg.cpp
r45627 r46757 17 17 */ 18 18 #include <cr_vreg.h> 19 #include <iprt/memcache.h>20 19 #include <iprt/err.h> 21 20 #include <iprt/assert.h> 22 21 #include <iprt/asm.h> 23 22 24 #ifndef IN_RING025 23 #include <cr_error.h> 26 24 #define WARN(_m) do { crWarning _m ; } while (0) 27 #else 28 # error port me! 29 #endif 30 31 #ifdef DEBUG_misha 32 //# define VBOXVDBG_VR_LAL_DISABLE 33 #endif 34 25 26 #ifndef IN_RING0 27 #include <iprt/memcache.h> 35 28 #ifndef VBOXVDBG_VR_LAL_DISABLE 36 static volatile int32_t g_cVBoxVrInits = 0;37 29 static RTMEMCACHE g_VBoxVrLookasideList; 38 #endif 39 40 static PVBOXVR_REG vboxVrRegCreate() 41 { 42 #ifndef VBOXVDBG_VR_LAL_DISABLE 43 PVBOXVR_REG pReg = (PVBOXVR_REG)RTMemCacheAlloc(g_VBoxVrLookasideList); 44 if (!pReg) 45 { 46 WARN(("ExAllocateFromLookasideListEx failed!")); 47 } 48 return pReg; 49 #else 50 return (PVBOXVR_REG)RTMemAlloc(sizeof (VBOXVR_REG)); 51 #endif 52 } 53 54 static void vboxVrRegTerm(PVBOXVR_REG pReg) 55 { 56 #ifndef VBOXVDBG_VR_LAL_DISABLE 57 RTMemCacheFree(g_VBoxVrLookasideList, pReg); 58 #else 59 RTMemFree(pReg); 60 #endif 61 } 62 63 VBOXVREGDECL(void) VBoxVrListClear(PVBOXVR_LIST pList) 64 { 65 PVBOXVR_REG pReg, pRegNext; 66 67 RTListForEachSafe(&pList->ListHead, pReg, pRegNext, VBOXVR_REG, ListEntry) 68 { 69 vboxVrRegTerm(pReg); 70 } 71 VBoxVrListInit(pList); 72 } 73 74 #define VBOXVR_MEMTAG 'vDBV' 75 76 VBOXVREGDECL(int) VBoxVrInit() 77 { 78 int32_t cNewRefs = ASMAtomicIncS32(&g_cVBoxVrInits); 79 Assert(cNewRefs >= 1); 80 Assert(cNewRefs == 1); /* <- debugging */ 81 if (cNewRefs > 1) 82 return VINF_SUCCESS; 83 84 #ifndef VBOXVDBG_VR_LAL_DISABLE 85 int rc = RTMemCacheCreate(&g_VBoxVrLookasideList, sizeof (VBOXVR_REG), 30 #define vboxVrRegLaAlloc(_c) RTMemCacheAlloc((_c)) 31 #define vboxVrRegLaFree(_c, _e) RTMemCacheFree((_c), (_e)) 32 DECLINLINE(int) vboxVrLaCreate(RTMEMCACHE *pCache, size_t cbElement) 33 { 34 int rc = RTMemCacheCreate(pCache, cbElement, 86 35 0, /* size_t cbAlignment */ 87 36 UINT32_MAX, /* uint32_t cMaxObjects */ … … 93 42 if (!RT_SUCCESS(rc)) 94 43 { 44 WARN(("RTMemCacheCreate failed rc %d", rc)); 45 return rc; 46 } 47 return VINF_SUCCESS; 48 } 49 #define vboxVrLaDestroy(_c) RTMemCacheDestroy((_c)) 50 #endif 51 #else 52 # ifdef RT_OS_WINDOWS 53 # ifdef PAGE_SIZE 54 # undef PAGE_SIZE 55 # endif 56 # ifdef PAGE_SHIFT 57 # undef PAGE_SHIFT 58 # endif 59 # define VBOX_WITH_WORKAROUND_MISSING_PACK 60 # if (_MSC_VER >= 1400) && !defined(VBOX_WITH_PATCHED_DDK) 61 # define _InterlockedExchange _InterlockedExchange_StupidDDKVsCompilerCrap 62 # define _InterlockedExchangeAdd _InterlockedExchangeAdd_StupidDDKVsCompilerCrap 63 # define _InterlockedCompareExchange _InterlockedCompareExchange_StupidDDKVsCompilerCrap 64 # define _InterlockedAddLargeStatistic _InterlockedAddLargeStatistic_StupidDDKVsCompilerCrap 65 # define _interlockedbittestandset _interlockedbittestandset_StupidDDKVsCompilerCrap 66 # define _interlockedbittestandreset _interlockedbittestandreset_StupidDDKVsCompilerCrap 67 # define _interlockedbittestandset64 _interlockedbittestandset64_StupidDDKVsCompilerCrap 68 # define _interlockedbittestandreset64 _interlockedbittestandreset64_StupidDDKVsCompilerCrap 69 # pragma warning(disable : 4163) 70 # ifdef VBOX_WITH_WORKAROUND_MISSING_PACK 71 # pragma warning(disable : 4103) 72 # endif 73 # include <ntddk.h> 74 # pragma warning(default : 4163) 75 # ifdef VBOX_WITH_WORKAROUND_MISSING_PACK 76 # pragma pack() 77 # pragma warning(default : 4103) 78 # endif 79 # undef _InterlockedExchange 80 # undef _InterlockedExchangeAdd 81 # undef _InterlockedCompareExchange 82 # undef _InterlockedAddLargeStatistic 83 # undef _interlockedbittestandset 84 # undef _interlockedbittestandreset 85 # undef _interlockedbittestandset64 86 # undef _interlockedbittestandreset64 87 # else 88 # include <ntddk.h> 89 # endif 90 #ifndef VBOXVDBG_VR_LAL_DISABLE 91 static LOOKASIDE_LIST_EX g_VBoxVrLookasideList; 92 #define vboxVrRegLaAlloc(_c) ExAllocateFromLookasideListEx(&(_c)) 93 #define vboxVrRegLaFree(_c, _e) ExFreeToLookasideListEx(&(_c), (_e)) 94 #define VBOXWDDMVR_MEMTAG 'vDBV' 95 DECLINLINE(int) vboxVrLaCreate(LOOKASIDE_LIST_EX *pCache, size_t cbElement) 96 { 97 NTSTATUS Status = ExInitializeLookasideListEx(pCache, 98 NULL, /* PALLOCATE_FUNCTION_EX Allocate */ 99 NULL, /* PFREE_FUNCTION_EX Free */ 100 NonPagedPool, 101 0, /* ULONG Flags */ 102 cbElement, 103 VBOXWDDMVR_MEMTAG, 104 0 /* USHORT Depth - reserved, must be null */ 105 ); 106 if (!NT_SUCCESS(Status)) 107 { 108 WARN(("ExInitializeLookasideListEx failed, Status (0x%x)", Status)); 109 return VERR_GENERAL_FAILURE; 110 } 111 112 return VINF_SUCCESS; 113 } 114 #define vboxVrLaDestroy(_c) ExDeleteLookasideListEx(&(_c)) 115 #endif 116 # else 117 # error "port me!" 118 # endif 119 #endif 120 121 #ifdef DEBUG_misha 122 //# define VBOXVDBG_VR_LAL_DISABLE 123 #endif 124 125 #ifndef VBOXVDBG_VR_LAL_DISABLE 126 static volatile int32_t g_cVBoxVrInits = 0; 127 #endif 128 129 static PVBOXVR_REG vboxVrRegCreate() 130 { 131 #ifndef VBOXVDBG_VR_LAL_DISABLE 132 PVBOXVR_REG pReg = (PVBOXVR_REG)vboxVrRegLaAlloc(g_VBoxVrLookasideList); 133 if (!pReg) 134 { 135 WARN(("ExAllocateFromLookasideListEx failed!")); 136 } 137 return pReg; 138 #else 139 return (PVBOXVR_REG)RTMemAlloc(sizeof (VBOXVR_REG)); 140 #endif 141 } 142 143 static void vboxVrRegTerm(PVBOXVR_REG pReg) 144 { 145 #ifndef VBOXVDBG_VR_LAL_DISABLE 146 vboxVrRegLaFree(g_VBoxVrLookasideList, pReg); 147 #else 148 RTMemFree(pReg); 149 #endif 150 } 151 152 VBOXVREGDECL(void) VBoxVrListClear(PVBOXVR_LIST pList) 153 { 154 PVBOXVR_REG pReg, pRegNext; 155 156 RTListForEachSafe(&pList->ListHead, pReg, pRegNext, VBOXVR_REG, ListEntry) 157 { 158 vboxVrRegTerm(pReg); 159 } 160 VBoxVrListInit(pList); 161 } 162 163 #define VBOXVR_MEMTAG 'vDBV' 164 165 VBOXVREGDECL(int) VBoxVrInit() 166 { 167 int32_t cNewRefs = ASMAtomicIncS32(&g_cVBoxVrInits); 168 Assert(cNewRefs >= 1); 169 Assert(cNewRefs == 1); /* <- debugging */ 170 if (cNewRefs > 1) 171 return VINF_SUCCESS; 172 173 #ifndef VBOXVDBG_VR_LAL_DISABLE 174 int rc = vboxVrLaCreate(&g_VBoxVrLookasideList, sizeof (VBOXVR_REG)); 175 if (!RT_SUCCESS(rc)) 176 { 95 177 WARN(("ExInitializeLookasideListEx failed, rc (%d)", rc)); 96 178 return rc; … … 109 191 110 192 #ifndef VBOXVDBG_VR_LAL_DISABLE 111 RTMemCacheDestroy(g_VBoxVrLookasideList);193 vboxVrLaDestroy(g_VBoxVrLookasideList); 112 194 #endif 113 195 } … … 1542 1624 int rc = VBoxVrListRectsGet(&pCEntry->Vr, cRects, pEntry->paDstRects); 1543 1625 AssertRC(rc); 1544 if (pCompositor->StretchX >= 1. && pCompositor->StretchY >= 1. /* <- stretching can not zero some rects */ 1545 && !pEntry->Pos.x && !pEntry->Pos.y) 1626 if ( 1627 #ifndef IN_RING0 1628 pCompositor->StretchX >= 1. && pCompositor->StretchY >= 1. /* <- stretching can not zero some rects */ 1629 && 1630 #endif 1631 !pEntry->Pos.x && !pEntry->Pos.y 1632 ) 1546 1633 { 1547 1634 memcpy(pEntry->paSrcRects, pEntry->paDstRects, cRects * sizeof (*pEntry->paSrcRects)); … … 1551 1638 for (uint32_t i = 0; i < cRects; ++i) 1552 1639 { 1553 pEntry->paSrcRects[i].xLeft = (int32_t)((pEntry->paDstRects[i].xLeft - pEntry->Pos.x) * pCompositor->StretchX); 1554 pEntry->paSrcRects[i].yTop = (int32_t)((pEntry->paDstRects[i].yTop - pEntry->Pos.y) * pCompositor->StretchY); 1555 pEntry->paSrcRects[i].xRight = (int32_t)((pEntry->paDstRects[i].xRight - pEntry->Pos.x) * pCompositor->StretchX); 1556 pEntry->paSrcRects[i].yBottom = (int32_t)((pEntry->paDstRects[i].yBottom - pEntry->Pos.y) * pCompositor->StretchY); 1557 } 1558 1559 bool canZeroX = (pCompositor->StretchX < 1); 1560 bool canZeroY = (pCompositor->StretchY < 1); 1640 pEntry->paSrcRects[i].xLeft = (int32_t)((pEntry->paDstRects[i].xLeft - pEntry->Pos.x)); 1641 pEntry->paSrcRects[i].yTop = (int32_t)((pEntry->paDstRects[i].yTop - pEntry->Pos.y)); 1642 pEntry->paSrcRects[i].xRight = (int32_t)((pEntry->paDstRects[i].xRight - pEntry->Pos.x)); 1643 pEntry->paSrcRects[i].yBottom = (int32_t)((pEntry->paDstRects[i].yBottom - pEntry->Pos.y)); 1644 #ifndef IN_RING0 1645 if (pCompositor->StretchX != 1.) 1646 { 1647 pEntry->paSrcRects[i].xLeft = (int32_t)(pEntry->paSrcRects[i].xLeft * pCompositor->StretchX); 1648 pEntry->paSrcRects[i].xRight = (int32_t)(pEntry->paSrcRects[i].xRight * pCompositor->StretchX); 1649 } 1650 if (pCompositor->StretchY != 1.) 1651 { 1652 pEntry->paSrcRects[i].yTop = (int32_t)(pEntry->paSrcRects[i].yTop * pCompositor->StretchY); 1653 pEntry->paSrcRects[i].yBottom = (int32_t)(pEntry->paSrcRects[i].yBottom * pCompositor->StretchY); 1654 } 1655 #endif 1656 } 1657 1658 #ifndef IN_RING0 1659 bool canZeroX = (pCompositor->StretchX < 1.); 1660 bool canZeroY = (pCompositor->StretchY < 1.); 1561 1661 if (canZeroX && canZeroY) 1562 1662 { … … 1589 1689 } 1590 1690 } 1591 } 1592 1691 #endif 1692 } 1593 1693 pEntry->cRects = cRects; 1594 1694 pData->paDstRects += cRects; … … 1980 2080 { 1981 2081 memset(pCompositor, 0, sizeof (*pCompositor)); 2082 #ifndef IN_RING0 1982 2083 int rc = RTCritSectInit(&pCompositor->CritSect); 1983 if (RT_SUCCESS(rc)) 1984 { 1985 VBoxVrCompositorInit(&pCompositor->Compositor, NULL); 1986 pCompositor->StretchX = 1.0; 1987 pCompositor->StretchY = 1.0; 1988 return VINF_SUCCESS; 1989 } 1990 else 2084 if (!RT_SUCCESS(rc)) 1991 2085 { 1992 2086 WARN(("RTCritSectInit failed rc %d", rc)); 1993 } 1994 return rc; 2087 return rc; 2088 } 2089 #endif 2090 VBoxVrCompositorInit(&pCompositor->Compositor, NULL); 2091 #ifndef IN_RING0 2092 pCompositor->StretchX = 1.0; 2093 pCompositor->StretchY = 1.0; 2094 #endif 2095 return VINF_SUCCESS; 1995 2096 } 1996 2097 … … 2002 2103 if (pCompositor->paSrcRects) 2003 2104 RTMemFree(pCompositor->paSrcRects); 2004 2105 #ifndef IN_RING0 2005 2106 RTCritSectDelete(&pCompositor->CritSect); 2107 #endif 2006 2108 } 2007 2109 … … 2018 2120 VBoxVrCompositorVisit(&pCompositor->Compositor, crVrScrCompositorEntrySetAllChangedCb, (void*)fChanged); 2019 2121 } 2020 2122 #ifndef IN_RING0 2021 2123 VBOXVREGDECL(void) CrVrScrCompositorSetStretching(PVBOXVR_SCR_COMPOSITOR pCompositor, float StretchX, float StretchY) 2022 2124 { … … 2026 2128 CrVrScrCompositorEntrySetAllChanged(pCompositor, true); 2027 2129 } 2028 2130 #endif 2029 2131 /* regions are valid until the next CrVrScrCompositor call */ 2030 2132 VBOXVREGDECL(int) CrVrScrCompositorRegionsGet(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions) -
trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_misc.c
r27091 r46757 75 75 cr_unpackDispatch.GetPixelMapusv( map, values ); 76 76 } 77 78 void crUnpackExtendVBoxTexPresent(void) 79 { 80 GLuint texture = READ_DATA( 8, GLuint ); 81 GLuint cfg = READ_DATA( 12, GLuint ); 82 GLint xPos = READ_DATA( 16, GLint ); 83 GLint yPos = READ_DATA( 20, GLint ); 84 GLint cRects = READ_DATA( 24, GLint ); 85 GLint *pRects = (GLint *)DATA_POINTER( 28, GLvoid ); 86 cr_unpackDispatch.VBoxTexPresent( texture, cfg, xPos, yPos, cRects, pRects ); 87 } -
trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpacker_special
r27244 r46757 181 181 UniformMatrix3x4fv 182 182 UniformMatrix4x3fv 183 VBoxTexPresent
Note:
See TracChangeset
for help on using the changeset viewer.