gdiplus: Add GdipGetPenCompoundCount implementation.
[wine.git] / dlls / dxva2 / tests / dxva2.c
blobdb48f3317727b0506a5f04a30ed3275fc3bf7fa4
1 /*
2 * Copyright 2020 Nikolay Sivov
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #define COBJMACROS
20 #include "wine/test.h"
21 #include "d3d9.h"
23 #include "initguid.h"
24 #include "dxva2api.h"
26 static unsigned int get_refcount(void *object)
28 IUnknown *iface = object;
29 IUnknown_AddRef(iface);
30 return IUnknown_Release(iface);
33 static HWND create_window(void)
35 RECT r = {0, 0, 640, 480};
37 AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW | WS_VISIBLE, FALSE);
39 return CreateWindowA("static", "d3d9_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
40 0, 0, r.right - r.left, r.bottom - r.top, NULL, NULL, NULL, NULL);
43 static IDirect3DDevice9 *create_device(IDirect3D9 *d3d9, HWND focus_window)
45 D3DPRESENT_PARAMETERS present_parameters = {0};
46 IDirect3DDevice9 *device = NULL;
48 present_parameters.BackBufferWidth = 640;
49 present_parameters.BackBufferHeight = 480;
50 present_parameters.BackBufferFormat = D3DFMT_A8R8G8B8;
51 present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
52 present_parameters.hDeviceWindow = focus_window;
53 present_parameters.Windowed = TRUE;
54 present_parameters.EnableAutoDepthStencil = TRUE;
55 present_parameters.AutoDepthStencilFormat = D3DFMT_D24S8;
57 IDirect3D9_CreateDevice(d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, focus_window,
58 D3DCREATE_HARDWARE_VERTEXPROCESSING, &present_parameters, &device);
60 return device;
63 static void test_surface_desc(IDirect3DSurface9 *surface)
65 D3DSURFACE_DESC desc = { 0 };
66 HRESULT hr;
68 hr = IDirect3DSurface9_GetDesc(surface, &desc);
69 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
71 ok(desc.Format == D3DFMT_X8R8G8B8, "Unexpected format %d.\n", desc.Format);
72 ok(desc.Type == D3DRTYPE_SURFACE, "Unexpected type %d.\n", desc.Type);
73 ok(!desc.Usage, "Unexpected usage %ld.\n", desc.Usage);
74 ok(desc.Pool == D3DPOOL_DEFAULT, "Unexpected pool %d.\n", desc.Pool);
75 ok(desc.MultiSampleType == D3DMULTISAMPLE_NONE, "Unexpected multisample type %d.\n", desc.MultiSampleType);
76 ok(!desc.MultiSampleQuality, "Unexpected multisample quality %ld.\n", desc.MultiSampleQuality);
77 ok(desc.Width == 64, "Unexpected width %u.\n", desc.Width);
78 ok(desc.Height == 64, "Unexpected height %u.\n", desc.Height);
81 static void init_video_desc(DXVA2_VideoDesc *video_desc, D3DFORMAT format)
83 memset(video_desc, 0, sizeof(*video_desc));
84 video_desc->SampleWidth = 64;
85 video_desc->SampleHeight = 64;
86 video_desc->Format = format;
89 static void test_device_manager(void)
91 IDirectXVideoProcessorService *processor_service;
92 IDirectXVideoAccelerationService *accel_service;
93 IDirect3DDevice9 *device, *device2, *device3;
94 IDirectXVideoProcessorService *proc_service;
95 IDirect3DDeviceManager9 *manager;
96 IDirect3DSurface9 *surfaces[2];
97 DXVA2_VideoDesc video_desc;
98 int refcount, refcount2;
99 HANDLE handle, handle1;
100 D3DFORMAT *formats;
101 UINT token, count;
102 IDirect3D9 *d3d;
103 unsigned int i;
104 HWND window;
105 GUID *guids;
106 HRESULT hr;
107 RECT rect;
109 static const D3DFORMAT rt_formats[] =
111 D3DFMT_A8R8G8B8,
112 D3DFMT_X8R8G8B8,
113 D3DFMT_YUY2,
114 MAKEFOURCC('A','Y','U','V'),
116 static const D3DFORMAT rt_unsupported_formats[] =
118 D3DFMT_A1R5G5B5,
119 D3DFMT_X1R5G5B5,
120 D3DFMT_A2R10G10B10,
121 D3DFMT_A8B8G8R8,
122 D3DFMT_X8B8G8R8,
123 D3DFMT_R5G6B5,
124 D3DFMT_UYVY,
127 window = create_window();
128 d3d = Direct3DCreate9(D3D_SDK_VERSION);
129 ok(!!d3d, "Failed to create a D3D object.\n");
130 if (!(device = create_device(d3d, window)))
132 skip("Failed to create a D3D device, skipping tests.\n");
133 goto done;
136 hr = DXVA2CreateDirect3DDeviceManager9(&token, &manager);
137 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
139 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle);
140 ok(hr == DXVA2_E_NOT_INITIALIZED, "Unexpected hr %#lx.\n", hr);
142 hr = IDirect3DDeviceManager9_LockDevice(manager, 0, &device2, FALSE);
143 ok(hr == DXVA2_E_NOT_INITIALIZED, "Unexpected hr %#lx.\n", hr);
145 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, 0);
146 ok(hr == E_HANDLE, "Unexpected hr %#lx.\n", hr);
148 /* Invalid token. */
149 hr = IDirect3DDeviceManager9_ResetDevice(manager, device, token + 1);
150 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
152 hr = IDirect3DDeviceManager9_ResetDevice(manager, device, token);
153 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
154 refcount = get_refcount(device);
156 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, 0);
157 ok(hr == E_HANDLE, "Unexpected hr %#lx.\n", hr);
159 handle1 = NULL;
160 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle1);
161 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
162 ok(!!handle1, "Unexpected handle value.\n");
164 refcount2 = get_refcount(device);
165 ok(refcount2 == refcount, "Unexpected refcount %d.\n", refcount);
167 handle = NULL;
168 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle);
169 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
170 ok(handle != handle1, "Unexpected handle.\n");
172 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle);
173 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
175 /* Already closed. */
176 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle);
177 ok(hr == E_HANDLE, "Unexpected hr %#lx.\n", hr);
179 handle = NULL;
180 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle);
181 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
183 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle1);
184 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
186 hr = IDirect3DDeviceManager9_TestDevice(manager, handle1);
187 ok(hr == E_HANDLE, "Unexpected hr %#lx.\n", hr);
189 hr = IDirect3DDeviceManager9_TestDevice(manager, 0);
190 ok(hr == E_HANDLE, "Unexpected hr %#lx.\n", hr);
192 handle = NULL;
193 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle);
194 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
196 handle1 = NULL;
197 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle1);
198 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
200 hr = IDirect3DDeviceManager9_GetVideoService(manager, handle, &IID_IDirectXVideoProcessorService,
201 (void **)&processor_service);
202 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
203 IDirectXVideoProcessorService_Release(processor_service);
205 device2 = create_device(d3d, window);
207 hr = IDirect3DDeviceManager9_ResetDevice(manager, device2, token);
208 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
210 hr = IDirect3DDeviceManager9_GetVideoService(manager, handle, &IID_IDirectXVideoProcessorService,
211 (void **)&processor_service);
212 ok(hr == DXVA2_E_NEW_VIDEO_DEVICE, "Unexpected hr %#lx.\n", hr);
214 hr = IDirect3DDeviceManager9_TestDevice(manager, handle);
215 ok(hr == DXVA2_E_NEW_VIDEO_DEVICE, "Unexpected hr %#lx.\n", hr);
217 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle);
218 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
220 /* Lock/Unlock. */
221 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle);
222 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
224 hr = IDirect3DDeviceManager9_LockDevice(manager, handle, &device3, FALSE);
225 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
226 ok(device2 == device3, "Unexpected device pointer.\n");
227 IDirect3DDevice9_Release(device3);
229 hr = IDirect3DDeviceManager9_UnlockDevice(manager, handle, FALSE);
230 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
232 hr = IDirect3DDeviceManager9_UnlockDevice(manager, handle, FALSE);
233 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
235 hr = IDirect3DDeviceManager9_UnlockDevice(manager, (HANDLE)((ULONG_PTR)handle + 100), FALSE);
236 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
238 /* Locked with one handle, unlock with another. */
239 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle1);
240 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
242 hr = IDirect3DDeviceManager9_LockDevice(manager, handle, &device3, FALSE);
243 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
244 ok(device2 == device3, "Unexpected device pointer.\n");
245 IDirect3DDevice9_Release(device3);
247 hr = IDirect3DDeviceManager9_UnlockDevice(manager, handle1, FALSE);
248 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
250 /* Closing unlocks the device. */
251 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle);
252 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
254 hr = IDirect3DDeviceManager9_LockDevice(manager, handle1, &device3, FALSE);
255 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
256 ok(device2 == device3, "Unexpected device pointer.\n");
257 IDirect3DDevice9_Release(device3);
259 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle1);
260 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
262 /* Open two handles. */
263 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle);
264 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
266 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle1);
267 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
269 hr = IDirect3DDeviceManager9_LockDevice(manager, handle, &device3, FALSE);
270 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
271 ok(device2 == device3, "Unexpected device pointer.\n");
272 IDirect3DDevice9_Release(device3);
274 hr = IDirect3DDeviceManager9_LockDevice(manager, handle1, &device3, FALSE);
275 ok(hr == DXVA2_E_VIDEO_DEVICE_LOCKED, "Unexpected hr %#lx.\n", hr);
277 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle1);
278 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
280 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle);
281 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
283 /* State saving function. */
284 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle);
285 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
287 hr = IDirect3DDeviceManager9_LockDevice(manager, handle, &device3, FALSE);
288 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
289 ok(device2 == device3, "Unexpected device pointer.\n");
291 SetRect(&rect, 50, 60, 70, 80);
292 hr = IDirect3DDevice9_SetScissorRect(device3, &rect);
293 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
295 hr = IDirect3DDeviceManager9_UnlockDevice(manager, handle, TRUE);
296 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
298 SetRect(&rect, 30, 60, 70, 80);
299 hr = IDirect3DDevice9_SetScissorRect(device3, &rect);
300 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
302 IDirect3DDevice9_Release(device3);
304 hr = IDirect3DDeviceManager9_LockDevice(manager, handle, &device3, FALSE);
305 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
306 ok(device2 == device3, "Unexpected device pointer.\n");
308 hr = IDirect3DDevice9_GetScissorRect(device3, &rect);
309 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
310 ok(rect.left == 50 && rect.top == 60 && rect.right == 70 && rect.bottom == 80,
311 "Got unexpected scissor rect %s.\n", wine_dbgstr_rect(&rect));
313 IDirect3DDevice9_Release(device3);
315 hr = IDirect3DDeviceManager9_UnlockDevice(manager, handle, TRUE);
316 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
318 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle);
319 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
321 /* Acceleration service. */
322 hr = DXVA2CreateVideoService(device, &IID_IDirectXVideoAccelerationService, (void **)&accel_service);
323 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
325 surfaces[0] = surfaces[1] = NULL;
326 hr = IDirectXVideoAccelerationService_CreateSurface(accel_service, 64, 64, 0, D3DFMT_X8R8G8B8,
327 D3DPOOL_DEFAULT, 0, DXVA2_VideoProcessorRenderTarget, surfaces, NULL);
328 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
329 ok(!!surfaces[0] && !surfaces[1], "Unexpected surfaces.\n");
330 IDirect3DSurface9_Release(surfaces[0]);
332 hr = IDirectXVideoAccelerationService_CreateSurface(accel_service, 64, 64, 1, D3DFMT_X8R8G8B8,
333 D3DPOOL_DEFAULT, 0, DXVA2_VideoProcessorRenderTarget, surfaces, NULL);
334 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
335 ok(!!surfaces[0] && !!surfaces[1], "Unexpected surfaces.\n");
336 test_surface_desc(surfaces[0]);
337 IDirect3DSurface9_Release(surfaces[0]);
338 IDirect3DSurface9_Release(surfaces[1]);
340 IDirectXVideoAccelerationService_Release(accel_service);
342 /* RT formats. */
343 hr = DXVA2CreateVideoService(device, &IID_IDirectXVideoProcessorService, (void **)&proc_service);
344 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
346 init_video_desc(&video_desc, D3DFMT_A8R8G8B8);
348 hr = IDirectXVideoProcessorService_GetVideoProcessorDeviceGuids(proc_service, &video_desc, &count, &guids);
349 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
350 ok(count, "Unexpected format count %u.\n", count);
351 CoTaskMemFree(guids);
353 for (i = 0; i < ARRAY_SIZE(rt_formats); ++i)
355 init_video_desc(&video_desc, rt_formats[i]);
357 count = 0;
358 hr = IDirectXVideoProcessorService_GetVideoProcessorDeviceGuids(proc_service, &video_desc, &count, &guids);
359 todo_wine_if(rt_formats[i] == MAKEFOURCC('A','Y','U','V'))
360 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
361 if (FAILED(hr)) continue;
362 ok(count > 0, "Unexpected device count.\n");
363 CoTaskMemFree(guids);
365 count = 0;
366 hr = IDirectXVideoProcessorService_GetVideoProcessorRenderTargets(proc_service, &DXVA2_VideoProcSoftwareDevice,
367 &video_desc, &count, &formats);
368 ok(hr == S_OK, "Unexpected hr %#lx, format %d.\n", hr, rt_formats[i]);
369 ok(count == 2, "Unexpected format count %u.\n", count);
370 if (count == 2)
371 ok(formats[0] == D3DFMT_X8R8G8B8 && formats[1] == D3DFMT_A8R8G8B8, "Unexpected formats %d,%d.\n",
372 formats[0], formats[1]);
373 CoTaskMemFree(formats);
376 for (i = 0; i < ARRAY_SIZE(rt_unsupported_formats); ++i)
378 init_video_desc(&video_desc, rt_unsupported_formats[i]);
380 hr = IDirectXVideoProcessorService_GetVideoProcessorRenderTargets(proc_service, &DXVA2_VideoProcSoftwareDevice,
381 &video_desc, &count, &formats);
382 ok(hr == E_FAIL, "Unexpected hr %#lx, format %d.\n", hr, rt_unsupported_formats[i]);
385 IDirectXVideoProcessorService_Release(proc_service);
387 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle);
388 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
390 hr = IDirect3DDeviceManager9_GetVideoService(manager, handle, &IID_IDirectXVideoAccelerationService,
391 (void **)&accel_service);
392 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
394 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle);
395 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
397 hr = IDirectXVideoAccelerationService_CreateSurface(accel_service, 64, 64, 0, D3DFMT_X8R8G8B8,
398 D3DPOOL_DEFAULT, 0, DXVA2_VideoProcessorRenderTarget, surfaces, NULL);
399 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
401 hr = IDirect3DSurface9_GetDevice(surfaces[0], &device3);
402 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
403 ok(device2 == device3, "Unexpected device.\n");
404 IDirect3DDevice9_Release(device3);
406 IDirect3DSurface9_Release(surfaces[0]);
408 IDirectXVideoAccelerationService_Release(accel_service);
410 IDirect3DDevice9_Release(device);
411 IDirect3DDevice9_Release(device2);
413 IDirect3DDeviceManager9_Release(manager);
415 done:
416 IDirect3D9_Release(d3d);
417 DestroyWindow(window);
420 static void test_video_processor(void)
422 IDirectXVideoProcessorService *service, *service2;
423 IDirectXVideoProcessor *processor, *processor2;
424 IDirect3DDeviceManager9 *manager;
425 DXVA2_VideoProcessorCaps caps;
426 DXVA2_VideoDesc video_desc;
427 IDirect3DDevice9 *device;
428 HANDLE handle, handle1;
429 D3DFORMAT format;
430 IDirect3D9 *d3d;
431 HWND window;
432 UINT token;
433 HRESULT hr;
434 GUID guid;
436 window = create_window();
437 d3d = Direct3DCreate9(D3D_SDK_VERSION);
438 ok(!!d3d, "Failed to create a D3D object.\n");
439 if (!(device = create_device(d3d, window)))
441 skip("Failed to create a D3D device, skipping tests.\n");
442 goto done;
445 hr = DXVA2CreateDirect3DDeviceManager9(&token, &manager);
446 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
448 hr = IDirect3DDeviceManager9_ResetDevice(manager, device, token);
449 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
451 handle = NULL;
452 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle);
453 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
455 handle1 = NULL;
456 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle1);
457 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
459 ok(get_refcount(manager) == 1, "Unexpected refcount %u.\n", get_refcount(manager));
461 hr = IDirect3DDeviceManager9_GetVideoService(manager, handle, &IID_IDirectXVideoProcessorService,
462 (void **)&service);
463 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
465 memset(&video_desc, 0, sizeof(video_desc));
466 video_desc.SampleWidth = 64;
467 video_desc.SampleHeight = 64;
468 video_desc.Format = D3DFMT_A8R8G8B8;
470 /* Number of substreams does not include reference stream. */
471 hr = IDirectXVideoProcessorService_CreateVideoProcessor(service, &DXVA2_VideoProcSoftwareDevice, &video_desc,
472 D3DFMT_A8R8G8B8, 16, &processor);
473 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
475 hr = IDirectXVideoProcessorService_CreateVideoProcessor(service, &DXVA2_VideoProcSoftwareDevice, &video_desc,
476 D3DFMT_A8R8G8B8, 15, &processor);
477 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
478 IDirectXVideoProcessor_Release(processor);
480 hr = IDirectXVideoProcessorService_CreateVideoProcessor(service, &DXVA2_VideoProcSoftwareDevice, &video_desc,
481 D3DFMT_A8R8G8B8, 0, &processor);
482 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
483 IDirectXVideoProcessor_Release(processor);
485 hr = IDirectXVideoProcessorService_CreateVideoProcessor(service, &DXVA2_VideoProcSoftwareDevice, &video_desc,
486 D3DFMT_A8R8G8B8, 1, &processor);
487 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
489 hr = IDirectXVideoProcessor_GetVideoProcessorCaps(processor, &caps);
490 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
491 ok(caps.DeviceCaps == DXVA2_VPDev_SoftwareDevice, "Unexpected device type %#x.\n", caps.DeviceCaps);
492 ok(caps.InputPool == D3DPOOL_SYSTEMMEM, "Unexpected input pool %#x.\n", caps.InputPool);
493 ok(!caps.NumForwardRefSamples, "Unexpected sample count.\n");
494 ok(!caps.NumBackwardRefSamples, "Unexpected sample count.\n");
495 ok(!caps.Reserved, "Unexpected field.\n");
496 ok(caps.DeinterlaceTechnology == DXVA2_DeinterlaceTech_Unknown, "Unexpected deinterlace technology %#x.\n",
497 caps.DeinterlaceTechnology);
498 ok(!caps.ProcAmpControlCaps, "Unexpected proc amp mask %#x.\n", caps.ProcAmpControlCaps);
499 ok(caps.VideoProcessorOperations == (DXVA2_VideoProcess_PlanarAlpha | DXVA2_VideoProcess_YUV2RGB |
500 DXVA2_VideoProcess_StretchX | DXVA2_VideoProcess_StretchY | DXVA2_VideoProcess_SubRects |
501 DXVA2_VideoProcess_SubStreams | DXVA2_VideoProcess_SubStreamsExtended | DXVA2_VideoProcess_YUV2RGBExtended),
502 "Unexpected processor operations %#x.\n", caps.VideoProcessorOperations);
503 ok(caps.NoiseFilterTechnology == DXVA2_NoiseFilterTech_Unsupported, "Unexpected noise filter technology %#x.\n",
504 caps.NoiseFilterTechnology);
505 ok(caps.DetailFilterTechnology == DXVA2_DetailFilterTech_Unsupported, "Unexpected detail filter technology %#x.\n",
506 caps.DetailFilterTechnology);
508 hr = IDirectXVideoProcessorService_CreateVideoProcessor(service, &DXVA2_VideoProcSoftwareDevice, &video_desc,
509 D3DFMT_A8R8G8B8, 1, &processor2);
510 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
511 ok(processor2 != processor, "Unexpected instance.\n");
513 hr = IDirectXVideoProcessor_GetCreationParameters(processor, NULL, NULL, NULL, NULL);
514 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
516 hr = IDirectXVideoProcessor_GetCreationParameters(processor, &guid, NULL, NULL, NULL);
517 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
518 ok(IsEqualGUID(&guid, &DXVA2_VideoProcSoftwareDevice), "Unexpected device guid.\n");
520 hr = IDirectXVideoProcessor_GetCreationParameters(processor, NULL, NULL, &format, NULL);
521 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
522 ok(format == D3DFMT_A8R8G8B8, "Unexpected format %u.\n", format);
524 IDirectXVideoProcessor_Release(processor);
525 IDirectXVideoProcessor_Release(processor2);
527 hr = IDirect3DDeviceManager9_GetVideoService(manager, handle, &IID_IDirectXVideoProcessorService,
528 (void **)&service2);
529 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
530 ok(service == service2, "Unexpected pointer.\n");
532 IDirectXVideoProcessorService_Release(service2);
533 IDirectXVideoProcessorService_Release(service);
535 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle);
536 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
538 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle1);
539 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
541 IDirect3DDevice9_Release(device);
542 IDirect3DDeviceManager9_Release(manager);
544 done:
545 IDirect3D9_Release(d3d);
546 DestroyWindow(window);
549 static BOOL check_format_list(D3DFORMAT format, const D3DFORMAT *list, unsigned int count)
551 unsigned int i;
552 for (i = 0; i < count; ++i)
553 if (list[i] == format) return TRUE;
554 return FALSE;
557 static void test_progressive_device(void)
559 static const unsigned int processor_ops = DXVA2_VideoProcess_YUV2RGB |
560 DXVA2_VideoProcess_StretchX | DXVA2_VideoProcess_StretchY;
561 IDirectXVideoProcessorService *service;
562 IDirectXVideoProcessor *processor;
563 IDirect3DDeviceManager9 *manager;
564 D3DFORMAT format, *rt_formats;
565 DXVA2_VideoProcessorCaps caps;
566 DXVA2_VideoDesc video_desc;
567 IDirect3DDevice9 *device;
568 unsigned int count, i, j;
569 GUID guid, *guids;
570 IDirect3D9 *d3d;
571 HANDLE handle;
572 HWND window;
573 UINT token;
574 HRESULT hr;
576 static const D3DFORMAT input_formats[] =
578 D3DFMT_X8R8G8B8,
579 D3DFMT_YUY2,
580 MAKEFOURCC('N','V','1','2'),
583 static const D3DFORMAT supported_rt_formats[] =
585 D3DFMT_X8R8G8B8,
586 MAKEFOURCC('N','V','1','2'),
587 D3DFMT_YUY2,
588 D3DFMT_A2R10G10B10,
591 window = create_window();
592 d3d = Direct3DCreate9(D3D_SDK_VERSION);
593 ok(!!d3d, "Failed to create a D3D object.\n");
594 if (!(device = create_device(d3d, window)))
596 skip("Failed to create a D3D device, skipping tests.\n");
597 goto done;
600 hr = DXVA2CreateDirect3DDeviceManager9(&token, &manager);
601 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
603 hr = IDirect3DDeviceManager9_ResetDevice(manager, device, token);
604 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
606 handle = NULL;
607 hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle);
608 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
610 hr = IDirect3DDeviceManager9_GetVideoService(manager, handle, &IID_IDirectXVideoProcessorService,
611 (void **)&service);
612 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
614 memset(&video_desc, 0, sizeof(video_desc));
615 video_desc.SampleWidth = 64;
616 video_desc.SampleHeight = 64;
617 video_desc.Format = MAKEFOURCC('N','V','1','2');
619 hr = IDirectXVideoProcessorService_CreateVideoProcessor(service, &DXVA2_VideoProcProgressiveDevice, &video_desc,
620 D3DFMT_A8R8G8B8, 0, &processor);
621 if (FAILED(hr))
623 win_skip("VideoProcProgressiveDevice is not supported.\n");
624 goto unsupported;
626 IDirectXVideoProcessor_Release(processor);
628 for (i = 0; i < ARRAY_SIZE(input_formats); ++i)
630 init_video_desc(&video_desc, input_formats[i]);
632 /* Check that progressive device is returned for given input format. */
633 count = 0;
634 hr = IDirectXVideoProcessorService_GetVideoProcessorDeviceGuids(service, &video_desc, &count, &guids);
635 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
636 ok(count > 0, "Unexpected device count.\n");
637 for (j = 0; j < count; ++j)
639 if (IsEqualGUID(&guids[j], &DXVA2_VideoProcProgressiveDevice)) break;
641 ok(j < count, "Expected progressive device for format %#x.\n", input_formats[i]);
642 CoTaskMemFree(guids);
644 count = 0;
645 hr = IDirectXVideoProcessorService_GetVideoProcessorRenderTargets(service, &DXVA2_VideoProcProgressiveDevice,
646 &video_desc, &count, &rt_formats);
647 ok(hr == S_OK, "Unexpected hr %#lx, format %d.\n", hr, input_formats[i]);
648 ok(count > 0, "Unexpected format count %u.\n", count);
649 for (j = 0; j < count; ++j)
651 ok(check_format_list(rt_formats[j], supported_rt_formats, ARRAY_SIZE(supported_rt_formats)),
652 "Unexpected rt format %#x for input format %#x.\n", rt_formats[j], input_formats[i]);
654 CoTaskMemFree(rt_formats);
657 memset(&video_desc, 0, sizeof(video_desc));
658 video_desc.SampleWidth = 64;
659 video_desc.SampleHeight = 64;
660 video_desc.Format = MAKEFOURCC('N','V','1','2');
662 hr = IDirectXVideoProcessorService_CreateVideoProcessor(service, &DXVA2_VideoProcProgressiveDevice, &video_desc,
663 D3DFMT_A8R8G8B8, 0, &processor);
664 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
666 hr = IDirectXVideoProcessor_GetVideoProcessorCaps(processor, &caps);
667 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
668 ok(caps.DeviceCaps == DXVA2_VPDev_HardwareDevice, "Unexpected device type %#x.\n", caps.DeviceCaps);
669 ok(!caps.NumForwardRefSamples, "Unexpected sample count.\n");
670 ok(!caps.NumBackwardRefSamples, "Unexpected sample count.\n");
671 ok(!caps.Reserved, "Unexpected field.\n");
672 ok((caps.VideoProcessorOperations & processor_ops) == processor_ops, "Unexpected processor operations %#x.\n",
673 caps.VideoProcessorOperations);
675 hr = IDirectXVideoProcessor_GetCreationParameters(processor, &guid, NULL, &format, NULL);
676 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
677 ok(IsEqualGUID(&guid, &DXVA2_VideoProcProgressiveDevice), "Unexpected device guid.\n");
678 ok(format == D3DFMT_A8R8G8B8, "Unexpected format %u.\n", format);
680 IDirectXVideoProcessor_Release(processor);
682 unsupported:
683 IDirectXVideoProcessorService_Release(service);
685 hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle);
686 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
688 IDirect3DDevice9_Release(device);
689 IDirect3DDeviceManager9_Release(manager);
691 done:
692 IDirect3D9_Release(d3d);
693 DestroyWindow(window);
696 START_TEST(dxva2)
698 test_device_manager();
699 test_video_processor();
700 test_progressive_device();