VBoxScreen.cpp revision 3c5c04d7b0973be0757addef8ba44b9352b38386
/* $Id$ */
/** @file
* VBoxVideo Display D3D User mode dll
*/
/*
* Copyright (C) 2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "VBoxScreen.h"
typedef struct VBOXSCREENMONENUM
{
static VBOXSCREENMON g_VBoxScreenMon;
typedef DECLCALLBACK(BOOLEAN) FNVBOXSCREENMON_ADAPTEROP(PVBOXSCREENMON pMon, D3DKMT_HANDLE hAdapter, LPCWSTR pDevName, PVOID pContext);
static HRESULT vboxScreenMonWDDMAdapterOp(PVBOXSCREENMON pMon, LPCWSTR pDevName, PFNVBOXSCREENMON_ADAPTEROP pfnOp, PVOID pContext)
{
wcsncpy(OpenAdapterData.DeviceName, pDevName, RT_ELEMENTS(OpenAdapterData.DeviceName) - 1 /* the last one is always \0 */);
if (!Status)
{
BOOLEAN bCloseAdapter = pfnOp(pMon, OpenAdapterData.hAdapter, OpenAdapterData.DeviceName, pContext);
if (bCloseAdapter)
{
if (Status)
{
/* ignore */
Status = 0;
}
}
}
else
{
}
return hr;
}
typedef struct
{
int cbData;
DECLCALLBACK(BOOLEAN) vboxScreenMonEscapeOp(PVBOXSCREENMON pMon, D3DKMT_HANDLE hAdapter, LPCWSTR pDevName, PVOID pContext)
{
D3DKMT_ESCAPE EscapeData = {0};
//EscapeData.hDevice = NULL;
//EscapeData.hContext = NULL;
return TRUE;
}
{
{
{
else
}
}
else
return hr;
}
static BOOL CALLBACK vboxScreenMonEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
{
{
{
wcsncpy(OpenAdapterData.DeviceName, minfo.szDevice, RT_ELEMENTS(OpenAdapterData.DeviceName) - 1 /* the last one is always \0 */);
if (!Status)
{
|| pMon->LoData.ScreenLayout.ScreenLayout.aScreens[pEnum->iCur].VidPnSourceId != OpenAdapterData.VidPnSourceId
{
pMon->LoData.ScreenLayout.ScreenLayout.aScreens[pEnum->iCur].VidPnSourceId = OpenAdapterData.VidPnSourceId;
}
}
else
{
}
}
else
{
Assert(0);
}
// D3DKMT_OPENADAPTERFROMHDC Oa;
// memset(&Oa, 0, sizeof (D3DKMT_OPENADAPTERFROMHDC));
// Oa.hDc = hdcMonitor;
// HRESULT hr = pMon->pfnD3DKMTOpenAdapterFromHdc(&Oa);
// Assert(hr == S_OK);
// if (hr == S_OK)
// {
// if (pEnum->pScreenInfo->cScreens <= pEnum->iCur
// || pEnum->pScreenInfo->aScreens[pEnum->iCur].VidPnSourceId != Oa.VidPnSourceId
// || pEnum->pScreenInfo->aScreens[pEnum->iCur].pos.x != lprcMonitor->left
// || pEnum->pScreenInfo->aScreens[pEnum->iCur].pos.y == lprcMonitor->top)
// {
// pEnum->pScreenInfo->aScreens[pEnum->iCur].VidPnSourceId = Oa.VidPnSourceId;
// pEnum->pScreenInfo->aScreens[pEnum->iCur].pos.x = lprcMonitor->left;
// pEnum->pScreenInfo->aScreens[pEnum->iCur].pos.y = lprcMonitor->top;
// pEnum->bChanged = true;
// }
//
// D3DKMT_CLOSEADAPTER ClosaAdapterData = {0};
// ClosaAdapterData.hAdapter = Oa.hAdapter;
// HRESULT tmpHr = pMon->pfnD3DKMTCloseAdapter(&ClosaAdapterData);
// Assert(tmpHr == S_OK);
// pEnum->hr = hr;
// }
}
else
{
}
}
return TRUE;
}
//static HRESULT vboxScreenMonCheckUpdateChange(PVBOXSCREENMON pMon)
static HRESULT vboxScreenMonCheckUpdateChange()
{
VBOXSCREENMONENUM monEnum = {0};
if (bResult)
{
{
UINT cbSize = RT_OFFSETOF(VBOXSCREENLAYOUT, aScreens[pMon->LoData.ScreenLayout.ScreenLayout.cScreens]);
return hr;
}
}
Assert(0);
return hr;
}
)
{
switch(uMsg)
{
case WM_DISPLAYCHANGE:
{
}
case WM_CLOSE:
return 0;
case WM_DESTROY:
return 0;
case WM_NCHITTEST:
return HTNOWHERE;
}
}
#define VBOXSCREENMONWND_NAME L"VboxScreenMonWnd"
{
/* Register the Window Class. */
{
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
if (!RegisterClass(&wc))
{
}
}
{
-100, -100,
10, 10,
NULL, //GetDesktopWindow() /* hWndParent */,
NULL /* hMenu */,
NULL /* lpParam */);
if (hWnd)
{
}
else
{
}
}
return hr;
}
{
if (bResult)
return S_OK;
Assert(0);
return HRESULT_FROM_WIN32(winErr);
}
//HRESULT vboxScreenMonInit(PVBOXSCREENMON pMon)
{
{
bool bSupported = true;
pMon->pfnD3DKMTOpenAdapterFromHdc = (PFND3DKMT_OPENADAPTERFROMHDC)GetProcAddress(pMon->hGdi32, "D3DKMTOpenAdapterFromHdc");
pMon->pfnD3DKMTOpenAdapterFromGdiDisplayName = (PFND3DKMT_OPENADAPTERFROMGDIDISPLAYNAME)GetProcAddress(pMon->hGdi32, "D3DKMTOpenAdapterFromGdiDisplayName");
Log((__FUNCTION__": pfnD3DKMTOpenAdapterFromGdiDisplayName = %p\n", pMon->pfnD3DKMTOpenAdapterFromGdiDisplayName));
pMon->pfnD3DKMTCloseAdapter = (PFND3DKMT_CLOSEADAPTER)GetProcAddress(pMon->hGdi32, "D3DKMTCloseAdapter");
if (bSupported)
{
return S_OK;
}
else
{
}
}
else
{
Assert(0);
}
return hr;
}
//HRESULT vboxScreenMonTerm(PVBOXSCREENMON pMon)
{
return S_OK;
}
{
{
NULL /* HWND hWnd */,
WM_USER /* UINT wMsgFilterMin */,
WM_USER /* UINT wMsgFilterMax */,
}
do
{
if (bCheck)
{
}
0 /*HWND hWnd*/,
0 /*UINT wMsgFilterMin*/,
0 /*UINT wMsgFilterMax*/
);
if(!bResult) /* WM_QUIT was posted */
{
break;
}
{
Assert(0);
/* just ensure we never return success in this case */
break;
}
{
case WM_DISPLAYCHANGE:
default:
break;
}
} while (1);
return 0;
}
{
Assert(0);
if (!bRc)
{
Assert(0);
}
{
hr = vboxScreenMonRun();
}
return 0;
}
{
FALSE, /* BOOL bManualReset*/
FALSE, /* BOOL bInitialState */
NULL /* LPCTSTR lpName */
);
{
0 /* SIZE_T dwStackSize */,
pMon,
0 /* DWORD dwCreationFlags */,
{
Assert(0);
return S_OK;
}
else
{
Assert(0);
}
}
else
{
Assert(0);
}
return hr;
}
{
return S_OK;
Assert(0);
FALSE, /* BOOL bWaitAll */
INFINITE /* DWORD dwMilliseconds */
);
{
if (bResult)
{
if (dwErr == WAIT_OBJECT_0)
{
}
else
{
Assert(0);
}
}
else
{
if (winErr == ERROR_INVALID_THREAD_ID)
{
}
else
{
Assert(0);
}
}
}
else if (dwResult == WAIT_OBJECT_0)
{
/* thread has terminated already */
}
else
{
Assert(0);
}
{
}
return hr;
}