9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox WDDM Miniport driver
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2011-2013 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxMPWddm.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxMPVidPn.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "common/VBoxMPCommon.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic D3DDDIFORMAT vboxWddmCalcPixelFormat(const VIDEO_MODE_INFORMATION *pInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (pInfo->BitsPerPlane)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case 32:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!(pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && !(pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pInfo->RedMask == 0xFF0000 && pInfo->GreenMask == 0xFF00 && pInfo->BlueMask == 0xFF)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return D3DDDIFMT_A8R8G8B8;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("unsupported format: bpp(%d), rmask(%d), gmask(%d), bmask(%d)",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->BitsPerPlane, pInfo->RedMask, pInfo->GreenMask, pInfo->BlueMask));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case 24:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!(pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && !(pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pInfo->RedMask == 0xFF0000 && pInfo->GreenMask == 0xFF00 && pInfo->BlueMask == 0xFF)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return D3DDDIFMT_R8G8B8;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("unsupported format: bpp(%d), rmask(%d), gmask(%d), bmask(%d)",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->BitsPerPlane, pInfo->RedMask, pInfo->GreenMask, pInfo->BlueMask));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case 16:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!(pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && !(pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pInfo->RedMask == 0xF800 && pInfo->GreenMask == 0x7E0 && pInfo->BlueMask == 0x1F)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return D3DDDIFMT_R5G6B5;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("unsupported format: bpp(%d), rmask(%d), gmask(%d), bmask(%d)",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->BitsPerPlane, pInfo->RedMask, pInfo->GreenMask, pInfo->BlueMask));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case 8:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if((pInfo->AttributeFlags & VIDEO_MODE_PALETTE_DRIVEN) && (pInfo->AttributeFlags & VIDEO_MODE_MANAGED_PALETTE))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return D3DDDIFMT_P8;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("unsupported AttributeFlags(0x%x)", pInfo->AttributeFlags));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("unsupported bpp(%d)", pInfo->BitsPerPlane));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return D3DDDIFMT_UNKNOWN;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic int vboxWddmResolutionFind(const D3DKMDT_2DREGION *pResolutions, int cResolutions, const D3DKMDT_2DREGION *pRes)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (int i = 0; i < cResolutions; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const D3DKMDT_2DREGION *pResolution = &pResolutions[i];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pResolution->cx == pRes->cx && pResolution->cy == pRes->cy)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return i;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return -1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic bool vboxWddmVideoModesMatch(const VIDEO_MODE_INFORMATION *pMode1, const VIDEO_MODE_INFORMATION *pMode2)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return pMode1->VisScreenHeight == pMode2->VisScreenHeight
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && pMode1->VisScreenWidth == pMode2->VisScreenWidth
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && pMode1->BitsPerPlane == pMode2->BitsPerPlane;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic int vboxWddmVideoModeFind(const VIDEO_MODE_INFORMATION *pModes, int cModes, const VIDEO_MODE_INFORMATION *pM)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (int i = 0; i < cModes; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VIDEO_MODE_INFORMATION *pMode = &pModes[i];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (vboxWddmVideoModesMatch(pMode, pM))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return i;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return -1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnPopulateVideoSignalInfo(D3DKMDT_VIDEO_SIGNAL_INFO *pVsi,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const RTRECTSIZE *pResolution,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG VSync)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
c7d2f5508ab9703a7a6c5cce5c9d4bf335af660avboxsync pVsi->VideoStandard = D3DKMDT_VSS_OTHER;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pVsi->ActiveSize.cx = pResolution->cx;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pVsi->ActiveSize.cy = pResolution->cy;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVsi->VSyncFreq.Numerator = VSync * 1000;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVsi->VSyncFreq.Denominator = 1000;
c7d2f5508ab9703a7a6c5cce5c9d4bf335af660avboxsync pVsi->TotalSize.cx = pVsi->ActiveSize.cx;// + VBOXVDPN_C_DISPLAY_HBLANK_SIZE;
c7d2f5508ab9703a7a6c5cce5c9d4bf335af660avboxsync pVsi->TotalSize.cy = pVsi->ActiveSize.cy;// + VBOXVDPN_C_DISPLAY_VBLANK_SIZE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVsi->PixelRate = pVsi->TotalSize.cx * pVsi->TotalSize.cy * VSync;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVsi->HSyncFreq.Numerator = (UINT)((pVsi->PixelRate / pVsi->TotalSize.cy) * 1000);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVsi->HSyncFreq.Denominator = 1000;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVsi->ScanLineOrdering = D3DDDI_VSSLO_PROGRESSIVE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN vboxVidPnMatchVideoSignal(const D3DKMDT_VIDEO_SIGNAL_INFO *pVsi1, const D3DKMDT_VIDEO_SIGNAL_INFO *pVsi2)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pVsi1->VideoStandard != pVsi2->VideoStandard)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pVsi1->TotalSize.cx != pVsi2->TotalSize.cx)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pVsi1->TotalSize.cy != pVsi2->TotalSize.cy)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pVsi1->ActiveSize.cx != pVsi2->ActiveSize.cx)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pVsi1->ActiveSize.cy != pVsi2->ActiveSize.cy)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pVsi1->VSyncFreq.Numerator != pVsi2->VSyncFreq.Numerator)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pVsi1->VSyncFreq.Denominator != pVsi2->VSyncFreq.Denominator)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pVsi1->HSyncFreq.Numerator != pVsi2->HSyncFreq.Numerator)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pVsi1->HSyncFreq.Denominator != pVsi2->HSyncFreq.Denominator)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pVsi1->PixelRate != pVsi2->PixelRate)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pVsi1->ScanLineOrdering != pVsi2->ScanLineOrdering)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic void vboxVidPnPopulateSourceModeInfo(D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const RTRECTSIZE *pSize)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* this is a graphics mode */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnSourceModeInfo->Type = D3DKMDT_RMT_GRAPHICS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx = pSize->cx;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy = pSize->cy;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize = pNewVidPnSourceModeInfo->Format.Graphics.PrimSurfSize;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnSourceModeInfo->Format.Graphics.Stride = pSize->cx * 4;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat = D3DDDIFMT_A8R8G8B8;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat != D3DDDIFMT_UNKNOWN);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnSourceModeInfo->Format.Graphics.ColorBasis = D3DKMDT_CB_SRGB;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pNewVidPnSourceModeInfo->Format.Graphics.PixelFormat == D3DDDIFMT_P8)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode = D3DKMDT_PVAM_SETTABLEPALETTE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode = D3DKMDT_PVAM_DIRECT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic void vboxVidPnPopulateMonitorModeInfo(D3DKMDT_MONITOR_SOURCE_MODE *pMonitorSourceMode,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const RTRECTSIZE *pResolution)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync vboxVidPnPopulateVideoSignalInfo(&pMonitorSourceMode->VideoSignalInfo, pResolution, 60 /* ULONG VSync */);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pMonitorSourceMode->ColorBasis = D3DKMDT_CB_SRGB;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.FirstChannel = 8;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.SecondChannel = 8;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.ThirdChannel = 8;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pMonitorSourceMode->ColorCoeffDynamicRanges.FourthChannel = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pMonitorSourceMode->Origin = D3DKMDT_MCO_DRIVER;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pMonitorSourceMode->Preference = D3DKMDT_MP_NOTPREFERRED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnPopulateTargetModeInfo(D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo, const RTRECTSIZE *pResolution)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnTargetModeInfo->Preference = D3DKMDT_MP_NOTPREFERRED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return vboxVidPnPopulateVideoSignalInfo(&pNewVidPnTargetModeInfo->VideoSignalInfo, pResolution, 60 /* ULONG VSync */);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncvoid VBoxVidPnStTargetCleanup(PVBOXWDDM_SOURCE paSources, uint32_t cScreens, PVBOXWDDM_TARGET pTarget)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync if (pTarget->VidPnSourceId == D3DDDI_ID_UNINITIALIZED)
359416647a711739d1b14addbf399178949a1a60vboxsync return;
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync Assert(pTarget->VidPnSourceId < cScreens);
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync PVBOXWDDM_SOURCE pSource = &paSources[pTarget->VidPnSourceId];
359416647a711739d1b14addbf399178949a1a60vboxsync if (!pSource)
359416647a711739d1b14addbf399178949a1a60vboxsync return;
359416647a711739d1b14addbf399178949a1a60vboxsync Assert(pSource->cTargets);
359416647a711739d1b14addbf399178949a1a60vboxsync Assert(ASMBitTest(pSource->aTargetMap, pTarget->u32Id));
359416647a711739d1b14addbf399178949a1a60vboxsync ASMBitClear(pSource->aTargetMap, pTarget->u32Id);
359416647a711739d1b14addbf399178949a1a60vboxsync pSource->cTargets--;
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->VidPnSourceId = D3DDDI_ID_UNINITIALIZED;
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY;
359416647a711739d1b14addbf399178949a1a60vboxsync pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY;
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncvoid VBoxVidPnStSourceTargetAdd(PVBOXWDDM_SOURCE paSources, uint32_t cScreens, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_TARGET pTarget)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync if (pTarget->VidPnSourceId == pSource->AllocData.SurfDesc.VidPnSourceId)
359416647a711739d1b14addbf399178949a1a60vboxsync return;
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnStTargetCleanup(paSources, cScreens, pTarget);
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync ASMBitSet(pSource->aTargetMap, pTarget->u32Id);
359416647a711739d1b14addbf399178949a1a60vboxsync pSource->cTargets++;
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->VidPnSourceId = pSource->AllocData.SurfDesc.VidPnSourceId;
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY;
359416647a711739d1b14addbf399178949a1a60vboxsync pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY;
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncvoid VBoxVidPnStTIterInit(PVBOXWDDM_SOURCE pSource, PVBOXWDDM_TARGET paTargets, uint32_t cTargets, VBOXWDDM_TARGET_ITER *pIter)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync pIter->pSource = pSource;
359416647a711739d1b14addbf399178949a1a60vboxsync pIter->paTargets = paTargets;
359416647a711739d1b14addbf399178949a1a60vboxsync pIter->cTargets = cTargets;
359416647a711739d1b14addbf399178949a1a60vboxsync pIter->i = 0;
359416647a711739d1b14addbf399178949a1a60vboxsync pIter->c = 0;
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncPVBOXWDDM_TARGET VBoxVidPnStTIterNext(VBOXWDDM_TARGET_ITER *pIter)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync PVBOXWDDM_SOURCE pSource = pIter->pSource;
359416647a711739d1b14addbf399178949a1a60vboxsync if (pSource->cTargets <= pIter->c)
359416647a711739d1b14addbf399178949a1a60vboxsync return NULL;
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync int i = (!pIter->c) ? ASMBitFirstSet(pSource->aTargetMap, pIter->cTargets)
359416647a711739d1b14addbf399178949a1a60vboxsync : ASMBitNextSet(pSource->aTargetMap, pIter->cTargets, pIter->i);
359416647a711739d1b14addbf399178949a1a60vboxsync if (i < 0)
359416647a711739d1b14addbf399178949a1a60vboxsync STOP_FATAL();
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync pIter->i = (uint32_t)i;
359416647a711739d1b14addbf399178949a1a60vboxsync pIter->c++;
359416647a711739d1b14addbf399178949a1a60vboxsync return &pIter->paTargets[i];
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncvoid VBoxVidPnStSourceCleanup(PVBOXWDDM_SOURCE paSources, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, PVBOXWDDM_TARGET paTargets, uint32_t cTargets)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync PVBOXWDDM_SOURCE pSource = &paSources[VidPnSourceId];
359416647a711739d1b14addbf399178949a1a60vboxsync VBOXWDDM_TARGET_ITER Iter;
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnStTIterInit(pSource, paTargets, cTargets, &Iter);
359416647a711739d1b14addbf399178949a1a60vboxsync for (PVBOXWDDM_TARGET pTarget = VBoxVidPnStTIterNext(&Iter);
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget;
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget = VBoxVidPnStTIterNext(&Iter))
359416647a711739d1b14addbf399178949a1a60vboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync Assert(pTarget->VidPnSourceId == pSource->AllocData.SurfDesc.VidPnSourceId);
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnStTargetCleanup(paSources, cTargets, pTarget);
359416647a711739d1b14addbf399178949a1a60vboxsync /* iterator is not safe wrt target removal, reinit it */
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnStTIterInit(pSource, paTargets, cTargets, &Iter);
359416647a711739d1b14addbf399178949a1a60vboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncvoid VBoxVidPnStCleanup(PVBOXWDDM_SOURCE paSources, PVBOXWDDM_TARGET paTargets, uint32_t cScreens)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync for (UINT i = 0; i < cScreens; ++i)
359416647a711739d1b14addbf399178949a1a60vboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync PVBOXWDDM_TARGET pTarget = &paTargets[i];
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnStTargetCleanup(paSources, cScreens, pTarget);
359416647a711739d1b14addbf399178949a1a60vboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncvoid VBoxVidPnAllocDataInit(VBOXWDDM_ALLOC_DATA *pData, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync memset(pData, 0, sizeof (*pData));
359416647a711739d1b14addbf399178949a1a60vboxsync pData->SurfDesc.VidPnSourceId = VidPnSourceId;
359416647a711739d1b14addbf399178949a1a60vboxsync pData->Addr.offVram = VBOXVIDEOOFFSET_VOID;
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
ac0289f10f2d2a73377ef9572871c48631973f80vboxsyncvoid VBoxVidPnSourceInit(PVBOXWDDM_SOURCE pSource, const D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, uint8_t u8SyncState)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync memset(pSource, 0, sizeof (*pSource));
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnAllocDataInit(&pSource->AllocData, VidPnSourceId);
ac0289f10f2d2a73377ef9572871c48631973f80vboxsync pSource->u8SyncState = (u8SyncState & VBOXWDDM_HGSYNC_F_SYNCED_ALL);
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
ac0289f10f2d2a73377ef9572871c48631973f80vboxsyncvoid VBoxVidPnTargetInit(PVBOXWDDM_TARGET pTarget, const D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId, uint8_t u8SyncState)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync memset(pTarget, 0, sizeof (*pTarget));
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->u32Id = VidPnTargetId;
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->VidPnSourceId = D3DDDI_ID_UNINITIALIZED;
ac0289f10f2d2a73377ef9572871c48631973f80vboxsync pTarget->u8SyncState = (u8SyncState & VBOXWDDM_HGSYNC_F_SYNCED_ALL);
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
ac0289f10f2d2a73377ef9572871c48631973f80vboxsyncvoid VBoxVidPnSourcesInit(PVBOXWDDM_SOURCE pSources, uint32_t cScreens, uint8_t u8SyncState)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync for (uint32_t i = 0; i < cScreens; ++i)
ac0289f10f2d2a73377ef9572871c48631973f80vboxsync VBoxVidPnSourceInit(&pSources[i], i, u8SyncState);
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
ac0289f10f2d2a73377ef9572871c48631973f80vboxsyncvoid VBoxVidPnTargetsInit(PVBOXWDDM_TARGET pTargets, uint32_t cScreens, uint8_t u8SyncState)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync for (uint32_t i = 0; i < cScreens; ++i)
ac0289f10f2d2a73377ef9572871c48631973f80vboxsync VBoxVidPnTargetInit(&pTargets[i], i, u8SyncState);
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncvoid VBoxVidPnSourceCopy(VBOXWDDM_SOURCE *pDst, const VBOXWDDM_SOURCE *pSrc)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync uint8_t u8SyncState = pDst->u8SyncState;
359416647a711739d1b14addbf399178949a1a60vboxsync *pDst = *pSrc;
ac0289f10f2d2a73377ef9572871c48631973f80vboxsync pDst->u8SyncState &= u8SyncState;
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncvoid VBoxVidPnTargetCopy(VBOXWDDM_TARGET *pDst, const VBOXWDDM_TARGET *pSrc)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync uint8_t u8SyncState = pDst->u8SyncState;
359416647a711739d1b14addbf399178949a1a60vboxsync *pDst = *pSrc;
ac0289f10f2d2a73377ef9572871c48631973f80vboxsync pDst->u8SyncState &= u8SyncState;
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncvoid VBoxVidPnSourcesCopy(VBOXWDDM_SOURCE *pDst, const VBOXWDDM_SOURCE *pSrc, uint32_t cScreens)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync for (uint32_t i = 0; i < cScreens; ++i)
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnSourceCopy(&pDst[i], &pSrc[i]);
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncvoid VBoxVidPnTargetsCopy(VBOXWDDM_TARGET *pDst, const VBOXWDDM_TARGET *pSrc, uint32_t cScreens)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync for (uint32_t i = 0; i < cScreens; ++i)
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnTargetCopy(&pDst[i], &pSrc[i]);
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE vboxVidPnCofuncModalityCurrentPathPivot(D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE enmPivot,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_ENUM_PIVOT *pPivot,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync switch (enmPivot)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync case D3DKMDT_EPT_VIDPNSOURCE:
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pPivot->VidPnSourceId == VidPnSourceId)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return D3DKMDT_EPT_VIDPNSOURCE;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pPivot->VidPnSourceId == D3DDDI_ID_ALL)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync#ifdef DEBUG_misha
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync AssertFailed();
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync#endif
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return D3DKMDT_EPT_VIDPNSOURCE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return D3DKMDT_EPT_NOPIVOT;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync case D3DKMDT_EPT_VIDPNTARGET:
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pPivot->VidPnTargetId == VidPnTargetId)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return D3DKMDT_EPT_VIDPNTARGET;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pPivot->VidPnTargetId == D3DDDI_ID_ALL)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync#ifdef DEBUG_misha
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync AssertFailed();
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync#endif
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return D3DKMDT_EPT_VIDPNTARGET;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return D3DKMDT_EPT_NOPIVOT;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync case D3DKMDT_EPT_SCALING:
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync case D3DKMDT_EPT_ROTATION:
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync case D3DKMDT_EPT_NOPIVOT:
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return D3DKMDT_EPT_NOPIVOT;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync default:
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("unexpected pivot"));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return D3DKMDT_EPT_NOPIVOT;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync}
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncNTSTATUS vboxVidPnQueryPinnedTargetMode(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId, RTRECTSIZE *pSize)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPNTARGETMODESET hCurVidPnTargetModeSet;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pCurVidPnTargetModeSetInterface;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pSize->cx = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pSize->cy = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = pVidPnInterface->pfnAcquireTargetModeSet(hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VidPnTargetId,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &hCurVidPnTargetModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &pCurVidPnTargetModeSetInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAcquireTargetModeSet failed Status(0x%x)", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CONST D3DKMDT_VIDPN_TARGET_MODE* pPinnedVidPnTargetModeInfo;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pCurVidPnTargetModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnTargetModeSet, &pPinnedVidPnTargetModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pPinnedVidPnTargetModeInfo = NULL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAcquirePinnedModeInfo failed Status(0x%x)", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(pPinnedVidPnTargetModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pSize->cx = pPinnedVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cx;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pSize->cy = pPinnedVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cy;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pCurVidPnTargetModeSetInterface->pfnReleaseModeInfo(hCurVidPnTargetModeSet, pPinnedVidPnTargetModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(NT_SUCCESS(tmpStatus));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hCurVidPnTargetModeSet);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncNTSTATUS vboxVidPnQueryPinnedSourceMode(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, RTRECTSIZE *pSize)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pCurVidPnSourceModeSetInterface;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pSize->cx = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pSize->cy = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = pVidPnInterface->pfnAcquireSourceModeSet(hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VidPnSourceId,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &hCurVidPnSourceModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &pCurVidPnSourceModeSetInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAcquireSourceModeSet failed Status(0x%x)", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CONST D3DKMDT_VIDPN_SOURCE_MODE* pPinnedVidPnSourceModeInfo;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pCurVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pPinnedVidPnSourceModeInfo = NULL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAcquirePinnedModeInfo failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(pPinnedVidPnSourceModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pSize->cx = pPinnedVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cx;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pSize->cy = pPinnedVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize.cy;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pCurVidPnSourceModeSetInterface->pfnReleaseModeInfo(hCurVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(NT_SUCCESS(tmpStatus));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hCurVidPnSourceModeSet);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync}
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnSourceModeSetToArray(D3DKMDT_HVIDPNSOURCEMODESET hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnModeSetInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CR_SORTARRAY *pArray)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBOXVIDPN_SOURCEMODE_ITER Iter;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pVidPnModeInfo;
c7d2f5508ab9703a7a6c5cce5c9d4bf335af660avboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnSourceModeIterInit(&Iter, hVidPnModeSet, pVidPnModeSetInterface);
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync while ((pVidPnModeInfo = VBoxVidPnSourceModeIterNext(&Iter)) != NULL)
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE size;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync size.cx = pVidPnModeInfo->Format.Graphics.VisibleRegionSize.cx;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync size.cy = pVidPnModeInfo->Format.Graphics.VisibleRegionSize.cy;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaAdd(pArray, CR_RSIZE2U64(size));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (RT_FAILURE(rc))
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnSourceModeIterTerm(&Iter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync }
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync }
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnSourceModeIterTerm(&Iter);
07b405d3b41cfce6f5f989a6c95a5819af3841a1vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return VBoxVidPnSourceModeIterStatus(&Iter);
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync}
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnSourceModeSetFromArray(D3DKMDT_HVIDPNSOURCEMODESET hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnModeSetInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const CR_SORTARRAY *pArray)
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync for (uint32_t i = 0; i < CrSaGetSize(pArray); ++i)
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE size = CR_U642RSIZE(CrSaGetVal(pArray, i));
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_VIDPN_SOURCE_MODE *pVidPnModeInfo;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = pVidPnModeSetInterface->pfnCreateNewModeInfo(hVidPnModeSet, &pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnCreateNewModeInfo failed, Status 0x%x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync }
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync vboxVidPnPopulateSourceModeInfo(pVidPnModeInfo, &size);
c7d2f5508ab9703a7a6c5cce5c9d4bf335af660avboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnModeSetInterface->pfnAddMode(hVidPnModeSet, pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAddMode failed, Status 0x%x", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpSourceMode("SourceMode: ", pVidPnModeInfo, "\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnModeSetInterface->pfnReleaseModeInfo(hVidPnModeSet, pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
c7d2f5508ab9703a7a6c5cce5c9d4bf335af660avboxsync }
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync }
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync}
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnTargetModeSetToArray(D3DKMDT_HVIDPNTARGETMODESET hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnModeSetInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CR_SORTARRAY *pArray)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBOXVIDPN_TARGETMODE_ITER Iter;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const D3DKMDT_VIDPN_TARGET_MODE *pVidPnModeInfo;
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnTargetModeIterInit(&Iter, hVidPnModeSet, pVidPnModeSetInterface);
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync while ((pVidPnModeInfo = VBoxVidPnTargetModeIterNext(&Iter)) != NULL)
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE size;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync size.cx = pVidPnModeInfo->VideoSignalInfo.ActiveSize.cx;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync size.cy = pVidPnModeInfo->VideoSignalInfo.ActiveSize.cy;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaAdd(pArray, CR_RSIZE2U64(size));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (RT_FAILURE(rc))
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnTargetModeIterTerm(&Iter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync }
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync }
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnTargetModeIterTerm(&Iter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return VBoxVidPnTargetModeIterStatus(&Iter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync}
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnTargetModeSetFromArray(D3DKMDT_HVIDPNTARGETMODESET hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnModeSetInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const CR_SORTARRAY *pArray)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync for (uint32_t i = 0; i < CrSaGetSize(pArray); ++i)
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE size = CR_U642RSIZE(CrSaGetVal(pArray, i));
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_VIDPN_TARGET_MODE *pVidPnModeInfo;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = pVidPnModeSetInterface->pfnCreateNewModeInfo(hVidPnModeSet, &pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnCreateNewModeInfo failed, Status 0x%x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync vboxVidPnPopulateTargetModeInfo(pVidPnModeInfo, &size);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnModeSetInterface->pfnAddMode(hVidPnModeSet, pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAddMode failed, Status 0x%x", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpTargetMode("TargetMode: ", pVidPnModeInfo, "\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnModeSetInterface->pfnReleaseModeInfo(hVidPnModeSet, pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnMonitorModeSetToArray(D3DKMDT_HMONITORSOURCEMODESET hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_MONITORSOURCEMODESET_INTERFACE *pVidPnModeSetInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CR_SORTARRAY *pArray)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBOXVIDPN_MONITORMODE_ITER Iter;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const D3DKMDT_MONITOR_SOURCE_MODE *pVidPnModeInfo;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnMonitorModeIterInit(&Iter, hVidPnModeSet, pVidPnModeSetInterface);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync while ((pVidPnModeInfo = VBoxVidPnMonitorModeIterNext(&Iter)) != NULL)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE size;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync size.cx = pVidPnModeInfo->VideoSignalInfo.ActiveSize.cx;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync size.cy = pVidPnModeInfo->VideoSignalInfo.ActiveSize.cy;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaAdd(pArray, CR_RSIZE2U64(size));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (RT_FAILURE(rc))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnMonitorModeIterTerm(&Iter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnMonitorModeIterTerm(&Iter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return VBoxVidPnMonitorModeIterStatus(&Iter);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync}
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnMonitorModeSetFromArray(D3DKMDT_HMONITORSOURCEMODESET hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_MONITORSOURCEMODESET_INTERFACE *pVidPnModeSetInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const CR_SORTARRAY *pArray)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync for (uint32_t i = 0; i < CrSaGetSize(pArray); ++i)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE size = CR_U642RSIZE(CrSaGetVal(pArray, i));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_MONITOR_SOURCE_MODE *pVidPnModeInfo;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = pVidPnModeSetInterface->pfnCreateNewModeInfo(hVidPnModeSet, &pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnCreateNewModeInfo failed, Status 0x%x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync vboxVidPnPopulateMonitorModeInfo(pVidPnModeInfo, &size);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnModeSetInterface->pfnAddMode(hVidPnModeSet, pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAddMode failed, Status 0x%x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnModeSetInterface->pfnReleaseModeInfo(hVidPnModeSet, pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync}
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnCollectInfoForPathTarget(PVBOXMP_DEVEXT pDevExt,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPN hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE enmCurPivot,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync uint32_t *aAdjustedModeMap,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CR_SORTARRAY *aModes,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const CR_SORTARRAY* pSupportedModes = VBoxWddmVModesGet(pDevExt, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (enmCurPivot == D3DKMDT_EPT_VIDPNTARGET)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPNTARGETMODESET hVidPnModeSet;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnModeSetInterface;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnAcquireTargetModeSet(hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VidPnTargetId,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &pVidPnModeSetInterface);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAcquireTargetModeSet failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* intersect modes from target */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!ASMBitTest(aAdjustedModeMap, VidPnTargetId))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnTargetModeSetToArray(hVidPnModeSet, pVidPnModeSetInterface, &aModes[VidPnTargetId]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aAdjustedModeMap, VidPnTargetId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CR_SORTARRAY Arr;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaInit(&Arr, 0);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnTargetModeSetToArray(hVidPnModeSet, pVidPnModeSetInterface, &aModes[VidPnTargetId]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaIntersect(&aModes[VidPnTargetId], &Arr);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaCleanup(&Arr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hVidPnModeSet);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync Assert(tmpStatus == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnTargetModeSetToArray failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE pinnedSize = {0};
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnQueryPinnedTargetMode(hVidPn, pVidPnInterface, VidPnTargetId, &pinnedSize);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnQueryPinnedTargetMode failed %#x", Status));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pinnedSize.cx)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaContains(pSupportedModes, CR_RSIZE2U64(pinnedSize)));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!ASMBitTest(aAdjustedModeMap, VidPnTargetId))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaGetSize(&aModes[VidPnTargetId]) == 0);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaAdd(&aModes[VidPnTargetId], CR_RSIZE2U64(pinnedSize));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aAdjustedModeMap, VidPnTargetId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaClear(&aModes[VidPnTargetId]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaAdd(&aModes[VidPnTargetId], CR_RSIZE2U64(pinnedSize));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnQueryPinnedSourceMode(hVidPn, pVidPnInterface, VidPnSourceId, &pinnedSize);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnQueryPinnedSourceMode failed %#x", Status));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pinnedSize.cx)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!ASMBitTest(aAdjustedModeMap, VidPnTargetId))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaGetSize(&aModes[VidPnTargetId]) == 0);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (CrSaContains(pSupportedModes, CR_RSIZE2U64(pinnedSize)))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaAdd(&aModes[VidPnTargetId], CR_RSIZE2U64(pinnedSize));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aAdjustedModeMap, VidPnTargetId);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync else
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaClear(&aModes[VidPnTargetId]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (CrSaContains(pSupportedModes, CR_RSIZE2U64(pinnedSize)))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaAdd(&aModes[VidPnTargetId], CR_RSIZE2U64(pinnedSize));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* now we are here because no pinned info is specified, we need to populate it based on the supported info
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync * and modes already configured,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync * this is pretty simple actually */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!ASMBitTest(aAdjustedModeMap, VidPnTargetId))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaGetSize(&aModes[VidPnTargetId]) == 0);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaClone(pSupportedModes, &aModes[VidPnTargetId]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaClone failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aAdjustedModeMap, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaIntersect(&aModes[VidPnTargetId], pSupportedModes);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* we are done */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync}
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnApplyInfoForPathTarget(PVBOXMP_DEVEXT pDevExt,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPN hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE enmCurPivot,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync uint32_t *aAdjustedModeMap,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const CR_SORTARRAY *aModes,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(ASMBitTest(aAdjustedModeMap, VidPnTargetId));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (enmCurPivot == D3DKMDT_EPT_VIDPNTARGET)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE pinnedSize = {0};
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = vboxVidPnQueryPinnedTargetMode(hVidPn, pVidPnInterface, VidPnTargetId, &pinnedSize);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnQueryPinnedTargetMode failed %#x", Status));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pinnedSize.cx)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* now just create the new source mode set and apply it */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPNTARGETMODESET hVidPnModeSet;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnModeSetInterface;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnCreateNewTargetModeSet(hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VidPnTargetId,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &pVidPnModeSetInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnCreateNewTargetModeSet failed Status(0x%x)", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnTargetModeSetFromArray(hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pVidPnModeSetInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &aModes[VidPnTargetId]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnTargetModeSetFromArray failed Status(0x%x)", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync vboxVidPnDumpVidPn("\nVidPn: ---------\n", pDevExt, hVidPn, pVidPnInterface, "\n------\n");
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpMonitorModeSet("MonModeSet: --------\n", pDevExt, VidPnTargetId, "\n------\n");
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hVidPnModeSet);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync Assert(tmpStatus == STATUS_SUCCESS);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnAssignTargetModeSet(hVidPn, VidPnTargetId, hVidPnModeSet);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("\n\n!!!!!!!\n\n pfnAssignTargetModeSet failed, Status(0x%x)", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync vboxVidPnDumpVidPn("\nVidPn: ---------\n", pDevExt, hVidPn, pVidPnInterface, "\n------\n");
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpMonitorModeSet("MonModeSet: --------\n", pDevExt, VidPnTargetId, "\n------\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hVidPnModeSet);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync}
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnApplyInfoForPathSource(PVBOXMP_DEVEXT pDevExt,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPN hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE enmCurPivot,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync uint32_t *aAdjustedModeMap,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const CR_SORTARRAY *aModes,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(ASMBitTest(aAdjustedModeMap, VidPnTargetId));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (enmCurPivot == D3DKMDT_EPT_VIDPNSOURCE)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE pinnedSize = {0};
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = vboxVidPnQueryPinnedSourceMode(hVidPn, pVidPnInterface, VidPnSourceId, &pinnedSize);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnQueryPinnedSourceMode failed %#x", Status));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pinnedSize.cx)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* now just create the new source mode set and apply it */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPNSOURCEMODESET hVidPnModeSet;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnModeSetInterface;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnCreateNewSourceModeSet(hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VidPnSourceId,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &pVidPnModeSetInterface);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnCreateNewSourceModeSet failed Status(0x%x)", Status));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnSourceModeSetFromArray(hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pVidPnModeSetInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &aModes[VidPnTargetId]); /* <- target modes always! */
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnSourceModeSetFromArray failed Status(0x%x)", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync vboxVidPnDumpVidPn("\nVidPn: ---------\n", pDevExt, hVidPn, pVidPnInterface, "\n------\n");
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpMonitorModeSet("MonModeSet: --------\n", pDevExt, VidPnTargetId, "\n------\n");
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hVidPnModeSet);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync Assert(tmpStatus == STATUS_SUCCESS);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnAssignSourceModeSet(hVidPn, VidPnSourceId, hVidPnModeSet);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("\n\n!!!!!!!\n\n pfnAssignSourceModeSet failed, Status(0x%x)", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync vboxVidPnDumpVidPn("\nVidPn: ---------\n", pDevExt, hVidPn, pVidPnInterface, "\n------\n");
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpMonitorModeSet("MonModeSet: --------\n", pDevExt, VidPnTargetId, "\n------\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hVidPnModeSet);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync}
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnCollectInfoForPathSource(PVBOXMP_DEVEXT pDevExt,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPN hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE enmCurPivot,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync uint32_t *aAdjustedModeMap,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CR_SORTARRAY *aModes,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const CR_SORTARRAY* pSupportedModes = VBoxWddmVModesGet(pDevExt, VidPnTargetId); /* <- yes, modes are target-determined always */
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync NTSTATUS Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (enmCurPivot == D3DKMDT_EPT_VIDPNSOURCE)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPNSOURCEMODESET hVidPnModeSet;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnModeSetInterface;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnAcquireSourceModeSet(hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VidPnSourceId,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &pVidPnModeSetInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAcquireSourceModeSet failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* intersect modes from target */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!ASMBitTest(aAdjustedModeMap, VidPnTargetId))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnSourceModeSetToArray(hVidPnModeSet, pVidPnModeSetInterface, &aModes[VidPnTargetId]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aAdjustedModeMap, VidPnTargetId);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync else
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CR_SORTARRAY Arr;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaInit(&Arr, 0);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnSourceModeSetToArray(hVidPnModeSet, pVidPnModeSetInterface, &aModes[VidPnTargetId]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaIntersect(&aModes[VidPnTargetId], &Arr);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaCleanup(&Arr);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hVidPnModeSet);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnReleaseSourceModeSet failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* intersect it with supported target modes, just in case */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaIntersect(&aModes[VidPnTargetId], pSupportedModes);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE pinnedSize = {0};
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnQueryPinnedSourceMode(hVidPn, pVidPnInterface, VidPnSourceId, &pinnedSize);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnQueryPinnedSourceMode failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pinnedSize.cx)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaContains(pSupportedModes, CR_RSIZE2U64(pinnedSize)));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!ASMBitTest(aAdjustedModeMap, VidPnTargetId))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaGetSize(&aModes[VidPnTargetId]) == 0);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (CrSaContains(pSupportedModes, CR_RSIZE2U64(pinnedSize)))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaAdd(&aModes[VidPnTargetId], CR_RSIZE2U64(pinnedSize));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aAdjustedModeMap, VidPnTargetId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaClear(&aModes[VidPnTargetId]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (CrSaContains(pSupportedModes, CR_RSIZE2U64(pinnedSize)))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaAdd(&aModes[VidPnTargetId], CR_RSIZE2U64(pinnedSize));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnQueryPinnedTargetMode(hVidPn, pVidPnInterface, VidPnTargetId, &pinnedSize);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnQueryPinnedTargetMode failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pinnedSize.cx)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaContains(pSupportedModes, CR_RSIZE2U64(pinnedSize)));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!ASMBitTest(aAdjustedModeMap, VidPnTargetId))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaGetSize(&aModes[VidPnTargetId]) == 0);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaAdd(&aModes[VidPnTargetId], CR_RSIZE2U64(pinnedSize));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aAdjustedModeMap, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaClear(&aModes[VidPnTargetId]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaAdd(&aModes[VidPnTargetId], CR_RSIZE2U64(pinnedSize));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* now we are here because no pinned info is specified, we need to populate it based on the supported info
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync * and modes already configured,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync * this is pretty simple actually */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!ASMBitTest(aAdjustedModeMap, VidPnTargetId))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaGetSize(&aModes[VidPnTargetId]) == 0);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaClone(pSupportedModes, &aModes[VidPnTargetId]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaClone failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aAdjustedModeMap, VidPnTargetId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaIntersect(&aModes[VidPnTargetId], pSupportedModes);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* we are done */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnCheckMonitorModes(PVBOXMP_DEVEXT pDevExt, uint32_t u32Target)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CONST DXGK_MONITOR_INTERFACE *pMonitorInterface;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pDevExt->u.primary.DxgkInterface.DxgkCbQueryMonitorInterface(pDevExt->u.primary.DxgkInterface.DeviceHandle, DXGK_MONITOR_INTERFACE_VERSION_V1, &pMonitorInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("DxgkCbQueryMonitorInterface failed, Status()0x%x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HMONITORSOURCEMODESET hVidPnModeSet;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pVidPnModeSetInterface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const CR_SORTARRAY *pSupportedModes = VBoxWddmVModesGet(pDevExt, u32Target);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CR_SORTARRAY DiffModes;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = CrSaInit(&DiffModes, CrSaGetSize(pSupportedModes));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaInit failed"));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_NO_MEMORY;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pMonitorInterface->pfnAcquireMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync u32Target,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &pVidPnModeSetInterface);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("DxgkCbQueryMonitorInterface failed, Status()0x%x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync// if (Status == STATUS_GRAPHICS_MONITOR_NOT_CONNECTED)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaCleanup(&DiffModes);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBOXVIDPN_MONITORMODE_ITER Iter;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const D3DKMDT_MONITOR_SOURCE_MODE *pVidPnModeInfo;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync rc = CrSaClone(pSupportedModes, &DiffModes);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!RT_SUCCESS(rc))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("CrSaClone failed"));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = STATUS_NO_MEMORY;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync goto done;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnMonitorModeIterInit(&Iter, hVidPnModeSet, pVidPnModeSetInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync while ((pVidPnModeInfo = VBoxVidPnMonitorModeIterNext(&Iter)) != NULL)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE size;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync size.cx = pVidPnModeInfo->VideoSignalInfo.ActiveSize.cx;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync size.cy = pVidPnModeInfo->VideoSignalInfo.ActiveSize.cy;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaRemove(&DiffModes, CR_RSIZE2U64(size));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnMonitorModeIterTerm(&Iter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = VBoxVidPnMonitorModeIterStatus(&Iter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("iter status failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync goto done;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnMonitorModeSetFromArray(hVidPnModeSet, pVidPnModeSetInterface, &DiffModes);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnMonitorModeSetFromArray failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync goto done;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncdone:
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pMonitorInterface->pfnReleaseMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle, hVidPnModeSet);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(tmpStatus))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnReleaseMonitorSourceModeSet failed tmpStatus(0x%x)", tmpStatus));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaCleanup(&DiffModes);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync}
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncstatic NTSTATUS vboxVidPnPathAdd(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, const D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_VIDPN_PRESENT_PATH_IMPORTANCE enmImportance)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = pVidPnInterface->pfnGetTopology(hVidPn, &hVidPnTopology, &pVidPnTopologyInterface);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync AssertFailed();
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnTopologyInterface->pfnCreateNewPathInfo(hVidPnTopology, &pNewVidPnPresentPathInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync AssertFailed();
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->VidPnSourceId = VidPnSourceId;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->VidPnTargetId = VidPnTargetId;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->ImportanceOrdinal = enmImportance;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->ContentTransformation.Scaling = D3DKMDT_VPPS_IDENTITY;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync memset(&pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync 0, sizeof (pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Identity = 1;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Centered = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Stretched = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->ContentTransformation.Rotation = D3DKMDT_VPPR_IDENTITY;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Identity = 1;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate180 = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate270 = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate90 = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cx = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cy = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cx = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cy = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->VidPnTargetColorBasis = D3DKMDT_CB_SRGB; /* @todo: how does it matters? */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.FirstChannel = 8;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.SecondChannel = 8;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.ThirdChannel = 8;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.FourthChannel = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->Content = D3DKMDT_VPPC_GRAPHICS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionType = D3DKMDT_VPPMT_UNINITIALIZED;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync// pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionType = D3DKMDT_VPPMT_NOPROTECTION;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pNewVidPnPresentPathInfo->CopyProtection.APSTriggerBits = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync memset(&pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport, 0, sizeof (pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync// pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport.NoProtection = 1;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync memset (&pNewVidPnPresentPathInfo->GammaRamp, 0, sizeof (pNewVidPnPresentPathInfo->GammaRamp));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync// pNewVidPnPresentPathInfo->GammaRamp.Type = D3DDDI_GAMMARAMP_DEFAULT;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync// pNewVidPnPresentPathInfo->GammaRamp.DataSize = 0;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnTopologyInterface->pfnAddPath(hVidPnTopology, pNewVidPnPresentPathInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync AssertFailed();
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnTopologyInterface->pfnReleasePathInfo(hVidPnTopology, pNewVidPnPresentPathInfo);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync Assert(NT_SUCCESS(tmpStatus));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync LOG(("Recommended Path (%d->%d)", VidPnSourceId, VidPnTargetId));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync}
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncNTSTATUS VBoxVidPnRecommendMonitorModes(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_TARGET_ID VideoPresentTargetId,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HMONITORSOURCEMODESET hVidPnModeSet, const DXGK_MONITORSOURCEMODESET_INTERFACE *pVidPnModeSetInterface)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const CR_SORTARRAY *pSupportedModes = VBoxWddmVModesGet(pDevExt, VideoPresentTargetId);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = vboxVidPnMonitorModeSetFromArray(hVidPnModeSet, pVidPnModeSetInterface, pSupportedModes);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnMonitorModeSetFromArray failed %d", Status));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncNTSTATUS VBoxVidPnUpdateModes(PVBOXMP_DEVEXT pDevExt, uint32_t u32TargetId, const RTRECTSIZE *pSize)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (u32TargetId >= (uint32_t)VBoxCommonFromDeviceExt(pDevExt)->cDisplays)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("invalid target id"));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_INVALID_PARAMETER;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = VBoxWddmVModesAdd(pDevExt, u32TargetId, pSize, TRUE);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (RT_FAILURE(rc))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("VBoxWddmVModesAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (rc == VINF_ALREADY_INITIALIZED)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* mode was already in list, just return */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaContains(VBoxWddmVModesGet(pDevExt, u32TargetId), CR_RSIZE2U64(*pSize)));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* modes have changed, need to replug */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = VBoxWddmChildStatusReportReconnected(pDevExt, u32TargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("VBoxWddmChildStatusReportReconnected failed Status(%#x)", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync}
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncNTSTATUS VBoxVidPnRecommendFunctional(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPN hVidPn, const VBOXWDDM_RECOMMENDVIDPN *pData)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface = NULL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbQueryVidPnInterface(hVidPn, DXGK_VIDPN_INTERFACE_VERSION_V1, &pVidPnInterface);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync if (!NT_SUCCESS(Status))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("DxgkCbQueryVidPnInterface failed Status(%#x)", Status));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aVisitedSourceMap);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync memset(aVisitedSourceMap, 0, sizeof (aVisitedSourceMap));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync uint32_t Importance = (uint32_t)D3DKMDT_VPPI_PRIMARY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync for (uint32_t i = 0; i < (uint32_t)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int32_t iSource = pData->aTargets[i].iSource;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (iSource < 0)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync continue;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (iSource >= VBoxCommonFromDeviceExt(pDevExt)->cDisplays)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("invalid iSource"));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_INVALID_PARAMETER;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!pDevExt->fComplexTopologiesEnabled && iSource != i)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("complex topologies not supported!"));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_INVALID_PARAMETER;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync bool fNewSource = false;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!ASMBitTest(aVisitedSourceMap, iSource))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync int rc = VBoxWddmVModesAdd(pDevExt, i, &pData->aSources[iSource].Size, TRUE);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (RT_FAILURE(rc))
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("VBoxWddmVModesAdd failed %d", rc));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_UNSUCCESSFUL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaContains(VBoxWddmVModesGet(pDevExt, i), CR_RSIZE2U64(pData->aSources[iSource].Size)));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnCheckMonitorModes(pDevExt, i);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnCheckMonitorModes failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aVisitedSourceMap, iSource);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync fNewSource = true;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnPathAdd(hVidPn, pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync (const D3DDDI_VIDEO_PRESENT_SOURCE_ID)iSource, (const D3DDDI_VIDEO_PRESENT_TARGET_ID)i,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync (D3DKMDT_VIDPN_PRESENT_PATH_IMPORTANCE)Importance);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnPathAdd failed Status()0x%x\n", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Importance++;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync do {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPNTARGETMODESET hVidPnModeSet;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnModeSetInterface;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnCreateNewTargetModeSet(hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync i,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &pVidPnModeSetInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_VIDPN_TARGET_MODE *pVidPnModeInfo;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnModeSetInterface->pfnCreateNewModeInfo(hVidPnModeSet, &pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync vboxVidPnPopulateTargetModeInfo(pVidPnModeInfo, &pData->aSources[iSource].Size);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync IN_CONST_D3DKMDT_VIDEO_PRESENT_TARGET_MODE_ID idMode = pVidPnModeInfo->Id;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnModeSetInterface->pfnAddMode(hVidPnModeSet, pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pVidPnModeInfo = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnModeSetInterface->pfnPinMode(hVidPnModeSet, idMode);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnAssignTargetModeSet(hVidPn, i, hVidPnModeSet);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync LOG(("Recommended Target[%d] (%dx%d)", i, pData->aSources[iSource].Size.cx, pData->aSources[iSource].Size.cy));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync break;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAssignTargetModeSet failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnPinMode failed %#x", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAddMode failed %#x", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pVidPnModeInfo)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnModeSetInterface->pfnReleaseModeInfo(hVidPnModeSet, pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnCreateNewTargetModeSet failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hVidPnModeSet);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnCreateNewTargetModeSet failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(!NT_SUCCESS(Status));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync } while (0);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (fNewSource)
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync do {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPNSOURCEMODESET hVidPnModeSet;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnModeSetInterface;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnCreateNewSourceModeSet(hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync iSource,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &hVidPnModeSet,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync &pVidPnModeSetInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_VIDPN_SOURCE_MODE *pVidPnModeInfo;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnModeSetInterface->pfnCreateNewModeInfo(hVidPnModeSet, &pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync vboxVidPnPopulateSourceModeInfo(pVidPnModeInfo, &pData->aSources[iSource].Size);
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync IN_CONST_D3DKMDT_VIDEO_PRESENT_SOURCE_MODE_ID idMode = pVidPnModeInfo->Id;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnModeSetInterface->pfnAddMode(hVidPnModeSet, pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pVidPnModeInfo = NULL;
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnModeSetInterface->pfnPinMode(hVidPnModeSet, idMode);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnAssignSourceModeSet(hVidPn, iSource, hVidPnModeSet);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync LOG(("Recommended Source[%d] (%dx%d)", iSource, pData->aSources[iSource].Size.cx, pData->aSources[iSource].Size.cy));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync break;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAssignSourceModeSet failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnPinMode failed %#x", Status));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnAddMode failed %#x", Status));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pVidPnModeInfo)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnModeSetInterface->pfnReleaseModeInfo(hVidPnModeSet, pVidPnModeInfo);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnCreateNewSourceModeSet failed %#x", Status));
bbe8d54f2bca31d98ce10c89506ca5a53c9d41b7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS tmpStatus = pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hVidPnModeSet);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(tmpStatus == STATUS_SUCCESS);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync else
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnCreateNewSourceModeSet failed %#x", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(!NT_SUCCESS(Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync } while (0);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(NT_SUCCESS(Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
8f9fa23f85edaee3f9eb9dc4cfb9b9053026c2b5vboxsyncstatic BOOLEAN vboxVidPnIsPathSupported(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync{
f068575233c08526611dbe29684bee5f2cbe7144vboxsync if (!pDevExt->fComplexTopologiesEnabled && pNewVidPnPresentPathInfo->VidPnSourceId != pNewVidPnPresentPathInfo->VidPnTargetId)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
70e6f03ca742e60292ae2d45811314790b16dab2vboxsync LOG(("unsupported source(%d)->target(%d) pair", pNewVidPnPresentPathInfo->VidPnSourceId, pNewVidPnPresentPathInfo->VidPnTargetId));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync /*
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync ImportanceOrdinal does not matter for now
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync pNewVidPnPresentPathInfo->ImportanceOrdinal
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync */
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (pNewVidPnPresentPathInfo->ContentTransformation.Scaling != D3DKMDT_VPPS_UNPINNED
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync && pNewVidPnPresentPathInfo->ContentTransformation.Scaling != D3DKMDT_VPPS_IDENTITY
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync && pNewVidPnPresentPathInfo->ContentTransformation.Scaling != D3DKMDT_VPPS_NOTSPECIFIED)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("unsupported Scaling (%d)", pNewVidPnPresentPathInfo->ContentTransformation.Scaling));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if ( !pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Identity
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync || pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Centered
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync || pNewVidPnPresentPathInfo->ContentTransformation.ScalingSupport.Stretched)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("unsupported Scaling support"));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (pNewVidPnPresentPathInfo->ContentTransformation.Rotation != D3DKMDT_VPPR_UNPINNED
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync && pNewVidPnPresentPathInfo->ContentTransformation.Rotation != D3DKMDT_VPPR_IDENTITY
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync && pNewVidPnPresentPathInfo->ContentTransformation.Rotation != D3DKMDT_VPPR_NOTSPECIFIED)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("unsupported rotation (%d)", pNewVidPnPresentPathInfo->ContentTransformation.Rotation));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if ( !pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Identity
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync || pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate90
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync || pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate180
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync || pNewVidPnPresentPathInfo->ContentTransformation.RotationSupport.Rotate270)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("unsupported RotationSupport"));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cx
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync || pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cy)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("Non-zero TLOffset: cx(%d), cy(%d)",
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cx,
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync pNewVidPnPresentPathInfo->VisibleFromActiveTLOffset.cy));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cx
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync || pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cy)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("Non-zero TLOffset: cx(%d), cy(%d)",
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cx,
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync pNewVidPnPresentPathInfo->VisibleFromActiveBROffset.cy));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (pNewVidPnPresentPathInfo->VidPnTargetColorBasis != D3DKMDT_CB_SRGB
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync && pNewVidPnPresentPathInfo->VidPnTargetColorBasis != D3DKMDT_CB_UNINITIALIZED)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("unsupported VidPnTargetColorBasis (%d)", pNewVidPnPresentPathInfo->VidPnTargetColorBasis));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync /* channels?
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.FirstChannel;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.SecondChannel;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.ThirdChannel;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync we definitely not support fourth channel
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync */
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.FourthChannel)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("Non-zero FourthChannel (%d)", pNewVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges.FourthChannel));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync /* Content (D3DKMDT_VPPC_GRAPHICS, _NOTSPECIFIED, _VIDEO), does not matter for now
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync pNewVidPnPresentPathInfo->Content
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync */
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync /* not support copy protection for now */
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionType != D3DKMDT_VPPMT_NOPROTECTION
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync && pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionType != D3DKMDT_VPPMT_UNINITIALIZED)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("Copy protection not supported CopyProtectionType(%d)", pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionType));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (pNewVidPnPresentPathInfo->CopyProtection.APSTriggerBits)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("Copy protection not supported APSTriggerBits(%d)", pNewVidPnPresentPathInfo->CopyProtection.APSTriggerBits));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync D3DKMDT_VIDPN_PRESENT_PATH_COPYPROTECTION_SUPPORT tstCPSupport = {0};
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync tstCPSupport.NoProtection = 1;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (memcmp(&tstCPSupport, &pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport, sizeof(tstCPSupport)))
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("Copy protection support (0x%x)", *((UINT*)&pNewVidPnPresentPathInfo->CopyProtection.CopyProtectionSupport)));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (pNewVidPnPresentPathInfo->GammaRamp.Type != D3DDDI_GAMMARAMP_DEFAULT
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync && pNewVidPnPresentPathInfo->GammaRamp.Type != D3DDDI_GAMMARAMP_UNINITIALIZED)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("Unsupported GammaRamp.Type (%d)", pNewVidPnPresentPathInfo->GammaRamp.Type));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (pNewVidPnPresentPathInfo->GammaRamp.DataSize != 0)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync WARN(("Warning: non-zero GammaRamp.DataSize (%d), treating as supported", pNewVidPnPresentPathInfo->GammaRamp.DataSize));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return TRUE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync}
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncNTSTATUS VBoxVidPnIsSupported(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPN hVidPn, BOOLEAN *pfSupported)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync *pfSupported = FALSE;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface = NULL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbQueryVidPnInterface(hVidPn, DXGK_VIDPN_INTERFACE_VERSION_V1, &pVidPnInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("DxgkCbQueryVidPnInterface failed Status()0x%x\n", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync#ifdef VBOXWDDM_DEBUG_VIDPN
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync vboxVidPnDumpVidPn(">>>>IsSupported VidPN (IN) : >>>>\n", pDevExt, hVidPn, pVidPnInterface, "<<<<<<<<<<<<<<<<<<<<\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync#endif
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnGetTopology(hVidPn, &hVidPnTopology, &pVidPnTopologyInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnGetTopology failed Status()0x%x\n", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBOXVIDPN_PATH_ITER PathIter;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const D3DKMDT_VIDPN_PRESENT_PATH * pPath;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aVisitedTargetMap);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync memset(aVisitedTargetMap, 0, sizeof (aVisitedTargetMap));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync BOOLEAN fSupported = TRUE;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* collect info first */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnPathIterInit(&PathIter, hVidPnTopology, pVidPnTopologyInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync while ((pPath = VBoxVidPnPathIterNext(&PathIter)) != NULL)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId = pPath->VidPnSourceId;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId = pPath->VidPnTargetId;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* actually vidpn topology should contain only one target info, right? */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(!ASMBitTest(aVisitedTargetMap, VidPnTargetId));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aVisitedTargetMap, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!vboxVidPnIsPathSupported(pDevExt, pPath))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync fSupported = FALSE;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync break;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE TargetSize;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync RTRECTSIZE SourceSize;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnQueryPinnedTargetMode(hVidPn, pVidPnInterface, VidPnTargetId, &TargetSize);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnQueryPinnedTargetMode failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync break;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnQueryPinnedSourceMode(hVidPn, pVidPnInterface, VidPnSourceId, &SourceSize);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnQueryPinnedSourceMode failed %#x", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync break;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (memcmp(&TargetSize, &SourceSize, sizeof (TargetSize)) && TargetSize.cx)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!SourceSize.cx)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("not expected?"));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync fSupported = FALSE;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync break;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnPathIterTerm(&PathIter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync goto done;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = VBoxVidPnPathIterStatus(&PathIter);
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("PathIter failed Status()0x%x\n", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync goto done;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync *pfSupported = fSupported;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncdone:
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return Status;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync}
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncNTSTATUS VBoxVidPnCofuncModality(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPN hVidPn, D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE enmPivot, const DXGK_ENUM_PIVOT *pPivot)
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync{
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface = NULL;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbQueryVidPnInterface(hVidPn, DXGK_VIDPN_INTERFACE_VERSION_V1, &pVidPnInterface);
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (!NT_SUCCESS(Status))
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("DxgkCbQueryVidPnInterface failed Status()0x%x\n", Status));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return Status;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync#ifdef VBOXWDDM_DEBUG_VIDPN
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync vboxVidPnDumpCofuncModalityArg(">>>>MODALITY Args: ", pEnumCofuncModalityArg, "\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync vboxVidPnDumpVidPn(">>>>MODALITY VidPN (IN) : >>>>\n", pDevExt, pEnumCofuncModalityArg->hConstrainingVidPn, pVidPnInterface, "<<<<<<<<<<<<<<<<<<<<\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync#endif
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnInterface->pfnGetTopology(hVidPn, &hVidPnTopology, &pVidPnTopologyInterface);
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync if (!NT_SUCCESS(Status))
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnGetTopology failed Status()0x%x\n", Status));
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return Status;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBOXVIDPN_PATH_ITER PathIter;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const D3DKMDT_VIDPN_PRESENT_PATH * pPath;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aVisitedTargetMap);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aAdjustedModeMap);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CR_SORTARRAY aModes[VBOX_VIDEO_MAX_SCREENS];
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync memset(aVisitedTargetMap, 0, sizeof (aVisitedTargetMap));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync memset(aAdjustedModeMap, 0, sizeof (aAdjustedModeMap));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync memset(aModes, 0, sizeof (aModes));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* collect info first */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnPathIterInit(&PathIter, hVidPnTopology, pVidPnTopologyInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync while ((pPath = VBoxVidPnPathIterNext(&PathIter)) != NULL)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId = pPath->VidPnSourceId;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId = pPath->VidPnTargetId;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* actually vidpn topology should contain only one target info, right? */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(!ASMBitTest(aVisitedTargetMap, VidPnTargetId));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aVisitedTargetMap, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE enmCurPivot = vboxVidPnCofuncModalityCurrentPathPivot(enmPivot, pPivot, VidPnSourceId, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnCollectInfoForPathTarget(pDevExt,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync enmCurPivot,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync aAdjustedModeMap,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync aModes,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VidPnSourceId, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnCollectInfoForPathTarget failed Status(0x%x\n", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpCofuncModalityInfo("Modality Info: ", enmPivot, pPivot, "\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync break;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaCovers(VBoxWddmVModesGet(pDevExt, VidPnTargetId), &aModes[VidPnTargetId]));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnCollectInfoForPathSource(pDevExt,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync enmCurPivot,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync aAdjustedModeMap,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync aModes,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VidPnSourceId, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnCollectInfoForPathSource failed Status(0x%x\n", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpCofuncModalityInfo("Modality Info: ", enmPivot, pPivot, "\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync break;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaCovers(VBoxWddmVModesGet(pDevExt, VidPnTargetId), &aModes[VidPnTargetId]));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnPathIterTerm(&PathIter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync goto done;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = VBoxVidPnPathIterStatus(&PathIter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("PathIter failed Status()0x%x\n", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpCofuncModalityInfo("Modality Info: ", enmPivot, pPivot, "\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync goto done;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* now we have collected all the necessary info,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync * go ahead and apply it */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync memset(aVisitedTargetMap, 0, sizeof (aVisitedTargetMap));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnPathIterInit(&PathIter, hVidPnTopology, pVidPnTopologyInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync while ((pPath = VBoxVidPnPathIterNext(&PathIter)) != NULL)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId = pPath->VidPnSourceId;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId = pPath->VidPnTargetId;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync /* actually vidpn topology should contain only one target info, right? */
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(!ASMBitTest(aVisitedTargetMap, VidPnTargetId));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync ASMBitSet(aVisitedTargetMap, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE enmCurPivot = vboxVidPnCofuncModalityCurrentPathPivot(enmPivot, pPivot, VidPnSourceId, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync bool bUpdatePath = false;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync D3DKMDT_VIDPN_PRESENT_PATH AdjustedPath = {0};
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync AdjustedPath.VidPnSourceId = pPath->VidPnSourceId;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync AdjustedPath.VidPnTargetId = pPath->VidPnTargetId;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync AdjustedPath.ContentTransformation = pPath->ContentTransformation;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync AdjustedPath.CopyProtection = pPath->CopyProtection;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pPath->ContentTransformation.Scaling == D3DKMDT_VPPS_UNPINNED)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync AdjustedPath.ContentTransformation.ScalingSupport.Identity = TRUE;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync bUpdatePath = true;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (pPath->ContentTransformation.Rotation == D3DKMDT_VPPR_UNPINNED)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync AdjustedPath.ContentTransformation.RotationSupport.Identity = TRUE;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync bUpdatePath = true;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (bUpdatePath)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = pVidPnTopologyInterface->pfnUpdatePathSupportInfo(hVidPnTopology, &AdjustedPath);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("pfnUpdatePathSupportInfo failed Status()0x%x\n", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpCofuncModalityInfo("Modality Info: ", enmPivot, pPivot, "\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync goto done;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Assert(CrSaCovers(VBoxWddmVModesGet(pDevExt, VidPnTargetId), &aModes[VidPnTargetId]));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnApplyInfoForPathTarget(pDevExt,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync enmCurPivot,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync aAdjustedModeMap,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync aModes,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VidPnSourceId, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnApplyInfoForPathTarget failed Status(0x%x\n", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpCofuncModalityInfo("Modality Info: ", enmPivot, pPivot, "\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync break;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = vboxVidPnApplyInfoForPathSource(pDevExt,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync hVidPn,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pVidPnInterface,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync enmCurPivot,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync aAdjustedModeMap,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync aModes,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VidPnSourceId, VidPnTargetId);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("vboxVidPnApplyInfoForPathSource failed Status(0x%x\n", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpCofuncModalityInfo("Modality Info: ", enmPivot, pPivot, "\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync break;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnPathIterTerm(&PathIter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync goto done;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = VBoxVidPnPathIterStatus(&PathIter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (!NT_SUCCESS(Status))
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("PathIter failed Status()0x%x\n", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpCofuncModalityInfo("Modality Info: ", enmPivot, pPivot, "\n");
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync goto done;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsyncdone:
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync for (uint32_t i = 0; i < (uint32_t)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync CrSaCleanup(&aModes[i]);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync return Status;
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync}
5793d23a719d4902824a3649b6fef3822ddd5fc7vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVidPnEnumMonitorSourceModes(D3DKMDT_HMONITORSOURCEMODESET hMonitorSMS, CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pMonitorSMSIf,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PFNVBOXVIDPNENUMMONITORSOURCEMODES pfnCallback, PVOID pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST D3DKMDT_MONITOR_SOURCE_MODE *pMonitorSMI;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pMonitorSMSIf->pfnAcquireFirstModeInfo(hMonitorSMS, &pMonitorSMI);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_DATASET_IS_EMPTY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pMonitorSMI);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync while (1)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST D3DKMDT_MONITOR_SOURCE_MODE *pNextMonitorSMI;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = pMonitorSMSIf->pfnAcquireNextModeInfo(hMonitorSMS, pMonitorSMI, &pNextMonitorSMI);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pfnCallback(hMonitorSMS, pMonitorSMSIf, pMonitorSMI, pContext))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pNextMonitorSMI);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x), ignored since callback returned false", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pMonitorSMI = pNextMonitorSMI;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNextMonitorSMI = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("pfnAcquireFirstModeInfo failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVidPnEnumSourceModes(D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PFNVBOXVIDPNENUMSOURCEMODES pfnCallback, PVOID pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pVidPnSourceModeSetInterface->pfnAcquireFirstModeInfo(hNewVidPnSourceModeSet, &pNewVidPnSourceModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pNewVidPnSourceModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync while (1)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNextVidPnSourceModeInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = pVidPnSourceModeSetInterface->pfnAcquireNextModeInfo(hNewVidPnSourceModeSet, pNewVidPnSourceModeInfo, &pNextVidPnSourceModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pfnCallback(hNewVidPnSourceModeSet, pVidPnSourceModeSetInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNewVidPnSourceModeInfo, pContext))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVidPnSourceModeSetInterface->pfnReleaseModeInfo(hNewVidPnSourceModeSet, pNextVidPnSourceModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x), ignored since callback returned false", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNewVidPnSourceModeInfo = pNextVidPnSourceModeInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNewVidPnSourceModeInfo = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("pfnAcquireFirstModeInfo failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVidPnEnumTargetModes(D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PFNVBOXVIDPNENUMTARGETMODES pfnCallback, PVOID pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pVidPnTargetModeSetInterface->pfnAcquireFirstModeInfo(hNewVidPnTargetModeSet, &pNewVidPnTargetModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pNewVidPnTargetModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync while (1)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNextVidPnTargetModeInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = pVidPnTargetModeSetInterface->pfnAcquireNextModeInfo(hNewVidPnTargetModeSet, pNewVidPnTargetModeInfo, &pNextVidPnTargetModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pfnCallback(hNewVidPnTargetModeSet, pVidPnTargetModeSetInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNewVidPnTargetModeInfo, pContext))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVidPnTargetModeSetInterface->pfnReleaseModeInfo(hNewVidPnTargetModeSet, pNextVidPnTargetModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x), ignored since callback returned false", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNewVidPnTargetModeInfo = pNextVidPnTargetModeInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("pfnAcquireNextModeInfo Failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNewVidPnTargetModeInfo = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("pfnAcquireFirstModeInfo failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVidPnEnumTargetsForSource(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PFNVBOXVIDPNENUMTARGETSFORSOURCE pfnCallback, PVOID pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync SIZE_T cTgtPaths;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pVidPnTopologyInterface->pfnGetNumPathsFromSource(hVidPnTopology, VidPnSourceId, &cTgtPaths);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (SIZE_T i = 0; i < cTgtPaths; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = pVidPnTopologyInterface->pfnEnumPathTargetsFromSource(hVidPnTopology, VidPnSourceId, i, &VidPnTargetId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pfnCallback(pDevExt, hVidPnTopology, pVidPnTopologyInterface, VidPnSourceId, VidPnTargetId, cTgtPaths, pContext))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("pfnEnumPathTargetsFromSource failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status != STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("pfnGetNumPathsFromSource failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncNTSTATUS vboxVidPnEnumPaths(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PFNVBOXVIDPNENUMPATHS pfnCallback, PVOID pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pVidPnTopologyInterface->pfnAcquireFirstPathInfo(hVidPnTopology, &pNewVidPnPresentPathInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync while (1)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const D3DKMDT_VIDPN_PRESENT_PATH *pNextVidPnPresentPathInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = pVidPnTopologyInterface->pfnAcquireNextPathInfo(hVidPnTopology, pNewVidPnPresentPathInfo, &pNextVidPnPresentPathInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pfnCallback(hVidPnTopology, pVidPnTopologyInterface, pNewVidPnPresentPathInfo, pContext))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVidPnTopologyInterface->pfnReleasePathInfo(hVidPnTopology, pNextVidPnPresentPathInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status != STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync WARN(("pfnAcquireNextPathInfo Failed Status(0x%x), ignored since callback returned false", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNewVidPnPresentPathInfo = pNextVidPnPresentPathInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync WARN(("pfnAcquireNextPathInfo Failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNewVidPnPresentPathInfo = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_DATASET_IS_EMPTY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync WARN(("pfnAcquireFirstModeInfo failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncNTSTATUS vboxVidPnSetupSourceInfo(PVBOXMP_DEVEXT pDevExt, CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, PVBOXWDDM_ALLOCATION pAllocation,
359416647a711739d1b14addbf399178949a1a60vboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, VBOXWDDM_SOURCE *paSources)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync PVBOXWDDM_SOURCE pSource = &paSources[VidPnSourceId];
31bfc52a4a41b49334ed8c53ab20a41c5c18f4e3vboxsync /* pVidPnSourceModeInfo could be null if STATUS_GRAPHICS_MODE_NOT_PINNED,
359416647a711739d1b14addbf399178949a1a60vboxsync * see VBoxVidPnCommitSourceModeForSrcId */
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync uint8_t fChanges = 0;
31bfc52a4a41b49334ed8c53ab20a41c5c18f4e3vboxsync if (pVidPnSourceModeInfo)
31bfc52a4a41b49334ed8c53ab20a41c5c18f4e3vboxsync {
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync if (pSource->AllocData.SurfDesc.width != pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx)
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync {
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync pSource->AllocData.SurfDesc.width = pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync }
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync if (pSource->AllocData.SurfDesc.height != pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy)
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync {
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync pSource->AllocData.SurfDesc.height = pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync }
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync if (pSource->AllocData.SurfDesc.format != pVidPnSourceModeInfo->Format.Graphics.PixelFormat)
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync {
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync pSource->AllocData.SurfDesc.format = pVidPnSourceModeInfo->Format.Graphics.PixelFormat;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync }
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync if (pSource->AllocData.SurfDesc.bpp != vboxWddmCalcBitsPerPixel(pVidPnSourceModeInfo->Format.Graphics.PixelFormat))
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync {
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync pSource->AllocData.SurfDesc.bpp = vboxWddmCalcBitsPerPixel(pVidPnSourceModeInfo->Format.Graphics.PixelFormat);
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync }
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync if(pSource->AllocData.SurfDesc.pitch != pVidPnSourceModeInfo->Format.Graphics.Stride)
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync {
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync pSource->AllocData.SurfDesc.pitch = pVidPnSourceModeInfo->Format.Graphics.Stride;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync }
31bfc52a4a41b49334ed8c53ab20a41c5c18f4e3vboxsync pSource->AllocData.SurfDesc.depth = 1;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync if (pSource->AllocData.SurfDesc.slicePitch != pVidPnSourceModeInfo->Format.Graphics.Stride)
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync {
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync pSource->AllocData.SurfDesc.slicePitch = pVidPnSourceModeInfo->Format.Graphics.Stride;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync }
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync if (pSource->AllocData.SurfDesc.cbSize != pVidPnSourceModeInfo->Format.Graphics.Stride * pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy)
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync {
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync pSource->AllocData.SurfDesc.cbSize = pVidPnSourceModeInfo->Format.Graphics.Stride * pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync }
5159c4c6485473c77871b515c15b59c3caa60b46vboxsync#ifdef VBOX_WDDM_WIN8
5159c4c6485473c77871b515c15b59c3caa60b46vboxsync if (g_VBoxDisplayOnly)
5159c4c6485473c77871b515c15b59c3caa60b46vboxsync {
28cbd612d23d0c7c9c909206f050919495d29a2cvboxsync vboxWddmDmSetupDefaultVramLocation(pDevExt, VidPnSourceId, paSources);
5159c4c6485473c77871b515c15b59c3caa60b46vboxsync }
5159c4c6485473c77871b515c15b59c3caa60b46vboxsync#endif
5159c4c6485473c77871b515c15b59c3caa60b46vboxsync }
5159c4c6485473c77871b515c15b59c3caa60b46vboxsync else
5159c4c6485473c77871b515c15b59c3caa60b46vboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnAllocDataInit(&pSource->AllocData, VidPnSourceId);
5159c4c6485473c77871b515c15b59c3caa60b46vboxsync Assert(!pAllocation);
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_ALL;
31bfc52a4a41b49334ed8c53ab20a41c5c18f4e3vboxsync }
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync
28cbd612d23d0c7c9c909206f050919495d29a2cvboxsync#ifdef VBOX_WDDM_WIN8
8f5637540ef5fe9fc37a62cdc991e4d151ed54ccvboxsync Assert(!g_VBoxDisplayOnly || !pAllocation);
28cbd612d23d0c7c9c909206f050919495d29a2cvboxsync if (!g_VBoxDisplayOnly)
28cbd612d23d0c7c9c909206f050919495d29a2cvboxsync#endif
8f5637540ef5fe9fc37a62cdc991e4d151ed54ccvboxsync {
8f5637540ef5fe9fc37a62cdc991e4d151ed54ccvboxsync vboxWddmAssignPrimary(pSource, pAllocation, VidPnSourceId);
8f5637540ef5fe9fc37a62cdc991e4d151ed54ccvboxsync }
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync Assert(pSource->AllocData.SurfDesc.VidPnSourceId == VidPnSourceId);
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync pSource->u8SyncState &= ~fChanges;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncNTSTATUS vboxVidPnCommitSourceMode(PVBOXMP_DEVEXT pDevExt, CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, PVBOXWDDM_ALLOCATION pAllocation,
359416647a711739d1b14addbf399178949a1a60vboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, VBOXWDDM_SOURCE *paSources)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync if (VidPnSourceId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays)
359416647a711739d1b14addbf399178949a1a60vboxsync return vboxVidPnSetupSourceInfo(pDevExt, pVidPnSourceModeInfo, pAllocation, VidPnSourceId, paSources);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync WARN(("invalid srcId (%d), cSources(%d)", VidPnSourceId, VBoxCommonFromDeviceExt(pDevExt)->cDisplays));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return STATUS_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXVIDPNCOMMITTARGETMODE
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMDT_HVIDPN hVidPn;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface;
359416647a711739d1b14addbf399178949a1a60vboxsync VBOXWDDM_SOURCE *paSources;
359416647a711739d1b14addbf399178949a1a60vboxsync VBOXWDDM_TARGET *paTargets;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXVIDPNCOMMITTARGETMODE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLCALLBACK(BOOLEAN) vboxVidPnCommitTargetModeEnum(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId, SIZE_T cTgtPaths, PVOID pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNCOMMITTARGETMODE *pInfo = (VBOXVIDPNCOMMITTARGETMODE*)pContext;
3987958b11f1f4151dd392c3cb5460dc166bc801vboxsync Assert(cTgtPaths <= (SIZE_T)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMDT_HVIDPNTARGETMODESET hVidPnTargetModeSet;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST DXGK_VIDPNTARGETMODESET_INTERFACE* pVidPnTargetModeSetInterface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pInfo->pVidPnInterface->pfnAcquireTargetModeSet(pInfo->hVidPn, VidPnTargetId, &hVidPnTargetModeSet, &pVidPnTargetModeSetInterface);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST D3DKMDT_VIDPN_TARGET_MODE* pPinnedVidPnTargetModeInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = pVidPnTargetModeSetInterface->pfnAcquirePinnedModeInfo(hVidPnTargetModeSet, &pPinnedVidPnTargetModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync VBOXWDDM_SOURCE *pSource = &pInfo->paSources[VidPnSourceId];
359416647a711739d1b14addbf399178949a1a60vboxsync VBOXWDDM_TARGET *pTarget = &pInfo->paTargets[VidPnTargetId];
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->Size.cx = pPinnedVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cx;
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->Size.cy = pPinnedVidPnTargetModeInfo->VideoSignalInfo.TotalSize.cy;
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnStSourceTargetAdd(pInfo->paSources, VBoxCommonFromDeviceExt(pDevExt)->cDisplays, pSource, pTarget);
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS;
359416647a711739d1b14addbf399178949a1a60vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVidPnTargetModeSetInterface->pfnReleaseModeInfo(hVidPnTargetModeSet, pPinnedVidPnTargetModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync else
359416647a711739d1b14addbf399178949a1a60vboxsync WARN(("pfnAcquirePinnedModeInfo failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->pVidPnInterface->pfnReleaseTargetModeSet(pInfo->hVidPn, hVidPnTargetModeSet);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
359416647a711739d1b14addbf399178949a1a60vboxsync WARN(("pfnAcquireTargetModeSet failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->Status = Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status == STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncNTSTATUS VBoxVidPnCommitSourceModeForSrcId(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
359416647a711739d1b14addbf399178949a1a60vboxsync PVBOXWDDM_ALLOCATION pAllocation,
359416647a711739d1b14addbf399178949a1a60vboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, VBOXWDDM_SOURCE *paSources, VBOXWDDM_TARGET *paTargets)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pCurVidPnSourceModeSetInterface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync PVBOXWDDM_SOURCE pSource = &paSources[VidPnSourceId];
359416647a711739d1b14addbf399178949a1a60vboxsync VBOXWDDM_TARGET_ITER Iter;
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnStTIterInit(pSource, paTargets, (uint32_t)VBoxCommonFromDeviceExt(pDevExt)->cDisplays, &Iter);
359416647a711739d1b14addbf399178949a1a60vboxsync for (PVBOXWDDM_TARGET pTarget = VBoxVidPnStTIterNext(&Iter);
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget;
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget = VBoxVidPnStTIterNext(&Iter))
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync Assert(pTarget->VidPnSourceId == pSource->AllocData.SurfDesc.VidPnSourceId);
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->Size.cx = 0;
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->Size.cy = 0;
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_ALL;
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnStSourceCleanup(paSources, VidPnSourceId, paTargets, (uint32_t)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pVidPnInterface->pfnAcquireSourceModeSet(hDesiredVidPn,
359416647a711739d1b14addbf399178949a1a60vboxsync VidPnSourceId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &hCurVidPnSourceModeSet,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &pCurVidPnSourceModeSetInterface);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST D3DKMDT_VIDPN_SOURCE_MODE* pPinnedVidPnSourceModeInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = pCurVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_MODE_NOT_PINNED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pPinnedVidPnSourceModeInfo);
359416647a711739d1b14addbf399178949a1a60vboxsync Status = vboxVidPnCommitSourceMode(pDevExt, pPinnedVidPnSourceModeInfo, pAllocation, VidPnSourceId, paSources);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = pVidPnInterface->pfnGetTopology(hDesiredVidPn, &hVidPnTopology, &pVidPnTopologyInterface);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNCOMMITTARGETMODE TgtModeInfo = {0};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync TgtModeInfo.Status = STATUS_SUCCESS; /* <- to ensure we're succeeded if no targets are set */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync TgtModeInfo.hVidPn = hDesiredVidPn;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync TgtModeInfo.pVidPnInterface = pVidPnInterface;
359416647a711739d1b14addbf399178949a1a60vboxsync TgtModeInfo.paSources = paSources;
359416647a711739d1b14addbf399178949a1a60vboxsync TgtModeInfo.paTargets = paTargets;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = vboxVidPnEnumTargetsForSource(pDevExt, hVidPnTopology, pVidPnTopologyInterface,
359416647a711739d1b14addbf399178949a1a60vboxsync VidPnSourceId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnCommitTargetModeEnum, &TgtModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = TgtModeInfo.Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = STATUS_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync WARN(("vboxVidPnEnumTargetsForSource failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync WARN(("pfnGetTopology failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync WARN(("vboxVidPnCommitSourceMode failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* release */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCurVidPnSourceModeSetInterface->pfnReleaseModeInfo(hCurVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync Status = vboxVidPnCommitSourceMode(pDevExt, NULL, pAllocation, VidPnSourceId, paSources);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync WARN(("pfnAcquirePinnedModeInfo failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVidPnInterface->pfnReleaseSourceModeSet(hDesiredVidPn, hCurVidPnSourceModeSet);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync WARN(("pfnAcquireSourceModeSet failed Status(0x%x)", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
359416647a711739d1b14addbf399178949a1a60vboxsyncNTSTATUS VBoxVidPnCommitAll(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
359416647a711739d1b14addbf399178949a1a60vboxsync PVBOXWDDM_ALLOCATION pAllocation,
359416647a711739d1b14addbf399178949a1a60vboxsync VBOXWDDM_SOURCE *paSources, VBOXWDDM_TARGET *paTargets)
359416647a711739d1b14addbf399178949a1a60vboxsync{
359416647a711739d1b14addbf399178949a1a60vboxsync D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology;
359416647a711739d1b14addbf399178949a1a60vboxsync const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface;
359416647a711739d1b14addbf399178949a1a60vboxsync NTSTATUS Status = pVidPnInterface->pfnGetTopology(hDesiredVidPn, &hVidPnTopology, &pVidPnTopologyInterface);
359416647a711739d1b14addbf399178949a1a60vboxsync if (!NT_SUCCESS(Status))
359416647a711739d1b14addbf399178949a1a60vboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync WARN(("pfnGetTopology failed Status 0x%x", Status));
359416647a711739d1b14addbf399178949a1a60vboxsync return Status;
359416647a711739d1b14addbf399178949a1a60vboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
359416647a711739d1b14addbf399178949a1a60vboxsync {
359416647a711739d1b14addbf399178949a1a60vboxsync PVBOXWDDM_TARGET pTarget = &paTargets[i];
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->Size.cx = 0;
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->Size.cy = 0;
359416647a711739d1b14addbf399178949a1a60vboxsync pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_ALL;
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync if (pTarget->VidPnSourceId == D3DDDI_ID_UNINITIALIZED)
359416647a711739d1b14addbf399178949a1a60vboxsync continue;
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync Assert(pTarget->VidPnSourceId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync VBOXWDDM_SOURCE *pSource = &paSources[pTarget->VidPnSourceId];
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnAllocDataInit(&pSource->AllocData, pTarget->VidPnSourceId);
359416647a711739d1b14addbf399178949a1a60vboxsync pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_ALL;
359416647a711739d1b14addbf399178949a1a60vboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync VBoxVidPnStCleanup(paSources, paTargets, VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
359416647a711739d1b14addbf399178949a1a60vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBOXVIDPN_PATH_ITER PathIter;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync const D3DKMDT_VIDPN_PRESENT_PATH *pPath;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnPathIterInit(&PathIter, hVidPnTopology, pVidPnTopologyInterface);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync while ((pPath = VBoxVidPnPathIterNext(&PathIter)) != NULL)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = VBoxVidPnCommitSourceModeForSrcId(pDevExt, hDesiredVidPn, pVidPnInterface, pAllocation,
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync pPath->VidPnSourceId, paSources, paTargets);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync if (Status != STATUS_SUCCESS)
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("VBoxVidPnCommitSourceModeForSrcId failed Status(0x%x)", Status));
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync break;
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync }
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync VBoxVidPnPathIterTerm(&PathIter);
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync
359416647a711739d1b14addbf399178949a1a60vboxsync if (!NT_SUCCESS(Status))
359416647a711739d1b14addbf399178949a1a60vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN((""));
359416647a711739d1b14addbf399178949a1a60vboxsync return Status;
359416647a711739d1b14addbf399178949a1a60vboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync Status = VBoxVidPnPathIterStatus(&PathIter);
359416647a711739d1b14addbf399178949a1a60vboxsync if (!NT_SUCCESS(Status))
359416647a711739d1b14addbf399178949a1a60vboxsync {
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync WARN(("VBoxVidPnPathIterStatus failed Status 0x%x", Status));
359416647a711739d1b14addbf399178949a1a60vboxsync return Status;
359416647a711739d1b14addbf399178949a1a60vboxsync }
359416647a711739d1b14addbf399178949a1a60vboxsync
635c83753ed04cf3637e019af0e15ba40e07f2fevboxsync return STATUS_SUCCESS;
359416647a711739d1b14addbf399178949a1a60vboxsync}
359416647a711739d1b14addbf399178949a1a60vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVIDPNDUMP_STRCASE(_t) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case _t: return #_t;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVIDPNDUMP_STRCASE_UNKNOWN() \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default: Assert(0); return "Unknown";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVIDPNDUMP_STRFLAGS(_v, _t) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if ((_v)._t return #_t;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrImportance(D3DKMDT_VIDPN_PRESENT_PATH_IMPORTANCE ImportanceOrdinal)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (ImportanceOrdinal)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_PRIMARY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_SECONDARY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_TERTIARY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_QUATERNARY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_QUINARY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_SENARY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_SEPTENARY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_OCTONARY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_NONARY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPI_DENARY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrScaling(D3DKMDT_VIDPN_PRESENT_PATH_SCALING Scaling)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (Scaling)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_IDENTITY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_CENTERED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_STRETCHED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_UNPINNED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPS_NOTSPECIFIED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrRotation(D3DKMDT_VIDPN_PRESENT_PATH_ROTATION Rotation)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (Rotation)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_IDENTITY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_ROTATE90);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_ROTATE180);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_ROTATE270);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_UNPINNED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPR_NOTSPECIFIED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrColorBasis(const D3DKMDT_COLOR_BASIS ColorBasis)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (ColorBasis)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_INTENSITY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_SRGB);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_SCRGB);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_YCBCR);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_CB_YPBPR);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsyncconst char * vboxVidPnDumpStrMonCapabilitiesOrigin(D3DKMDT_MONITOR_CAPABILITIES_ORIGIN enmOrigin)
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync{
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync switch (enmOrigin)
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync {
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_MCO_UNINITIALIZED);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_MCO_DEFAULTMONITORPROFILE);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_MCO_MONITORDESCRIPTOR);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_MCO_MONITORDESCRIPTOR_REGISTRYOVERRIDE);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_MCO_SPECIFICCAP_REGISTRYOVERRIDE);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_MCO_DRIVER);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync }
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync}
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrPvam(D3DKMDT_PIXEL_VALUE_ACCESS_MODE PixelValueAccessMode)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (PixelValueAccessMode)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_PVAM_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_PVAM_DIRECT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_PVAM_PRESETPALETTE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_PVAM_SETTABLEPALETTE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrContent(D3DKMDT_VIDPN_PRESENT_PATH_CONTENT Content)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (Content)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPC_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPC_GRAPHICS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPC_VIDEO);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPC_NOTSPECIFIED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrCopyProtectionType(D3DKMDT_VIDPN_PRESENT_PATH_COPYPROTECTION_TYPE CopyProtectionType)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (CopyProtectionType)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPMT_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPMT_NOPROTECTION);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPMT_MACROVISION_APSTRIGGER);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VPPMT_MACROVISION_FULLSUPPORT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrGammaRampType(D3DDDI_GAMMARAMP_TYPE Type)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (Type)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDI_GAMMARAMP_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDI_GAMMARAMP_DEFAULT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDI_GAMMARAMP_RGB256x3x16);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDI_GAMMARAMP_DXGI_1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrSourceModeType(D3DKMDT_VIDPN_SOURCE_MODE_TYPE Type)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (Type)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_RMT_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_RMT_GRAPHICS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_RMT_TEXT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrScanLineOrdering(D3DDDI_VIDEO_SIGNAL_SCANLINE_ORDERING ScanLineOrdering)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (ScanLineOrdering)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDI_VSSLO_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDI_VSSLO_PROGRESSIVE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDI_VSSLO_INTERLACED_UPPERFIELDFIRST);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDI_VSSLO_INTERLACED_LOWERFIELDFIRST);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDI_VSSLO_OTHER);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrCFMPivotType(D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE EnumPivotType)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (EnumPivotType)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_VIDPNSOURCE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_VIDPNTARGET);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_SCALING);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_ROTATION);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_EPT_NOPIVOT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrModePreference(D3DKMDT_MODE_PREFERENCE Preference)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (Preference)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_MP_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_MP_PREFERRED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_MP_NOTPREFERRED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrSignalStandard(D3DKMDT_VIDEO_SIGNAL_STANDARD VideoStandard)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (VideoStandard)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_UNINITIALIZED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_VESA_DMT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_VESA_GTF);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_VESA_CVT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_IBM);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_APPLE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_NTSC_M);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_NTSC_J);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_NTSC_443);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_B);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_B1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_G);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_H);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_I);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_D);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_N);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_NC);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_B);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_D);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_G);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_H);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_K);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_K1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_L);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_SECAM_L1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_EIA_861);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_EIA_861A);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_EIA_861B);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_K);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_K1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_L);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_PAL_M);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DKMDT_VSS_OTHER);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncconst char* vboxVidPnDumpStrPixFormat(D3DDDIFORMAT PixelFormat)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (PixelFormat)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_UNKNOWN);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R8G8B8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8R8G8B8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X8R8G8B8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R5G6B5);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X1R5G5B5);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A1R5G5B5);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A4R4G4B4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R3G3B2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8R3G3B2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X4R4G4B4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A2B10G10R10);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8B8G8R8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X8B8G8R8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_G16R16);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A2R10G10B10);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A16B16G16R16);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8P8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R32F);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_G32R32F);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A32B32G32R32F);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_CxV8U8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_BINARYBUFFER);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_VERTEXDATA);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_INDEX16);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_INDEX32);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_Q16W16V16U16);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_MULTI2_ARGB8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R16F);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_G16R16F);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A16B16G16R16F);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D32F_LOCKABLE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D24FS8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D32_LOCKABLE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_S8_LOCKABLE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_S1D15);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_S8D24);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X8D24);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X4S4D24);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_L16);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_UYVY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_R8G8_B8G8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_YUY2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_G8R8_G8B8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_DXT1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_DXT2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_DXT3);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_DXT4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_DXT5);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D16_LOCKABLE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D32);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D15S1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D24S8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D24X8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D24X4S4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_D16);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_P8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_L8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A8L8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A4L4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_V8U8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_L6V5U5);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_X8L8V8U8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_Q8W8V8U8);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_V16U16);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_W11V11U10);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE(D3DDDIFMT_A2W10V10U10);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMP_STRCASE_UNKNOWN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpCopyProtectoin(const char *pPrefix, const D3DKMDT_VIDPN_PRESENT_PATH_COPYPROTECTION *pCopyProtection, const char *pSuffix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("%sType(%s), TODO%s", pPrefix,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpStrCopyProtectionType(pCopyProtection->CopyProtectionType), pSuffix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpPathTransformation(const D3DKMDT_VIDPN_PRESENT_PATH_TRANSFORMATION *pContentTransformation)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT((" --Transformation: Scaling(%s), ScalingSupport(%d), Rotation(%s), RotationSupport(%d)--",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpStrScaling(pContentTransformation->Scaling), pContentTransformation->ScalingSupport,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpStrRotation(pContentTransformation->Rotation), pContentTransformation->RotationSupport));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpRegion(const char *pPrefix, const D3DKMDT_2DREGION *pRegion, const char *pSuffix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("%s%dX%d%s", pPrefix, pRegion->cx, pRegion->cy, pSuffix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpRational(const char *pPrefix, const D3DDDI_RATIONAL *pRational, const char *pSuffix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("%s%d/%d=%d%s", pPrefix, pRational->Numerator, pRational->Denominator, pRational->Numerator/pRational->Denominator, pSuffix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpRanges(const char *pPrefix, const D3DKMDT_COLOR_COEFF_DYNAMIC_RANGES *pDynamicRanges, const char *pSuffix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("%sFirstChannel(%d), SecondChannel(%d), ThirdChannel(%d), FourthChannel(%d)%s", pPrefix,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDynamicRanges->FirstChannel,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDynamicRanges->SecondChannel,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDynamicRanges->ThirdChannel,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDynamicRanges->FourthChannel,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSuffix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpGammaRamp(const char *pPrefix, const D3DKMDT_GAMMA_RAMP *pGammaRamp, const char *pSuffix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("%sType(%s), DataSize(%d), TODO: dump the rest%s", pPrefix,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpStrGammaRampType(pGammaRamp->Type), pGammaRamp->DataSize,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSuffix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsyncvoid VBoxVidPnDumpSourceMode(const char *pPrefix, const D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, const char *pSuffix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("%sType(%s), ", pPrefix, vboxVidPnDumpStrSourceModeType(pVidPnSourceModeInfo->Type)));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpRegion("surf(", &pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize, "), ");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpRegion("vis(", &pVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize, "), ");
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("stride(%d), ", pVidPnSourceModeInfo->Format.Graphics.Stride));
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("format(%s), ", vboxVidPnDumpStrPixFormat(pVidPnSourceModeInfo->Format.Graphics.PixelFormat)));
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("clrBasis(%s), ", vboxVidPnDumpStrColorBasis(pVidPnSourceModeInfo->Format.Graphics.ColorBasis)));
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("pvam(%s)%s", vboxVidPnDumpStrPvam(pVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode), pSuffix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpSignalInfo(const char *pPrefix, const D3DKMDT_VIDEO_SIGNAL_INFO *pVideoSignalInfo, const char *pSuffix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("%sVStd(%s), ", pPrefix, vboxVidPnDumpStrSignalStandard(pVideoSignalInfo->VideoStandard)));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpRegion("totSize(", &pVideoSignalInfo->TotalSize, "), ");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpRegion("activeSize(", &pVideoSignalInfo->ActiveSize, "), ");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpRational("VSynch(", &pVideoSignalInfo->VSyncFreq, "), ");
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("PixelRate(%d), ScanLineOrdering(%s)%s", pVideoSignalInfo->PixelRate, vboxVidPnDumpStrScanLineOrdering(pVideoSignalInfo->ScanLineOrdering), pSuffix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsyncvoid VBoxVidPnDumpTargetMode(const char *pPrefix, const D3DKMDT_VIDPN_TARGET_MODE* CONST pVidPnTargetModeInfo, const char *pSuffix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("%s", pPrefix));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync LOGREL_EXACT(("ID: %d, ", pVidPnTargetModeInfo->Id));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpSignalInfo("VSI: ", &pVidPnTargetModeInfo->VideoSignalInfo, ", ");
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("Preference(%s)%s", vboxVidPnDumpStrModePreference(pVidPnTargetModeInfo->Preference), pSuffix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsyncvoid VBoxVidPnDumpMonitorMode(const char *pPrefix, const D3DKMDT_MONITOR_SOURCE_MODE *pVidPnModeInfo, const char *pSuffix)
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync{
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync LOGREL_EXACT(("%s", pPrefix));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync LOGREL_EXACT(("ID: %d, ", pVidPnModeInfo->Id));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync vboxVidPnDumpSignalInfo("VSI: ", &pVidPnModeInfo->VideoSignalInfo, ", ");
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync LOGREL_EXACT(("ColorBasis: %s, ", vboxVidPnDumpStrColorBasis(pVidPnModeInfo->ColorBasis)));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync vboxVidPnDumpRanges("Ranges: ", &pVidPnModeInfo->ColorCoeffDynamicRanges, ", ");
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync LOGREL_EXACT(("MonCapOr: %s, ", vboxVidPnDumpStrMonCapabilitiesOrigin(pVidPnModeInfo->Origin)));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync LOGREL_EXACT(("Preference(%s)%s", vboxVidPnDumpStrModePreference(pVidPnModeInfo->Preference), pSuffix));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync}
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsyncNTSTATUS VBoxVidPnDumpMonitorModeSet(const char *pPrefix, PVBOXMP_DEVEXT pDevExt, uint32_t u32Target, const char *pSuffix)
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync{
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync LOGREL_EXACT(("%s Tgt[%d]\n", pPrefix, u32Target));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync NTSTATUS Status;
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync CONST DXGK_MONITOR_INTERFACE *pMonitorInterface;
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync Status = pDevExt->u.primary.DxgkInterface.DxgkCbQueryMonitorInterface(pDevExt->u.primary.DxgkInterface.DeviceHandle, DXGK_MONITOR_INTERFACE_VERSION_V1, &pMonitorInterface);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync if (!NT_SUCCESS(Status))
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync {
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync WARN(("DxgkCbQueryMonitorInterface failed, Status()0x%x", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync return Status;
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync }
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync D3DKMDT_HMONITORSOURCEMODESET hVidPnModeSet;
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync CONST DXGK_MONITORSOURCEMODESET_INTERFACE *pVidPnModeSetInterface;
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync Status = pMonitorInterface->pfnAcquireMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle,
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync u32Target,
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync &hVidPnModeSet,
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync &pVidPnModeSetInterface);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync if (!NT_SUCCESS(Status))
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync {
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync WARN(("DxgkCbQueryMonitorInterface failed, Status()0x%x", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync return Status;
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync }
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBOXVIDPN_MONITORMODE_ITER Iter;
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync const D3DKMDT_MONITOR_SOURCE_MODE *pVidPnModeInfo;
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnMonitorModeIterInit(&Iter, hVidPnModeSet, pVidPnModeSetInterface);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync while ((pVidPnModeInfo = VBoxVidPnMonitorModeIterNext(&Iter)) != NULL)
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync {
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpMonitorMode("MonitorMode: ",pVidPnModeInfo, "\n");
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync }
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnMonitorModeIterTerm(&Iter);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync Status = VBoxVidPnMonitorModeIterStatus(&Iter);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync if (!NT_SUCCESS(Status))
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync {
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync WARN(("iter status failed %#x", Status));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync }
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync NTSTATUS tmpStatus = pMonitorInterface->pfnReleaseMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle, hVidPnModeSet);
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync if (!NT_SUCCESS(tmpStatus))
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync WARN(("pfnReleaseMonitorSourceModeSet failed tmpStatus(0x%x)", tmpStatus));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync LOGREL_EXACT(("%s", pSuffix));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync return Status;
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync}
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpPinnedSourceMode(const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pCurVidPnSourceModeSetInterface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pVidPnInterface->pfnAcquireSourceModeSet(hVidPn,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VidPnSourceId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &hCurVidPnSourceModeSet,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &pCurVidPnSourceModeSetInterface);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST D3DKMDT_VIDPN_SOURCE_MODE* pPinnedVidPnSourceModeInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = pCurVidPnSourceModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnSourceModeSet, &pPinnedVidPnSourceModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_MODE_NOT_PINNED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpSourceMode("Source Pinned: ", pPinnedVidPnSourceModeInfo, "\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCurVidPnSourceModeSetInterface->pfnReleaseModeInfo(hCurVidPnSourceModeSet, pPinnedVidPnSourceModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("Source NOT Pinned\n"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("ERROR getting piined Source Mode(0x%x)\n", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hCurVidPnSourceModeSet);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("ERROR getting SourceModeSet(0x%x)\n", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsyncDECLCALLBACK(BOOLEAN) vboxVidPnDumpSourceModeSetEnum(D3DKMDT_HVIDPNSOURCEMODESET hNewVidPnSourceModeSet, const DXGK_VIDPNSOURCEMODESET_INTERFACE *pVidPnSourceModeSetInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo, PVOID pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpSourceMode("SourceMode: ", pNewVidPnSourceModeInfo, "\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpSourceModeSet(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT((" >>>+++SourceMode Set for Source(%d)+++\n", VidPnSourceId));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const DXGK_VIDPNSOURCEMODESET_INTERFACE *pCurVidPnSourceModeSetInterface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pVidPnInterface->pfnAcquireSourceModeSet(hVidPn,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VidPnSourceId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &hCurVidPnSourceModeSet,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &pCurVidPnSourceModeSetInterface);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = vboxVidPnEnumSourceModes(hCurVidPnSourceModeSet, pCurVidPnSourceModeSetInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpSourceModeSetEnum, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status != STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("ERROR enumerating Source Modes(0x%x)\n", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVidPnInterface->pfnReleaseSourceModeSet(hVidPn, hCurVidPnSourceModeSet);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("ERROR getting SourceModeSet for Source(%d), Status(0x%x)\n", VidPnSourceId, Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT((" <<<+++End Of SourceMode Set for Source(%d)+++", VidPnSourceId));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLCALLBACK(BOOLEAN) vboxVidPnDumpTargetModeSetEnum(D3DKMDT_HVIDPNTARGETMODESET hNewVidPnTargetModeSet, const DXGK_VIDPNTARGETMODESET_INTERFACE *pVidPnTargetModeSetInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo, PVOID pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpTargetMode("TargetMode: ", pNewVidPnTargetModeInfo, "\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpTargetModeSet(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT((" >>>---TargetMode Set for Target(%d)---\n", VidPnTargetId));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMDT_HVIDPNTARGETMODESET hCurVidPnTargetModeSet;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pCurVidPnTargetModeSetInterface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pVidPnInterface->pfnAcquireTargetModeSet(hVidPn,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VidPnTargetId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &hCurVidPnTargetModeSet,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &pCurVidPnTargetModeSetInterface);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = vboxVidPnEnumTargetModes(hCurVidPnTargetModeSet, pCurVidPnTargetModeSetInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpTargetModeSetEnum, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status != STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("ERROR enumerating Target Modes(0x%x)\n", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hCurVidPnTargetModeSet);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("ERROR getting TargetModeSet for Target(%d), Status(0x%x)\n", VidPnTargetId, Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT((" <<<---End Of TargetMode Set for Target(%d)---", VidPnTargetId));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpPinnedTargetMode(const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMDT_HVIDPNTARGETMODESET hCurVidPnTargetModeSet;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const DXGK_VIDPNTARGETMODESET_INTERFACE *pCurVidPnTargetModeSetInterface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pVidPnInterface->pfnAcquireTargetModeSet(hVidPn,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VidPnTargetId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &hCurVidPnTargetModeSet,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &pCurVidPnTargetModeSetInterface);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST D3DKMDT_VIDPN_TARGET_MODE* pPinnedVidPnTargetModeInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = pCurVidPnTargetModeSetInterface->pfnAcquirePinnedModeInfo(hCurVidPnTargetModeSet, &pPinnedVidPnTargetModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_MODE_NOT_PINNED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync VBoxVidPnDumpTargetMode("Target Pinned: ", pPinnedVidPnTargetModeInfo, "\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCurVidPnTargetModeSetInterface->pfnReleaseModeInfo(hCurVidPnTargetModeSet, pPinnedVidPnTargetModeInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("Target NOT Pinned\n"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("ERROR getting piined Target Mode(0x%x)\n", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVidPnInterface->pfnReleaseTargetModeSet(hVidPn, hCurVidPnTargetModeSet);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("ERROR getting TargetModeSet(0x%x)\n", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsyncvoid VBoxVidPnDumpCofuncModalityInfo(const char *pPrefix, D3DKMDT_ENUMCOFUNCMODALITY_PIVOT_TYPE enmEnumPivotType, const DXGK_ENUM_PIVOT *pPivot, const char *pSuffix)
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync{
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync LOGREL_EXACT(("%sPivotType(%s), SourceId(0x%x), TargetId(0x%x),%s", pPrefix, vboxVidPnDumpStrCFMPivotType(enmEnumPivotType),
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync pPivot->VidPnSourceId, pPivot->VidPnTargetId, pSuffix));
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync}
924168e361ce5874143cc4281aa5ccbeb87c08e2vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpCofuncModalityArg(const char *pPrefix, CONST DXGKARG_ENUMVIDPNCOFUNCMODALITY* CONST pEnumCofuncModalityArg, const char *pSuffix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("%sPivotType(%s), SourceId(0x%x), TargetId(0x%x),%s", pPrefix, vboxVidPnDumpStrCFMPivotType(pEnumCofuncModalityArg->EnumPivotType),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pEnumCofuncModalityArg->EnumPivot.VidPnSourceId, pEnumCofuncModalityArg->EnumPivot.VidPnTargetId, pSuffix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpPath(const D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, const D3DKMDT_VIDPN_PRESENT_PATH *pVidPnPresentPathInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT((" >>**** Start Dump VidPn Path ****>>\n"));
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("VidPnSourceId(%d), VidPnTargetId(%d)\n",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVidPnPresentPathInfo->VidPnSourceId, pVidPnPresentPathInfo->VidPnTargetId));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpPinnedSourceMode(hVidPn, pVidPnInterface, pVidPnPresentPathInfo->VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpPinnedTargetMode(hVidPn, pVidPnInterface, pVidPnPresentPathInfo->VidPnTargetId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpPathTransformation(&pVidPnPresentPathInfo->ContentTransformation);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("Importance(%s), TargetColorBasis(%s), Content(%s), ",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpStrImportance(pVidPnPresentPathInfo->ImportanceOrdinal),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpStrColorBasis(pVidPnPresentPathInfo->VidPnTargetColorBasis),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpStrContent(pVidPnPresentPathInfo->Content)));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpRegion("VFA_TL_O(", &pVidPnPresentPathInfo->VisibleFromActiveTLOffset, "), ");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpRegion("VFA_BR_O(", &pVidPnPresentPathInfo->VisibleFromActiveBROffset, "), ");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpRanges("CCDynamicRanges: ", &pVidPnPresentPathInfo->VidPnTargetColorCoeffDynamicRanges, "| ");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpCopyProtectoin("CProtection: ", &pVidPnPresentPathInfo->CopyProtection, "| ");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpGammaRamp("GammaRamp: ", &pVidPnPresentPathInfo->GammaRamp, "\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT((" <<**** Stop Dump VidPn Path ****<<"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXVIDPNDUMPPATHENUM
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMDT_HVIDPN hVidPn;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const DXGK_VIDPN_INTERFACE* pVidPnInterface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXVIDPNDUMPPATHENUM, *PVBOXVIDPNDUMPPATHENUM;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic DECLCALLBACK(BOOLEAN) vboxVidPnDumpPathEnum(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const D3DKMDT_VIDPN_PRESENT_PATH *pVidPnPresentPathInfo, PVOID pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVIDPNDUMPPATHENUM pData = (PVBOXVIDPNDUMPPATHENUM)pContext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpPath(pData->hVidPn, pData->pVidPnInterface, pVidPnPresentPathInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVidPnTopologyInterface->pfnReleasePathInfo(hVidPnTopology, pVidPnPresentPathInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVidPnDumpVidPn(const char * pPrefix, PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, const char * pSuffix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("%s", pPrefix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVIDPNDUMPPATHENUM CbData;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CbData.hVidPn = hVidPn;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CbData.pVidPnInterface = pVidPnInterface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pVidPnInterface->pfnGetTopology(hVidPn, &hVidPnTopology, &pVidPnTopologyInterface);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (Status == STATUS_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Status = vboxVidPnEnumPaths(hVidPnTopology, pVidPnTopologyInterface,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpPathEnum, &CbData);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpSourceModeSet(pDevExt, hVidPn, pVidPnInterface, (D3DDDI_VIDEO_PRESENT_SOURCE_ID)i);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVidPnDumpTargetModeSet(pDevExt, hVidPn, pVidPnInterface, (D3DDDI_VIDEO_PRESENT_TARGET_ID)i);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
340ee06f35257fee1bd68223ab3504cf2b1d0c3evboxsync LOGREL_EXACT(("%s", pSuffix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}