VBoxDispIf.h revision 92717ff0762d9966fec99b209450611e42af2ca1
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan/** @file
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * VBoxTray - Display Settings Interface abstraction for XPDM & WDDM
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan */
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan/*
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * Copyright (C) 2006-2010 Oracle Corporation
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan *
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * This file is part of VirtualBox Open Source Edition (OSE), as
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * available from http://www.virtualbox.org. This file is free software;
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * you can redistribute it and/or modify it under the terms of the GNU
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * General Public License (GPL) as published by the Free Software
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * Foundation, in version 2 as it comes in the "COPYING" file of the
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan */
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan#include <iprt/cdefs.h>
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan#ifdef VBOX_WITH_WDDM
698087e79b077b3fd51ea24a83cdd9b2c979d26eDirk Hogan# define D3DKMDT_SPECIAL_MULTIPLATFORM_TOOL
698087e79b077b3fd51ea24a83cdd9b2c979d26eDirk Hogan# include <d3dkmthk.h>
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan#endif
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan
698087e79b077b3fd51ea24a83cdd9b2c979d26eDirk Hogan#include <VBoxDisplay.h>
698087e79b077b3fd51ea24a83cdd9b2c979d26eDirk Hogan
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogantypedef enum
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan{
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan VBOXDISPIF_MODE_UNKNOWN = 0,
698087e79b077b3fd51ea24a83cdd9b2c979d26eDirk Hogan VBOXDISPIF_MODE_XPDM_NT4 = 1,
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan VBOXDISPIF_MODE_XPDM
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan#ifdef VBOX_WITH_WDDM
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan , VBOXDISPIF_MODE_WDDM
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan#endif
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan} VBOXDISPIF_MODE;
698087e79b077b3fd51ea24a83cdd9b2c979d26eDirk Hogan/* display driver interface abstraction for XPDM & WDDM
698087e79b077b3fd51ea24a83cdd9b2c979d26eDirk Hogan * with WDDM we can not use ExtEscape to communicate with our driver
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * because we do not have XPDM display driver any more, i.e. escape requests are handled by cdd
698087e79b077b3fd51ea24a83cdd9b2c979d26eDirk Hogan * that knows nothing about us
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * NOTE: DispIf makes no checks whether the display driver is actually a VBox driver,
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * it just switches between using different backend OS API based on the VBoxDispIfSwitchMode call
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * It's caller's responsibility to initiate it to work in the correct mode */
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogantypedef struct VBOXDISPIF
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan{
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan VBOXDISPIF_MODE enmMode;
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan /* with WDDM the approach is to call into WDDM miniport driver via PFND3DKMT API provided by the GDI,
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * The PFND3DKMT is supposed to be used by the OpenGL ICD according to MSDN, so this approach is a bit hacky */
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan union
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan {
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan struct
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan {
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan LONG (WINAPI * pfnChangeDisplaySettingsEx)(LPCSTR lpszDeviceName, LPDEVMODE lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam);
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan } xpdm;
ed6e467da555df9e4404518414a9e43bff3b353cDirk Hogan#ifdef VBOX_WITH_WDDM
698087e79b077b3fd51ea24a83cdd9b2c979d26eDirk Hogan struct
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan {
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan /* ChangeDisplaySettingsEx does not exist in NT. ResizeDisplayDevice uses the function. */
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan LONG (WINAPI * pfnChangeDisplaySettingsEx)(LPCTSTR lpszDeviceName, LPDEVMODE lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam);
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan /* EnumDisplayDevices does not exist in NT. isVBoxDisplayDriverActive et al. are using these functions. */
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan BOOL (WINAPI * pfnEnumDisplayDevices)(IN LPCSTR lpDevice, IN DWORD iDevNum, OUT PDISPLAY_DEVICEA lpDisplayDevice, IN DWORD dwFlags);
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan /* open adapter */
7b09ff83c4ae53ff29b28d7c359ac90fe015a3a3Dirk Hogan PFND3DKMT_OPENADAPTERFROMHDC pfnD3DKMTOpenAdapterFromHdc;
ed6e467da555df9e4404518414a9e43bff3b353cDirk Hogan PFND3DKMT_OPENADAPTERFROMGDIDISPLAYNAME pfnD3DKMTOpenAdapterFromGdiDisplayName;
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan /* close adapter */
698087e79b077b3fd51ea24a83cdd9b2c979d26eDirk Hogan PFND3DKMT_CLOSEADAPTER pfnD3DKMTCloseAdapter;
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan /* escape */
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan PFND3DKMT_ESCAPE pfnD3DKMTEscape;
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan /* auto resize support */
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan PFND3DKMT_INVALIDATEACTIVEVIDPN pfnD3DKMTInvalidateActiveVidPn;
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan } wddm;
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan#endif
ed6e467da555df9e4404518414a9e43bff3b353cDirk Hogan } modeData;
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan} VBOXDISPIF, *PVBOXDISPIF;
698087e79b077b3fd51ea24a83cdd9b2c979d26eDirk Hogantypedef const struct VBOXDISPIF *PCVBOXDISPIF;
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan/* initializes the DispIf
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * Initially the DispIf is configured to work in XPDM mode
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan * call VBoxDispIfSwitchMode to switch the mode to WDDM */
883337f300b7ec221922c406e0c4dcee08a89e51Dirk HoganDWORD VBoxDispIfInit(PVBOXDISPIF pIf);
883337f300b7ec221922c406e0c4dcee08a89e51Dirk HoganDWORD VBoxDispIfSwitchMode(PVBOXDISPIF pIf, VBOXDISPIF_MODE enmMode, VBOXDISPIF_MODE *penmOldMode);
883337f300b7ec221922c406e0c4dcee08a89e51Dirk HoganDECLINLINE(VBOXDISPIF_MODE) VBoxDispGetMode(PVBOXDISPIF pIf) { return pIf->enmMode; }
883337f300b7ec221922c406e0c4dcee08a89e51Dirk HoganDWORD VBoxDispIfTerm(PVBOXDISPIF pIf);
883337f300b7ec221922c406e0c4dcee08a89e51Dirk HoganDWORD VBoxDispIfEscape(PCVBOXDISPIF const pIf, PVBOXDISPIFESCAPE pEscape, int cbData);
883337f300b7ec221922c406e0c4dcee08a89e51Dirk HoganDWORD VBoxDispIfResize(PCVBOXDISPIF const pIf, ULONG Id, DWORD Width, DWORD Height, DWORD BitsPerPixel);
883337f300b7ec221922c406e0c4dcee08a89e51Dirk HoganDWORD VBoxDispIfResizeModes(PCVBOXDISPIF const pIf, UINT iChangedMode, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes);
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan//DWORD VBoxDispIfReninitModes(PCVBOXDISPIF const pIf, uint8_t *pScreenIdMask, BOOL fReconnectDisplaysOnChange);
883337f300b7ec221922c406e0c4dcee08a89e51Dirk Hogan