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
20 #include "wine/test.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
);
63 static void test_surface_desc(IDirect3DSurface9
*surface
)
65 D3DSURFACE_DESC desc
= { 0 };
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
;
109 static const D3DFORMAT rt_formats
[] =
114 MAKEFOURCC('A','Y','U','V'),
116 static const D3DFORMAT rt_unsupported_formats
[] =
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");
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
);
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
);
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
);
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
);
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
);
193 hr
= IDirect3DDeviceManager9_OpenDeviceHandle(manager
, &handle
);
194 ok(hr
== S_OK
, "Unexpected hr %#lx.\n", hr
);
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
);
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
);
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
]);
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
);
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
);
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
);
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
;
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");
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
);
452 hr
= IDirect3DDeviceManager9_OpenDeviceHandle(manager
, &handle
);
453 ok(hr
== S_OK
, "Unexpected hr %#lx.\n", hr
);
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
,
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
,
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
);
545 IDirect3D9_Release(d3d
);
546 DestroyWindow(window
);
549 static BOOL
check_format_list(D3DFORMAT format
, const D3DFORMAT
*list
, unsigned int count
)
552 for (i
= 0; i
< count
; ++i
)
553 if (list
[i
] == format
) return TRUE
;
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
;
576 static const D3DFORMAT input_formats
[] =
580 MAKEFOURCC('N','V','1','2'),
583 static const D3DFORMAT supported_rt_formats
[] =
586 MAKEFOURCC('N','V','1','2'),
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");
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
);
607 hr
= IDirect3DDeviceManager9_OpenDeviceHandle(manager
, &handle
);
608 ok(hr
== S_OK
, "Unexpected hr %#lx.\n", hr
);
610 hr
= IDirect3DDeviceManager9_GetVideoService(manager
, handle
, &IID_IDirectXVideoProcessorService
,
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
);
623 win_skip("VideoProcProgressiveDevice is not supported.\n");
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. */
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
);
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
);
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
);
692 IDirect3D9_Release(d3d
);
693 DestroyWindow(window
);
698 test_device_manager();
699 test_video_processor();
700 test_progressive_device();