2 * Copyright 2010 Christian Costa
3 * Copyright 2012 André Hentschel
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #include "wine/test.h"
26 static HMODULE d3drm_handle
= 0;
28 static HRESULT (WINAPI
* pDirect3DRMCreate
)(LPDIRECT3DRM
* ppDirect3DRM
);
30 #define CHECK_REFCOUNT(obj,rc) \
33 int count = get_refcount( (IUnknown *)obj ); \
34 ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
37 #define D3DRM_GET_PROC(func) \
38 p ## func = (void*)GetProcAddress(d3drm_handle, #func); \
40 trace("GetProcAddress(%s) failed\n", #func); \
41 FreeLibrary(d3drm_handle); \
45 static BOOL
InitFunctionPtrs(void)
47 d3drm_handle
= LoadLibraryA("d3drm.dll");
51 skip("Could not load d3drm.dll\n");
55 D3DRM_GET_PROC(Direct3DRMCreate
)
60 static int get_refcount(IUnknown
*object
)
62 IUnknown_AddRef( object
);
63 return IUnknown_Release( object
);
66 static char data_bad_version
[] =
73 static char data_no_mesh
[] =
80 static char data_ok
[] =
99 static void test_MeshBuilder(void)
103 LPDIRECT3DRMMESHBUILDER pMeshBuilder
;
104 D3DRMLOADMEMORY info
;
106 DWORD val1
, val2
, val3
;
109 hr
= pDirect3DRMCreate(&pD3DRM
);
110 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
112 hr
= IDirect3DRM_CreateMeshBuilder(pD3DRM
, &pMeshBuilder
);
113 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr
);
115 info
.lpMemory
= data_bad_version
;
116 info
.dSize
= strlen(data_bad_version
);
117 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
118 ok(hr
== D3DRMERR_BADFILE
, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr
);
120 info
.lpMemory
= data_no_mesh
;
121 info
.dSize
= strlen(data_no_mesh
);
122 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
123 ok(hr
== D3DRMERR_NOTFOUND
, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr
);
125 info
.lpMemory
= data_ok
;
126 info
.dSize
= strlen(data_ok
);
127 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
128 ok(hr
== D3DRM_OK
, "Cannot load mesh data (hr = %x)\n", hr
);
130 val
= IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder
);
131 ok(val
== 4, "Wrong number of vertices %d (must be 4)\n", val
);
133 val
= IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder
);
134 ok(val
== 3, "Wrong number of faces %d (must be 3)\n", val
);
136 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, NULL
, &val2
, NULL
, &val3
, NULL
);
137 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
138 ok(val1
== 4, "Wrong number of vertices %d (must be 4)\n", val1
);
139 todo_wine
ok(val2
== 4, "Wrong number of normals %d (must be 4)\n", val2
);
140 todo_wine
ok(val3
== 22, "Wrong number of face data bytes %d (must be 22)\n", val3
);
144 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 1, &valu
, &valv
);
145 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
146 todo_wine
ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
147 todo_wine
ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
151 hr
= IDirect3DRMMeshBuilder_SetTextureCoordinates(pMeshBuilder
, 1, valu
, valv
);
152 todo_wine
ok(hr
== D3DRM_OK
, "Cannot set texture coordinates (hr = %x)\n", hr
);
156 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 1, &valu
, &valv
);
157 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
158 todo_wine
ok(valu
== 1.23f
, "Wrong coordinate %f (must be 1.23)\n", valu
);
159 todo_wine
ok(valv
== 3.21f
, "Wrong coordinate %f (must be 3.21)\n", valv
);
161 IDirect3DRMMeshBuilder_Release(pMeshBuilder
);
163 IDirect3DRM_Release(pD3DRM
);
166 static void test_MeshBuilder3(void)
170 LPDIRECT3DRM3 pD3DRM3
;
171 LPDIRECT3DRMMESHBUILDER3 pMeshBuilder3
;
172 D3DRMLOADMEMORY info
;
177 hr
= pDirect3DRMCreate(&pD3DRM
);
178 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
180 hr
= IDirect3DRM_QueryInterface(pD3DRM
, &IID_IDirect3DRM3
, (LPVOID
*)&pD3DRM3
);
183 win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr
);
184 IDirect3DRM_Release(pD3DRM
);
188 hr
= IDirect3DRM3_CreateMeshBuilder(pD3DRM3
, &pMeshBuilder3
);
189 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder3 interface (hr = %x)\n", hr
);
191 info
.lpMemory
= data_bad_version
;
192 info
.dSize
= strlen(data_bad_version
);
193 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
194 ok(hr
== D3DRMERR_BADFILE
, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr
);
196 info
.lpMemory
= data_no_mesh
;
197 info
.dSize
= strlen(data_no_mesh
);
198 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
199 ok(hr
== D3DRMERR_NOTFOUND
, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr
);
201 info
.lpMemory
= data_ok
;
202 info
.dSize
= strlen(data_ok
);
203 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
204 ok(hr
== D3DRM_OK
, "Cannot load mesh data (hr = %x)\n", hr
);
206 val
= IDirect3DRMMeshBuilder3_GetVertexCount(pMeshBuilder3
);
207 ok(val
== 4, "Wrong number of vertices %d (must be 4)\n", val
);
209 val
= IDirect3DRMMeshBuilder3_GetFaceCount(pMeshBuilder3
);
210 ok(val
== 3, "Wrong number of faces %d (must be 3)\n", val
);
212 hr
= IDirect3DRMMeshBuilder3_GetVertices(pMeshBuilder3
, 0, &val1
, NULL
);
213 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
214 ok(val1
== 4, "Wrong number of vertices %d (must be 4)\n", val1
);
218 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 1, &valu
, &valv
);
219 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
220 todo_wine
ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
221 todo_wine
ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
225 hr
= IDirect3DRMMeshBuilder3_SetTextureCoordinates(pMeshBuilder3
, 1, valu
, valv
);
226 todo_wine
ok(hr
== D3DRM_OK
, "Cannot set texture coordinates (hr = %x)\n", hr
);
230 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 1, &valu
, &valv
);
231 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
232 todo_wine
ok(valu
== 1.23f
, "Wrong coordinate %f (must be 1.23)\n", valu
);
233 todo_wine
ok(valv
== 3.21f
, "Wrong coordinate %f (must be 3.21)\n", valv
);
235 IDirect3DRMMeshBuilder3_Release(pMeshBuilder3
);
236 IDirect3DRM3_Release(pD3DRM3
);
237 IDirect3DRM_Release(pD3DRM
);
240 static void test_Frame(void)
244 LPDIRECT3DRMFRAME pFrameC
;
245 LPDIRECT3DRMFRAME pFrameP1
;
246 LPDIRECT3DRMFRAME pFrameP2
;
247 LPDIRECT3DRMFRAME pFrameTmp
;
248 LPDIRECT3DRMFRAMEARRAY pArray
;
251 hr
= pDirect3DRMCreate(&pD3DRM
);
252 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
254 hr
= IDirect3DRM_CreateFrame(pD3DRM
, NULL
, &pFrameC
);
255 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
256 CHECK_REFCOUNT(pFrameC
, 1);
258 pFrameTmp
= (void*)0xdeadbeef;
259 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
260 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
261 todo_wine
ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
262 CHECK_REFCOUNT(pFrameC
, 1);
265 hr
= IDirect3DRMFrame_GetChildren(pFrameC
, &pArray
);
266 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
267 todo_wine
ok(pArray
!= NULL
, "pArray = %p\n", pArray
);
270 count
= IDirect3DRMFrameArray_GetSize(pArray
);
271 ok(count
== 0, "count = %u\n", count
);
272 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
273 ok(hr
== D3DRMERR_BADVALUE
, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr
);
274 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
275 IDirect3DRMFrameArray_Release(pArray
);
278 hr
= IDirect3DRM_CreateFrame(pD3DRM
, NULL
, &pFrameP1
);
279 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
281 /* [Add/Delete]Child with NULL pointer */
282 hr
= IDirect3DRMFrame_AddChild(pFrameP1
, NULL
);
283 todo_wine
ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
284 CHECK_REFCOUNT(pFrameP1
, 1);
286 hr
= IDirect3DRMFrame_DeleteChild(pFrameP1
, NULL
);
287 todo_wine
ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
288 CHECK_REFCOUNT(pFrameP1
, 1);
290 /* Add child to first parent */
291 pFrameTmp
= (void*)0xdeadbeef;
292 hr
= IDirect3DRMFrame_GetParent(pFrameP1
, &pFrameTmp
);
293 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
294 todo_wine
ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
296 hr
= IDirect3DRMFrame_AddChild(pFrameP1
, pFrameC
);
297 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
298 CHECK_REFCOUNT(pFrameP1
, 1);
299 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
302 hr
= IDirect3DRMFrame_GetChildren(pFrameP1
, &pArray
);
303 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
306 count
= IDirect3DRMFrameArray_GetSize(pArray
);
307 ok(count
== 1, "count = %u\n", count
);
308 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
309 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
310 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
311 IDirect3DRMFrame_Release(pFrameTmp
);
312 IDirect3DRMFrameArray_Release(pArray
);
315 pFrameTmp
= (void*)0xdeadbeef;
316 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
317 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
318 todo_wine
ok(pFrameTmp
== pFrameP1
, "pFrameTmp = %p\n", pFrameTmp
);
319 todo_wine
CHECK_REFCOUNT(pFrameP1
, 2);
321 /* Add child to second parent */
322 hr
= IDirect3DRM_CreateFrame(pD3DRM
, NULL
, &pFrameP2
);
323 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
325 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
326 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
327 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
330 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &pArray
);
331 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
334 count
= IDirect3DRMFrameArray_GetSize(pArray
);
335 ok(count
== 1, "count = %u\n", count
);
336 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
337 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
338 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
339 IDirect3DRMFrame_Release(pFrameTmp
);
340 IDirect3DRMFrameArray_Release(pArray
);
344 hr
= IDirect3DRMFrame_GetChildren(pFrameP1
, &pArray
);
345 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
348 count
= IDirect3DRMFrameArray_GetSize(pArray
);
349 ok(count
== 0, "count = %u\n", count
);
350 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
351 ok(hr
== D3DRMERR_BADVALUE
, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr
);
352 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
353 IDirect3DRMFrameArray_Release(pArray
);
356 pFrameTmp
= (void*)0xdeadbeef;
357 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
358 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
359 todo_wine
ok(pFrameTmp
== pFrameP2
, "pFrameTmp = %p\n", pFrameTmp
);
360 todo_wine
CHECK_REFCOUNT(pFrameP2
, 2);
361 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
363 /* Add child again */
364 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
365 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
366 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
369 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &pArray
);
370 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
373 count
= IDirect3DRMFrameArray_GetSize(pArray
);
374 ok(count
== 1, "count = %u\n", count
);
375 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
376 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
377 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
378 IDirect3DRMFrame_Release(pFrameTmp
);
379 IDirect3DRMFrameArray_Release(pArray
);
383 hr
= IDirect3DRMFrame_DeleteChild(pFrameP2
, pFrameC
);
384 todo_wine
ok(hr
== D3DRM_OK
, "Cannot delete child frame (hr = %x)\n", hr
);
385 CHECK_REFCOUNT(pFrameC
, 1);
388 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &pArray
);
389 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
392 count
= IDirect3DRMFrameArray_GetSize(pArray
);
393 ok(count
== 0, "count = %u\n", count
);
394 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
395 ok(hr
== D3DRMERR_BADVALUE
, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr
);
396 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
397 IDirect3DRMFrameArray_Release(pArray
);
400 pFrameTmp
= (void*)0xdeadbeef;
401 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
402 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
403 todo_wine
ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
405 /* Add two children */
406 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
407 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
408 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
410 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameP1
);
411 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
412 todo_wine
CHECK_REFCOUNT(pFrameP1
, 3);
415 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &pArray
);
416 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
419 count
= IDirect3DRMFrameArray_GetSize(pArray
);
420 ok(count
== 2, "count = %u\n", count
);
421 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
422 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
423 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
424 IDirect3DRMFrame_Release(pFrameTmp
);
425 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 1, &pFrameTmp
);
426 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
427 ok(pFrameTmp
== pFrameP1
, "pFrameTmp = %p\n", pFrameTmp
);
428 IDirect3DRMFrame_Release(pFrameTmp
);
429 IDirect3DRMFrameArray_Release(pArray
);
432 IDirect3DRMMeshBuilder_Release(pFrameP2
);
433 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
434 todo_wine
CHECK_REFCOUNT(pFrameP1
, 3);
436 IDirect3DRMMeshBuilder_Release(pFrameC
);
437 IDirect3DRMMeshBuilder_Release(pFrameP1
);
439 IDirect3DRM_Release(pD3DRM
);
444 if (!InitFunctionPtrs())
451 FreeLibrary(d3drm_handle
);