VBoxMPVidPn.cpp revision 340ee06f35257fee1bd68223ab3504cf2b1d0c3e
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* $Id$ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync/** @file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VBox WDDM Miniport driver
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync/*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Copyright (C) 2011 Oracle Corporation
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
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.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync */
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync#include "VBoxMPWddm.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "VBoxMPVidPn.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "common/VBoxMPCommon.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic D3DDDIFORMAT vboxWddmCalcPixelFormat(const VIDEO_MODE_INFORMATION *pInfo)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (pInfo->BitsPerPlane)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case 32:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if(!(pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && !(pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pInfo->RedMask == 0xFF0000 && pInfo->GreenMask == 0xFF00 && pInfo->BlueMask == 0xFF)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return D3DDDIFMT_A8R8G8B8;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("unsupported format: bpp(%d), rmask(%d), gmask(%d), bmask(%d)",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->BitsPerPlane, pInfo->RedMask, pInfo->GreenMask, pInfo->BlueMask));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync {
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case 24:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if(!(pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && !(pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pInfo->RedMask == 0xFF0000 && pInfo->GreenMask == 0xFF00 && pInfo->BlueMask == 0xFF)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return D3DDDIFMT_R8G8B8;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("unsupported format: bpp(%d), rmask(%d), gmask(%d), bmask(%d)",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->BitsPerPlane, pInfo->RedMask, pInfo->GreenMask, pInfo->BlueMask));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case 16:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if(!(pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && !(pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pInfo->RedMask == 0xF800 && pInfo->GreenMask == 0x7E0 && pInfo->BlueMask == 0x1F)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return D3DDDIFMT_R5G6B5;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("unsupported format: bpp(%d), rmask(%d), gmask(%d), bmask(%d)",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->BitsPerPlane, pInfo->RedMask, pInfo->GreenMask, pInfo->BlueMask));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case 8:
cfb3a8ae5e9668de4506cf5c053b8009bcc89dafvboxsync if((pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && (pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return D3DDDIFMT_P8;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync default:
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync WARN(("unsupported bpp(%d)", pInfo->BitsPerPlane));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertBreakpoint();
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync break;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync return D3DDDIFMT_UNKNOWN;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync}
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsyncstatic int vboxWddmResolutionFind(const D3DKMDT_2DREGION *pResolutions, int cResolutions, const D3DKMDT_2DREGION *pRes)
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync{
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync for (int i = 0; i < cResolutions; ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_2DREGION *pResolution = &pResolutions[i];
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync if (pResolution->cx == pRes->cx && pResolution->cy == pRes->cy)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return i;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return -1;
05406988cc320ac1b0971de976b6cf0c986044a9vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic bool vboxWddmVideoModesMatch(const VIDEO_MODE_INFORMATION *pMode1, const VIDEO_MODE_INFORMATION *pMode2)
05406988cc320ac1b0971de976b6cf0c986044a9vboxsync{
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync return pMode1->VisScreenHeight == pMode2->VisScreenHeight
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync && pMode1->VisScreenWidth == pMode2->VisScreenWidth
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pMode1->BitsPerPlane == pMode2->BitsPerPlane;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync}
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
05406988cc320ac1b0971de976b6cf0c986044a9vboxsyncstatic int vboxWddmVideoModeFind(const VIDEO_MODE_INFORMATION *pModes, int cModes, const VIDEO_MODE_INFORMATION *pM)
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync{
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync for (int i = 0; i < cModes; ++i)
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync {
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync const VIDEO_MODE_INFORMATION *pMode = &pModes[i];
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync if (vboxWddmVideoModesMatch(pMode, pM))
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync return i;
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync }
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync return -1;
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync}
05406988cc320ac1b0971de976b6cf0c986044a9vboxsync
05406988cc320ac1b0971de976b6cf0c986044a9vboxsyncNTSTATUS vboxVidPnCheckSourceModeInfo(const D3DKMDT_HVIDPN hDesiredVidPn,
05406988cc320ac1b0971de976b6cf0c986044a9vboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo,
05406988cc320ac1b0971de976b6cf0c986044a9vboxsync BOOLEAN *pbSupported)
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync{
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync BOOLEAN bSupported = TRUE;
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync /* we support both GRAPHICS and TEXT modes */
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync switch (pNewVidPnSourceModeInfo->Type)
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync {
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync case D3DKMDT_RMT_GRAPHICS:
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync /* any primary surface size actually
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx
05406988cc320ac1b0971de976b6cf0c986044a9vboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy
05406988cc320ac1b0971de976b6cf0c986044a9vboxsync */
05406988cc320ac1b0971de976b6cf0c986044a9vboxsync if (pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cx != pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx
05406988cc320ac1b0971de976b6cf0c986044a9vboxsync || pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cy != pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy)
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync {
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync LOG(("VisibleRegionSize(%d, %d) != PrimSurfSize(%d, %d)",
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cx,
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cy,
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy));
3d5f0ee34d7d75f349347d02f25c5abae9b197aavboxsync AssertBreakpoint();
3d5f0ee34d7d75f349347d02f25c5abae9b197aavboxsync bSupported = FALSE;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync /*
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.Stride
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.ColorBasis
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case D3DKMDT_RMT_TEXT:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOG(("Warning: Unknown Src mode Type (%d)", pNewVidPnSourceModeInfo->Type));
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync *pbSupported = bSupported;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return STATUS_SUCCESS;
23de3d76e5d27015e334e6ff763ab08de5969363vboxsync}
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
23de3d76e5d27015e334e6ff763ab08de5969363vboxsyncNTSTATUS vboxVidPnCheckSourceModeSet(const D3DKMDT_HVIDPN hDesiredVidPn,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync BOOLEAN *pbSupported)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pVidPnSourceModeSetInterface->pfnAcquireFirstModeInfo(hNewVidPnSourceModeSet, &pNewVidPnSourceModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync BOOLEAN bSupported = TRUE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_SUCCESS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while (1)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnCheckSourceModeInfo(hDesiredVidPn, pNewVidPnSourceModeInfo, &bSupported);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_SUCCESS && bSupported)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNextVidPnSourceModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pVidPnSourceModeSetInterface->pfnAcquireNextModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo, &pNextVidPnSourceModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_SUCCESS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync pNewVidPnSourceModeInfo = pNextVidPnSourceModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync {
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync pVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync }
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("VBoxVideoWddm: pfnAcquireFirstModeInfo failed Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pbSupported = bSupported;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnPopulateVideoSignalInfo(D3DKMDT_VIDEO_SIGNAL_INFO *pVsi,
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync D3DKMDT_2DREGION *pResolution,
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync ULONG VSync)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVsi->VideoStandard = D3DKMDT_VSS_VESA_DMT;
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync pVsi->ActiveSize = *pResolution;
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync pVsi->VSyncFreq.Numerator = VSync * 1000;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVsi->VSyncFreq.Denominator = 1000;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVsi->TotalSize.cx = pVsi->ActiveSize.cx + VBOXVDPN_C_DISPLAY_HBLANK_SIZE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync 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);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVsi->HSyncFreq.Denominator = 1000;
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync pVsi->ScanLineOrdering = D3DDDI_VSSLO_PROGRESSIVE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsyncBOOLEAN vboxVidPnMatchVideoSignal(const D3DKMDT_VIDEO_SIGNAL_INFO *pVsi1, const D3DKMDT_VIDEO_SIGNAL_INFO *pVsi2)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->VideoStandard != pVsi2->VideoStandard)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->TotalSize.cx != pVsi2->TotalSize.cx)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->TotalSize.cy != pVsi2->TotalSize.cy)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->ActiveSize.cx != pVsi2->ActiveSize.cx)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync if (pVsi1->ActiveSize.cy != pVsi2->ActiveSize.cy)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->VSyncFreq.Numerator != pVsi2->VSyncFreq.Numerator)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->VSyncFreq.Denominator != pVsi2->VSyncFreq.Denominator)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync if (pVsi1->HSyncFreq.Numerator != pVsi2->HSyncFreq.Numerator)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync if (pVsi1->HSyncFreq.Denominator != pVsi2->HSyncFreq.Denominator)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->PixelRate != pVsi2->PixelRate)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVsi1->ScanLineOrdering != pVsi2->ScanLineOrdering)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync
be9bc9b4ba510c4b4159c193f783d024633ef8e9vboxsync return TRUE;
be9bc9b4ba510c4b4159c193f783d024633ef8e9vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnCheckTargetModeInfo(const D3DKMDT_HVIDPN hDesiredVidPn,
be9bc9b4ba510c4b4159c193f783d024633ef8e9vboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync BOOLEAN *pbSupported)
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync BOOLEAN bSupported = TRUE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_VIDEO_SIGNAL_INFO CmpVsi;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_2DREGION CmpRes;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CmpRes.cx = pNewVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cx;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync CmpRes.cy = pNewVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cy;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync NTSTATUS Status = vboxVidPnPopulateVideoSignalInfo(&CmpVsi,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &CmpRes,
090f6abdd6282f48527b83162b8b441425f05e36vboxsync pNewVidPnTargetModeInfo->VideoSignalInfo.VSyncFreq.Numerator/pNewVidPnTargetModeInfo->VideoSignalInfo.VSyncFreq.Denominator);
090f6abdd6282f48527b83162b8b441425f05e36vboxsync Assert(Status == STATUS_SUCCESS);
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync if (Status != STATUS_SUCCESS)
78a205e3fc6719d59e8c561b3d287d3a4f879852vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("vboxVidPnPopulateVideoSignalInfo error Status (0x%x)", Status));
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!vboxVidPnMatchVideoSignal(&CmpVsi, &pNewVidPnTargetModeInfo->VideoSignalInfo))
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync {
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync WARN(("VideoSignalInfos do not match!!!"));
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync bSupported = FALSE;
090f6abdd6282f48527b83162b8b441425f05e36vboxsync }
090f6abdd6282f48527b83162b8b441425f05e36vboxsync
090f6abdd6282f48527b83162b8b441425f05e36vboxsync *pbSupported = bSupported;
090f6abdd6282f48527b83162b8b441425f05e36vboxsync return STATUS_SUCCESS;
090f6abdd6282f48527b83162b8b441425f05e36vboxsync}
090f6abdd6282f48527b83162b8b441425f05e36vboxsync
090f6abdd6282f48527b83162b8b441425f05e36vboxsyncNTSTATUS vboxVidPnCheckTargetModeSet(const D3DKMDT_HVIDPN hDesiredVidPn,
090f6abdd6282f48527b83162b8b441425f05e36vboxsync D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
090f6abdd6282f48527b83162b8b441425f05e36vboxsync BOOLEAN *pbSupported)
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync{
090f6abdd6282f48527b83162b8b441425f05e36vboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo;
090f6abdd6282f48527b83162b8b441425f05e36vboxsync NTSTATUS Status = pVidPnTargetModeSetInterface->pfnAcquireFirstModeInfo(hNewVidPnTargetModeSet, &pNewVidPnTargetModeInfo);
090f6abdd6282f48527b83162b8b441425f05e36vboxsync BOOLEAN bSupported = TRUE;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync if (Status == STATUS_SUCCESS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
090f6abdd6282f48527b83162b8b441425f05e36vboxsync Assert(pNewVidPnTargetModeInfo);
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync while (1)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnCheckTargetModeInfo(hDesiredVidPn, pNewVidPnTargetModeInfo, &bSupported);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_SUCCESS && bSupported)
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync {
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNextVidPnTargetModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pVidPnTargetModeSetInterface->pfnAcquireNextModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo, &pNextVidPnTargetModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVidPnTargetModeSetInterface->pfnReleaseModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_SUCCESS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnTargetModeInfo = pNextVidPnTargetModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVidPnTargetModeSetInterface->pfnReleaseModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_SUCCESS;
0b65654be767b9fb7677181ddb434d8467f608e3vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("pfnAcquireFirstModeInfo failed Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync *pbSupported = bSupported;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnPopulateSourceModeInfoFromLegacy(D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo,
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync VIDEO_MODE_INFORMATION *pMode)
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync{
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync NTSTATUS Status = STATUS_SUCCESS;
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync if (pMode->AttributeFlags & VIDEO_MODE_GRAPHICS)
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync {
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync /* this is a graphics mode */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Type = D3DKMDT_RMT_GRAPHICS;
f5395a2af3050ddd694b0ad505975f7b717ab4f1vboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx = pMode->VisScreenWidth;
a44cdd0b29504e3de7b8aa87f839ad62b6e66f51vboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy = pMode->VisScreenHeight;
a44cdd0b29504e3de7b8aa87f839ad62b6e66f51vboxsync pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize = pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.Stride = pMode->ScreenStride;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat = vboxWddmCalcPixelFormat(pMode);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat != D3DDDIFMT_UNKNOWN);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat != D3DDDIFMT_UNKNOWN)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync pNewVidPnSourceModeInfo->Format.Graphics.ColorBasis = D3DKMDT_CB_SRGB;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat == D3DDDIFMT_P8)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode = D3DKMDT_PVAM_SETTABLEPALETTE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode = D3DKMDT_PVAM_DIRECT;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync }
332ccb6ac6feb4b50ec24d63ff029119164182ffvboxsync else
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("vboxWddmCalcPixelFormat failed"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_INVALID_PARAMETER;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync }
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync /* @todo: XPDM driver does not seem to return text modes, should we? */
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync LOGREL(("text mode not supported currently"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_INVALID_PARAMETER;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnPopulateMonitorSourceModeInfoFromLegacy(PVBOXMP_DEVEXT pDevExt,
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync D3DKMDT_MONITOR_SOURCE_MODE *pMonitorSourceMode,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_2DREGION *pResolution,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_MONITOR_CAPABILITIES_ORIGIN enmOrigin,
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync BOOLEAN bPreferred)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = vboxVidPnPopulateVideoSignalInfo(&pMonitorSourceMode->VideoSignalInfo, pResolution, 60 /* ULONG VSync */);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(Status == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_SUCCESS)
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync {
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync pMonitorSourceMode->ColorBasis = D3DKMDT_CB_SRGB;
a64bf60e92e5cb8a76aa6c8e92193932d88a906fvboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.FirstChannel = 8;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.SecondChannel = 8;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.ThirdChannel = 8;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.FourthChannel = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSourceMode->Origin = enmOrigin;
d45f7f7fe0c28b500b45b2dc88d7a04f4c0be6b8vboxsync pMonitorSourceMode->Preference = bPreferred ? D3DKMDT_MP_PREFERRED : D3DKMDT_MP_NOTPREFERRED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnCreatePopulateMonitorSourceModeInfoFromLegacy(PVBOXMP_DEVEXT pDevExt,
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync CONST D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_2DREGION *pResolution,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_MONITOR_CAPABILITIES_ORIGIN enmOrigin,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync BOOLEAN bPreferred)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_MONITOR_SOURCE_MODE * pMonitorSMI;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pMonitorSMSIf->pfnCreateNewModeInfo(hMonitorSMS, &pMonitorSMI);
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync Assert(Status == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_SUCCESS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync do
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnPopulateMonitorSourceModeInfoFromLegacy(pDevExt,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSMI,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pResolution,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync enmOrigin,
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync bPreferred);
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync Assert(Status == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_SUCCESS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync Status = pMonitorSMSIf->pfnAddMode(hMonitorSMS, pMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(Status == STATUS_SUCCESS/* || Status == STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET*/);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_SUCCESS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("pfnAddMode failed, Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("vboxVidPnPopulateMonitorSourceModeInfoFromLegacy failed, Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert (Status != STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* we're here because of a failure */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS tmpStatus = pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(tmpStatus == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (tmpStatus != STATUS_SUCCESS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("pfnReleaseModeInfo failed tmpStatus(0x%x)", tmpStatus));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync if (Status == STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET)
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } while (0);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("pfnCreateNewModeInfo failed, Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync}
a64bf60e92e5cb8a76aa6c8e92193932d88a906fvboxsync
a64bf60e92e5cb8a76aa6c8e92193932d88a906fvboxsyncNTSTATUS vboxVidPnPopulateTargetModeInfoFromLegacy(D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo, D3DKMDT_2DREGION *pResolution, BOOLEAN fPreferred)
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync{
04a471b98d492ee51b1f40424c7f90ddf44a90f0vboxsync pNewVidPnTargetModeInfo->Preference = fPreferred ? D3DKMDT_MP_PREFERRED : D3DKMDT_MP_NOTPREFERRED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vboxVidPnPopulateVideoSignalInfo(&pNewVidPnTargetModeInfo->VideoSignalInfo, pResolution, 60 /* ULONG VSync */);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef struct VBOXVIDPNCHECKADDMONITORMODES
bee1a7d4b183cab9654f247b3ea8cf680842bed5vboxsync{
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync NTSTATUS Status;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync D3DKMDT_2DREGION *pResolutions;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync uint32_t cResolutions;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync} VBOXVIDPNCHECKADDMONITORMODES, *PVBOXVIDPNCHECKADDMONITORMODES;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(BOOLEAN) vboxVidPnCheckAddMonitorModesEnum(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS, CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST D3DKMDT_MONITOR_SOURCE_MODE *pMonitorSMI, PVOID pContext)
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync{
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync PVBOXVIDPNCHECKADDMONITORMODES pData = (PVBOXVIDPNCHECKADDMONITORMODES)pContext;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (uint32_t i = 0; i < pData->cResolutions; ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_VIDPN_TARGET_MODE dummyMode = {0};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnPopulateTargetModeInfoFromLegacy(&dummyMode, &pData->pResolutions[i], FALSE /* preference does not matter for now */);
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync Assert(Status == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_SUCCESS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync if (vboxVidPnMatchVideoSignal(&dummyMode.VideoSignalInfo, &pMonitorSMI->VideoSignalInfo))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* mark it as unneeded */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pData->pResolutions[i].cx = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync }
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("vboxVidPnPopulateTargetModeInfoFromLegacy failed Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pData->Status = Status;
d45f7f7fe0c28b500b45b2dc88d7a04f4c0be6b8vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status == STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef struct VBOXVIDPNCHECKMONMODESENUM
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_2DREGION Region;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_MONITOR_SOURCE_MODE * pMonitorSMI;
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync} VBOXVIDPNCHECKMONMODESENUM, *PVBOXVIDPNCHECKMONMODESENUM;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(BOOLEAN) vboxFidPnCheckMonitorModesEnum(D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS, CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST D3DKMDT_MONITOR_SOURCE_MODE *pMonitorSMI, PVOID pContext)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVBOXVIDPNCHECKMONMODESENUM pInfo = (PVBOXVIDPNCHECKMONMODESENUM)pContext;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync if (pMonitorSMI->VideoSignalInfo.ActiveSize.cx == pInfo->Region.cx
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pMonitorSMI->VideoSignalInfo.ActiveSize.cy == pInfo->Region.cy)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync Assert(!pInfo->pMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pInfo->pMonitorSMI)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pInfo->pMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->pMonitorSMI = pMonitorSMI;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pMonitorSMI);
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return TRUE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef struct VBOXVIDPNMATCHMONMODESENUM
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_2DREGION *paResolutions;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t cResolutions;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync BOOLEAN fMatch;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync} VBOXVIDPNMATCHMONMODESENUM, *PVBOXVIDPNMATCHMONMODESENUM;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(BOOLEAN) vboxFidPnMatchMonitorModesEnum(D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS, CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST D3DKMDT_MONITOR_SOURCE_MODE *pMonitorSMI, PVOID pContext)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVBOXVIDPNMATCHMONMODESENUM pInfo = (PVBOXVIDPNMATCHMONMODESENUM)pContext;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync Assert(pInfo->fMatch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (UINT i = 0; i < pInfo->cResolutions; ++i)
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_2DREGION *pResolution = &pInfo->paResolutions[i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pMonitorSMI->VideoSignalInfo.ActiveSize.cx != pResolution->cx
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || pMonitorSMI->VideoSignalInfo.ActiveSize.cy != pResolution->cy)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->fMatch = FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return pInfo->fMatch;
ebe05ec36d1fcd24d62e7066dedcb4eb2e691358vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
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{
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync *pfMatch = FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST DXGK_MONITOR_INTERFACE *pMonitorInterface;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbQueryMonitorInterface(pDevExt->u.primary.DxgkInterface.DeviceHandle, DXGK_MONITOR_INTERFACE_VERSION_V1, &pMonitorInterface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("DxgkCbQueryMonitorInterface failed, Status (0x%x)", Status));
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pMonitorInterface->pfnAcquireMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync targetId,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &hMonitorSMS,
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync &pMonitorSMSIf);
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync if (!NT_SUCCESS(Status))
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync {
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync WARN(("pfnAcquireMonitorSourceModeSet failed, Status (0x%x)", Status));
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync if (Status == STATUS_GRAPHICS_MONITOR_NOT_CONNECTED)
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* this is ok in case we replug the monitor to pick up the monitor modes properly,
f5395a2af3050ddd694b0ad505975f7b717ab4f1vboxsync * so pretend success */
a44cdd0b29504e3de7b8aa87f839ad62b6e66f51vboxsync *pfMatch = TRUE;
a44cdd0b29504e3de7b8aa87f839ad62b6e66f51vboxsync Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync VBOXVIDPNMATCHMONMODESENUM Info;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync Info.paResolutions = pResolutions;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Info.cResolutions = cResolutions;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Info.fMatch = TRUE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync Status = vboxVidPnEnumMonitorSourceModes(hMonitorSMS, pMonitorSMSIf, vboxFidPnMatchMonitorModesEnum, &Info);
332ccb6ac6feb4b50ec24d63ff029119164182ffvboxsync if (NT_SUCCESS(Status))
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pfMatch = Info.fMatch;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync NTSTATUS tmpStatus = pMonitorInterface->pfnReleaseMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle, hMonitorSMS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(tmpStatus))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("pfnReleaseMonitorSourceModeSet failed tmpStatus(0x%x)", tmpStatus));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsyncNTSTATUS vboxVidPnCheckAddMonitorModes(PVBOXMP_DEVEXT pDevExt,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DDDI_VIDEO_PRESENT_TARGET_ID targetId, D3DKMDT_MONITOR_CAPABILITIES_ORIGIN enmOrigin,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_2DREGION *pResolutions, uint32_t cResolutions, int iPreferred)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST DXGK_MONITOR_INTERFACE *pMonitorInterface;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pDevExt->u.primary.DxgkInterface.DxgkCbQueryMonitorInterface(pDevExt->u.primary.DxgkInterface.DeviceHandle, DXGK_MONITOR_INTERFACE_VERSION_V1, &pMonitorInterface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync WARN(("DxgkCbQueryMonitorInterface failed, Status()0x%x", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pMonitorInterface->pfnAcquireMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync targetId,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &hMonitorSMS,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &pMonitorSMSIf);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("DxgkCbQueryMonitorInterface failed, Status()0x%x", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_GRAPHICS_MONITOR_NOT_CONNECTED)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync /* this is ok in case we replug the monitor to pick up the monitor modes properly,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * so pretend success */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (uint32_t i = 0; i < cResolutions; ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_2DREGION *pRes = &pResolutions[i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync Status = vboxVidPnCreatePopulateMonitorSourceModeInfoFromLegacy(pDevExt,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hMonitorSMS,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSMSIf,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pRes,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync enmOrigin,
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync iPreferred == i
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync );
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(Status == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status != STATUS_SUCCESS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync LOGREL(("vboxVidPnCreatePopulateMonitorSourceModeInfoFromLegacy failed Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS tmpStatus = pMonitorInterface->pfnReleaseMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle, hMonitorSMS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(tmpStatus))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("pfnReleaseMonitorSourceModeSet failed tmpStatus(0x%x)", tmpStatus));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync
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{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pVidPnInterface->pfnGetTopology(hVidPn, &hVidPnTopology, &pVidPnTopologyInterface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pVidPnTopologyInterface->pfnCreateNewPathInfo(hVidPnTopology, &pNewVidPnPresentPathInfo);
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync pNewVidPnPresentPathInfo->VidPnSourceId = VidPnSourceId;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VidPnTargetId = VidPnTargetId;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync pNewVidPnPresentPathInfo->ImportanceOrdinal = D3DKMDT_VPPI_PRIMARY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->ContentTransformation.Scaling = D3DKMDT_VPPS_IDENTITY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync memset(&pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync 0, sizeof (pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Identity = 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Centered = 0;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Stretched = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->ContentTransformation.Rotation = D3DKMDT_VPPR_IDENTITY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Identity = 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate180 = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate270 = 0;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate90 = 0;
1df4b0cdc5ec23d817014f9347ef28222b51e3fbvboxsync pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cx = 0;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cy = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cx = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cy = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VidPnTargetColorBasis = D3DKMDT_CB_SRGB; /* @todo: how does it matters? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.FirstChannel = 8;
1df4b0cdc5ec23d817014f9347ef28222b51e3fbvboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.SecondChannel = 8;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.ThirdChannel = 8;
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.FourthChannel = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->Content = D3DKMDT_VPPC_GRAPHICS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionType = D3DKMDT_VPPMT_UNINITIALIZED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync// pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionType = D3DKMDT_VPPMT_NOPROTECTION;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->CopyProtection.APSTriggerBits = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync memset(&pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport, 0, sizeof (pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport));
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync// pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport.NoProtection = 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync memset (&pNewVidPnPresentPathInfo->GammaRamp, 0, sizeof (pNewVidPnPresentPathInfo->GammaRamp));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync// pNewVidPnPresentPathInfo->GammaRamp.Type = D3DDDI_GAMMARAMP_DEFAULT;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync// pNewVidPnPresentPathInfo->GammaRamp.DataSize = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pVidPnTopologyInterface->pfnAddPath(hVidPnTopology, pNewVidPnPresentPathInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS tmpStatus = pVidPnTopologyInterface->pfnReleasePathInfo(hVidPnTopology, pNewVidPnPresentPathInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(NT_SUCCESS(tmpStatus));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic NTSTATUS vboxVidPnCreatePopulateSourceModeInfoFromLegacy(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VIDEO_MODE_INFORMATION *pModes, uint32_t cModes, int iModeToPin,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_VIDEO_PRESENT_SOURCE_MODE_ID *pModeIdToPin,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync BOOLEAN fDoPin
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync )
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pNewVidPnSourceModeSetInterface;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pModeIdToPin)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pModeIdToPin = D3DDDI_ID_UNINITIALIZED;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync NTSTATUS Status = pVidPnInterface->pfnCreateNewSourceModeSet(hVidPn,
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync VidPnSourceId,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &hNewVidPnSourceModeSet,
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync &pNewVidPnSourceModeSetInterface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync {
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_VIDEO_PRESENT_SOURCE_MODE_ID sourceModeId = D3DDDI_ID_UNINITIALIZED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (uint32_t i = 0; i < cModes; ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VIDEO_MODE_INFORMATION *pMode = &pModes[i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pNewVidPnSourceModeSetInterface->pfnCreateNewModeInfo(hNewVidPnSourceModeSet, &pNewVidPnSourceModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnPopulateSourceModeInfoFromLegacy(pNewVidPnSourceModeInfo, pMode);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (i == iModeToPin)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync sourceModeId = pNewVidPnSourceModeInfo->Id;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pNewVidPnSourceModeSetInterface->pfnAddMode(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync if (NT_SUCCESS(Status))
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* success */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync continue;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS tmpStatus = pNewVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync Assert(tmpStatus == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
ab0130d1627b2b214952b929de71b89e4ba41eb1vboxsync /* we're here because of an error */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(!NT_SUCCESS(Status));
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync break;
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync }
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync AssertFailed();
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync return Status;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync }
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync if (sourceModeId != D3DDDI_ID_UNINITIALIZED)
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync {
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync if (pModeIdToPin)
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync {
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync *pModeIdToPin = sourceModeId;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync }
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync Assert(iModeToPin >= 0);
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync if (fDoPin)
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync {
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync Status = pNewVidPnSourceModeSetInterface->pfnPinMode(hNewVidPnSourceModeSet, sourceModeId);
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(iModeToPin < 0);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync Status = pVidPnInterface->pfnAssignSourceModeSet(hVidPn, VidPnSourceId, hNewVidPnSourceModeSet);
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic NTSTATUS vboxVidPnCreatePopulateTargetModeInfoFromLegacy(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_2DREGION *pResolutions, uint32_t cResolutions,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VIDEO_MODE_INFORMATION *pModeToPin,
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync D3DKMDT_VIDEO_PRESENT_TARGET_MODE_ID *pModeIdToPin,
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync BOOLEAN fSetPreferred,
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync BOOLEAN fDoPin
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync )
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pNewVidPnTargetModeSetInterface;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pModeIdToPin)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pModeIdToPin = D3DDDI_ID_UNINITIALIZED;
61283d6341bac43f73cf33c9ec754a59f674fa19vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pVidPnInterface->pfnCreateNewTargetModeSet(hVidPn,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VidPnTargetId,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &hNewVidPnTargetModeSet,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &pNewVidPnTargetModeSetInterface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_VIDEO_PRESENT_TARGET_MODE_ID targetModeId = D3DDDI_ID_UNINITIALIZED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (uint32_t i = 0; i < cResolutions; ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync D3DKMDT_2DREGION *pResolution = &pResolutions[i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pNewVidPnTargetModeSetInterface->pfnCreateNewModeInfo(hNewVidPnTargetModeSet, &pNewVidPnTargetModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync BOOLEAN fIsPinMode = pModeToPin && pModeToPin->VisScreenWidth == pResolution->cx
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync && pModeToPin->VisScreenHeight == pResolution->cy;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnPopulateTargetModeInfoFromLegacy(pNewVidPnTargetModeInfo, pResolution, fIsPinMode && fSetPreferred);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (fIsPinMode)
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync targetModeId = pNewVidPnTargetModeInfo->Id;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pNewVidPnTargetModeSetInterface->pfnAddMode(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync if (NT_SUCCESS(Status))
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync {
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* success */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync continue;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync NTSTATUS tmpStatus = pNewVidPnTargetModeSetInterface->pfnReleaseModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(tmpStatus == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* we're here because of an error */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(!NT_SUCCESS(Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
be9bc9b4ba510c4b4159c193f783d024633ef8e9vboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync if (targetModeId != D3DDDI_ID_UNINITIALIZED)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(pModeToPin);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pModeIdToPin)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync *pModeIdToPin = targetModeId;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync }
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync if (fDoPin)
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync {
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync Status = pNewVidPnTargetModeSetInterface->pfnPinMode(hNewVidPnTargetModeSet, targetModeId);
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync if (!NT_SUCCESS(Status))
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync {
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync AssertFailed();
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync return Status;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync }
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync }
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync }
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync else
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync {
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync Assert(!pModeToPin);
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync }
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync Status = pVidPnInterface->pfnAssignTargetModeSet(hVidPn, VidPnTargetId, hNewVidPnTargetModeSet);
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync if (!NT_SUCCESS(Status))
b880eb99e249b300390f5eeedff304ac30ba548evboxsync {
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync AssertFailed();
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync return Status;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync }
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync return Status;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync}
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsyncNTSTATUS vboxVidPnCreatePopulateVidPnPathFromLegacy(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync VIDEO_MODE_INFORMATION *pModes, uint32_t cModes, int iModeToPin,
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync D3DKMDT_2DREGION *pResolutions, uint32_t cResolutions,
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync const D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, const D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync{
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync NTSTATUS Status;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync#if 0
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync Status = vboxVidPnPathAdd(hVidPn, pVidPnInterface, VidPnSourceId, VidPnTargetId);
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync if (!NT_SUCCESS(Status))
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync {
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync AssertFailed();
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync return Status;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync }
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync#endif
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync VIDEO_MODE_INFORMATION *pModeToPin = iModeToPin >= 0 ? &pModes[iModeToPin] : NULL;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync Status = vboxVidPnCreatePopulateTargetModeInfoFromLegacy(hVidPn, pVidPnInterface, VidPnTargetId, pResolutions, cResolutions, pModeToPin, NULL, TRUE, TRUE);
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync if (!NT_SUCCESS(Status))
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync {
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync AssertFailed();
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnCreatePopulateSourceModeInfoFromLegacy(hVidPn, pVidPnInterface, VidPnSourceId, pModes, cModes, iModeToPin, NULL, TRUE);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef struct VBOXVIDPNPOPRESOLUTIONENUM
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync D3DKMDT_2DREGION *pResolutions;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int cResolutions;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync int cResultResolutions;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync}VBOXVIDPNPOPRESOLUTIONENUM, *PVBOXVIDPNPOPRESOLUTIONENUM;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsyncstatic DECLCALLBACK(BOOLEAN) vboxVidPnPopulateResolutionsFromSourceModeSetEnum(D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo, PVOID pContext)
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync{
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync NTSTATUS Status = STATUS_SUCCESS;
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync PVBOXVIDPNPOPRESOLUTIONENUM pInfo = (PVBOXVIDPNPOPRESOLUTIONENUM)pContext;
9f16100a870e25701da9bc9819e15c0f9fb3870evboxsync Assert(pInfo->cResolutions >= pInfo->cResultResolutions);
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync Assert(pInfo->Status == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (vboxWddmResolutionFind(pInfo->pResolutions, pInfo->cResultResolutions, &pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize) < 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync if (pInfo->cResultResolutions < pInfo->cResolutions)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->pResolutions[pInfo->cResultResolutions] = pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ++pInfo->cResultResolutions;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_BUFFER_OVERFLOW;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
61283d6341bac43f73cf33c9ec754a59f674fa19vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->Status = Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status == STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(BOOLEAN) vboxVidPnPopulateResolutionsFromTargetModeSetEnum(D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo, PVOID pContext)
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVBOXVIDPNPOPRESOLUTIONENUM pInfo = (PVBOXVIDPNPOPRESOLUTIONENUM)pContext;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync Assert(pInfo->cResolutions >= pInfo->cResultResolutions);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(pInfo->Status == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (vboxWddmResolutionFind(pInfo->pResolutions, pInfo->cResultResolutions, &pNewVidPnTargetModeInfo->VideoSignalInfo.ActiveSize) < 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync if (pInfo->cResultResolutions < pInfo->cResolutions)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->pResolutions[pInfo->cResultResolutions] = pNewVidPnTargetModeInfo->VideoSignalInfo.ActiveSize;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ++pInfo->cResultResolutions;
61283d6341bac43f73cf33c9ec754a59f674fa19vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_BUFFER_OVERFLOW;
f3a0f5af19a0af82d4afa126e62789a778420261vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
f3a0f5af19a0af82d4afa126e62789a778420261vboxsync pInfo->Status = Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status == STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef struct VBOXVIDPNPOPMODEENUM
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VIDEO_MODE_INFORMATION *pModes;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int cModes;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int cResultModes;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}VBOXVIDPNPOPMODEENUM, *PVBOXVIDPNPOPMODEENUM;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(BOOLEAN) vboxVidPnPopulateModesFromSourceModeSetEnum(D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo, PVOID pContext)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = STATUS_SUCCESS;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync PVBOXVIDPNPOPMODEENUM pInfo = (PVBOXVIDPNPOPMODEENUM)pContext;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VIDEO_MODE_INFORMATION Mode;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(pInfo->cModes >= pInfo->cResultModes);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(pInfo->Status == STATUS_SUCCESS);
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync if (VBoxWddmFillMode(&Mode, pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cx,
22408fe91738075b3c413b14a421d641aacad508vboxsync pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cy))
22408fe91738075b3c413b14a421d641aacad508vboxsync {
22408fe91738075b3c413b14a421d641aacad508vboxsync if (vboxWddmVideoModeFind(pInfo->pModes, pInfo->cModes, &Mode) < 0)
22408fe91738075b3c413b14a421d641aacad508vboxsync {
22408fe91738075b3c413b14a421d641aacad508vboxsync if (pInfo->cResultModes < pInfo->cModes)
22408fe91738075b3c413b14a421d641aacad508vboxsync {
22408fe91738075b3c413b14a421d641aacad508vboxsync pInfo->pModes[pInfo->cResultModes] = Mode;
22408fe91738075b3c413b14a421d641aacad508vboxsync ++pInfo->cResultModes;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync }
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync else
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_BUFFER_OVERFLOW;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync else
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(0);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Status = STATUS_INVALID_PARAMETER;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync pInfo->Status = Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync return Status == STATUS_SUCCESS;
22408fe91738075b3c413b14a421d641aacad508vboxsync}
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsynctypedef struct VBOXVIDPNPOPMODETARGETENUM
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync{
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync VBOXVIDPNPOPMODEENUM Base;
22408fe91738075b3c413b14a421d641aacad508vboxsync VIDEO_MODE_INFORMATION *pSuperset;
22408fe91738075b3c413b14a421d641aacad508vboxsync int cSuperset;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync}VBOXVIDPNPOPMODETARGETENUM, *PVBOXVIDPNPOPMODETARGETENUM;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsyncstatic DECLCALLBACK(BOOLEAN) vboxVidPnPopulateModesFromTargetModeSetEnum(D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo, PVOID pContext)
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = STATUS_SUCCESS;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync PVBOXVIDPNPOPMODETARGETENUM pInfo = (PVBOXVIDPNPOPMODETARGETENUM)pContext;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(pInfo->Base.cModes >= pInfo->Base.cResultModes);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Assert(pInfo->Base.Status == STATUS_SUCCESS);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync uint32_t cResult;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync Status = VBoxWddmGetModesForResolution(pInfo->pSuperset, pInfo->cSuperset, -1, &pNewVidPnTargetModeInfo->VideoSignalInfo.ActiveSize,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pInfo->Base.pModes + pInfo->Base.cResultModes, pInfo->Base.cModes - pInfo->Base.cResultModes, &cResult, NULL);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Assert(Status == STATUS_SUCCESS);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync if (Status == STATUS_SUCCESS)
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync pInfo->Base.cResultModes += cResult;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync pInfo->Base.Status = Status;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync return Status == STATUS_SUCCESS;
22408fe91738075b3c413b14a421d641aacad508vboxsync}
22408fe91738075b3c413b14a421d641aacad508vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE vboxVidPnCofuncModalityCurrentPathPivot(CONST DXGKARG_ENUMVIDPNCOFUNCMODALITY* pEnumCofuncModalityArg,
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (pEnumCofuncModalityArg->EnumPivotType)
352f5cf617a287b8a3ca2fbe1f23afe258874ce9vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case D3DKMDT_EPT_VIDPNSOURCE:
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync if (pEnumCofuncModalityArg->EnumPivot.VidPnSourceId == VidPnSourceId)
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync return D3DKMDT_EPT_VIDPNSOURCE;
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync if (pEnumCofuncModalityArg->EnumPivot.VidPnSourceId == D3DDDI_ID_ALL)
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync {
22408fe91738075b3c413b14a421d641aacad508vboxsync#ifdef DEBUG_misha
22408fe91738075b3c413b14a421d641aacad508vboxsync AssertFailed();
22408fe91738075b3c413b14a421d641aacad508vboxsync#endif
22408fe91738075b3c413b14a421d641aacad508vboxsync return D3DKMDT_EPT_VIDPNSOURCE;
22408fe91738075b3c413b14a421d641aacad508vboxsync }
22408fe91738075b3c413b14a421d641aacad508vboxsync return D3DKMDT_EPT_NOPIVOT;
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync case D3DKMDT_EPT_VIDPNTARGET:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pEnumCofuncModalityArg->EnumPivot.VidPnTargetId == VidPnTargetId)
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync return D3DKMDT_EPT_VIDPNTARGET;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync if (pEnumCofuncModalityArg->EnumPivot.VidPnTargetId == D3DDDI_ID_ALL)
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef DEBUG_misha
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync AssertFailed();
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync#endif
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync return D3DKMDT_EPT_VIDPNTARGET;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync return D3DKMDT_EPT_NOPIVOT;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync case D3DKMDT_EPT_SCALING:
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync case D3DKMDT_EPT_ROTATION:
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync case D3DKMDT_EPT_NOPIVOT:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return D3DKMDT_EPT_NOPIVOT;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync AssertFailed();
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync return D3DKMDT_EPT_NOPIVOT;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync}
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsyncNTSTATUS vboxVidPnHasPinnedTargetMode(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId, BOOLEAN *pfHas)
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync{
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync D3DKMDT_HVIDPNTARGETMODESET hCurVidPnTargetModeSet;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pCurVidPnTargetModeSetInterface;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pfHas = FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pVidPnInterface->pfnAcquireTargetModeSet(hVidPn,
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync VidPnTargetId,
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync &hCurVidPnTargetModeSet,
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync &pCurVidPnTargetModeSetInterface);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync if (!NT_SUCCESS(Status))
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync {
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync AssertFailed();
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync CONST D3DKMDT_VIDPN_TARGET_MODE* pPinnedVidPnTargetModeInfo;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Status = pCurVidPnTargetModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnTargetModeSet, &pPinnedVidPnTargetModeInfo);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync {
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync pPinnedVidPnTargetModeInfo = NULL;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync else if (!NT_SUCCESS(Status))
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync {
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync LOGREL(("pfnAcquirePinnedModeInfo failed Status(0x%x)", Status));
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync AssertFailed();
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Assert(pPinnedVidPnTargetModeInfo);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync NTSTATUS tmpStatus = pCurVidPnTargetModeSetInterface->pfnReleaseModeInfo(hCurVidPnTargetModeSet, pPinnedVidPnTargetModeInfo);
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync Assert(NT_SUCCESS(tmpStatus));
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync *pfHas = TRUE;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hCurVidPnTargetModeSet);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync Assert(tmpStatus == STATUS_SUCCESS);
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync return Status;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync}
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsyncNTSTATUS vboxVidPnHasPinnedSourceMode(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, BOOLEAN *pfHas)
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync{
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pCurVidPnSourceModeSetInterface;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync *pfHas = FALSE;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync NTSTATUS Status = pVidPnInterface->pfnAcquireSourceModeSet(hVidPn,
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync VidPnSourceId,
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync &hCurVidPnSourceModeSet,
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync &pCurVidPnSourceModeSetInterface);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync if (!NT_SUCCESS(Status))
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync return Status;
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync }
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync CONST D3DKMDT_VIDPN_SOURCE_MODE* pPinnedVidPnSourceModeInfo;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync Status = pCurVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
ebf9e36b6e5548e4db69cebbef120e669a459afevboxsync {
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync pPinnedVidPnSourceModeInfo = NULL;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync Status = STATUS_SUCCESS;
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync }
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync else if (!NT_SUCCESS(Status))
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("pfnAcquirePinnedModeInfo failed Status(0x%x)", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync else
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync {
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Assert(pPinnedVidPnSourceModeInfo);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync NTSTATUS tmpStatus = pCurVidPnSourceModeSetInterface->pfnReleaseModeInfo(hCurVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Assert(NT_SUCCESS(tmpStatus));
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync *pfHas = TRUE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hCurVidPnSourceModeSet);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(tmpStatus == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
47b5427d1a541bcd269bc625c35b19d849071edfvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic NTSTATUS vboxVidPnCofuncModalityForPathTarget(PVBOXVIDPNCOFUNCMODALITY pCbContext,
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVBOXMP_DEVEXT pDevExt = pCbContext->pDevExt;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_HVIDPN hVidPn = pCbContext->pEnumCofuncModalityArg->hConstrainingVidPn;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface = pCbContext->pVidPnInterface;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVBOXWDDM_VIDEOMODES_INFO pInfo = &pCbContext->pInfos[VidPnTargetId];
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet = NULL;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pNewVidPnTargetModeSetInterface;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync if (VidPnSourceId != VidPnTargetId || pCbContext->apPathInfos[VidPnTargetId].enmState != VBOXVIDPNPATHITEM_STATE_PRESENT)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet;
22408fe91738075b3c413b14a421d641aacad508vboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pCurVidPnSourceModeSetInterface;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pVidPnInterface->pfnAcquireSourceModeSet(hVidPn,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VidPnSourceId,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &hCurVidPnSourceModeSet,
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync &pCurVidPnSourceModeSetInterface);
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync if (!NT_SUCCESS(Status))
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync {
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync AssertFailed();
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync return Status;
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync }
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync CONST D3DKMDT_VIDPN_SOURCE_MODE* pPinnedVidPnSourceModeInfo;
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync Status = pCurVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync {
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync pPinnedVidPnSourceModeInfo = NULL;
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync Status = STATUS_SUCCESS;
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync }
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync else if (!NT_SUCCESS(Status))
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync {
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync LOGREL(("pfnAcquirePinnedModeInfo failed Status(0x%x)", Status));
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync AssertFailed();
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync }
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync else
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync {
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync Assert(pPinnedVidPnSourceModeInfo);
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync }
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync if (NT_SUCCESS(Status))
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync {
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync Status = pVidPnInterface->pfnCreateNewTargetModeSet(hVidPn,
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync VidPnTargetId,
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync &hNewVidPnTargetModeSet,
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync &pNewVidPnTargetModeSetInterface);
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync if (NT_SUCCESS(Status))
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync {
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync Assert(hNewVidPnTargetModeSet);
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync if (VidPnSourceId == VidPnTargetId && pCbContext->apPathInfos[VidPnTargetId].enmState == VBOXVIDPNPATHITEM_STATE_PRESENT)
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync {
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync Assert(VidPnSourceId == VidPnTargetId);
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync for (uint32_t i = 0; i < pInfo->cResolutions; ++i)
8bc010ff67963900f9c39d93ce1a64a4e1c08ba1vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_2DREGION *pResolution = &pInfo->aResolutions[i];
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync if (pPinnedVidPnSourceModeInfo)
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync {
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync if (pPinnedVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx != pResolution->cx
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync || pPinnedVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy != pResolution->cy)
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync {
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync continue;
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync }
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync }
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo;
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync Status = pNewVidPnTargetModeSetInterface->pfnCreateNewModeInfo(hNewVidPnTargetModeSet, &pNewVidPnTargetModeInfo);
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync Assert(Status == STATUS_SUCCESS);
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync if (NT_SUCCESS(Status))
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync {
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync Status = vboxVidPnPopulateTargetModeInfoFromLegacy(pNewVidPnTargetModeInfo, pResolution, i == pInfo->iPreferredResolution);
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync Assert(Status == STATUS_SUCCESS);
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync if (NT_SUCCESS(Status))
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync Status = pNewVidPnTargetModeSetInterface->pfnAddMode(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
22408fe91738075b3c413b14a421d641aacad508vboxsync Assert(Status == STATUS_SUCCESS);
22408fe91738075b3c413b14a421d641aacad508vboxsync if (NT_SUCCESS(Status))
22408fe91738075b3c413b14a421d641aacad508vboxsync {
22408fe91738075b3c413b14a421d641aacad508vboxsync /* success */
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync continue;
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync }
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync }
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync NTSTATUS tmpStatus = pNewVidPnTargetModeSetInterface->pfnReleaseModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo);
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync Assert(tmpStatus == STATUS_SUCCESS);
5ae72b1f28e1d602e74d89e79e43778c9fc18203vboxsync }
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync /* we're here because of an error */
5ae72b1f28e1d602e74d89e79e43778c9fc18203vboxsync Assert(!NT_SUCCESS(Status));
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync break;
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync }
22408fe91738075b3c413b14a421d641aacad508vboxsync }
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync }
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync else
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync {
e131925debcc0add6ebecf92e6d09d62150476a4vboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pPinnedVidPnSourceModeInfo)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS tmpStatus = pCurVidPnSourceModeSetInterface->pfnReleaseModeInfo(hCurVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync Assert(tmpStatus == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
22408fe91738075b3c413b14a421d641aacad508vboxsync
22408fe91738075b3c413b14a421d641aacad508vboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hCurVidPnSourceModeSet);
22408fe91738075b3c413b14a421d641aacad508vboxsync Assert(tmpStatus == STATUS_SUCCESS);
22408fe91738075b3c413b14a421d641aacad508vboxsync
22408fe91738075b3c413b14a421d641aacad508vboxsync if (NT_SUCCESS(Status))
22408fe91738075b3c413b14a421d641aacad508vboxsync {
22408fe91738075b3c413b14a421d641aacad508vboxsync Assert(hNewVidPnTargetModeSet);
22408fe91738075b3c413b14a421d641aacad508vboxsync Status = pVidPnInterface->pfnAssignTargetModeSet(hVidPn, VidPnTargetId, hNewVidPnTargetModeSet);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("\n\n!!!!!!!\n\n pfnAssignTargetModeSet failed, Status(0x%x)", Status));
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync tmpStatus = pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hNewVidPnTargetModeSet);
22408fe91738075b3c413b14a421d641aacad508vboxsync Assert(tmpStatus == STATUS_SUCCESS);
22408fe91738075b3c413b14a421d641aacad508vboxsync }
22408fe91738075b3c413b14a421d641aacad508vboxsync }
22408fe91738075b3c413b14a421d641aacad508vboxsync
22408fe91738075b3c413b14a421d641aacad508vboxsync return Status;
22408fe91738075b3c413b14a421d641aacad508vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsyncstatic NTSTATUS vboxVidPnCofuncModalityForPathSource(PVBOXVIDPNCOFUNCMODALITY pCbContext,
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
22408fe91738075b3c413b14a421d641aacad508vboxsync{
22408fe91738075b3c413b14a421d641aacad508vboxsync PVBOXMP_DEVEXT pDevExt = pCbContext->pDevExt;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_HVIDPN hVidPn = pCbContext->pEnumCofuncModalityArg->hConstrainingVidPn;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface = pCbContext->pVidPnInterface;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVBOXWDDM_VIDEOMODES_INFO pInfo = &pCbContext->pInfos[VidPnTargetId];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet = NULL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pNewVidPnSourceModeSetInterface;
22408fe91738075b3c413b14a421d641aacad508vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (VidPnSourceId != VidPnTargetId || pCbContext->apPathInfos[VidPnSourceId].enmState != VBOXVIDPNPATHITEM_STATE_PRESENT)
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_HVIDPNTARGETMODESET hCurVidPnTargetModeSet;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pCurVidPnTargetModeSetInterface;
be2a61911f40a64584c3c7188104f45e0c4311ddvboxsync NTSTATUS Status = pVidPnInterface->pfnAcquireTargetModeSet(hVidPn,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VidPnTargetId,
22408fe91738075b3c413b14a421d641aacad508vboxsync &hCurVidPnTargetModeSet,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &pCurVidPnTargetModeSetInterface);
be2a61911f40a64584c3c7188104f45e0c4311ddvboxsync if (!NT_SUCCESS(Status))
be2a61911f40a64584c3c7188104f45e0c4311ddvboxsync {
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST D3DKMDT_VIDPN_TARGET_MODE* pPinnedVidPnTargetModeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pCurVidPnTargetModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnTargetModeSet, &pPinnedVidPnTargetModeInfo);
b3547e42ce5221377866e3fa041b3086b7cc1562vboxsync if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
22408fe91738075b3c413b14a421d641aacad508vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pPinnedVidPnTargetModeInfo = NULL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
212d777d7378ef2a3ecc028df71ca7b82b9cb1dcvboxsync LOGREL(("pfnAcquirePinnedModeInfo failed Status(0x%x)", Status));
212d777d7378ef2a3ecc028df71ca7b82b9cb1dcvboxsync AssertFailed();
212d777d7378ef2a3ecc028df71ca7b82b9cb1dcvboxsync }
212d777d7378ef2a3ecc028df71ca7b82b9cb1dcvboxsync else
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(pPinnedVidPnTargetModeInfo);
b3547e42ce5221377866e3fa041b3086b7cc1562vboxsync }
22408fe91738075b3c413b14a421d641aacad508vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pVidPnInterface->pfnCreateNewSourceModeSet(hVidPn,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VidPnSourceId,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &hNewVidPnSourceModeSet,
212d777d7378ef2a3ecc028df71ca7b82b9cb1dcvboxsync &pNewVidPnSourceModeSetInterface);
212d777d7378ef2a3ecc028df71ca7b82b9cb1dcvboxsync if (NT_SUCCESS(Status))
212d777d7378ef2a3ecc028df71ca7b82b9cb1dcvboxsync {
212d777d7378ef2a3ecc028df71ca7b82b9cb1dcvboxsync Assert(hNewVidPnSourceModeSet);
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync if (VidPnSourceId == VidPnTargetId && pCbContext->apPathInfos[VidPnSourceId].enmState == VBOXVIDPNPATHITEM_STATE_PRESENT)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
b3547e42ce5221377866e3fa041b3086b7cc1562vboxsync Assert(VidPnSourceId == VidPnTargetId);
22408fe91738075b3c413b14a421d641aacad508vboxsync for (uint32_t i = 0; i < pInfo->cModes; ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VIDEO_MODE_INFORMATION *pMode = &pInfo->aModes[i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pPinnedVidPnTargetModeInfo)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync if (pPinnedVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cx != pMode->VisScreenWidth
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || pPinnedVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cy != pMode->VisScreenHeight)
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
22408fe91738075b3c413b14a421d641aacad508vboxsync continue;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Status = pNewVidPnSourceModeSetInterface->pfnCreateNewModeInfo(hNewVidPnSourceModeSet, &pNewVidPnSourceModeInfo);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Assert(Status == STATUS_SUCCESS);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync if (NT_SUCCESS(Status))
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync {
be2a61911f40a64584c3c7188104f45e0c4311ddvboxsync Status = vboxVidPnPopulateSourceModeInfoFromLegacy(pNewVidPnSourceModeInfo, pMode);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Assert(Status == STATUS_SUCCESS);
afc45562e8673a50bc8cb53333049d67fef30bcbvboxsync if (NT_SUCCESS(Status))
afc45562e8673a50bc8cb53333049d67fef30bcbvboxsync {
afc45562e8673a50bc8cb53333049d67fef30bcbvboxsync Status = pNewVidPnSourceModeSetInterface->pfnAddMode(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
e718c14033c9205b4264213b6583a936692861d2vboxsync Assert(Status == STATUS_SUCCESS);
e718c14033c9205b4264213b6583a936692861d2vboxsync if (NT_SUCCESS(Status))
e718c14033c9205b4264213b6583a936692861d2vboxsync {
e718c14033c9205b4264213b6583a936692861d2vboxsync /* success */
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync continue;
afc45562e8673a50bc8cb53333049d67fef30bcbvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
22408fe91738075b3c413b14a421d641aacad508vboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync NTSTATUS tmpStatus = pNewVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(tmpStatus == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* we're here because of an error */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(!NT_SUCCESS(Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
22408fe91738075b3c413b14a421d641aacad508vboxsync AssertFailed();
22408fe91738075b3c413b14a421d641aacad508vboxsync }
22408fe91738075b3c413b14a421d641aacad508vboxsync
22408fe91738075b3c413b14a421d641aacad508vboxsync if (pPinnedVidPnTargetModeInfo)
22408fe91738075b3c413b14a421d641aacad508vboxsync {
22408fe91738075b3c413b14a421d641aacad508vboxsync NTSTATUS tmpStatus = pCurVidPnTargetModeSetInterface->pfnReleaseModeInfo(hCurVidPnTargetModeSet, pPinnedVidPnTargetModeInfo);
22408fe91738075b3c413b14a421d641aacad508vboxsync Assert(tmpStatus == STATUS_SUCCESS);
22408fe91738075b3c413b14a421d641aacad508vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hCurVidPnTargetModeSet);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(tmpStatus == STATUS_SUCCESS);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
22408fe91738075b3c413b14a421d641aacad508vboxsync if (NT_SUCCESS(Status))
22408fe91738075b3c413b14a421d641aacad508vboxsync {
22408fe91738075b3c413b14a421d641aacad508vboxsync Assert(hNewVidPnSourceModeSet);
22408fe91738075b3c413b14a421d641aacad508vboxsync Status = pVidPnInterface->pfnAssignSourceModeSet(hVidPn, VidPnSourceId, hNewVidPnSourceModeSet);
22408fe91738075b3c413b14a421d641aacad508vboxsync if (!NT_SUCCESS(Status))
22408fe91738075b3c413b14a421d641aacad508vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("\n\n!!!!!!!\n\n pfnAssignSourceModeSet failed, Status(0x%x)", Status));
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync tmpStatus = pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hNewVidPnSourceModeSet);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Assert(tmpStatus == STATUS_SUCCESS);
22408fe91738075b3c413b14a421d641aacad508vboxsync }
22408fe91738075b3c413b14a421d641aacad508vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnCofuncModalityForPath(PVBOXVIDPNCOFUNCMODALITY pCbContext,
22408fe91738075b3c413b14a421d641aacad508vboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVBOXMP_DEVEXT pDevExt = pCbContext->pDevExt;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_HVIDPN hVidPn = pCbContext->pEnumCofuncModalityArg->hConstrainingVidPn;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface = pCbContext->pVidPnInterface;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync NTSTATUS Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pCbContext->Status = STATUS_SUCCESS;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync PVBOXWDDM_VIDEOMODES_INFO pInfo = &pCbContext->pInfos[VidPnTargetId];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE enmPivot = vboxVidPnCofuncModalityCurrentPathPivot(pCbContext->pEnumCofuncModalityArg, VidPnSourceId, VidPnTargetId);
be2a61911f40a64584c3c7188104f45e0c4311ddvboxsync BOOLEAN fHasPinnedMode = FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnHasPinnedTargetMode(hVidPn, pVidPnInterface, VidPnTargetId, &fHasPinnedMode);
22408fe91738075b3c413b14a421d641aacad508vboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
be2a61911f40a64584c3c7188104f45e0c4311ddvboxsync AssertFailed();
be2a61911f40a64584c3c7188104f45e0c4311ddvboxsync return Status;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
b3547e42ce5221377866e3fa041b3086b7cc1562vboxsync BOOLEAN fNeedUpdate = enmPivot != D3DKMDT_EPT_VIDPNTARGET && !fHasPinnedMode;
22408fe91738075b3c413b14a421d641aacad508vboxsync if (fNeedUpdate)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnCofuncModalityForPathTarget(pCbContext, VidPnSourceId, VidPnTargetId);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (NT_SUCCESS(Status))
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
22408fe91738075b3c413b14a421d641aacad508vboxsync fHasPinnedMode = FALSE;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync Status = vboxVidPnHasPinnedSourceMode(hVidPn, pVidPnInterface, VidPnSourceId, &fHasPinnedMode);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync return Status;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync fNeedUpdate = enmPivot != D3DKMDT_EPT_VIDPNSOURCE && !fHasPinnedMode;
be2a61911f40a64584c3c7188104f45e0c4311ddvboxsync if (fNeedUpdate)
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync {
b3547e42ce5221377866e3fa041b3086b7cc1562vboxsync Status = vboxVidPnCofuncModalityForPathSource(pCbContext, VidPnSourceId, VidPnTargetId);
22408fe91738075b3c413b14a421d641aacad508vboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncDECLCALLBACK(BOOLEAN) vboxVidPnCofuncModalityPathEnum(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo, PVOID pContext)
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVBOXVIDPNCOFUNCMODALITY pCbContext = (PVBOXVIDPNCOFUNCMODALITY)pContext;
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync D3DKMDT_VIDPN_PRESENT_PATH AdjustedPath = {};
be2589a6f7086676e45b18d204bb1064889dc586vboxsync NTSTATUS Status = STATUS_SUCCESS;
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync bool bUpdatePath = false;
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync AdjustedPath.VidPnSourceId = pNewVidPnPresentPathInfo->VidPnSourceId;
be2589a6f7086676e45b18d204bb1064889dc586vboxsync AdjustedPath.VidPnTargetId = pNewVidPnPresentPathInfo->VidPnTargetId;
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync AdjustedPath.ContentTransformation = pNewVidPnPresentPathInfo->ContentTransformation;
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync AdjustedPath.CopyProtection = pNewVidPnPresentPathInfo->CopyProtection;
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync if (pNewVidPnPresentPathInfo->ContentTransformation.Scaling == D3DKMDT_VPPS_UNPINNED)
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AdjustedPath.ContentTransformation.ScalingSupport.Identity = TRUE;
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync bUpdatePath = true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pNewVidPnPresentPathInfo->ContentTransformation.Rotation == D3DKMDT_VPPR_UNPINNED)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AdjustedPath.ContentTransformation.RotationSupport.Identity = TRUE;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync bUpdatePath = true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync if (bUpdatePath)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = pVidPnTopologyInterface->pfnUpdatePathSupportInfo(hVidPnTopology, &AdjustedPath);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(Status == STATUS_SUCCESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vboxVidPnCofuncModalityForPath(pCbContext, pNewVidPnPresentPathInfo->VidPnSourceId, pNewVidPnPresentPathInfo->VidPnTargetId);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVidPnTopologyInterface->pfnReleasePathInfo(hVidPnTopology, pNewVidPnPresentPathInfo);
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pCbContext->Status = Status;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync Assert(Status == STATUS_SUCCESS);
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync return Status == STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic BOOLEAN vboxVidPnIsPathSupported(const D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pNewVidPnPresentPathInfo->VidPnSourceId != pNewVidPnPresentPathInfo->VidPnTargetId)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync WARN(("unsupported source(%d)->target(%d) pair", pNewVidPnPresentPathInfo->VidPnSourceId, pNewVidPnPresentPathInfo->VidPnTargetId));
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync return FALSE;
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync }
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ImportanceOrdinal does not matter for now
e255139508b8e3745b53f3679a60efc8d06cf836vboxsync pNewVidPnPresentPathInfo->ImportanceOrdinal
f5395a2af3050ddd694b0ad505975f7b717ab4f1vboxsync */
e255139508b8e3745b53f3679a60efc8d06cf836vboxsync
e255139508b8e3745b53f3679a60efc8d06cf836vboxsync if (pNewVidPnPresentPathInfo->ContentTransformation.Scaling != D3DKMDT_VPPS_UNPINNED
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pNewVidPnPresentPathInfo->ContentTransformation.Scaling != D3DKMDT_VPPS_IDENTITY
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pNewVidPnPresentPathInfo->ContentTransformation.Scaling != D3DKMDT_VPPS_NOTSPECIFIED)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("unsupported Scaling (%d)", pNewVidPnPresentPathInfo->ContentTransformation.Scaling));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync if ( !pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Identity
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync || pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Centered
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync || pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Stretched)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync WARN(("unsupported Scaling support"));
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pNewVidPnPresentPathInfo->ContentTransformation.Rotation != D3DKMDT_VPPR_UNPINNED
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync && pNewVidPnPresentPathInfo->ContentTransformation.Rotation != D3DKMDT_VPPR_IDENTITY
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pNewVidPnPresentPathInfo->ContentTransformation.Rotation != D3DKMDT_VPPR_NOTSPECIFIED)
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync {
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync WARN(("unsupported rotation (%d)", pNewVidPnPresentPathInfo->ContentTransformation.Rotation));
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync if ( !pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Identity
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate90
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate180
65047a71308d9524254c8f60dc1371cf5679d53avboxsync || pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate270)
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("unsupported RotationSupport"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cx
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync || pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cy)
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync {
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync WARN(("Non-zero TLOffset: cx(%d), cy(%d)",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cx,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cy));
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync if (pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cx
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cy)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync WARN(("Non-zero TLOffset: cx(%d), cy(%d)",
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cx,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cy));
a9147f75af731f500aea9d37566e83a1f0e2c51dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync if (pNewVidPnPresentPathInfo->VidPnTargetColorBasis != D3DKMDT_CB_SRGB
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pNewVidPnPresentPathInfo->VidPnTargetColorBasis != D3DKMDT_CB_UNINITIALIZED)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync WARN(("unsupported VidPnTargetColorBasis (%d)", pNewVidPnPresentPathInfo->VidPnTargetColorBasis));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* channels?
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.FirstChannel;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.SecondChannel;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.ThirdChannel;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync we definitely not support fourth channel
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.FourthChannel)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("Non-zero FourthChannel (%d)", pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.FourthChannel));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Content (D3DKMDT_VPPC_GRAPHICS, _NOTSPECIFIED, _VIDEO), does not matter for now
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync pNewVidPnPresentPathInfo->Content
be2589a6f7086676e45b18d204bb1064889dc586vboxsync */
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync /* not support copy protection for now */
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync if (pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionType != D3DKMDT_VPPMT_NOPROTECTION
be2589a6f7086676e45b18d204bb1064889dc586vboxsync && pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionType != D3DKMDT_VPPMT_UNINITIALIZED)
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync {
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync WARN(("Copy protection not supported CopyProtectionType(%d)", pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionType));
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync return FALSE;
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync }
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pNewVidPnPresentPathInfo->CopyProtection.APSTriggerBits)
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("Copy protection not supported APSTriggerBits(%d)", pNewVidPnPresentPathInfo->CopyProtection.APSTriggerBits));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync D3DKMDT_VIDPN_PRESENT_PATH_COPYPROTECTION_SUPPORT tstCPSupport = {0};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync tstCPSupport.NoProtection = 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (memcmp(&tstCPSupport, &pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport, sizeof(tstCPSupport)))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("Copy protection support (0x%x)", *((UINT*)&pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport)));
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync return FALSE;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync if (pNewVidPnPresentPathInfo->GammaRamp.Type != D3DDDI_GAMMARAMP_DEFAULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pNewVidPnPresentPathInfo->GammaRamp.Type != D3DDDI_GAMMARAMP_UNINITIALIZED)
fe376b8f218c234c1ba918513340aff917aa7925vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("Unsupported GammaRamp.Type (%d)", pNewVidPnPresentPathInfo->GammaRamp.Type));
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync return FALSE;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync }
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync if (pNewVidPnPresentPathInfo->GammaRamp.DataSize != 0)
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync {
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync WARN(("Warning: non-zero GammaRamp.DataSize (%d), treating as supported", pNewVidPnPresentPathInfo->GammaRamp.DataSize));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return TRUE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef struct VBOXVIDPNGETPATHSINFO
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync BOOLEAN fBreakOnDisabled;
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync BOOLEAN fDisabledFound;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync UINT cItems;
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync PVBOXVIDPNPATHITEM paItems;
be2589a6f7086676e45b18d204bb1064889dc586vboxsync} VBOXVIDPNGETPATHSINFO, *PVBOXVIDPNGETPATHSINFO;
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsyncstatic DECLCALLBACK(BOOLEAN) vboxVidPnCheckTopologyEnum(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
be2589a6f7086676e45b18d204bb1064889dc586vboxsync const D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo, PVOID pContext)
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync{
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync PVBOXVIDPNGETPATHSINFO pCbContext = (PVBOXVIDPNGETPATHSINFO)pContext;
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync NTSTATUS Status = STATUS_SUCCESS;
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync CONST D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId = pNewVidPnPresentPathInfo->VidPnSourceId;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId = pNewVidPnPresentPathInfo->VidPnTargetId;
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync BOOLEAN fDisabledFound = !vboxVidPnIsPathSupported(pNewVidPnPresentPathInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync do
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (fDisabledFound)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pCbContext->cItems > VidPnSourceId)
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pCbContext->paItems[VidPnSourceId].enmState = VBOXVIDPNPATHITEM_STATE_DISABLED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_BUFFER_OVERFLOW;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pCbContext->cItems > VidPnTargetId)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync pCbContext->paItems[VidPnTargetId].enmState = VBOXVIDPNPATHITEM_STATE_DISABLED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync else
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_BUFFER_OVERFLOW;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync }
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync /* VidPnSourceId == VidPnTargetId */
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync if (pCbContext->cItems > VidPnSourceId)
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pCbContext->paItems[VidPnSourceId].enmState != VBOXVIDPNPATHITEM_STATE_DISABLED)
f5395a2af3050ddd694b0ad505975f7b717ab4f1vboxsync {
e255139508b8e3745b53f3679a60efc8d06cf836vboxsync Assert(pCbContext->paItems[VidPnSourceId].enmState == VBOXVIDPNPATHITEM_STATE_NOT_EXISTS);
e255139508b8e3745b53f3679a60efc8d06cf836vboxsync pCbContext->paItems[VidPnSourceId].enmState = VBOXVIDPNPATHITEM_STATE_PRESENT;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_BUFFER_OVERFLOW;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync break;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync }
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync } while (0);
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pCbContext->fDisabledFound |= fDisabledFound;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync pCbContext->Status = Status;
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync if (!NT_SUCCESS(Status))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FALSE; /* do not continue on failure */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return !fDisabledFound || !pCbContext->fBreakOnDisabled;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync}
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync/* we currently support only 0 -> 0, 1 -> 1, 2 -> 2 paths, AND 0 -> 0 must be present
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync * this routine disables all paths unsupported */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnCheckTopology(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync BOOLEAN fBreakOnDisabled, UINT cItems, PVBOXVIDPNPATHITEM paItems, BOOLEAN *pfDisabledFound)
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync UINT i;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (i = 0; i < cItems; ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync paItems[i].enmState = VBOXVIDPNPATHITEM_STATE_NOT_EXISTS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBOXVIDPNGETPATHSINFO CbContext = {};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CbContext.Status = STATUS_SUCCESS;
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync CbContext.fBreakOnDisabled = fBreakOnDisabled;
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync CbContext.fDisabledFound = FALSE;
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync CbContext.cItems = cItems;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CbContext.paItems = paItems;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync NTSTATUS Status = vboxVidPnEnumPaths(hVidPnTopology, pVidPnTopologyInterface, vboxVidPnCheckTopologyEnum, &CbContext);
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync if (!NT_SUCCESS(Status))
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("vboxVidPnEnumPaths failed Status()0x%x\n", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return Status;
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = CbContext.Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!NT_SUCCESS(Status))
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WARN(("vboxVidPnCheckTopologyEnum returned failed Status()0x%x\n", Status));
fa14b6834510fceb09a719a6f3c933635f441b20vboxsync return Status;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync }
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pfDisabledFound)
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync *pfDisabledFound = CbContext.fDisabledFound;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!fBreakOnDisabled)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync /* now check if 0->0 path is present and enabled, and if not, disable everything */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (cItems && paItems[0].enmState != VBOXVIDPNPATHITEM_STATE_PRESENT)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("path 0 not set to present\n"));
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync for (i = 0; i < cItems; ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (paItems[i].enmState == VBOXVIDPNPATHITEM_STATE_PRESENT)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync paItems[i].enmState = VBOXVIDPNPATHITEM_STATE_DISABLED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync return Status;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncNTSTATUS vboxVidPnEnumMonitorSourceModes(D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS, CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PFNVBOXVIDPNENUMMONITORSOURCEMODES pfnCallback, PVOID pContext)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CONST D3DKMDT_MONITOR_SOURCE_MODE *pMonitorSMI;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS Status = pMonitorSMSIf->pfnAcquireFirstModeInfo(hMonitorSMS, &pMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_DATASET_IS_EMPTY);
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync if (Status == STATUS_SUCCESS)
be2589a6f7086676e45b18d204bb1064889dc586vboxsync {
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync Assert(pMonitorSMI);
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync while (1)
be2589a6f7086676e45b18d204bb1064889dc586vboxsync {
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync CONST D3DKMDT_MONITOR_SOURCE_MODE *pNextMonitorSMI;
a82df5167acec0c75d741d08c1d05a4007e3d50evboxsync Status = pMonitorSMSIf->pfnAcquireNextModeInfo(hMonitorSMS, pMonitorSMI, &pNextMonitorSMI);
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync if (!pfnCallback(hMonitorSMS, pMonitorSMSIf, pMonitorSMI, pContext))
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync {
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (Status == STATUS_SUCCESS)
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pNextMonitorSMI);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_SUCCESS;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x), ignored since callback returned false", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = STATUS_SUCCESS;
be9bc9b4ba510c4b4159c193f783d024633ef8e9vboxsync }
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync break;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else if (Status == STATUS_SUCCESS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pMonitorSMI = pNextMonitorSMI;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
fe376b8f218c234c1ba918513340aff917aa7925vboxsync Status = STATUS_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync }
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync else
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync {
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync AssertBreakpoint();
ed5875886aed64570809cf39f881a0fcb93f44a7vboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x)", Status));
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync pNextMonitorSMI = NULL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d8df004f4caf4f71e78f0be1cc2e2a918358ae9fvboxsync }
ebe05ec36d1fcd24d62e7066dedcb4eb2e691358vboxsync else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync Status = STATUS_SUCCESS;
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync else
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync LOGREL(("pfnAcquireFirstModeInfo failed Status(0x%x)", Status));
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync return Status;
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync}
ebe05ec36d1fcd24d62e7066dedcb4eb2e691358vboxsync
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsyncNTSTATUS vboxVidPnEnumSourceModes(D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync PFNVBOXVIDPNENUMSOURCEMODES pfnCallback, PVOID pContext)
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync{
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync NTSTATUS Status = pVidPnSourceModeSetInterface->pfnAcquireFirstModeInfo(hNewVidPnSourceModeSet, &pNewVidPnSourceModeInfo);
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync if (Status == STATUS_SUCCESS)
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync {
3f87e8441654102266beb3bda1446e4878360a84vboxsync Assert(pNewVidPnSourceModeInfo);
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync while (1)
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync {
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNextVidPnSourceModeInfo;
d7f13a056a2bfd91ca8973baf89c7d87c2d1bf80vboxsync Status = pVidPnSourceModeSetInterface->pfnAcquireNextModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo, &pNextVidPnSourceModeInfo);
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync if (!pfnCallback(hNewVidPnSourceModeSet, pVidPnSourceModeSetInterface,
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync pNewVidPnSourceModeInfo, pContext))
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync {
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync Assert(Status == STATUS_SUCCESS);
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync if (Status == STATUS_SUCCESS)
be9322776c5e79993df07a0728780a4397be7388vboxsync pVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pNextVidPnSourceModeInfo);
be9322776c5e79993df07a0728780a4397be7388vboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync {
be9322776c5e79993df07a0728780a4397be7388vboxsync Status = STATUS_SUCCESS;
be9322776c5e79993df07a0728780a4397be7388vboxsync break;
be9322776c5e79993df07a0728780a4397be7388vboxsync }
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync else
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync {
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x), ignored since callback returned false", Status));
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync Status = STATUS_SUCCESS;
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync }
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync break;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync }
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync else if (Status == STATUS_SUCCESS)
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync pNewVidPnSourceModeInfo = pNextVidPnSourceModeInfo;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync {
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync Status = STATUS_SUCCESS;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync break;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync }
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync else
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync {
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync AssertBreakpoint();
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x)", Status));
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync pNewVidPnSourceModeInfo = NULL;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync break;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync }
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync }
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync }
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
0d0687880459ea33aa3e9c5a74d736edcb0937devboxsync Status = STATUS_SUCCESS;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync else
9243c25e887b8f49e764b130c132bbe1b60bed50vboxsync LOGREL(("pfnAcquireFirstModeInfo failed Status(0x%x)", Status));
9243c25e887b8f49e764b130c132bbe1b60bed50vboxsync
d45f7f7fe0c28b500b45b2dc88d7a04f4c0be6b8vboxsync return Status;
7250d2692ab7cbd235c2feeb78e48f0bdb302f14vboxsync}
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync
9243c25e887b8f49e764b130c132bbe1b60bed50vboxsyncNTSTATUS vboxVidPnEnumTargetModes(D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
d45f7f7fe0c28b500b45b2dc88d7a04f4c0be6b8vboxsync PFNVBOXVIDPNENUMTARGETMODES pfnCallback, PVOID pContext)
7250d2692ab7cbd235c2feeb78e48f0bdb302f14vboxsync{
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo;
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync NTSTATUS Status = pVidPnTargetModeSetInterface->pfnAcquireFirstModeInfo(hNewVidPnTargetModeSet, &pNewVidPnTargetModeInfo);
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync if (Status == STATUS_SUCCESS)
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync {
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync Assert(pNewVidPnTargetModeInfo);
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync while (1)
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync {
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNextVidPnTargetModeInfo;
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync Status = pVidPnTargetModeSetInterface->pfnAcquireNextModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo, &pNextVidPnTargetModeInfo);
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync if (!pfnCallback(hNewVidPnTargetModeSet, pVidPnTargetModeSetInterface,
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync pNewVidPnTargetModeInfo, pContext))
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync {
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync Assert(Status == STATUS_SUCCESS);
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync if (Status == STATUS_SUCCESS)
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync pVidPnTargetModeSetInterface->pfnReleaseModeInfo(hNewVidPnTargetModeSet, pNextVidPnTargetModeInfo);
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync {
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync Status = STATUS_SUCCESS;
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync break;
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync }
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync else
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync {
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x), ignored since callback returned false", Status));
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync Status = STATUS_SUCCESS;
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync }
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync break;
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync }
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync else if (Status == STATUS_SUCCESS)
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync pNewVidPnTargetModeInfo = pNextVidPnTargetModeInfo;
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync {
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync Status = STATUS_SUCCESS;
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync break;
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync }
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync else
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync {
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync AssertBreakpoint();
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x)", Status));
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync pNewVidPnTargetModeInfo = NULL;
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync break;
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync }
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync }
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync }
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync Status = STATUS_SUCCESS;
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync else
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync LOGREL(("pfnAcquireFirstModeInfo failed Status(0x%x)", Status));
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync return Status;
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync}
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync
2af2d8756d82236367dfee425f88eb7141a490cbvboxsyncNTSTATUS vboxVidPnEnumTargetsForSource(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync CONST D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId,
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync PFNVBOXVIDPNENUMTARGETSFORSOURCE pfnCallback, PVOID pContext)
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync{
2af2d8756d82236367dfee425f88eb7141a490cbvboxsync SIZE_T cTgtPaths;
ebe05ec36d1fcd24d62e7066dedcb4eb2e691358vboxsync NTSTATUS Status = pVidPnTopologyInterface->pfnGetNumPathsFromSource(hVidPnTopology, VidPnSourceId, &cTgtPaths);
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY);
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync if (Status == STATUS_SUCCESS)
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync {
ebe05ec36d1fcd24d62e7066dedcb4eb2e691358vboxsync for (SIZE_T i = 0; i < cTgtPaths; ++i)
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync {
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId;
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync Status = pVidPnTopologyInterface->pfnEnumPathTargetsFromSource(hVidPnTopology, VidPnSourceId, i, &VidPnTargetId);
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync Assert(Status == STATUS_SUCCESS);
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync if (Status == STATUS_SUCCESS)
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync {
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync if (!pfnCallback(pDevExt, hVidPnTopology, pVidPnTopologyInterface, VidPnSourceId, VidPnTargetId, cTgtPaths, pContext))
4eff20ce85bd2f6c2e942f4b02f201d17fec1059vboxsync break;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync }
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync else
be9322776c5e79993df07a0728780a4397be7388vboxsync {
be9322776c5e79993df07a0728780a4397be7388vboxsync LOGREL(("pfnEnumPathTargetsFromSource failed Status(0x%x)", Status));
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync break;
be9322776c5e79993df07a0728780a4397be7388vboxsync }
be9322776c5e79993df07a0728780a4397be7388vboxsync }
be9322776c5e79993df07a0728780a4397be7388vboxsync }
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync else if (Status != STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY)
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync LOGREL(("pfnGetNumPathsFromSource failed Status(0x%x)", Status));
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync return Status;
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync}
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsyncNTSTATUS vboxVidPnEnumPaths(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync PFNVBOXVIDPNENUMPATHS pfnCallback, PVOID pContext)
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync{
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync const D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo = NULL;
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync NTSTATUS Status = pVidPnTopologyInterface->pfnAcquireFirstPathInfo(hVidPnTopology, &pNewVidPnPresentPathInfo);
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync if (Status == STATUS_SUCCESS)
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync {
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync while (1)
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync {
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync const D3DKMDT_VIDPN_PRESENT_PATH *pNextVidPnPresentPathInfo;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync Status = pVidPnTopologyInterface->pfnAcquireNextPathInfo(hVidPnTopology, pNewVidPnPresentPathInfo, &pNextVidPnPresentPathInfo);
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync
51afd9e19409617e8f3a204d58e96e22ee618e57vboxsync if (!pfnCallback(hVidPnTopology, pVidPnTopologyInterface, pNewVidPnPresentPathInfo, pContext))
b9324cf9058e6ab9a0c16018e5e4f366a58a7d19vboxsync {
b9324cf9058e6ab9a0c16018e5e4f366a58a7d19vboxsync if (Status == STATUS_SUCCESS)
b9324cf9058e6ab9a0c16018e5e4f366a58a7d19vboxsync pVidPnTopologyInterface->pfnReleasePathInfo(hVidPnTopology, pNextVidPnPresentPathInfo);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync else
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync {
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync Assert(Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET);
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync if (Status != STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync LOGREL(("pfnAcquireNextPathInfo Failed Status(0x%x), ignored since callback returned false", Status));
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync Status = STATUS_SUCCESS;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync }
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync
87fe4d73d7e6e53fbcec40dc6be2372479851cd4vboxsync break;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync }
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync else if (Status == STATUS_SUCCESS)
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync pNewVidPnPresentPathInfo = pNextVidPnPresentPathInfo;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync {
b9324cf9058e6ab9a0c16018e5e4f366a58a7d19vboxsync Status = STATUS_SUCCESS;
15cb2a15b8a2bf93c7e5e83d801e6184ed3ab3e2vboxsync break;
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync }
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync else
8f3f7a8bb1cf9f74426deee5af7432ebd63de2b1vboxsync {
AssertBreakpoint();
LOGREL(("pfnAcquireNextPathInfo Failed Status(0x%x)", Status));
pNewVidPnPresentPathInfo = NULL;
break;
}
}
}
else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
Status = STATUS_SUCCESS;
else
LOGREL(("pfnAcquireFirstModeInfo failed Status(0x%x)", 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)
{
vboxWddmAssignPrimary(pDevExt, pSource, pAllocation, srcId);
return STATUS_SUCCESS;
}
NTSTATUS vboxVidPnCommitSourceMode(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, PVBOXWDDM_ALLOCATION pAllocation)
{
Assert(srcId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
if (srcId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays)
{
PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[srcId];
return vboxVidPnSetupSourceInfo(pDevExt, srcId, pSource, pVidPnSourceModeInfo, pAllocation);
}
LOGREL(("invalid srcId (%d), cSources(%d)", srcId, VBoxCommonFromDeviceExt(pDevExt)->cDisplays));
return STATUS_INVALID_PARAMETER;
}
typedef struct VBOXVIDPNCOMMITTARGETMODE
{
NTSTATUS Status;
D3DKMDT_HVIDPN hVidPn;
const DXGK_VIDPN_INTERFACE* pVidPnInterface;
} 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)
{
VBOXVIDPNCOMMITTARGETMODE *pInfo = (VBOXVIDPNCOMMITTARGETMODE*)pContext;
Assert(cTgtPaths <= (SIZE_T)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
D3DKMDT_HVIDPNTARGETMODESET hVidPnTargetModeSet;
CONST DXGK_VIDPNTARGETMODESET_INTERFACE* pVidPnTargetModeSetInterface;
NTSTATUS Status = pInfo->pVidPnInterface->pfnAcquireTargetModeSet(pInfo->hVidPn, VidPnTargetId, &hVidPnTargetModeSet, &pVidPnTargetModeSetInterface);
Assert(Status == STATUS_SUCCESS);
if (Status == STATUS_SUCCESS)
{
CONST D3DKMDT_VIDPN_TARGET_MODE* pPinnedVidPnTargetModeInfo;
Status = pVidPnTargetModeSetInterface->pfnAcquirePinnedModeInfo(hVidPnTargetModeSet, &pPinnedVidPnTargetModeInfo);
Assert(Status == STATUS_SUCCESS);
if (Status == STATUS_SUCCESS)
{
VBOXWDDM_TARGET *pTarget = &pDevExt->aTargets[VidPnTargetId];
if (pTarget->HeightVisible != pPinnedVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cy
|| pTarget->HeightTotal != pPinnedVidPnTargetModeInfo->VideoSignalInfo.TotalSize.cy)
{
pTarget->HeightVisible = pPinnedVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cy;
pTarget->HeightTotal = pPinnedVidPnTargetModeInfo->VideoSignalInfo.TotalSize.cy;
pTarget->ScanLineState = 0;
}
pVidPnTargetModeSetInterface->pfnReleaseModeInfo(hVidPnTargetModeSet, pPinnedVidPnTargetModeInfo);
}
pInfo->pVidPnInterface->pfnReleaseTargetModeSet(pInfo->hVidPn, hVidPnTargetModeSet);
}
else
LOGREL(("pfnAcquireTargetModeSet failed Status(0x%x)", Status));
pInfo->Status = Status;
return Status == STATUS_SUCCESS;
}
NTSTATUS vboxVidPnCommitSourceModeForSrcId(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, PVBOXWDDM_ALLOCATION pAllocation)
{
D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet;
const DXGK_VIDPNSOURCEMODESET_INTERFACE *pCurVidPnSourceModeSetInterface;
NTSTATUS Status = pVidPnInterface->pfnAcquireSourceModeSet(hDesiredVidPn,
srcId,
&hCurVidPnSourceModeSet,
&pCurVidPnSourceModeSetInterface);
Assert(Status == STATUS_SUCCESS);
if (Status == STATUS_SUCCESS)
{
CONST D3DKMDT_VIDPN_SOURCE_MODE* pPinnedVidPnSourceModeInfo;
Status = pCurVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_MODE_NOT_PINNED);
if (Status == STATUS_SUCCESS)
{
Assert(pPinnedVidPnSourceModeInfo);
Status = vboxVidPnCommitSourceMode(pDevExt, srcId, pPinnedVidPnSourceModeInfo, pAllocation);
Assert(Status == STATUS_SUCCESS);
if (Status == STATUS_SUCCESS)
{
D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology;
CONST DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface;
Status = pVidPnInterface->pfnGetTopology(hDesiredVidPn, &hVidPnTopology, &pVidPnTopologyInterface);
Assert(Status == STATUS_SUCCESS);
if (Status == STATUS_SUCCESS)
{
VBOXVIDPNCOMMITTARGETMODE TgtModeInfo = {0};
TgtModeInfo.Status = STATUS_SUCCESS; /* <- to ensure we're succeeded if no targets are set */
TgtModeInfo.hVidPn = hDesiredVidPn;
TgtModeInfo.pVidPnInterface = pVidPnInterface;
Status = vboxVidPnEnumTargetsForSource(pDevExt, hVidPnTopology, pVidPnTopologyInterface,
srcId,
vboxVidPnCommitTargetModeEnum, &TgtModeInfo);
Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY);
if (Status == STATUS_SUCCESS)
{
Status = TgtModeInfo.Status;
Assert(Status == STATUS_SUCCESS);
}
else if (Status == STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY)
{
Status = STATUS_SUCCESS;
}
else
LOGREL(("vboxVidPnEnumTargetsForSource failed Status(0x%x)", Status));
}
else
LOGREL(("pfnGetTopology failed Status(0x%x)", Status));
}
else
LOGREL(("vboxVidPnCommitSourceMode failed Status(0x%x)", Status));
/* release */
pCurVidPnSourceModeSetInterface->pfnReleaseModeInfo(hCurVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
}
else if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
{
Status = vboxVidPnCommitSourceMode(pDevExt, srcId, NULL, pAllocation);
Assert(Status == STATUS_SUCCESS);
}
else
LOGREL(("pfnAcquirePinnedModeInfo failed Status(0x%x)", Status));
pVidPnInterface->pfnReleaseSourceModeSet(hDesiredVidPn, hCurVidPnSourceModeSet);
}
else
{
LOGREL(("pfnAcquireSourceModeSet failed Status(0x%x)", Status));
}
return Status;
}
DECLCALLBACK(BOOLEAN) vboxVidPnCommitPathEnum(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
const D3DKMDT_VIDPN_PRESENT_PATH *pVidPnPresentPathInfo, PVOID pContext)
{
NTSTATUS Status = STATUS_SUCCESS;
PVBOXVIDPNCOMMIT pCommitInfo = (PVBOXVIDPNCOMMIT)pContext;
PVBOXMP_DEVEXT pDevExt = pCommitInfo->pDevExt;
const D3DKMDT_HVIDPN hDesiredVidPn = pCommitInfo->pCommitVidPnArg->hFunctionalVidPn;
const DXGK_VIDPN_INTERFACE* pVidPnInterface = pCommitInfo->pVidPnInterface;
if (pCommitInfo->pCommitVidPnArg->AffectedVidPnSourceId == D3DDDI_ID_ALL
|| pCommitInfo->pCommitVidPnArg->AffectedVidPnSourceId == pVidPnPresentPathInfo->VidPnSourceId)
{
Status = vboxVidPnCommitSourceModeForSrcId(pDevExt, hDesiredVidPn, pVidPnInterface, pVidPnPresentPathInfo->VidPnSourceId, (PVBOXWDDM_ALLOCATION)pCommitInfo->pCommitVidPnArg->hPrimaryAllocation);
Assert(Status == STATUS_SUCCESS);
if (Status != STATUS_SUCCESS)
LOGREL(("vboxVidPnCommitSourceModeForSrcId failed Status(0x%x)", Status));
}
pCommitInfo->Status = Status;
pVidPnTopologyInterface->pfnReleasePathInfo(hVidPnTopology, pVidPnPresentPathInfo);
return Status == STATUS_SUCCESS;
}
#define VBOXVIDPNDUMP_STRCASE(_t) \
case _t: return #_t;
#define VBOXVIDPNDUMP_STRCASE_UNKNOWN() \
default: Assert(0); return "Unknown";
#define VBOXVIDPNDUMP_STRFLAGS(_v, _t) \
if ((_v)._t return #_t;
const char* vboxVidPnDumpStrImportance(D3DKMDT_VIDPN_PRESENT_PATH_IMPORTANCE ImportanceOrdinal)
{
switch (ImportanceOrdinal)
{
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_PRIMARY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_SECONDARY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_TERTIARY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_QUATERNARY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_QUINARY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_SENARY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_SEPTENARY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_OCTONARY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_NONARY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_DENARY);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrScaling(D3DKMDT_VIDPN_PRESENT_PATH_SCALING Scaling)
{
switch (Scaling)
{
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_IDENTITY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_CENTERED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_STRETCHED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_UNPINNED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_NOTSPECIFIED);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrRotation(D3DKMDT_VIDPN_PRESENT_PATH_ROTATION Rotation)
{
switch (Rotation)
{
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_IDENTITY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_ROTATE90);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_ROTATE180);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_ROTATE270);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_UNPINNED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_NOTSPECIFIED);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrColorBasis(const D3DKMDT_COLOR_BASIS ColorBasis)
{
switch (ColorBasis)
{
VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_INTENSITY);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_SRGB);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_SCRGB);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_YCBCR);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_YPBPR);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrPvam(D3DKMDT_PIXEL_VALUE_ACCESS_MODE PixelValueAccessMode)
{
switch (PixelValueAccessMode)
{
VBOXVIDPNDUMP_STRCASE(D3DKMDT_PVAM_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_PVAM_DIRECT);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_PVAM_PRESETPALETTE);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_PVAM_SETTABLEPALETTE);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrContent(D3DKMDT_VIDPN_PRESENT_PATH_CONTENT Content)
{
switch (Content)
{
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPC_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPC_GRAPHICS);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPC_VIDEO);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPC_NOTSPECIFIED);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrCopyProtectionType(D3DKMDT_VIDPN_PRESENT_PATH_COPYPROTECTION_TYPE CopyProtectionType)
{
switch (CopyProtectionType)
{
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPMT_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPMT_NOPROTECTION);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPMT_MACROVISION_APSTRIGGER);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPMT_MACROVISION_FULLSUPPORT);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrGammaRampType(D3DDDI_GAMMARAMP_TYPE Type)
{
switch (Type)
{
VBOXVIDPNDUMP_STRCASE(D3DDDI_GAMMARAMP_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DDDI_GAMMARAMP_DEFAULT);
VBOXVIDPNDUMP_STRCASE(D3DDDI_GAMMARAMP_RGB256x3x16);
VBOXVIDPNDUMP_STRCASE(D3DDDI_GAMMARAMP_DXGI_1);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrSourceModeType(D3DKMDT_VIDPN_SOURCE_MODE_TYPE Type)
{
switch (Type)
{
VBOXVIDPNDUMP_STRCASE(D3DKMDT_RMT_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_RMT_GRAPHICS);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_RMT_TEXT);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrScanLineOrdering(D3DDDI_VIDEO_SIGNAL_SCANLINE_ORDERING ScanLineOrdering)
{
switch (ScanLineOrdering)
{
VBOXVIDPNDUMP_STRCASE(D3DDDI_VSSLO_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DDDI_VSSLO_PROGRESSIVE);
VBOXVIDPNDUMP_STRCASE(D3DDDI_VSSLO_INTERLACED_UPPERFIELDFIRST);
VBOXVIDPNDUMP_STRCASE(D3DDDI_VSSLO_INTERLACED_LOWERFIELDFIRST);
VBOXVIDPNDUMP_STRCASE(D3DDDI_VSSLO_OTHER);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrCFMPivotType(D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE EnumPivotType)
{
switch (EnumPivotType)
{
VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_VIDPNSOURCE);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_VIDPNTARGET);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_SCALING);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_ROTATION);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_NOPIVOT);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrModePreference(D3DKMDT_MODE_PREFERENCE Preference)
{
switch (Preference)
{
VBOXVIDPNDUMP_STRCASE(D3DKMDT_MP_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_MP_PREFERRED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_MP_NOTPREFERRED);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrSignalStandard(D3DKMDT_VIDEO_SIGNAL_STANDARD VideoStandard)
{
switch (VideoStandard)
{
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_UNINITIALIZED);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_VESA_DMT);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_VESA_GTF);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_VESA_CVT);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_IBM);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_APPLE);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_NTSC_M);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_NTSC_J);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_NTSC_443);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_B);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_B1);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_G);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_H);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_I);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_D);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_N);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_NC);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_B);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_D);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_G);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_H);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_K);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_K1);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_L);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_L1);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_EIA_861);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_EIA_861A);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_EIA_861B);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_K);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_K1);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_L);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_M);
VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_OTHER);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
const char* vboxVidPnDumpStrPixFormat(D3DDDIFORMAT PixelFormat)
{
switch (PixelFormat)
{
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_UNKNOWN);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R8G8B8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8R8G8B8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X8R8G8B8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R5G6B5);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X1R5G5B5);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A1R5G5B5);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A4R4G4B4);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R3G3B2);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8R3G3B2);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X4R4G4B4);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A2B10G10R10);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8B8G8R8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X8B8G8R8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_G16R16);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A2R10G10B10);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A16B16G16R16);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8P8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R32F);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_G32R32F);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A32B32G32R32F);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_CxV8U8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A1);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_BINARYBUFFER);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_VERTEXDATA);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_INDEX16);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_INDEX32);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_Q16W16V16U16);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_MULTI2_ARGB8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R16F);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_G16R16F);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A16B16G16R16F);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D32F_LOCKABLE);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D24FS8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D32_LOCKABLE);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_S8_LOCKABLE);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_S1D15);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_S8D24);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X8D24);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X4S4D24);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_L16);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_UYVY);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R8G8_B8G8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_YUY2);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_G8R8_G8B8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_DXT1);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_DXT2);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_DXT3);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_DXT4);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_DXT5);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D16_LOCKABLE);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D32);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D15S1);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D24S8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D24X8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D24X4S4);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D16);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_P8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_L8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8L8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A4L4);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_V8U8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_L6V5U5);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X8L8V8U8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_Q8W8V8U8);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_V16U16);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_W11V11U10);
VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A2W10V10U10);
VBOXVIDPNDUMP_STRCASE_UNKNOWN();
}
}
void vboxVidPnDumpCopyProtectoin(const char *pPrefix, const D3DKMDT_VIDPN_PRESENT_PATH_COPYPROTECTION *pCopyProtection, const char *pSuffix)
{
LOGREL_EXACT(("%sType(%s), TODO%s", pPrefix,
vboxVidPnDumpStrCopyProtectionType(pCopyProtection->CopyProtectionType), pSuffix));
}
void vboxVidPnDumpPathTransformation(const D3DKMDT_VIDPN_PRESENT_PATH_TRANSFORMATION *pContentTransformation)
{
LOGREL_EXACT((" --Transformation: Scaling(%s), ScalingSupport(%d), Rotation(%s), RotationSupport(%d)--",
vboxVidPnDumpStrScaling(pContentTransformation->Scaling), pContentTransformation->ScalingSupport,
vboxVidPnDumpStrRotation(pContentTransformation->Rotation), pContentTransformation->RotationSupport));
}
void vboxVidPnDumpRegion(const char *pPrefix, const D3DKMDT_2DREGION *pRegion, const char *pSuffix)
{
LOGREL_EXACT(("%s%dX%d%s", pPrefix, pRegion->cx, pRegion->cy, pSuffix));
}
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,
pDynamicRanges->FirstChannel,
pDynamicRanges->SecondChannel,
pDynamicRanges->ThirdChannel,
pDynamicRanges->FourthChannel,
pSuffix));
}
void vboxVidPnDumpGammaRamp(const char *pPrefix, const D3DKMDT_GAMMA_RAMP *pGammaRamp, const char *pSuffix)
{
LOGREL_EXACT(("%sType(%s), DataSize(%d), TODO: dump the rest%s", pPrefix,
vboxVidPnDumpStrGammaRampType(pGammaRamp->Type), pGammaRamp->DataSize,
pSuffix));
}
void vboxVidPnDumpSourceMode(const char *pPrefix, const D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, const char *pSuffix)
{
LOGREL_EXACT(("%sType(%s), ", pPrefix, vboxVidPnDumpStrSourceModeType(pVidPnSourceModeInfo->Type)));
vboxVidPnDumpRegion("surf(", &pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize, "), ");
vboxVidPnDumpRegion("vis(", &pVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize, "), ");
LOGREL_EXACT(("stride(%d), ", pVidPnSourceModeInfo->Format.Graphics.Stride));
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)));
vboxVidPnDumpRegion("totSize(", &pVideoSignalInfo->TotalSize, "), ");
vboxVidPnDumpRegion("activeSize(", &pVideoSignalInfo->ActiveSize, "), ");
vboxVidPnDumpRational("VSynch(", &pVideoSignalInfo->VSyncFreq, "), ");
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(("%s", pPrefix));
vboxVidPnDumpSignalInfo("VSI: ", &pVidPnTargetModeInfo->VideoSignalInfo, ", ");
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)
{
D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet;
const DXGK_VIDPNSOURCEMODESET_INTERFACE *pCurVidPnSourceModeSetInterface;
NTSTATUS Status = pVidPnInterface->pfnAcquireSourceModeSet(hVidPn,
VidPnSourceId,
&hCurVidPnSourceModeSet,
&pCurVidPnSourceModeSetInterface);
Assert(Status == STATUS_SUCCESS);
if (Status == STATUS_SUCCESS)
{
CONST D3DKMDT_VIDPN_SOURCE_MODE* pPinnedVidPnSourceModeInfo;
Status = pCurVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_MODE_NOT_PINNED);
if (Status == STATUS_SUCCESS)
{
vboxVidPnDumpSourceMode("Source Pinned: ", pPinnedVidPnSourceModeInfo, "\n");
pCurVidPnSourceModeSetInterface->pfnReleaseModeInfo(hCurVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
}
else if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
{
LOGREL_EXACT(("Source NOT Pinned\n"));
}
else
{
LOGREL_EXACT(("ERROR getting piined Source Mode(0x%x)\n", Status));
}
pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hCurVidPnSourceModeSet);
}
else
{
LOGREL_EXACT(("ERROR getting SourceModeSet(0x%x)\n", Status));
}
}
DECLCALLBACK(BOOLEAN) vboxVidPnDumpSourceModeSetEnum(D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
const D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo, PVOID pContext)
{
vboxVidPnDumpSourceMode("SourceMode: ", pNewVidPnSourceModeInfo, "\n");
return TRUE;
}
void vboxVidPnDumpSourceModeSet(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
{
LOGREL_EXACT((" >>>+++SourceMode Set for Source(%d)+++\n", VidPnSourceId));
D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet;
const DXGK_VIDPNSOURCEMODESET_INTERFACE *pCurVidPnSourceModeSetInterface;
NTSTATUS Status = pVidPnInterface->pfnAcquireSourceModeSet(hVidPn,
VidPnSourceId,
&hCurVidPnSourceModeSet,
&pCurVidPnSourceModeSetInterface);
Assert(Status == STATUS_SUCCESS);
if (Status == STATUS_SUCCESS)
{
Status = vboxVidPnEnumSourceModes(hCurVidPnSourceModeSet, pCurVidPnSourceModeSetInterface,
vboxVidPnDumpSourceModeSetEnum, NULL);
Assert(Status == STATUS_SUCCESS);
if (Status != STATUS_SUCCESS)
{
LOGREL_EXACT(("ERROR enumerating Source Modes(0x%x)\n", Status));
}
pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hCurVidPnSourceModeSet);
}
else
{
LOGREL_EXACT(("ERROR getting SourceModeSet for Source(%d), Status(0x%x)\n", VidPnSourceId, Status));
}
LOGREL_EXACT((" <<<+++End Of SourceMode Set for Source(%d)+++", VidPnSourceId));
}
DECLCALLBACK(BOOLEAN) vboxVidPnDumpTargetModeSetEnum(D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
const D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo, PVOID pContext)
{
vboxVidPnDumpTargetMode("TargetMode: ", pNewVidPnTargetModeInfo, "\n");
return TRUE;
}
void vboxVidPnDumpTargetModeSet(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
{
LOGREL_EXACT((" >>>---TargetMode Set for Target(%d)---\n", VidPnTargetId));
D3DKMDT_HVIDPNTARGETMODESET hCurVidPnTargetModeSet;
const DXGK_VIDPNTARGETMODESET_INTERFACE *pCurVidPnTargetModeSetInterface;
NTSTATUS Status = pVidPnInterface->pfnAcquireTargetModeSet(hVidPn,
VidPnTargetId,
&hCurVidPnTargetModeSet,
&pCurVidPnTargetModeSetInterface);
Assert(Status == STATUS_SUCCESS);
if (Status == STATUS_SUCCESS)
{
Status = vboxVidPnEnumTargetModes(hCurVidPnTargetModeSet, pCurVidPnTargetModeSetInterface,
vboxVidPnDumpTargetModeSetEnum, NULL);
Assert(Status == STATUS_SUCCESS);
if (Status != STATUS_SUCCESS)
{
LOGREL_EXACT(("ERROR enumerating Target Modes(0x%x)\n", Status));
}
pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hCurVidPnTargetModeSet);
}
else
{
LOGREL_EXACT(("ERROR getting TargetModeSet for Target(%d), Status(0x%x)\n", VidPnTargetId, Status));
}
LOGREL_EXACT((" <<<---End Of TargetMode Set for Target(%d)---", VidPnTargetId));
}
void vboxVidPnDumpPinnedTargetMode(const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
{
D3DKMDT_HVIDPNTARGETMODESET hCurVidPnTargetModeSet;
const DXGK_VIDPNTARGETMODESET_INTERFACE *pCurVidPnTargetModeSetInterface;
NTSTATUS Status = pVidPnInterface->pfnAcquireTargetModeSet(hVidPn,
VidPnTargetId,
&hCurVidPnTargetModeSet,
&pCurVidPnTargetModeSetInterface);
Assert(Status == STATUS_SUCCESS);
if (Status == STATUS_SUCCESS)
{
CONST D3DKMDT_VIDPN_TARGET_MODE* pPinnedVidPnTargetModeInfo;
Status = pCurVidPnTargetModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnTargetModeSet, &pPinnedVidPnTargetModeInfo);
Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_MODE_NOT_PINNED);
if (Status == STATUS_SUCCESS)
{
vboxVidPnDumpTargetMode("Target Pinned: ", pPinnedVidPnTargetModeInfo, "\n");
pCurVidPnTargetModeSetInterface->pfnReleaseModeInfo(hCurVidPnTargetModeSet, pPinnedVidPnTargetModeInfo);
}
else if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
{
LOGREL_EXACT(("Target NOT Pinned\n"));
}
else
{
LOGREL_EXACT(("ERROR getting piined Target Mode(0x%x)\n", Status));
}
pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hCurVidPnTargetModeSet);
}
else
{
LOGREL_EXACT(("ERROR getting TargetModeSet(0x%x)\n", Status));
}
}
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)
{
LOGREL_EXACT((" >>**** Start Dump VidPn Path ****>>\n"));
LOGREL_EXACT(("VidPnSourceId(%d), VidPnTargetId(%d)\n",
pVidPnPresentPathInfo->VidPnSourceId, pVidPnPresentPathInfo->VidPnTargetId));
vboxVidPnDumpPinnedSourceMode(hVidPn, pVidPnInterface, pVidPnPresentPathInfo->VidPnSourceId);
vboxVidPnDumpPinnedTargetMode(hVidPn, pVidPnInterface, pVidPnPresentPathInfo->VidPnTargetId);
vboxVidPnDumpPathTransformation(&pVidPnPresentPathInfo->ContentTransformation);
LOGREL_EXACT(("Importance(%s), TargetColorBasis(%s), Content(%s), ",
vboxVidPnDumpStrImportance(pVidPnPresentPathInfo->ImportanceOrdinal),
vboxVidPnDumpStrColorBasis(pVidPnPresentPathInfo->VidPnTargetColorBasis),
vboxVidPnDumpStrContent(pVidPnPresentPathInfo->Content)));
vboxVidPnDumpRegion("VFA_TL_O(", &pVidPnPresentPathInfo->VisibleFromActiveTLOffset, "), ");
vboxVidPnDumpRegion("VFA_BR_O(", &pVidPnPresentPathInfo->VisibleFromActiveBROffset, "), ");
vboxVidPnDumpRanges("CCDynamicRanges: ", &pVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges, "| ");
vboxVidPnDumpCopyProtectoin("CProtection: ", &pVidPnPresentPathInfo->CopyProtection, "| ");
vboxVidPnDumpGammaRamp("GammaRamp: ", &pVidPnPresentPathInfo->GammaRamp, "\n");
LOGREL_EXACT((" <<**** Stop Dump VidPn Path ****<<"));
}
typedef struct VBOXVIDPNDUMPPATHENUM
{
D3DKMDT_HVIDPN hVidPn;
const DXGK_VIDPN_INTERFACE* pVidPnInterface;
} VBOXVIDPNDUMPPATHENUM, *PVBOXVIDPNDUMPPATHENUM;
static DECLCALLBACK(BOOLEAN) vboxVidPnDumpPathEnum(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
const D3DKMDT_VIDPN_PRESENT_PATH *pVidPnPresentPathInfo, PVOID pContext)
{
PVBOXVIDPNDUMPPATHENUM pData = (PVBOXVIDPNDUMPPATHENUM)pContext;
vboxVidPnDumpPath(pData->hVidPn, pData->pVidPnInterface, pVidPnPresentPathInfo);
pVidPnTopologyInterface->pfnReleasePathInfo(hVidPnTopology, pVidPnPresentPathInfo);
return TRUE;
}
void vboxVidPnDumpVidPn(const char * pPrefix, PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, const char * pSuffix)
{
LOGREL_EXACT(("%s", pPrefix));
VBOXVIDPNDUMPPATHENUM CbData;
CbData.hVidPn = hVidPn;
CbData.pVidPnInterface = pVidPnInterface;
D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology;
const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface;
NTSTATUS Status = pVidPnInterface->pfnGetTopology(hVidPn, &hVidPnTopology, &pVidPnTopologyInterface);
Assert(Status == STATUS_SUCCESS);
if (Status == STATUS_SUCCESS)
{
Status = vboxVidPnEnumPaths(hVidPnTopology, pVidPnTopologyInterface,
vboxVidPnDumpPathEnum, &CbData);
Assert(Status == STATUS_SUCCESS);
}
for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
{
vboxVidPnDumpSourceModeSet(pDevExt, hVidPn, pVidPnInterface, (D3DDDI_VIDEO_PRESENT_SOURCE_ID)i);
vboxVidPnDumpTargetModeSet(pDevExt, hVidPn, pVidPnInterface, (D3DDDI_VIDEO_PRESENT_TARGET_ID)i);
}
LOGREL_EXACT(("%s", pSuffix));
}