Changeset 51121 in vbox for trunk/src/VBox/Devices/Graphics
- Timestamp:
- Apr 23, 2014 11:39:21 AM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 93425
- Location:
- trunk/src/VBox/Devices/Graphics
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA.h
r51013 r51121 592 592 void VBVAReset (PVGASTATE pVGAState); 593 593 void VBVAPause (PVGASTATE pVGAState, bool fPause); 594 int VBVAGetScreenInfo(PVGASTATE pVGAState, unsigned uScreenId, struct VBVAINFOSCREEN *pScreen, void **ppvVram);595 594 596 595 bool VBVAIsEnabled(PVGASTATE pVGAState); … … 598 597 void VBVARaiseIrq (PVGASTATE pVGAState, uint32_t fFlags); 599 598 void VBVARaiseIrqNoWait(PVGASTATE pVGAState, uint32_t fFlags); 599 600 int VBVAInfoView(PVGASTATE pVGAState, VBVAINFOVIEW *pView); 601 int VBVAInfoScreen(PVGASTATE pVGAState, VBVAINFOSCREEN *pScreen); 600 602 601 603 /* @return host-guest flags that were set on reset -
trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
r51013 r51121 496 496 pVBVA->hostFlags.u32SupportedOrders = 0; 497 497 498 rc = pVGAState->pDrv->pfnVBVAEnable (pVGAState->pDrv, uScreenId, &pVBVA->hostFlags );498 rc = pVGAState->pDrv->pfnVBVAEnable (pVGAState->pDrv, uScreenId, &pVBVA->hostFlags, false); 499 499 } 500 500 else … … 1903 1903 } 1904 1904 1905 int VBVAInfoView(PVGASTATE pVGAState, VBVAINFOVIEW *pView) 1906 { 1907 LogFlowFunc(("VBVA_INFO_VIEW: index %d, offset 0x%x, size 0x%x, max screen size 0x%x\n", 1908 pView->u32ViewIndex, pView->u32ViewOffset, pView->u32ViewSize, pView->u32MaxScreenSize)); 1909 1910 PHGSMIINSTANCE pIns = pVGAState->pHGSMI; 1911 VBVACONTEXT *pCtx = (VBVACONTEXT *)HGSMIContext (pIns); 1912 1913 /* @todo verify view data. */ 1914 if (pView->u32ViewIndex >= pCtx->cViews) 1915 { 1916 Log(("View index too large %d!!!\n", 1917 pView->u32ViewIndex)); 1918 return VERR_INVALID_PARAMETER; 1919 } 1920 1921 pCtx->aViews[pView->u32ViewIndex].view = *pView; 1922 1923 return VINF_SUCCESS; 1924 } 1925 1926 int VBVAInfoScreen(PVGASTATE pVGAState, VBVAINFOSCREEN *pScreen) 1927 { 1928 PHGSMIINSTANCE pIns = pVGAState->pHGSMI; 1929 VBVACONTEXT *pCtx = (VBVACONTEXT *)HGSMIContext (pIns); 1930 VBVAINFOVIEW *pView = &pCtx->aViews[pScreen->u32ViewIndex].view; 1931 /* Calculate the offset of the end of the screen so we can make 1932 * sure it is inside the view. I assume that screen rollover is not 1933 * implemented. */ 1934 int64_t offEnd = (int64_t)pScreen->u32Height * pScreen->u32LineSize 1935 + pScreen->u32Width + pScreen->u32StartOffset; 1936 LogRel(("VBVA_INFO_SCREEN: [%d] @%d,%d %dx%d, line 0x%x, BPP %d, flags 0x%x\n", 1937 pScreen->u32ViewIndex, pScreen->i32OriginX, pScreen->i32OriginY, 1938 pScreen->u32Width, pScreen->u32Height, 1939 pScreen->u32LineSize, pScreen->u16BitsPerPixel, pScreen->u16Flags)); 1940 1941 if ( pScreen->u32ViewIndex < RT_ELEMENTS (pCtx->aViews) 1942 && pScreen->u16BitsPerPixel <= 32 1943 && pScreen->u32Width <= UINT16_MAX 1944 && pScreen->u32Height <= UINT16_MAX 1945 && pScreen->u32LineSize <= UINT16_MAX * 4 1946 && offEnd < pView->u32MaxScreenSize) 1947 { 1948 vbvaResize (pVGAState, &pCtx->aViews[pScreen->u32ViewIndex], pScreen); 1949 return VINF_SUCCESS; 1950 } 1951 1952 LogRelFlow(("VBVA_INFO_SCREEN [%lu]: bad data: %lux%lu, line 0x%lx, BPP %u, start offset %lu, max screen size %lu\n", 1953 (unsigned long)pScreen->u32ViewIndex, 1954 (unsigned long)pScreen->u32Width, 1955 (unsigned long)pScreen->u32Height, 1956 (unsigned long)pScreen->u32LineSize, 1957 (unsigned long)pScreen->u16BitsPerPixel, 1958 (unsigned long)pScreen->u32StartOffset, 1959 (unsigned long)pView->u32MaxScreenSize)); 1960 return VERR_INVALID_PARAMETER; 1961 } 1962 1905 1963 1906 1964 /* … … 2069 2127 pView++, cbBuffer -= sizeof (VBVAINFOVIEW)) 2070 2128 { 2071 LogFlowFunc(("VBVA_INFO_VIEW: index %d, offset 0x%x, size 0x%x, max screen size 0x%x\n", 2072 pView->u32ViewIndex, pView->u32ViewOffset, pView->u32ViewSize, pView->u32MaxScreenSize)); 2073 2074 /* @todo verify view data. */ 2075 if (pView->u32ViewIndex >= pCtx->cViews) 2076 { 2077 Log(("View index too large %d!!!\n", 2078 pView->u32ViewIndex)); 2079 rc = VERR_INVALID_PARAMETER; 2129 VBVAINFOVIEW View = *pView; 2130 rc = VBVAInfoView(pVGAState, &View); 2131 if (RT_FAILURE(rc)) 2080 2132 break; 2081 }2082 2083 pCtx->aViews[pView->u32ViewIndex].view = *pView;2084 2133 } 2085 2134 } break; … … 2124 2173 2125 2174 VBVAINFOSCREEN *pScreen = (VBVAINFOSCREEN *)pvBuffer; 2126 VBVAINFOVIEW *pView = &pCtx->aViews[pScreen->u32ViewIndex].view; 2127 /* Calculate the offset of the end of the screen so we can make 2128 * sure it is inside the view. I assume that screen rollover is not 2129 * implemented. */ 2130 int64_t offEnd = (int64_t)pScreen->u32Height * pScreen->u32LineSize 2131 + pScreen->u32Width + pScreen->u32StartOffset; 2132 LogRel(("VBVA_INFO_SCREEN: [%d] @%d,%d %dx%d, line 0x%x, BPP %d, flags 0x%x\n", 2133 pScreen->u32ViewIndex, pScreen->i32OriginX, pScreen->i32OriginY, 2134 pScreen->u32Width, pScreen->u32Height, 2135 pScreen->u32LineSize, pScreen->u16BitsPerPixel, pScreen->u16Flags)); 2136 2137 if ( pScreen->u32ViewIndex < RT_ELEMENTS (pCtx->aViews) 2138 && pScreen->u16BitsPerPixel <= 32 2139 && pScreen->u32Width <= UINT16_MAX 2140 && pScreen->u32Height <= UINT16_MAX 2141 && pScreen->u32LineSize <= UINT16_MAX * 4 2142 && offEnd < pView->u32MaxScreenSize) 2143 { 2144 vbvaResize (pVGAState, &pCtx->aViews[pScreen->u32ViewIndex], pScreen); 2145 } 2146 else 2147 { 2148 LogRelFlow(("VBVA_INFO_SCREEN [%lu]: bad data: %lux%lu, line 0x%lx, BPP %u, start offset %lu, max screen size %lu\n", 2149 (unsigned long)pScreen->u32ViewIndex, 2150 (unsigned long)pScreen->u32Width, 2151 (unsigned long)pScreen->u32Height, 2152 (unsigned long)pScreen->u32LineSize, 2153 (unsigned long)pScreen->u16BitsPerPixel, 2154 (unsigned long)pScreen->u32StartOffset, 2155 (unsigned long)pView->u32MaxScreenSize)); 2156 rc = VERR_INVALID_PARAMETER; 2157 } 2175 VBVAINFOSCREEN Screen = *pScreen; 2176 rc = VBVAInfoScreen(pVGAState, &Screen); 2158 2177 } break; 2159 2178 … … 2442 2461 pVGAState->pHGSMI = NULL; 2443 2462 } 2444 2445 int VBVAGetScreenInfo(PVGASTATE pVGAState, unsigned uScreenId, struct VBVAINFOSCREEN *pScreen, void **ppvVram)2446 {2447 PPDMDEVINS pDevIns = pVGAState->pDevInsR3;2448 PHGSMIINSTANCE pIns = pVGAState->pHGSMI;2449 VBVACONTEXT *pCtx = (VBVACONTEXT *)HGSMIContext (pIns);2450 int rc = PDMCritSectEnter(&pVGAState->CritSect, VERR_SEM_BUSY);2451 if (RT_SUCCESS(rc))2452 {2453 if (uScreenId < pCtx->cViews)2454 {2455 VBVAVIEW *pView = &pCtx->aViews[uScreenId];2456 if (pView->pVBVA)2457 {2458 uint8_t *pu8VRAM = pVGAState->vram_ptrR3 + pView->view.u32ViewOffset;2459 *pScreen = pView->screen;2460 *ppvVram = (void*)pu8VRAM;2461 rc = VINF_SUCCESS;2462 }2463 else2464 {2465 /* pretend disabled */2466 memset(pScreen, 0, sizeof (*pScreen));2467 pScreen->u16Flags = VBVA_SCREEN_F_DISABLED;2468 pScreen->u32ViewIndex = uScreenId;2469 *ppvVram = NULL;2470 rc = VINF_SUCCESS;2471 }2472 }2473 else2474 rc = VERR_INVALID_PARAMETER;2475 2476 PDMCritSectLeave(&pVGAState->CritSect);2477 }2478 return rc;2479 } -
trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
r51111 r51121 109 109 VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED, 110 110 VBVAEXHOSTCTL_TYPE_GHH_DISABLE, 111 VBVAEXHOSTCTL_TYPE_GH_MIN = VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE, 112 VBVAEXHOSTCTL_TYPE_GH_MAX = VBVAEXHOSTCTL_TYPE_GHH_DISABLE 111 VBVAEXHOSTCTL_TYPE_GHH_RESIZE 113 112 } VBVAEXHOSTCTL_TYPE; 114 113 … … 615 614 static int vboxVBVAExHSSaveGuestCtl(struct VBVAEXHOSTCONTEXT *pCmdVbva, VBVAEXHOSTCTL* pCtl, uint8_t* pu8VramBase, PSSMHANDLE pSSM) 616 615 { 617 if (VBVAEXHOSTCTL_TYPE_GH_MIN > pCtl->enmType || VBVAEXHOSTCTL_TYPE_GH_MAX < pCtl->enmType)618 {619 WARN(("unexpected command type!\n"));620 return VERR_INTERNAL_ERROR;621 }622 623 616 int rc = SSMR3PutU32(pSSM, pCtl->enmType); 624 617 AssertRCReturn(rc, rc); … … 681 674 if (!u32) 682 675 return VINF_EOF; 683 684 if (VBVAEXHOSTCTL_TYPE_GH_MIN > u32 || VBVAEXHOSTCTL_TYPE_GH_MAX < u32)685 {686 WARN(("unexpected command type!\n"));687 return VERR_INTERNAL_ERROR;688 }689 676 690 677 VBVAEXHOSTCTL* pHCtl = VBoxVBVAExHCtlCreate(pCmdVbva, (VBVAEXHOSTCTL_TYPE)u32); … … 1336 1323 } 1337 1324 case VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE: 1325 { 1338 1326 if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva)) 1339 1327 { … … 1342 1330 } 1343 1331 return pVdma->CrSrvInfo.pfnHostCtl(pVdma->CrSrvInfo.hSvr, pCmd->u.cmd.pu8Cmd, pCmd->u.cmd.cbCmd); 1332 } 1344 1333 case VBVAEXHOSTCTL_TYPE_GHH_DISABLE: 1345 1334 { … … 1383 1372 switch (enmType) 1384 1373 { 1385 case VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE: 1386 if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva)) 1387 { 1388 WARN(("VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE for disabled vdma VBVA\n")); 1389 return VERR_INVALID_STATE; 1390 } 1391 return pVdma->CrSrvInfo.pfnGuestCtl(pVdma->CrSrvInfo.hSvr, pCmd->u.cmd.pu8Cmd, pCmd->u.cmd.cbCmd); 1374 case VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE: 1375 { 1376 if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva)) 1377 { 1378 WARN(("VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE for disabled vdma VBVA\n")); 1379 return VERR_INVALID_STATE; 1380 } 1381 return pVdma->CrSrvInfo.pfnGuestCtl(pVdma->CrSrvInfo.hSvr, pCmd->u.cmd.pu8Cmd, pCmd->u.cmd.cbCmd); 1382 } 1383 case VBVAEXHOSTCTL_TYPE_GHH_RESIZE: 1384 { 1385 if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva)) 1386 { 1387 WARN(("VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE for disabled vdma VBVA\n")); 1388 return VERR_INVALID_STATE; 1389 } 1390 1391 uint32_t cbCmd = pCmd->u.cmd.cbCmd; 1392 1393 if (cbCmd % sizeof (VBOXCMDVBVA_RESIZE_ENTRY)) 1394 { 1395 WARN(("invalid buffer size\n")); 1396 return VERR_INVALID_PARAMETER; 1397 } 1398 1399 uint32_t cElements = cbCmd / sizeof (VBOXCMDVBVA_RESIZE_ENTRY); 1400 if (!cElements) 1401 { 1402 WARN(("invalid buffer size\n")); 1403 return VERR_INVALID_PARAMETER; 1404 } 1405 1406 VBOXCMDVBVA_RESIZE *pResize = (VBOXCMDVBVA_RESIZE*)pCmd->u.cmd.pu8Cmd; 1407 PVGASTATE pVGAState = pVdma->pVGAState; 1408 int rc = VINF_SUCCESS; 1409 1410 for (uint32_t i = 0; i < cElements; ++i) 1411 { 1412 VBOXCMDVBVA_RESIZE_ENTRY *pEntry = &pResize->aEntries[i]; 1413 VBVAINFOSCREEN Screen = pEntry->Screen; 1414 VBVAINFOVIEW View; 1415 uint32_t u32StartOffsetPreserve = 0; 1416 if (Screen.u32StartOffset == ~0UL) 1417 { 1418 if (Screen.u16Flags & VBVA_SCREEN_F_DISABLED) 1419 { 1420 u32StartOffsetPreserve = ~0UL; 1421 Screen.u32StartOffset = 0; 1422 } 1423 else 1424 { 1425 WARN(("invalid parameter\n")); 1426 rc = VERR_INVALID_PARAMETER; 1427 break; 1428 } 1429 } 1430 1431 1432 View.u32ViewIndex = Screen.u32ViewIndex; 1433 View.u32ViewOffset = 0; 1434 View.u32ViewSize = Screen.u32LineSize * Screen.u32Height + Screen.u32StartOffset; 1435 View.u32MaxScreenSize = View.u32ViewSize + Screen.u32Width + 1; /* <- make VBVAInfoScreen logic (offEnd < pView->u32MaxScreenSize) happy */ 1436 1437 int rc = VBVAInfoView(pVGAState, &View); 1438 if (RT_SUCCESS(rc)) 1439 { 1440 1441 rc = VBVAInfoScreen(pVGAState, &Screen); 1442 if (RT_SUCCESS(rc)) 1443 { 1444 if (u32StartOffsetPreserve) 1445 Screen.u32StartOffset = u32StartOffsetPreserve; 1446 1447 rc = pVdma->CrSrvInfo.pfnResize(pVdma->CrSrvInfo.hSvr, &Screen, u32StartOffsetPreserve ? NULL : pVGAState->vram_ptrR3 + Screen.u32StartOffset); 1448 if (RT_SUCCESS(rc)) 1449 continue; 1450 else 1451 { 1452 WARN(("pfnResize failed %d\n", rc)); 1453 break; 1454 } 1455 } 1456 else 1457 { 1458 WARN(("VBVAInfoScreen failed %d\n", rc)); 1459 break; 1460 } 1461 } 1462 else 1463 { 1464 WARN(("VBVAInfoView failed %d\n", rc)); 1465 break; 1466 } 1467 } 1468 return rc; 1469 } 1392 1470 case VBVAEXHOSTCTL_TYPE_GHH_ENABLE: 1393 1471 case VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED: … … 2645 2723 } 2646 2724 2647 static int vdmaVBVACtl OpaqueSubmit(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL_SOURCE enmSource, uint8_t* pu8Cmd, uint32_t cbCmd, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete)2648 { 2649 VBVAEXHOSTCTL* pHCtl = VBoxVBVAExHCtlCreate(&pVdma->CmdVbva, VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE);2725 static int vdmaVBVACtlGenericSubmit(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL_SOURCE enmSource, VBVAEXHOSTCTL_TYPE enmType, uint8_t* pu8Cmd, uint32_t cbCmd, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete) 2726 { 2727 VBVAEXHOSTCTL* pHCtl = VBoxVBVAExHCtlCreate(&pVdma->CmdVbva, enmType); 2650 2728 if (!pHCtl) 2651 2729 { … … 2666 2744 } 2667 2745 2668 static int vdmaVBVACtl OpaqueGuestSubmit(PVBOXVDMAHOST pVdma, VBOXCMDVBVA_CTL *pCtl, uint32_t cbCtl)2746 static int vdmaVBVACtlGenericGuestSubmit(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL_TYPE enmType, VBOXCMDVBVA_CTL *pCtl, uint32_t cbCtl) 2669 2747 { 2670 2748 Assert(cbCtl >= sizeof (VBOXCMDVBVA_CTL)); 2671 2749 VBoxSHGSMICommandMarkAsynchCompletion(pCtl); 2672 int rc = vdmaVBVACtl OpaqueSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_GUEST, (uint8_t*)(pCtl+1), cbCtl - sizeof (VBOXCMDVBVA_CTL), vboxCmdVBVACmdCtlGuestCompletion, pVdma);2750 int rc = vdmaVBVACtlGenericSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_GUEST, enmType, (uint8_t*)(pCtl+1), cbCtl - sizeof (VBOXCMDVBVA_CTL), vboxCmdVBVACmdCtlGuestCompletion, pVdma); 2673 2751 if (RT_SUCCESS(rc)) 2674 2752 return VINF_SUCCESS; 2675 2753 2676 WARN(("vdmaVBVACtl OpaqueSubmit failed %d\n", rc));2754 WARN(("vdmaVBVACtlGenericSubmit failed %d\n", rc)); 2677 2755 pCtl->i32Result = rc; 2678 2756 rc = VBoxSHGSMICommandComplete(pVdma->pHgsmi, pCtl); … … 2694 2772 { 2695 2773 pCmd->u.pfnInternal = (void(*)())pfnCompletion; 2696 int rc = vdmaVBVACtl OpaqueSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_HOST, (uint8_t*)pCmd, cbCmd, vboxCmdVBVACmdCtlHostCompletion, pvCompletion);2774 int rc = vdmaVBVACtlGenericSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_HOST, VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE, (uint8_t*)pCmd, cbCmd, vboxCmdVBVACmdCtlHostCompletion, pvCompletion); 2697 2775 if (RT_FAILURE(rc)) 2698 2776 { … … 2707 2785 return rc; 2708 2786 } 2709 WARN(("vdmaVBVACtl OpaqueSubmit failed %d\n", rc));2787 WARN(("vdmaVBVACtlGenericSubmit failed %d\n", rc)); 2710 2788 return rc; 2711 2789 } 2712 2790 2791 return VINF_SUCCESS; 2792 } 2793 2794 static DECLCALLBACK(int) vdmaVBVANotifyEnable(PVGASTATE pVGAState) 2795 { 2796 for (uint32_t i = 0; i < pVGAState->cMonitors; i++) 2797 { 2798 int rc = pVGAState->pDrv->pfnVBVAEnable (pVGAState->pDrv, i, NULL, true); 2799 if (!RT_SUCCESS(rc)) 2800 { 2801 WARN(("pfnVBVAEnable failed %d\n", rc)); 2802 for (uint32_t j = 0; j < i; j++) 2803 { 2804 pVGAState->pDrv->pfnVBVADisable (pVGAState->pDrv, j); 2805 } 2806 2807 return rc; 2808 } 2809 } 2810 return VINF_SUCCESS; 2811 } 2812 2813 static DECLCALLBACK(int) vdmaVBVANotifyDisable(PVGASTATE pVGAState) 2814 { 2815 for (uint32_t i = 0; i < pVGAState->cMonitors; i++) 2816 { 2817 pVGAState->pDrv->pfnVBVADisable (pVGAState->pDrv, i); 2818 } 2713 2819 return VINF_SUCCESS; 2714 2820 } … … 2722 2828 { 2723 2829 rc = vboxVDMACrGuestCtlProcess(pVdma, pHCtl); 2724 if (RT_FAILURE(rc)) 2830 /* rc == VINF_SUCCESS would mean the actual state change has occcured */ 2831 if (rc == VINF_SUCCESS) 2832 { 2833 /* we need to inform Main about VBVA enable/disable 2834 * main expects notifications to be done from the main thread 2835 * submit it there */ 2836 PVGASTATE pVGAState = pVdma->pVGAState; 2837 2838 if (VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva)) 2839 vdmaVBVANotifyEnable(pVGAState); 2840 else 2841 vdmaVBVANotifyDisable(pVGAState); 2842 } 2843 else if (RT_FAILURE(rc)) 2725 2844 WARN(("vboxVDMACrGuestCtlProcess failed %d\n", rc)); 2726 2845 } … … 2823 2942 } 2824 2943 2825 static DECLCALLBACK(int) vdmaVBVANotifyEnable(PVGASTATE pVGAState)2826 {2827 for (uint32_t i = 0; i < pVGAState->cMonitors; i++)2828 {2829 int rc = pVGAState->pDrv->pfnVBVAEnable (pVGAState->pDrv, i, NULL);2830 if (!RT_SUCCESS(rc))2831 {2832 WARN(("pfnVBVAEnable failed %d\n", rc));2833 for (uint32_t j = 0; j < i; j++)2834 {2835 pVGAState->pDrv->pfnVBVADisable (pVGAState->pDrv, j);2836 }2837 2838 return rc;2839 }2840 }2841 return VINF_SUCCESS;2842 }2843 2844 static DECLCALLBACK(int) vdmaVBVANotifyDisable(PVGASTATE pVGAState)2845 {2846 for (uint32_t i = 0; i < pVGAState->cMonitors; i++)2847 {2848 pVGAState->pDrv->pfnVBVADisable (pVGAState->pDrv, i);2849 }2850 return VINF_SUCCESS;2851 }2852 2853 static DECLCALLBACK(void) vboxCmdVBVACmdCtlGuestEnableDisableCompletion(VBVAEXHOSTCONTEXT *pVbva, struct VBVAEXHOSTCTL *pCtl, int rc, void *pvContext)2854 {2855 if (rc == VINF_SUCCESS)2856 {2857 /* we need to inform Main about VBVA enable/disable2858 * main expects notifications to be done from the main thread2859 * submit it there */2860 PVBOXVDMAHOST pVdma = RT_FROM_MEMBER(pVbva, VBOXVDMAHOST, CmdVbva);2861 PVGASTATE pVGAState = pVdma->pVGAState;2862 2863 if (VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))2864 VMR3ReqCallNoWait(PDMDevHlpGetVM(pVGAState->pDevInsR3), VMCPUID_ANY, (PFNRT)vdmaVBVANotifyEnable, 1, pVGAState);2865 else2866 VMR3ReqCallNoWait(PDMDevHlpGetVM(pVGAState->pDevInsR3), VMCPUID_ANY, (PFNRT)vdmaVBVANotifyDisable, 1, pVGAState);2867 }2868 2869 vboxCmdVBVACmdCtlGuestCompletion(pVbva, pCtl, rc, pvContext);2870 }2871 2872 2944 static int vdmaVBVACtlEnableDisableSubmitInternal(PVBOXVDMAHOST pVdma, VBVAENABLE *pEnable, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete) 2873 2945 { … … 2881 2953 { 2882 2954 VBoxSHGSMICommandMarkAsynchCompletion(&pEnable->Hdr); 2883 int rc = vdmaVBVACtlEnableDisableSubmitInternal(pVdma, &pEnable->Enable, vboxCmdVBVACmdCtlGuest EnableDisableCompletion, pVdma);2955 int rc = vdmaVBVACtlEnableDisableSubmitInternal(pVdma, &pEnable->Enable, vboxCmdVBVACmdCtlGuestCompletion, pVdma); 2884 2956 if (RT_SUCCESS(rc)) 2885 2957 return VINF_SUCCESS; … … 3045 3117 { 3046 3118 case VBOXCMDVBVACTL_TYPE_3DCTL: 3047 return vdmaVBVACtlOpaqueGuestSubmit(pVdma, pCtl, cbCtl); 3119 return vdmaVBVACtlGenericGuestSubmit(pVdma, VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE, pCtl, cbCtl); 3120 case VBOXCMDVBVACTL_TYPE_RESIZE: 3121 return vdmaVBVACtlGenericGuestSubmit(pVdma, VBVAEXHOSTCTL_TYPE_GHH_RESIZE, pCtl, cbCtl); 3048 3122 case VBOXCMDVBVACTL_TYPE_ENABLE: 3049 3123 if (cbCtl != sizeof (VBOXCMDVBVA_CTL_ENABLE)) … … 3215 3289 Assert(pVdma->CmdVbva.i32State == VBVAEXHOSTCONTEXT_ESTATE_PAUSED); 3216 3290 3217 vdmaVBVANotifyEnable(pVdma->pVGAState);3218 3219 3291 VBVAEXHOSTCTL HCtl; 3220 3292 HCtl.enmType = VBVAEXHOSTCTL_TYPE_HH_LOADSTATE;
Note:
See TracChangeset
for help on using the changeset viewer.