VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispKmt.cpp@ 36046

Last change on this file since 36046 was 35658, checked in by vboxsync, 14 years ago

build fix + missing headers

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.7 KB
Line 
1/** @file
2 * VBoxVideo Display D3D User mode dll
3 *
4 * Copyright (C) 2011 Oracle Corporation
5 *
6 * This file is part of VirtualBox Open Source Edition (OSE), as
7 * available from http://www.virtualbox.org. This file is free software;
8 * you can redistribute it and/or modify it under the terms of the GNU
9 * General Public License (GPL) as published by the Free Software
10 * Foundation, in version 2 as it comes in the "COPYING" file of the
11 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
12 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
13 */
14
15#include "VBoxDispD3DCmn.h"
16
17HRESULT vboxDispKmtCallbacksInit(PVBOXDISPKMT_CALLBACKS pCallbacks)
18{
19 HRESULT hr = S_OK;
20
21 memset(pCallbacks, 0, sizeof (*pCallbacks));
22
23 pCallbacks->hGdi32 = LoadLibraryW(L"gdi32.dll");
24 if (pCallbacks->hGdi32 != NULL)
25 {
26 bool bSupported = true;
27 pCallbacks->pfnD3DKMTOpenAdapterFromHdc = (PFND3DKMT_OPENADAPTERFROMHDC)GetProcAddress(pCallbacks->hGdi32, "D3DKMTOpenAdapterFromHdc");
28 Log((__FUNCTION__"pfnD3DKMTOpenAdapterFromHdc = %p\n", pCallbacks->pfnD3DKMTOpenAdapterFromHdc));
29 bSupported &= !!(pCallbacks->pfnD3DKMTOpenAdapterFromHdc);
30
31 pCallbacks->pfnD3DKMTOpenAdapterFromGdiDisplayName = (PFND3DKMT_OPENADAPTERFROMGDIDISPLAYNAME)GetProcAddress(pCallbacks->hGdi32, "D3DKMTOpenAdapterFromGdiDisplayName");
32 Log((__FUNCTION__": pfnD3DKMTOpenAdapterFromGdiDisplayName = %p\n", pCallbacks->pfnD3DKMTOpenAdapterFromGdiDisplayName));
33 bSupported &= !!(pCallbacks->pfnD3DKMTOpenAdapterFromGdiDisplayName);
34
35 pCallbacks->pfnD3DKMTCloseAdapter = (PFND3DKMT_CLOSEADAPTER)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCloseAdapter");
36 Log((__FUNCTION__": pfnD3DKMTCloseAdapter = %p\n", pCallbacks->pfnD3DKMTCloseAdapter));
37 bSupported &= !!(pCallbacks->pfnD3DKMTCloseAdapter);
38
39 pCallbacks->pfnD3DKMTEscape = (PFND3DKMT_ESCAPE)GetProcAddress(pCallbacks->hGdi32, "D3DKMTEscape");
40 Log((__FUNCTION__": pfnD3DKMTEscape = %p\n", pCallbacks->pfnD3DKMTEscape));
41 bSupported &= !!(pCallbacks->pfnD3DKMTEscape);
42
43 pCallbacks->pfnD3DKMTCreateDevice = (PFND3DKMT_CREATEDEVICE)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCreateDevice");
44 Log((__FUNCTION__": pfnD3DKMTCreateDevice = %p\n", pCallbacks->pfnD3DKMTCreateDevice));
45 bSupported &= !!(pCallbacks->pfnD3DKMTCreateDevice);
46
47 pCallbacks->pfnD3DKMTDestroyDevice = (PFND3DKMT_DESTROYDEVICE)GetProcAddress(pCallbacks->hGdi32, "D3DKMTDestroyDevice");
48 Log((__FUNCTION__": pfnD3DKMTDestroyDevice = %p\n", pCallbacks->pfnD3DKMTDestroyDevice));
49 bSupported &= !!(pCallbacks->pfnD3DKMTDestroyDevice);
50
51 pCallbacks->pfnD3DKMTCreateContext = (PFND3DKMT_CREATECONTEXT)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCreateContext");
52 Log((__FUNCTION__": pfnD3DKMTCreateContext = %p\n", pCallbacks->pfnD3DKMTCreateContext));
53 bSupported &= !!(pCallbacks->pfnD3DKMTCreateContext);
54
55 pCallbacks->pfnD3DKMTDestroyContext = (PFND3DKMT_DESTROYCONTEXT)GetProcAddress(pCallbacks->hGdi32, "D3DKMTDestroyContext");
56 Log((__FUNCTION__": pfnD3DKMTDestroyContext = %p\n", pCallbacks->pfnD3DKMTDestroyContext));
57 bSupported &= !!(pCallbacks->pfnD3DKMTDestroyContext);
58
59 pCallbacks->pfnD3DKMTRender = (PFND3DKMT_RENDER)GetProcAddress(pCallbacks->hGdi32, "D3DKMTRender");
60 Log((__FUNCTION__": pfnD3DKMTRender = %p\n", pCallbacks->pfnD3DKMTRender));
61 bSupported &= !!(pCallbacks->pfnD3DKMTRender);
62
63 pCallbacks->pfnD3DKMTCreateAllocation = (PFND3DKMT_CREATEALLOCATION)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCreateAllocation");
64 Log((__FUNCTION__": pfnD3DKMTCreateAllocation = %p\n", pCallbacks->pfnD3DKMTCreateAllocation));
65 bSupported &= !!(pCallbacks->pfnD3DKMTCreateAllocation);
66
67 pCallbacks->pfnD3DKMTDestroyAllocation = (PFND3DKMT_DESTROYALLOCATION)GetProcAddress(pCallbacks->hGdi32, "D3DKMTDestroyAllocation");
68 Log((__FUNCTION__": pfnD3DKMTDestroyAllocation = %p\n", pCallbacks->pfnD3DKMTDestroyAllocation));
69 bSupported &= !!(pCallbacks->pfnD3DKMTDestroyAllocation);
70
71 pCallbacks->pfnD3DKMTLock = (PFND3DKMT_LOCK)GetProcAddress(pCallbacks->hGdi32, "D3DKMTLock");
72 Log((__FUNCTION__": pfnD3DKMTLock = %p\n", pCallbacks->pfnD3DKMTLock));
73 bSupported &= !!(pCallbacks->pfnD3DKMTLock);
74
75 pCallbacks->pfnD3DKMTUnlock = (PFND3DKMT_UNLOCK)GetProcAddress(pCallbacks->hGdi32, "D3DKMTUnlock");
76 Log((__FUNCTION__": pfnD3DKMTUnlock = %p\n", pCallbacks->pfnD3DKMTUnlock));
77 bSupported &= !!(pCallbacks->pfnD3DKMTUnlock);
78
79 /*Assert(bSupported);*/
80 if (bSupported)
81 {
82 return S_OK;
83 }
84 else
85 {
86 Log((__FUNCTION__": one of pfnD3DKMT function pointers failed to initialize\n"));
87 hr = E_NOINTERFACE;
88 }
89
90 FreeLibrary(pCallbacks->hGdi32);
91 }
92 else
93 {
94 DWORD winEr = GetLastError();
95 hr = HRESULT_FROM_WIN32(winEr);
96 Assert(0);
97 Assert(hr != S_OK);
98 Assert(hr != S_FALSE);
99 if (hr == S_OK || hr == S_FALSE)
100 hr = E_FAIL;
101 }
102
103 return hr;
104}
105
106HRESULT vboxDispKmtCallbacksTerm(PVBOXDISPKMT_CALLBACKS pCallbacks)
107{
108 FreeLibrary(pCallbacks->hGdi32);
109 return S_OK;
110}
111
112HRESULT vboxDispKmtAdpHdcCreate(HDC *phDc)
113{
114 HRESULT hr = E_FAIL;
115 DISPLAY_DEVICE DDev;
116 memset(&DDev, 0, sizeof (DDev));
117 DDev.cb = sizeof (DDev);
118
119 *phDc = NULL;
120
121 for (int i = 0; ; ++i)
122 {
123 if (EnumDisplayDevices(NULL, /* LPCTSTR lpDevice */ i, /* DWORD iDevNum */
124 &DDev, 0 /* DWORD dwFlags*/))
125 {
126 if (DDev.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
127 {
128 HDC hDc = CreateDC(NULL, DDev.DeviceName, NULL, NULL);
129 if (hDc)
130 {
131 *phDc = hDc;
132 return S_OK;
133 }
134 else
135 {
136 DWORD winEr = GetLastError();
137 Assert(0);
138 hr = HRESULT_FROM_WIN32(winEr);
139 Assert(FAILED(hr));
140 break;
141 }
142 }
143 }
144 else
145 {
146 DWORD winEr = GetLastError();
147#ifdef DEBUG_misha
148 Assert(0);
149#endif
150 Log((__FUNCTION__": EnumDisplayDevices failed, winEr (%d)\n", winEr));
151 hr = HRESULT_FROM_WIN32(winEr);
152 Assert(FAILED(hr));
153 break;
154 }
155 }
156
157 return hr;
158}
159
160HRESULT vboxDispKmtOpenAdapter(PVBOXDISPKMT_CALLBACKS pCallbacks, PVBOXDISPKMT_ADAPTER pAdapter)
161{
162 D3DKMT_OPENADAPTERFROMHDC OpenAdapterData = {0};
163 HRESULT hr = vboxDispKmtAdpHdcCreate(&OpenAdapterData.hDc);
164 if (hr == S_OK)
165 {
166 Assert(OpenAdapterData.hDc);
167 NTSTATUS Status = pCallbacks->pfnD3DKMTOpenAdapterFromHdc(&OpenAdapterData);
168#ifdef DEBUG_misha
169 /* may fail with xpdm driver */
170 Assert(!Status);
171#endif
172 if (!Status)
173 {
174 pAdapter->hAdapter = OpenAdapterData.hAdapter;
175 pAdapter->hDc = OpenAdapterData.hDc;
176 pAdapter->pCallbacks = pCallbacks;
177 return S_OK;
178 }
179 else
180 {
181 Log((__FUNCTION__": pfnD3DKMTOpenAdapterFromGdiDisplayName failed, Status (0x%x)\n", Status));
182 hr = E_FAIL;
183 }
184
185 DeleteDC(OpenAdapterData.hDc);
186 }
187
188 return hr;
189}
190
191HRESULT vboxDispKmtCloseAdapter(PVBOXDISPKMT_ADAPTER pAdapter)
192{
193 D3DKMT_CLOSEADAPTER ClosaAdapterData = {0};
194 ClosaAdapterData.hAdapter = pAdapter->hAdapter;
195 NTSTATUS Status = pAdapter->pCallbacks->pfnD3DKMTCloseAdapter(&ClosaAdapterData);
196 Assert(!Status);
197 if (!Status)
198 {
199 DeleteDC(pAdapter->hDc);
200 return S_OK;
201 }
202
203 Log((__FUNCTION__": pfnD3DKMTCloseAdapter failed, Status (0x%x)\n", Status));
204
205 return E_FAIL;
206}
207
208HRESULT vboxDispKmtCreateDevice(PVBOXDISPKMT_ADAPTER pAdapter, PVBOXDISPKMT_DEVICE pDevice)
209{
210 D3DKMT_CREATEDEVICE CreateDeviceData = {0};
211 CreateDeviceData.hAdapter = pAdapter->hAdapter;
212 NTSTATUS Status = pAdapter->pCallbacks->pfnD3DKMTCreateDevice(&CreateDeviceData);
213 Assert(!Status);
214 if (!Status)
215 {
216 pDevice->pAdapter = pAdapter;
217 pDevice->hDevice = CreateDeviceData.hDevice;
218 pDevice->pCommandBuffer = CreateDeviceData.pCommandBuffer;
219 pDevice->CommandBufferSize = CreateDeviceData.CommandBufferSize;
220 pDevice->pAllocationList = CreateDeviceData.pAllocationList;
221 pDevice->AllocationListSize = CreateDeviceData.AllocationListSize;
222 pDevice->pPatchLocationList = CreateDeviceData.pPatchLocationList;
223 pDevice->PatchLocationListSize = CreateDeviceData.PatchLocationListSize;
224
225 return S_OK;
226 }
227
228 return E_FAIL;
229}
230
231HRESULT vboxDispKmtDestroyDevice(PVBOXDISPKMT_DEVICE pDevice)
232{
233 D3DKMT_DESTROYDEVICE DestroyDeviceData = {0};
234 DestroyDeviceData.hDevice = pDevice->hDevice;
235 NTSTATUS Status = pDevice->pAdapter->pCallbacks->pfnD3DKMTDestroyDevice(&DestroyDeviceData);
236 Assert(!Status);
237 if (!Status)
238 {
239 return S_OK;
240 }
241 return E_FAIL;
242}
243
244HRESULT vboxDispKmtCreateContext(PVBOXDISPKMT_DEVICE pDevice, PVBOXDISPKMT_CONTEXT pContext,
245 VBOXWDDM_CONTEXT_TYPE enmType, HANDLE hEvent, uint64_t u64UmInfo)
246{
247 VBOXWDDM_CREATECONTEXT_INFO Info = {0};
248 Info.u32IfVersion = 9;
249 Info.enmType = enmType;
250 Info.hUmEvent = (uint64_t)hEvent;
251 Info.u64UmInfo = u64UmInfo;
252 D3DKMT_CREATECONTEXT ContextData = {0};
253 ContextData.hDevice = pDevice->hDevice;
254 ContextData.NodeOrdinal = 0;
255 ContextData.EngineAffinity = 0;
256 ContextData.pPrivateDriverData = &Info;
257 ContextData.PrivateDriverDataSize = sizeof (Info);
258 ContextData.ClientHint = enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_UHGSMI_GL ? D3DKMT_CLIENTHINT_OPENGL : D3DKMT_CLIENTHINT_DX9;
259 NTSTATUS Status = pDevice->pAdapter->pCallbacks->pfnD3DKMTCreateContext(&ContextData);
260 Assert(!Status);
261 if (!Status)
262 {
263 pContext->pDevice = pDevice;
264 pContext->hContext = ContextData.hContext;
265 pContext->pCommandBuffer = ContextData.pCommandBuffer;
266 pContext->CommandBufferSize = ContextData.CommandBufferSize;
267 pContext->pAllocationList = ContextData.pAllocationList;
268 pContext->AllocationListSize = ContextData.AllocationListSize;
269 pContext->pPatchLocationList = ContextData.pPatchLocationList;
270 pContext->PatchLocationListSize = ContextData.PatchLocationListSize;
271 return S_OK;
272 }
273 return E_FAIL;
274}
275
276HRESULT vboxDispKmtDestroyContext(PVBOXDISPKMT_CONTEXT pContext)
277{
278 D3DKMT_DESTROYCONTEXT DestroyContextData = {0};
279 DestroyContextData.hContext = pContext->hContext;
280 NTSTATUS Status = pContext->pDevice->pAdapter->pCallbacks->pfnD3DKMTDestroyContext(&DestroyContextData);
281 Assert(!Status);
282 if (!Status)
283 return S_OK;
284 return E_FAIL;
285}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette