VBoxMPVidPn.cpp revision 70e6f03ca742e60292ae2d45811314790b16dab2
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VBox WDDM Miniport driver
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Copyright (C) 2011 Oracle Corporation
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic D3DDDIFORMAT vboxWddmCalcPixelFormat(const VIDEO_MODE_INFORMATION *pInfo)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if(!(pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && !(pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pInfo->RedMask == 0xFF0000 && pInfo->GreenMask == 0xFF00 && pInfo->BlueMask == 0xFF)
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync WARN(("unsupported format: bpp(%d), rmask(%d), gmask(%d), bmask(%d)",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->BitsPerPlane, pInfo->RedMask, pInfo->GreenMask, pInfo->BlueMask));
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if(!(pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && !(pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pInfo->RedMask == 0xFF0000 && pInfo->GreenMask == 0xFF00 && pInfo->BlueMask == 0xFF)
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync WARN(("unsupported format: bpp(%d), rmask(%d), gmask(%d), bmask(%d)",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->BitsPerPlane, pInfo->RedMask, pInfo->GreenMask, pInfo->BlueMask));
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if(!(pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && !(pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pInfo->RedMask == 0xF800 && pInfo->GreenMask == 0x7E0 && pInfo->BlueMask == 0x1F)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("unsupported format: bpp(%d), rmask(%d), gmask(%d), bmask(%d)",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->BitsPerPlane, pInfo->RedMask, pInfo->GreenMask, pInfo->BlueMask));
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
48d60b042893290a747d3abeda71a3085d9133fdvboxsync if((pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && (pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("unsupported bpp(%d)", pInfo->BitsPerPlane));
10eaaac806009b8336cc5d746fe5072f6c9f58c0vboxsyncstatic int vboxWddmResolutionFind(const D3DKMDT_2DREGION *pResolutions, int cResolutions, const D3DKMDT_2DREGION *pRes)
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync for (int i = 0; i < cResolutions; ++i)
6c83eb6b98d1dd1b1d9795c16801ee2f53d2cc31vboxsync const D3DKMDT_2DREGION *pResolution = &pResolutions[i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pResolution->cx == pRes->cx && pResolution->cy == pRes->cy)
86b620001857a05e9e7b83b11525094c34637e23vboxsyncstatic bool vboxWddmVideoModesMatch(const VIDEO_MODE_INFORMATION *pMode1, const VIDEO_MODE_INFORMATION *pMode2)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return pMode1->VisScreenHeight == pMode2->VisScreenHeight
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pMode1->VisScreenWidth == pMode2->VisScreenWidth
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic int vboxWddmVideoModeFind(const VIDEO_MODE_INFORMATION *pModes, int cModes, const VIDEO_MODE_INFORMATION *pM)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (int i = 0; i < cModes; ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnCheckSourceModeInfo(const D3DKMDT_HVIDPN hDesiredVidPn,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* we support both GRAPHICS and TEXT modes */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* any primary surface size actually
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cx != pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cy != pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOG(("VisibleRegionSize(%d, %d) != PrimSurfSize(%d, %d)",
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cx,
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cy,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx,
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.Stride
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.ColorBasis
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOG(("Warning: Unknown Src mode Type (%d)", pNewVidPnSourceModeInfo->Type));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnCheckSourceModeSet(const D3DKMDT_HVIDPN hDesiredVidPn,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo;
6565c2fb4f10f47bcb5436630d2dc35e5a4f28e2vboxsync NTSTATUS Status = pVidPnSourceModeSetInterface->pfnAcquireFirstModeInfo(hNewVidPnSourceModeSet, &pNewVidPnSourceModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnCheckSourceModeInfo(hDesiredVidPn, pNewVidPnSourceModeInfo, &bSupported);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNextVidPnSourceModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pVidPnSourceModeSetInterface->pfnAcquireNextModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo, &pNextVidPnSourceModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo = pNextVidPnSourceModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("pfnAcquireFirstModeInfo failed Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnPopulateVideoSignalInfo(D3DKMDT_VIDEO_SIGNAL_INFO *pVsi,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVsi->TotalSize.cx = pVsi->ActiveSize.cx + VBOXVDPN_C_DISPLAY_HBLANK_SIZE;
38b70b2dcb1783801f7580cba797a0c8af4b5326vboxsync pVsi->TotalSize.cy = pVsi->ActiveSize.cy + VBOXVDPN_C_DISPLAY_VBLANK_SIZE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVsi->PixelRate = pVsi->TotalSize.cx * pVsi->TotalSize.cy * VSync;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVsi->HSyncFreq.Numerator = (UINT)((pVsi->PixelRate / pVsi->TotalSize.cy) * 1000);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncBOOLEAN vboxVidPnMatchVideoSignal(const D3DKMDT_VIDEO_SIGNAL_INFO *pVsi1, const D3DKMDT_VIDEO_SIGNAL_INFO *pVsi2)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->VSyncFreq.Numerator != pVsi2->VSyncFreq.Numerator)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->VSyncFreq.Denominator != pVsi2->VSyncFreq.Denominator)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->HSyncFreq.Numerator != pVsi2->HSyncFreq.Numerator)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->HSyncFreq.Denominator != pVsi2->HSyncFreq.Denominator)
17c6e5e8177d068d1bc6af875d1610718efcfdb4vboxsync if (pVsi1->ScanLineOrdering != pVsi2->ScanLineOrdering)
fa92c704624def98d3c4aca86d65182effb98e04vboxsyncNTSTATUS vboxVidPnCheckTargetModeInfo(const D3DKMDT_HVIDPN hDesiredVidPn,
fa92c704624def98d3c4aca86d65182effb98e04vboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CmpRes.cx = pNewVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cx;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CmpRes.cy = pNewVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cy;
17c6e5e8177d068d1bc6af875d1610718efcfdb4vboxsync NTSTATUS Status = vboxVidPnPopulateVideoSignalInfo(&CmpVsi,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnTargetModeInfo->VideoSignalInfo.VSyncFreq.Numerator/pNewVidPnTargetModeInfo->VideoSignalInfo.VSyncFreq.Denominator);
fa92c704624def98d3c4aca86d65182effb98e04vboxsync LOGREL(("vboxVidPnPopulateVideoSignalInfo error Status (0x%x)", Status));
17c6e5e8177d068d1bc6af875d1610718efcfdb4vboxsync if (!vboxVidPnMatchVideoSignal(&CmpVsi, &pNewVidPnTargetModeInfo->VideoSignalInfo))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnCheckTargetModeSet(const D3DKMDT_HVIDPN hDesiredVidPn,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pVidPnTargetModeSetInterface->pfnAcquireFirstModeInfo(hNewVidPnTargetModeSet, &pNewVidPnTargetModeInfo);
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync Status = vboxVidPnCheckTargetModeInfo(hDesiredVidPn, pNewVidPnTargetModeInfo, &bSupported);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNextVidPnTargetModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pVidPnTargetModeSetInterface->pfnAcquireNextModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo, &pNextVidPnTargetModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVidPnTargetModeSetInterface->pfnReleaseModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnTargetModeInfo = pNextVidPnTargetModeInfo;
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x)", Status));
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync pVidPnTargetModeSetInterface->pfnReleaseModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync LOGREL(("pfnAcquireFirstModeInfo failed Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnPopulateSourceModeInfoFromLegacy(D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo,
ada08ea58e7613c10d4c40669fd4fb955324bfdfvboxsync /* this is a graphics mode */
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync pNewVidPnSourceModeInfo->Type = D3DKMDT_RMT_GRAPHICS;
ada08ea58e7613c10d4c40669fd4fb955324bfdfvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx = pMode->VisScreenWidth;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy = pMode->VisScreenHeight;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize = pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize;
5cd35366dd244ca8c8c583904fc6ff2a0c60fa0fvboxsync pNewVidPnSourceModeInfo->Format.Graphics.Stride = pMode->ScreenStride;
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat = vboxWddmCalcPixelFormat(pMode);
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync Assert(pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat != D3DDDIFMT_UNKNOWN);
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync if (pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat != D3DDDIFMT_UNKNOWN)
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync pNewVidPnSourceModeInfo->Format.Graphics.ColorBasis = D3DKMDT_CB_SRGB;
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync if (pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat == D3DDDIFMT_P8)
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode = D3DKMDT_PVAM_SETTABLEPALETTE;
43d3e60a2bcef646da0887a845e67c3a47759158vboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode = D3DKMDT_PVAM_DIRECT;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync /* @todo: XPDM driver does not seem to return text modes, should we? */
5cd35366dd244ca8c8c583904fc6ff2a0c60fa0fvboxsyncNTSTATUS vboxVidPnPopulateMonitorSourceModeInfoFromLegacy(PVBOXMP_DEVEXT pDevExt,
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync NTSTATUS Status = vboxVidPnPopulateVideoSignalInfo(&pMonitorSourceMode->VideoSignalInfo, pResolution, 60 /* ULONG VSync */);
da2ac963e5567d049d02bad0ad7783a0b9181637vboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.FirstChannel = 8;
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.SecondChannel = 8;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.ThirdChannel = 8;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.FourthChannel = 0;
f20f327b65009074292a4b9ad44a02b6bfb2de8avboxsync pMonitorSourceMode->Preference = bPreferred ? D3DKMDT_MP_PREFERRED : D3DKMDT_MP_NOTPREFERRED;
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncNTSTATUS vboxVidPnCreatePopulateMonitorSourceModeInfoFromLegacy(PVBOXMP_DEVEXT pDevExt,
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pMonitorSMSIf->pfnCreateNewModeInfo(hMonitorSMS, &pMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnPopulateMonitorSourceModeInfoFromLegacy(pDevExt,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pMonitorSMSIf->pfnAddMode(hMonitorSMS, pMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(Status == STATUS_SUCCESS/* || Status == STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET*/);
1f67f03c498fb10dfaa104a3698a1e149b7e9eb5vboxsync LOGREL(("pfnAddMode failed, Status(0x%x)", Status));
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync LOGREL(("vboxVidPnPopulateMonitorSourceModeInfoFromLegacy failed, Status(0x%x)", Status));
e17f587595bd5d3a7be56a892e3fd3a0ef83d268vboxsync /* we're here because of a failure */
10eaaac806009b8336cc5d746fe5072f6c9f58c0vboxsync NTSTATUS tmpStatus = pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pMonitorSMI);
1f67f03c498fb10dfaa104a3698a1e149b7e9eb5vboxsync LOGREL(("pfnReleaseModeInfo failed tmpStatus(0x%x)", tmpStatus));
1f67f03c498fb10dfaa104a3698a1e149b7e9eb5vboxsync if (Status == STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET)
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsync } while (0);
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsync LOGREL(("pfnCreateNewModeInfo failed, Status(0x%x)", Status));
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsyncNTSTATUS vboxVidPnPopulateTargetModeInfoFromLegacy(D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo, D3DKMDT_2DREGION *pResolution, BOOLEAN fPreferred)
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsync pNewVidPnTargetModeInfo->Preference = fPreferred ? D3DKMDT_MP_PREFERRED : D3DKMDT_MP_NOTPREFERRED;
1f67f03c498fb10dfaa104a3698a1e149b7e9eb5vboxsync return vboxVidPnPopulateVideoSignalInfo(&pNewVidPnTargetModeInfo->VideoSignalInfo, pResolution, 60 /* ULONG VSync */);
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync} VBOXVIDPNCHECKADDMONITORMODES, *PVBOXVIDPNCHECKADDMONITORMODES;
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsyncstatic DECLCALLBACK(BOOLEAN) vboxVidPnCheckAddMonitorModesEnum(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS, CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf,
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync CONST D3DKMDT_MONITOR_SOURCE_MODE *pMonitorSMI, PVOID pContext)
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync PVBOXVIDPNCHECKADDMONITORMODES pData = (PVBOXVIDPNCHECKADDMONITORMODES)pContext;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnPopulateTargetModeInfoFromLegacy(&dummyMode, &pData->pResolutions[i], FALSE /* preference does not matter for now */);
10eaaac806009b8336cc5d746fe5072f6c9f58c0vboxsync if (vboxVidPnMatchVideoSignal(&dummyMode.VideoSignalInfo, &pMonitorSMI->VideoSignalInfo))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* mark it as unneeded */
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync LOGREL(("vboxVidPnPopulateTargetModeInfoFromLegacy failed Status(0x%x)", Status));
f20f327b65009074292a4b9ad44a02b6bfb2de8avboxsync pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pMonitorSMI);
c50100d1513854735d4e3593b3b385c007f6d8b6vboxsync} VBOXVIDPNCHECKMONMODESENUM, *PVBOXVIDPNCHECKMONMODESENUM;
b0d29fd0a868929a608ff72658aac997cc95319avboxsyncstatic DECLCALLBACK(BOOLEAN) vboxFidPnCheckMonitorModesEnum(D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS, CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf,
b0d29fd0a868929a608ff72658aac997cc95319avboxsync CONST D3DKMDT_MONITOR_SOURCE_MODE *pMonitorSMI, PVOID pContext)
b0d29fd0a868929a608ff72658aac997cc95319avboxsync PVBOXVIDPNCHECKMONMODESENUM pInfo = (PVBOXVIDPNCHECKMONMODESENUM)pContext;
b0d29fd0a868929a608ff72658aac997cc95319avboxsync if (pMonitorSMI->VideoSignalInfo.ActiveSize.cx == pInfo->Region.cx
b0d29fd0a868929a608ff72658aac997cc95319avboxsync && pMonitorSMI->VideoSignalInfo.ActiveSize.cy == pInfo->Region.cy)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pInfo->pMonitorSMI);
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync} VBOXVIDPNMATCHMONMODESENUM, *PVBOXVIDPNMATCHMONMODESENUM;
6565c2fb4f10f47bcb5436630d2dc35e5a4f28e2vboxsyncstatic DECLCALLBACK(BOOLEAN) vboxFidPnMatchMonitorModesEnum(D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS, CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf,
6c83eb6b98d1dd1b1d9795c16801ee2f53d2cc31vboxsync CONST D3DKMDT_MONITOR_SOURCE_MODE *pMonitorSMI, PVOID pContext)
6565c2fb4f10f47bcb5436630d2dc35e5a4f28e2vboxsync PVBOXVIDPNMATCHMONMODESENUM pInfo = (PVBOXVIDPNMATCHMONMODESENUM)pContext;
2da513a7caa29822c9991d7e8615658a194c0cf8vboxsync D3DKMDT_2DREGION *pResolution = &pInfo->paResolutions[i];
2da513a7caa29822c9991d7e8615658a194c0cf8vboxsync if (pMonitorSMI->VideoSignalInfo.ActiveSize.cx != pResolution->cx
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || pMonitorSMI->VideoSignalInfo.ActiveSize.cy != pResolution->cy)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* matches the monitor mode set for the given target id with the resolution set, and sets the pfMatch to true if they match, otherwise sets it to false */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnMatchMonitorModes(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_TARGET_ID targetId,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_2DREGION *pResolutions, uint32_t cResolutions, BOOLEAN *pfMatch)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbQueryMonitorInterface(pDevExt->u.primary.DxgkInterface.DeviceHandle, DXGK_MONITOR_INTERFACE_VERSION_V1, &pMonitorInterface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("DxgkCbQueryMonitorInterface failed, Status (0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf;
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync Status = pMonitorInterface->pfnAcquireMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("pfnAcquireMonitorSourceModeSet failed, Status (0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_GRAPHICS_MONITOR_NOT_CONNECTED)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* this is ok in case we replug the monitor to pick up the monitor modes properly,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * so pretend success */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnEnumMonitorSourceModes(hMonitorSMS, pMonitorSMSIf, vboxFidPnMatchMonitorModesEnum, &Info);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS tmpStatus = pMonitorInterface->pfnReleaseMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle, hMonitorSMS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("pfnReleaseMonitorSourceModeSet failed tmpStatus(0x%x)", tmpStatus));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnCheckAddMonitorModes(PVBOXMP_DEVEXT pDevExt,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DDDI_VIDEO_PRESENT_TARGET_ID targetId, D3DKMDT_MONITOR_CAPABILITIES_ORIGIN enmOrigin,
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync D3DKMDT_2DREGION *pResolutions, uint32_t cResolutions, int iPreferred)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pDevExt->u.primary.DxgkInterface.DxgkCbQueryMonitorInterface(pDevExt->u.primary.DxgkInterface.DeviceHandle, DXGK_MONITOR_INTERFACE_VERSION_V1, &pMonitorInterface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("DxgkCbQueryMonitorInterface failed, Status()0x%x", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pMonitorInterface->pfnAcquireMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("DxgkCbQueryMonitorInterface failed, Status()0x%x", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_GRAPHICS_MONITOR_NOT_CONNECTED)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* this is ok in case we replug the monitor to pick up the monitor modes properly,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * so pretend success */
38b70b2dcb1783801f7580cba797a0c8af4b5326vboxsync Status = vboxVidPnCreatePopulateMonitorSourceModeInfoFromLegacy(pDevExt,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("vboxVidPnCreatePopulateMonitorSourceModeInfoFromLegacy failed Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS tmpStatus = pMonitorInterface->pfnReleaseMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle, hMonitorSMS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("pfnReleaseMonitorSourceModeSet failed tmpStatus(0x%x)", tmpStatus));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnPathAdd(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, const D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pVidPnInterface->pfnGetTopology(hVidPn, &hVidPnTopology, &pVidPnTopologyInterface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pVidPnTopologyInterface->pfnCreateNewPathInfo(hVidPnTopology, &pNewVidPnPresentPathInfo);
pNewVidPnPresentPathInfo->VidPnTargetColorBasis = D3DKMDT_CB_SRGB; /* @todo: how does it matters? */
memset(&pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport, 0, sizeof (pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport));
AssertFailed();
NTSTATUS tmpStatus = pVidPnTopologyInterface->pfnReleasePathInfo(hVidPnTopology, pNewVidPnPresentPathInfo);
return Status;
static NTSTATUS vboxVidPnCreatePopulateSourceModeInfoFromLegacy(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
if (pModeIdToPin)
AssertFailed();
return Status;
Status = pNewVidPnSourceModeSetInterface->pfnCreateNewModeInfo(hNewVidPnSourceModeSet, &pNewVidPnSourceModeInfo);
AssertFailed();
if (i == iModeToPin)
Status = pNewVidPnSourceModeSetInterface->pfnAddMode(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
AssertFailed();
AssertFailed();
NTSTATUS tmpStatus = pNewVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
AssertFailed();
return Status;
if (pModeIdToPin)
if (fDoPin)
AssertFailed();
return Status;
AssertFailed();
return Status;
return Status;
static NTSTATUS vboxVidPnCreatePopulateTargetModeInfoFromLegacy(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
if (pModeIdToPin)
AssertFailed();
return Status;
Status = pNewVidPnTargetModeSetInterface->pfnCreateNewModeInfo(hNewVidPnTargetModeSet, &pNewVidPnTargetModeInfo);
AssertFailed();
Status = vboxVidPnPopulateTargetModeInfoFromLegacy(pNewVidPnTargetModeInfo, pResolution, fIsPinMode && fSetPreferred);
if (fIsPinMode)
Status = pNewVidPnTargetModeSetInterface->pfnAddMode(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
AssertFailed();
AssertFailed();
NTSTATUS tmpStatus = pNewVidPnTargetModeSetInterface->pfnReleaseModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
AssertFailed();
return Status;
if (pModeIdToPin)
if (fDoPin)
AssertFailed();
return Status;
AssertFailed();
return Status;
return Status;
NTSTATUS vboxVidPnCreatePopulateVidPnPathFromLegacy(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
const D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, const D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
AssertFailed();
return Status;
Status = vboxVidPnCreatePopulateTargetModeInfoFromLegacy(hVidPn, pVidPnInterface, VidPnTargetId, pResolutions, cResolutions, pModeToPin, NULL, TRUE, TRUE);
AssertFailed();
return Status;
Status = vboxVidPnCreatePopulateSourceModeInfoFromLegacy(hVidPn, pVidPnInterface, VidPnSourceId, pModes, cModes, iModeToPin, NULL, TRUE);
AssertFailed();
return Status;
return Status;
typedef struct VBOXVIDPNPOPRESOLUTIONENUM
int cResolutions;
int cResultResolutions;
static DECLCALLBACK(BOOLEAN) vboxVidPnPopulateResolutionsFromSourceModeSetEnum(D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
if (vboxWddmResolutionFind(pInfo->pResolutions, pInfo->cResultResolutions, &pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize) < 0)
pInfo->pResolutions[pInfo->cResultResolutions] = pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize;
static DECLCALLBACK(BOOLEAN) vboxVidPnPopulateResolutionsFromTargetModeSetEnum(D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
if (vboxWddmResolutionFind(pInfo->pResolutions, pInfo->cResultResolutions, &pNewVidPnTargetModeInfo->VideoSignalInfo.ActiveSize) < 0)
pInfo->pResolutions[pInfo->cResultResolutions] = pNewVidPnTargetModeInfo->VideoSignalInfo.ActiveSize;
typedef struct VBOXVIDPNPOPMODEENUM
int cModes;
int cResultModes;
static DECLCALLBACK(BOOLEAN) vboxVidPnPopulateModesFromSourceModeSetEnum(D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
Assert(0);
typedef struct VBOXVIDPNPOPMODETARGETENUM
int cSuperset;
static DECLCALLBACK(BOOLEAN) vboxVidPnPopulateModesFromTargetModeSetEnum(D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
Status = VBoxWddmGetModesForResolution(pInfo->pSuperset, pInfo->cSuperset, -1, &pNewVidPnTargetModeInfo->VideoSignalInfo.ActiveSize,
pInfo->Base.pModes + pInfo->Base.cResultModes, pInfo->Base.cModes - pInfo->Base.cResultModes, &cResult, NULL);
static D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE vboxVidPnCofuncModalityCurrentPathPivot(CONST DXGKARG_ENUMVIDPNCOFUNCMODALITY* pEnumCofuncModalityArg,
case D3DKMDT_EPT_VIDPNSOURCE:
return D3DKMDT_EPT_VIDPNSOURCE;
#ifdef DEBUG_misha
AssertFailed();
return D3DKMDT_EPT_VIDPNSOURCE;
return D3DKMDT_EPT_NOPIVOT;
case D3DKMDT_EPT_VIDPNTARGET:
return D3DKMDT_EPT_VIDPNTARGET;
#ifdef DEBUG_misha
AssertFailed();
return D3DKMDT_EPT_VIDPNTARGET;
return D3DKMDT_EPT_NOPIVOT;
case D3DKMDT_EPT_SCALING:
case D3DKMDT_EPT_ROTATION:
case D3DKMDT_EPT_NOPIVOT:
return D3DKMDT_EPT_NOPIVOT;
AssertFailed();
return D3DKMDT_EPT_NOPIVOT;
NTSTATUS vboxVidPnHasPinnedTargetMode(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
AssertFailed();
return Status;
Status = pCurVidPnTargetModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnTargetModeSet, &pPinnedVidPnTargetModeInfo);
AssertFailed();
NTSTATUS tmpStatus = pCurVidPnTargetModeSetInterface->pfnReleaseModeInfo(hCurVidPnTargetModeSet, pPinnedVidPnTargetModeInfo);
return Status;
NTSTATUS vboxVidPnHasPinnedSourceMode(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
AssertFailed();
return Status;
Status = pCurVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
AssertFailed();
NTSTATUS tmpStatus = pCurVidPnSourceModeSetInterface->pfnReleaseModeInfo(hCurVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
return Status;
if (VidPnSourceId != VidPnTargetId || pCbContext->apPathInfos[VidPnTargetId].enmState != VBOXVIDPNPATHITEM_STATE_PRESENT)
return STATUS_SUCCESS;
AssertFailed();
return Status;
Status = pCurVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
AssertFailed();
if (VidPnSourceId == VidPnTargetId && pCbContext->apPathInfos[VidPnTargetId].enmState == VBOXVIDPNPATHITEM_STATE_PRESENT)
Status = pNewVidPnTargetModeSetInterface->pfnCreateNewModeInfo(hNewVidPnTargetModeSet, &pNewVidPnTargetModeInfo);
Status = vboxVidPnPopulateTargetModeInfoFromLegacy(pNewVidPnTargetModeInfo, pResolution, i == pInfo->iPreferredResolution);
Status = pNewVidPnTargetModeSetInterface->pfnAddMode(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
NTSTATUS tmpStatus = pNewVidPnTargetModeSetInterface->pfnReleaseModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
AssertFailed();
AssertFailed();
NTSTATUS tmpStatus = pCurVidPnSourceModeSetInterface->pfnReleaseModeInfo(hCurVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
return Status;
if (VidPnSourceId != VidPnTargetId || pCbContext->apPathInfos[VidPnSourceId].enmState != VBOXVIDPNPATHITEM_STATE_PRESENT)
return STATUS_SUCCESS;
AssertFailed();
return Status;
Status = pCurVidPnTargetModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnTargetModeSet, &pPinnedVidPnTargetModeInfo);
AssertFailed();
if (VidPnSourceId == VidPnTargetId && pCbContext->apPathInfos[VidPnSourceId].enmState == VBOXVIDPNPATHITEM_STATE_PRESENT)
Status = pNewVidPnSourceModeSetInterface->pfnCreateNewModeInfo(hNewVidPnSourceModeSet, &pNewVidPnSourceModeInfo);
Status = pNewVidPnSourceModeSetInterface->pfnAddMode(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
NTSTATUS tmpStatus = pNewVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
AssertFailed();
AssertFailed();
NTSTATUS tmpStatus = pCurVidPnTargetModeSetInterface->pfnReleaseModeInfo(hCurVidPnTargetModeSet, pPinnedVidPnTargetModeInfo);
return Status;
D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE enmPivot = vboxVidPnCofuncModalityCurrentPathPivot(pCbContext->pEnumCofuncModalityArg, VidPnSourceId, VidPnTargetId);
AssertFailed();
return Status;
if (fNeedUpdate)
AssertFailed();
return Status;
if (fNeedUpdate)
return Status;
DECLCALLBACK(BOOLEAN) vboxVidPnCofuncModalityPathEnum(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
bool bUpdatePath = false;
bUpdatePath = true;
bUpdatePath = true;
if (bUpdatePath)
Status = vboxVidPnCofuncModalityForPath(pCbContext, pNewVidPnPresentPathInfo->VidPnSourceId, pNewVidPnPresentPathInfo->VidPnTargetId);
LOG(("unsupported source(%d)->target(%d) pair", pNewVidPnPresentPathInfo->VidPnSourceId, pNewVidPnPresentPathInfo->VidPnTargetId));
return FALSE;
return FALSE;
return FALSE;
return FALSE;
return FALSE;
return FALSE;
return FALSE;
return FALSE;
WARN(("Non-zero FourthChannel (%d)", pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.FourthChannel));
return FALSE;
WARN(("Copy protection not supported CopyProtectionType(%d)", pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionType));
return FALSE;
WARN(("Copy protection not supported APSTriggerBits(%d)", pNewVidPnPresentPathInfo->CopyProtection.APSTriggerBits));
return FALSE;
if (memcmp(&tstCPSupport, &pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport, sizeof(tstCPSupport)))
WARN(("Copy protection support (0x%x)", *((UINT*)&pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport)));
return FALSE;
return FALSE;
WARN(("Warning: non-zero GammaRamp.DataSize (%d), treating as supported", pNewVidPnPresentPathInfo->GammaRamp.DataSize));
return TRUE;
typedef struct VBOXVIDPNGETPATHSINFO
static DECLCALLBACK(BOOLEAN) vboxVidPnCheckTopologyEnum(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
if (fDisabledFound)
AssertFailed();
AssertFailed();
AssertFailed();
NTSTATUS vboxVidPnCheckTopology(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
UINT i;
for (i = 0; i < cItems; ++i)
NTSTATUS Status = vboxVidPnEnumPaths(hVidPnTopology, pVidPnTopologyInterface, vboxVidPnCheckTopologyEnum, &CbContext);
return Status;
return Status;
if (pfDisabledFound)
if (!fBreakOnDisabled)
for (i = 0; i < cItems; ++i)
return Status;
NTSTATUS vboxVidPnEnumMonitorSourceModes(D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS, CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf,
LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x), ignored since callback returned false", Status));
return Status;
NTSTATUS vboxVidPnEnumSourceModes(D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
NTSTATUS Status = pVidPnSourceModeSetInterface->pfnAcquireFirstModeInfo(hNewVidPnSourceModeSet, &pNewVidPnSourceModeInfo);
Status = pVidPnSourceModeSetInterface->pfnAcquireNextModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo, &pNextVidPnSourceModeInfo);
LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x), ignored since callback returned false", Status));
return Status;
NTSTATUS vboxVidPnEnumTargetModes(D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
NTSTATUS Status = pVidPnTargetModeSetInterface->pfnAcquireFirstModeInfo(hNewVidPnTargetModeSet, &pNewVidPnTargetModeInfo);
Status = pVidPnTargetModeSetInterface->pfnAcquireNextModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo, &pNextVidPnTargetModeInfo);
LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x), ignored since callback returned false", Status));
return Status;
NTSTATUS vboxVidPnEnumTargetsForSource(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
NTSTATUS Status = pVidPnTopologyInterface->pfnGetNumPathsFromSource(hVidPnTopology, VidPnSourceId, &cTgtPaths);
Status = pVidPnTopologyInterface->pfnEnumPathTargetsFromSource(hVidPnTopology, VidPnSourceId, i, &VidPnTargetId);
if (!pfnCallback(pDevExt, hVidPnTopology, pVidPnTopologyInterface, VidPnSourceId, VidPnTargetId, cTgtPaths, pContext))
return Status;
NTSTATUS vboxVidPnEnumPaths(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
NTSTATUS Status = pVidPnTopologyInterface->pfnAcquireFirstPathInfo(hVidPnTopology, &pNewVidPnPresentPathInfo);
Status = pVidPnTopologyInterface->pfnAcquireNextPathInfo(hVidPnTopology, pNewVidPnPresentPathInfo, &pNextVidPnPresentPathInfo);
LOGREL(("pfnAcquireNextPathInfo Failed Status(0x%x), ignored since callback returned false", Status));
return Status;
NTSTATUS vboxVidPnSetupSourceInfo(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, PVBOXWDDM_SOURCE pSource, CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, PVBOXWDDM_ALLOCATION pAllocation)
if (pVidPnSourceModeInfo)
pSource->AllocData.SurfDesc.bpp = vboxWddmCalcBitsPerPixel(pVidPnSourceModeInfo->Format.Graphics.PixelFormat);
pSource->AllocData.SurfDesc.cbSize = pVidPnSourceModeInfo->Format.Graphics.Stride * pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy;
#ifdef VBOX_WDDM_WIN8
if (g_VBoxDisplayOnly)
return STATUS_SUCCESS;
NTSTATUS vboxVidPnCommitSourceMode(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, PVBOXWDDM_ALLOCATION pAllocation)
return STATUS_INVALID_PARAMETER;
typedef struct VBOXVIDPNCOMMITTARGETMODE
DECLCALLBACK(BOOLEAN) vboxVidPnCommitTargetModeEnum(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
CONST D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId, SIZE_T cTgtPaths, PVOID pContext)
NTSTATUS Status = pInfo->pVidPnInterface->pfnAcquireTargetModeSet(pInfo->hVidPn, VidPnTargetId, &hVidPnTargetModeSet, &pVidPnTargetModeSetInterface);
Status = pVidPnTargetModeSetInterface->pfnAcquirePinnedModeInfo(hVidPnTargetModeSet, &pPinnedVidPnTargetModeInfo);
NTSTATUS vboxVidPnCommitSourceModeForSrcId(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, PVBOXWDDM_ALLOCATION pAllocation)
#ifdef DEBUG_misha
if (pAllocation)
Status = pCurVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
pCurVidPnSourceModeSetInterface->pfnReleaseModeInfo(hCurVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
return Status;
DECLCALLBACK(BOOLEAN) vboxVidPnCommitPathEnum(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
Status = vboxVidPnCommitSourceModeForSrcId(pDevExt, hDesiredVidPn, pVidPnInterface, pVidPnPresentPathInfo->VidPnSourceId, (PVBOXWDDM_ALLOCATION)pCommitInfo->pCommitVidPnArg->hPrimaryAllocation);
#define VBOXVIDPNDUMP_STRCASE_UNKNOWN() \
switch (ImportanceOrdinal)
switch (Scaling)
switch (Rotation)
switch (ColorBasis)
switch (PixelValueAccessMode)
switch (Content)
const char* vboxVidPnDumpStrCopyProtectionType(D3DKMDT_VIDPN_PRESENT_PATH_COPYPROTECTION_TYPE CopyProtectionType)
switch (CopyProtectionType)
switch (Type)
switch (Type)
const char* vboxVidPnDumpStrScanLineOrdering(D3DDDI_VIDEO_SIGNAL_SCANLINE_ORDERING ScanLineOrdering)
switch (ScanLineOrdering)
switch (EnumPivotType)
switch (Preference)
switch (VideoStandard)
switch (PixelFormat)
void vboxVidPnDumpCopyProtectoin(const char *pPrefix, const D3DKMDT_VIDPN_PRESENT_PATH_COPYPROTECTION *pCopyProtection, const char *pSuffix)
void vboxVidPnDumpPathTransformation(const D3DKMDT_VIDPN_PRESENT_PATH_TRANSFORMATION *pContentTransformation)
LOGREL_EXACT((" --Transformation: Scaling(%s), ScalingSupport(%d), Rotation(%s), RotationSupport(%d)--",
vboxVidPnDumpStrRotation(pContentTransformation->Rotation), pContentTransformation->RotationSupport));
void vboxVidPnDumpRational(const char *pPrefix, const D3DDDI_RATIONAL *pRational, const char *pSuffix)
LOGREL_EXACT(("%s%d/%d=%d%s", pPrefix, pRational->Numerator, pRational->Denominator, pRational->Numerator/pRational->Denominator, pSuffix));
void vboxVidPnDumpRanges(const char *pPrefix, const D3DKMDT_COLOR_COEFF_DYNAMIC_RANGES *pDynamicRanges, const char *pSuffix)
LOGREL_EXACT(("%sFirstChannel(%d), SecondChannel(%d), ThirdChannel(%d), FourthChannel(%d)%s", pPrefix,
pSuffix));
void vboxVidPnDumpGammaRamp(const char *pPrefix, const D3DKMDT_GAMMA_RAMP *pGammaRamp, const char *pSuffix)
pSuffix));
void vboxVidPnDumpSourceMode(const char *pPrefix, const D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, const char *pSuffix)
LOGREL_EXACT(("%sType(%s), ", pPrefix, vboxVidPnDumpStrSourceModeType(pVidPnSourceModeInfo->Type)));
LOGREL_EXACT(("format(%s), ", vboxVidPnDumpStrPixFormat(pVidPnSourceModeInfo->Format.Graphics.PixelFormat)));
LOGREL_EXACT(("clrBasis(%s), ", vboxVidPnDumpStrColorBasis(pVidPnSourceModeInfo->Format.Graphics.ColorBasis)));
LOGREL_EXACT(("pvam(%s)%s", vboxVidPnDumpStrPvam(pVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode), pSuffix));
void vboxVidPnDumpSignalInfo(const char *pPrefix, const D3DKMDT_VIDEO_SIGNAL_INFO *pVideoSignalInfo, const char *pSuffix)
LOGREL_EXACT(("%sVStd(%s), ", pPrefix, vboxVidPnDumpStrSignalStandard(pVideoSignalInfo->VideoStandard)));
LOGREL_EXACT(("PixelRate(%d), ScanLineOrdering(%s)%s", pVideoSignalInfo->PixelRate, vboxVidPnDumpStrScanLineOrdering(pVideoSignalInfo->ScanLineOrdering), pSuffix));
void vboxVidPnDumpTargetMode(const char *pPrefix, const D3DKMDT_VIDPN_TARGET_MODE* CONST pVidPnTargetModeInfo, const char *pSuffix)
LOGREL_EXACT(("Preference(%s)%s", vboxVidPnDumpStrModePreference(pVidPnTargetModeInfo->Preference), pSuffix));
void vboxVidPnDumpPinnedSourceMode(const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
Status = pCurVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
pCurVidPnSourceModeSetInterface->pfnReleaseModeInfo(hCurVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
DECLCALLBACK(BOOLEAN) vboxVidPnDumpSourceModeSetEnum(D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
return TRUE;
void vboxVidPnDumpSourceModeSet(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
LOGREL_EXACT(("ERROR getting SourceModeSet for Source(%d), Status(0x%x)\n", VidPnSourceId, Status));
DECLCALLBACK(BOOLEAN) vboxVidPnDumpTargetModeSetEnum(D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
return TRUE;
void vboxVidPnDumpTargetModeSet(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
LOGREL_EXACT(("ERROR getting TargetModeSet for Target(%d), Status(0x%x)\n", VidPnTargetId, Status));
void vboxVidPnDumpPinnedTargetMode(const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
Status = pCurVidPnTargetModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnTargetModeSet, &pPinnedVidPnTargetModeInfo);
pCurVidPnTargetModeSetInterface->pfnReleaseModeInfo(hCurVidPnTargetModeSet, pPinnedVidPnTargetModeInfo);
void vboxVidPnDumpCofuncModalityArg(const char *pPrefix, CONST DXGKARG_ENUMVIDPNCOFUNCMODALITY* CONST pEnumCofuncModalityArg, const char *pSuffix)
LOGREL_EXACT(("%sPivotType(%s), SourceId(0x%x), TargetId(0x%x),%s", pPrefix, vboxVidPnDumpStrCFMPivotType(pEnumCofuncModalityArg->EnumPivotType),
pEnumCofuncModalityArg->EnumPivot.VidPnSourceId, pEnumCofuncModalityArg->EnumPivot.VidPnTargetId, pSuffix));
void vboxVidPnDumpPath(const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, const D3DKMDT_VIDPN_PRESENT_PATH *pVidPnPresentPathInfo)
vboxVidPnDumpRanges("CCDynamicRanges: ", &pVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges, "| ");
typedef struct VBOXVIDPNDUMPPATHENUM
static DECLCALLBACK(BOOLEAN) vboxVidPnDumpPathEnum(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
return TRUE;
void vboxVidPnDumpVidPn(const char * pPrefix, PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, const char * pSuffix)