VBoxDispD3DIf.cpp revision 9055f61bb57d2a625c6434d55beac7565c3b3c0d
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBoxVideo Display D3D User mode dll
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Copyright (C) 2011 Oracle Corporation
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 pD3D->hD3DLib = LoadLibraryW(L"VBoxD3D9wddm-x86.dll");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pD3D->pfnDirect3DCreate9Ex = (PFNVBOXDISPD3DCREATE9EX)GetProcAddress(pD3D->hD3DLib, "Direct3DCreate9Ex");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pD3D->pfnVBoxWineExD3DDev9CreateTexture = (PFNVBOXWINEEXD3DDEV9_CREATETEXTURE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9CreateTexture");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pD3D->pfnVBoxWineExD3DDev9CreateCubeTexture = (PFNVBOXWINEEXD3DDEV9_CREATECUBETEXTURE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9CreateCubeTexture");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pD3D->pfnVBoxWineExD3DDev9CreateCubeTexture);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pD3D->pfnVBoxWineExD3DDev9Flush = (PFNVBOXWINEEXD3DDEV9_FLUSH)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9Flush");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pD3D->pfnVBoxWineExD3DDev9Update = (PFNVBOXWINEEXD3DDEV9_UPDATE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9Update");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVDbgPrintR((__FUNCTION__": GetProcAddressW (for Direct3DCreate9Ex) failed, winErr = (%d)", winErr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVDbgPrintR((__FUNCTION__": LoadLibraryW failed, winErr = (%d)", winErr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic DWORD WINAPI vboxDispWorkerThread(void *pvUser)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0 /*HWND hWnd*/,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0 /*UINT wMsgFilterMin*/,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0 /*UINT wMsgFilterMax*/
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISP_CALLPROC* pData = (VBOXDISP_CALLPROC*)Msg.lParam;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic int vboxDispWorkerSubmit(VBOXDISPWORKER *pWorker, UINT Msg, LPARAM lParam)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* need to serialize since vboxDispWorkerThread is using one pWorker->hEvent
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * to signal job completion */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bResult = PostThreadMessage(pWorker->idThread, Msg, 0, lParam);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = RTSemEventWait(pWorker->hEvent, RT_INDEFINITE_WAIT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT VBoxDispWorkerSubmitProc(VBOXDISPWORKER *pWorker, PFNVBOXDISPWORKERCB pfnCb, void *pvCb)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = vboxDispWorkerSubmit(pWorker, WM_VBOXDISP_CALLPROC, (LPARAM)&Ctx);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT VBoxDispWorkerCreate(VBOXDISPWORKER *pWorker)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NULL /* LPSECURITY_ATTRIBUTES lpThreadAttributes */,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0 /* SIZE_T dwStackSize */,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0 /* DWORD dwCreationFlags */,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = RTSemEventWait(pWorker->hEvent, RT_INDEFINITE_WAIT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* destroy thread ? */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVDbgPrintR((__FUNCTION__": CreateThread failed, winErr = (%d)", winErr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT VBoxDispWorkerDestroy(VBOXDISPWORKER *pWorker)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bResult = PostThreadMessage(pWorker->idThread, WM_QUIT, 0, 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DWORD dwErr = WaitForSingleObject(pWorker->hThread, INFINITE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVDbgPrint((__FUNCTION__": got WM_CLOSE for hwnd(0x%x)", hwnd));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVDbgPrint((__FUNCTION__": got WM_DESTROY for hwnd(0x%x)", hwnd));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVDbgPrint((__FUNCTION__": got WM_NCHITTEST for hwnd(0x%x)\n", hwnd));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT vboxDispWndDoCreate(DWORD w, DWORD h, HWND *phWnd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Register the Window Class. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!GetClassInfo(hInstance, VBOXDISPWND_NAME, &wc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVDbgPrint((__FUNCTION__": RegisterClass failed, winErr(%d)\n", winErr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_DISABLED,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVDbgPrint((__FUNCTION__": CreateWindowEx failed, winErr(%d)\n", winErr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVDbgPrint((__FUNCTION__": DestroyWindow failed, winErr(%d) for hWnd(0x%x)\n", winErr, hWnd));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLCALLBACK(void) vboxDispWndDestroyWorker(void *pvUser)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISPWND_DESTROY_INFO *pInfo = (VBOXDISPWND_DESTROY_INFO*)pvUser;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLCALLBACK(void) vboxDispWndCreateWorker(void *pvUser)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISPWND_CREATE_INFO *pInfo = (VBOXDISPWND_CREATE_INFO*)pvUser;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->hr = vboxDispWndDoCreate(pInfo->width, pInfo->height, &pInfo->hWnd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT VBoxDispWndDestroy(PVBOXWDDMDISP_ADAPTER pAdapter, HWND hWnd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HRESULT hr = VBoxDispWorkerSubmitProc(&pAdapter->WndWorker, vboxDispWndDestroyWorker, &Info);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT VBoxDispWndCreate(PVBOXWDDMDISP_ADAPTER pAdapter, DWORD width, DWORD height, HWND *phWnd)