Changeset 32496 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Display
- Timestamp:
- Sep 14, 2010 10:14:46 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 65872
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp
r32444 r32496 1384 1384 } 1385 1385 1386 static HRESULT vboxWddmSwapchainKmSynch(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain) 1387 { 1388 struct 1389 { 1390 VBOXDISPIFESCAPE_SWAPCHAININFO SwapchainInfo; 1391 D3DKMT_HANDLE ahAllocs[VBOXWDDMDISP_MAX_SWAPCHAIN_SIZE]; 1392 } Buf; 1393 1394 memset(&Buf.SwapchainInfo, 0, sizeof (Buf.SwapchainInfo)); 1395 Buf.SwapchainInfo.EscapeHdr.escapeCode = VBOXESC_SWAPCHAININFO; 1396 Buf.SwapchainInfo.SwapchainInfo.hSwapchainKm = pSwapchain->hSwapchainKm; 1397 Buf.SwapchainInfo.SwapchainInfo.hSwapchainUm = (VBOXDISP_UMHANDLE)pSwapchain; 1398 // Buf.SwapchainInfo.SwapchainInfo.Rect; 1399 // Buf.SwapchainInfo.SwapchainInfo.u32Reserved; 1400 Buf.SwapchainInfo.SwapchainInfo.cAllocs = pSwapchain->cRTs; 1401 for (UINT i = 0; i < Buf.SwapchainInfo.SwapchainInfo.cAllocs; ++i) 1402 { 1403 Assert(pSwapchain->aRTs[i].pAlloc->hAllocation); 1404 Buf.SwapchainInfo.SwapchainInfo.ahAllocs[i] = pSwapchain->aRTs[i].pAlloc->hAllocation; 1405 } 1406 1407 D3DDDICB_ESCAPE DdiEscape = {0}; 1408 DdiEscape.hContext = pDevice->DefaultContext.ContextInfo.hContext; 1409 DdiEscape.hDevice = pDevice->hDevice; 1410 // DdiEscape.Flags.Value = 0; 1411 DdiEscape.pPrivateDriverData = &Buf.SwapchainInfo; 1412 DdiEscape.PrivateDriverDataSize = RT_OFFSETOF(VBOXDISPIFESCAPE_SWAPCHAININFO, SwapchainInfo.ahAllocs[Buf.SwapchainInfo.SwapchainInfo.cAllocs]); 1413 HRESULT hr = pDevice->RtCallbacks.pfnEscapeCb(pDevice->pAdapter->hAdapter, &DdiEscape); 1414 Assert(hr == S_OK); 1415 if (hr == S_OK) 1416 { 1417 pSwapchain->hSwapchainKm = Buf.SwapchainInfo.SwapchainInfo.hSwapchainKm; 1418 } 1419 1420 return hr; 1421 } 1422 1423 static HRESULT vboxWddmSwapchainKmDestroy(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain) 1424 { 1425 HRESULT hr = S_OK; 1426 if (pSwapchain->hSwapchainKm) 1427 { 1428 /* submit empty swapchain to destroy the KM one */ 1429 UINT cOldRTc = pSwapchain->cRTs; 1430 pSwapchain->cRTs = 0; 1431 hr = vboxWddmSwapchainKmSynch(pDevice, pSwapchain); 1432 Assert(hr == S_OK); 1433 Assert(!pSwapchain->hSwapchainKm); 1434 pSwapchain->cRTs = cOldRTc; 1435 } 1436 return hr; 1437 } 1386 1438 static HRESULT vboxWddmSwapchainDestroyIf(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain) 1387 1439 { … … 1410 1462 } 1411 1463 vboxWddmSwapchainDestroyIf(pDevice, pSwapchain); 1464 vboxWddmSwapchainKmDestroy(pDevice, pSwapchain); 1412 1465 vboxWddmSwapchainInit(pSwapchain); 1413 1466 } … … 1803 1856 return hr; 1804 1857 } 1858 1805 1859 static HRESULT vboxWddmSwapchainSynch(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain) 1806 1860 { 1861 HRESULT hr = S_OK; 1807 1862 for (int iBb = -1; iBb < int(pSwapchain->cRTs - 1); ++iBb) 1808 1863 { 1809 HRESULThr = vboxWddmSwapchainRtSynch(pDevice, pSwapchain, (UINT)iBb);1864 hr = vboxWddmSwapchainRtSynch(pDevice, pSwapchain, (UINT)iBb); 1810 1865 Assert(hr == S_OK); 1811 1866 } 1812 pSwapchain->fFlags.bChanged = 0; 1813 return S_OK; 1867 1868 if (pSwapchain->fFlags.bChanged) 1869 { 1870 hr = vboxWddmSwapchainKmSynch(pDevice, pSwapchain); 1871 if (hr == S_OK) 1872 { 1873 pSwapchain->fFlags.bChanged = 0; 1874 } 1875 } 1876 return hr; 1814 1877 } 1815 1878 … … 4373 4436 { 4374 4437 bool bIssueCreateResource = false; 4438 bool bCreateSwapchain = false; 4375 4439 bool bCreateKMResource = false; 4376 4440 … … 4649 4713 if (RTListIsEmpty(&pDevice->SwapchainList)) 4650 4714 { 4651 PVBOXWDDMDISP_SWAPCHAIN pSwapchain; 4652 hr = vboxWddmSwapchainCreateIfForRc(pDevice, pRc, &pSwapchain); 4653 Assert(hr == S_OK); 4715 bCreateSwapchain = true; 4716 Assert(bIssueCreateResource); 4654 4717 } 4655 4718 else … … 4825 4888 pAllocation->pvMem = (void*)pSurf->pSysMem; 4826 4889 pAllocation->SurfDesc = pAllocInfo->SurfDesc; 4890 } 4891 4892 if(bCreateSwapchain) 4893 { 4894 PVBOXWDDMDISP_SWAPCHAIN pSwapchain; 4895 hr = vboxWddmSwapchainCreateIfForRc(pDevice, pRc, &pSwapchain); 4896 Assert(hr == S_OK); 4827 4897 } 4828 4898 } -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h
r32444 r32496 139 139 IDirect3DSwapChain9 *pSwapChainIf; 140 140 HWND hWnd; 141 VBOXDISP_KMHANDLE hSwapchainKm; 141 142 VBOXWDDMDISP_RENDERTGT aRTs[VBOXWDDMDISP_MAX_SWAPCHAIN_SIZE]; 142 143 } VBOXWDDMDISP_SWAPCHAIN, *PVBOXWDDMDISP_SWAPCHAIN; -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispMp.cpp
r32425 r32496 139 139 VBOXWDDMDISP_CONTEXT *pContext = (VBOXWDDMDISP_CONTEXT*)pHdr->u64UmData; 140 140 PVBOXVIDEOCM_CMD_RECTS_INTERNAL pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)(((uint8_t*)pHdr) + sizeof (VBOXVIDEOCM_CMD_HDR)); 141 // UINT iScreen = pContext->pDevice->cScreens == 1 ? pContext->pDevice->iPrimaryScreen : pCmdInternal->VidPnSourceId; 142 // PVBOXWDDMDISP_SCREEN pScreen = &pContext->pDevice->aScreens[iScreen]; 143 // Assert(pScreen->hWnd); 144 // Assert(pScreen->pDevice9If); 145 // pRegions->hWnd = pScreen->hWnd; 146 PVBOXWDDMDISP_SWAPCHAIN pSwapchain = RTListNodeGetLast(&pContext->pDevice->SwapchainList, VBOXWDDMDISP_SWAPCHAIN, ListEntry); 141 PVBOXWDDMDISP_SWAPCHAIN pSwapchain = (PVBOXWDDMDISP_SWAPCHAIN)pCmdInternal->hSwapchainUm; 142 /* todo: synchronization */ 147 143 Assert(pSwapchain); 148 144 pRegions->hWnd = pSwapchain->hWnd;
Note:
See TracChangeset
for help on using the changeset viewer.