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 char data_full
[] =
101 "Header { 1; 0; 1; }\n"
109 " MeshMaterialList {\n"
112 " 0.0; 1.0; 0.0; 1.0;;\n"
116 " TextureFileName {\n"
117 " \"Texture.bmp\";\n"
129 " MeshTextureCoords {\n"
137 static void test_MeshBuilder(void)
141 LPDIRECT3DRMMESHBUILDER pMeshBuilder
;
142 D3DRMLOADMEMORY info
;
144 DWORD val1
, val2
, val3
;
150 hr
= pDirect3DRMCreate(&pD3DRM
);
151 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
153 hr
= IDirect3DRM_CreateMeshBuilder(pD3DRM
, &pMeshBuilder
);
154 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr
);
156 info
.lpMemory
= data_bad_version
;
157 info
.dSize
= strlen(data_bad_version
);
158 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
159 ok(hr
== D3DRMERR_BADFILE
, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr
);
161 info
.lpMemory
= data_no_mesh
;
162 info
.dSize
= strlen(data_no_mesh
);
163 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
164 ok(hr
== D3DRMERR_NOTFOUND
, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr
);
166 info
.lpMemory
= data_ok
;
167 info
.dSize
= strlen(data_ok
);
168 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
169 ok(hr
== D3DRM_OK
, "Cannot load mesh data (hr = %x)\n", hr
);
171 val
= IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder
);
172 ok(val
== 4, "Wrong number of vertices %d (must be 4)\n", val
);
174 val
= IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder
);
175 ok(val
== 3, "Wrong number of faces %d (must be 3)\n", val
);
177 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, NULL
, &val2
, NULL
, &val3
, NULL
);
178 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
179 ok(val1
== 4, "Wrong number of vertices %d (must be 4)\n", val1
);
180 todo_wine
ok(val2
== 4, "Wrong number of normals %d (must be 4)\n", val2
);
181 ok(val3
== 22, "Wrong number of face data bytes %d (must be 22)\n", val3
);
185 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 1, &valu
, &valv
);
186 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
187 todo_wine
ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
188 todo_wine
ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
192 hr
= IDirect3DRMMeshBuilder_SetTextureCoordinates(pMeshBuilder
, 1, valu
, valv
);
193 todo_wine
ok(hr
== D3DRM_OK
, "Cannot set texture coordinates (hr = %x)\n", hr
);
197 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 1, &valu
, &valv
);
198 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
199 todo_wine
ok(valu
== 1.23f
, "Wrong coordinate %f (must be 1.23)\n", valu
);
200 todo_wine
ok(valv
== 3.21f
, "Wrong coordinate %f (must be 3.21)\n", valv
);
202 IDirect3DRMMeshBuilder_Release(pMeshBuilder
);
204 hr
= IDirect3DRM_CreateMeshBuilder(pD3DRM
, &pMeshBuilder
);
205 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr
);
207 info
.lpMemory
= data_full
;
208 info
.dSize
= strlen(data_full
);
209 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
210 ok(hr
== D3DRM_OK
, "Cannot load mesh data (hr = %x)\n", hr
);
212 val
= IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder
);
213 ok(val
== 3, "Wrong number of vertices %d (must be 3)\n", val
);
215 val
= IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder
);
216 ok(val
== 1, "Wrong number of faces %d (must be 1)\n", val
);
218 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, v
, &val2
, n
, &val3
, f
);
219 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
220 ok(val1
== 3, "Wrong number of vertices %d (must be 3)\n", val1
);
221 ok(val2
== 3, "Wrong number of normals %d (must be 3)\n", val2
);
222 ok(val3
== 8, "Wrong number of face data bytes %d (must be 8)\n", val3
);
223 ok(v
[0].x
== 0.1f
, "Wrong component v[0].x = %f (expected 0.1)\n", v
[0].x
);
224 ok(v
[0].y
== 0.2f
, "Wrong component v[0].y = %f (expected 0.2)\n", v
[0].y
);
225 ok(v
[0].z
== 0.3f
, "Wrong component v[0].z = %f (expected 0.3)\n", v
[0].z
);
226 ok(v
[1].x
== 0.4f
, "Wrong component v[1].x = %f (expected 0.4)\n", v
[1].x
);
227 ok(v
[1].y
== 0.5f
, "Wrong component v[1].y = %f (expected 0.5)\n", v
[1].y
);
228 ok(v
[1].z
== 0.6f
, "Wrong component v[1].z = %f (expected 0.6)\n", v
[1].z
);
229 ok(v
[2].x
== 0.7f
, "Wrong component v[2].x = %f (expected 0.7)\n", v
[2].x
);
230 ok(v
[2].y
== 0.8f
, "Wrong component v[2].y = %f (expected 0.8)\n", v
[2].y
);
231 ok(v
[2].z
== 0.9f
, "Wrong component v[2].z = %f (expected 0.9)\n", v
[2].z
);
232 ok(n
[0].x
== 1.1f
, "Wrong component n[0].x = %f (expected 1.1)\n", n
[0].x
);
233 ok(n
[0].y
== 1.2f
, "Wrong component n[0].y = %f (expected 1.2)\n", n
[0].y
);
234 ok(n
[0].z
== 1.3f
, "Wrong component n[0].z = %f (expected 1.3)\n", n
[0].z
);
235 ok(n
[1].x
== 1.4f
, "Wrong component n[1].x = %f (expected 1.4)\n", n
[1].x
);
236 ok(n
[1].y
== 1.5f
, "Wrong component n[1].y = %f (expected 1.5)\n", n
[1].y
);
237 ok(n
[1].z
== 1.6f
, "Wrong component n[1].z = %f (expected 1.6)\n", n
[1].z
);
238 ok(n
[2].x
== 1.7f
, "Wrong component n[2].x = %f (expected 1.7)\n", n
[2].x
);
239 ok(n
[2].y
== 1.8f
, "Wrong component n[2].y = %f (expected 1.8)\n", n
[2].y
);
240 ok(n
[2].z
== 1.9f
, "Wrong component n[2].z = %f (expected 1.9)\n", n
[2].z
);
241 ok(f
[0] == 3 , "Wrong component f[0] = %d (expected 3)\n", f
[0]);
242 ok(f
[1] == 0 , "Wrong component f[1] = %d (expected 0)\n", f
[1]);
243 ok(f
[2] == 0 , "Wrong component f[2] = %d (expected 0)\n", f
[2]);
244 ok(f
[3] == 1 , "Wrong component f[3] = %d (expected 1)\n", f
[3]);
245 ok(f
[4] == 1 , "Wrong component f[4] = %d (expected 1)\n", f
[4]);
246 ok(f
[5] == 2 , "Wrong component f[5] = %d (expected 2)\n", f
[5]);
247 ok(f
[6] == 2 , "Wrong component f[6] = %d (expected 2)\n", f
[6]);
248 ok(f
[7] == 0 , "Wrong component f[7] = %d (expected 0)\n", f
[7]);
250 IDirect3DRMMeshBuilder_Release(pMeshBuilder
);
252 IDirect3DRM_Release(pD3DRM
);
255 static void test_MeshBuilder3(void)
259 LPDIRECT3DRM3 pD3DRM3
;
260 LPDIRECT3DRMMESHBUILDER3 pMeshBuilder3
;
261 D3DRMLOADMEMORY info
;
266 hr
= pDirect3DRMCreate(&pD3DRM
);
267 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
269 hr
= IDirect3DRM_QueryInterface(pD3DRM
, &IID_IDirect3DRM3
, (LPVOID
*)&pD3DRM3
);
272 win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr
);
273 IDirect3DRM_Release(pD3DRM
);
277 hr
= IDirect3DRM3_CreateMeshBuilder(pD3DRM3
, &pMeshBuilder3
);
278 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder3 interface (hr = %x)\n", hr
);
280 info
.lpMemory
= data_bad_version
;
281 info
.dSize
= strlen(data_bad_version
);
282 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
283 ok(hr
== D3DRMERR_BADFILE
, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr
);
285 info
.lpMemory
= data_no_mesh
;
286 info
.dSize
= strlen(data_no_mesh
);
287 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
288 ok(hr
== D3DRMERR_NOTFOUND
, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr
);
290 info
.lpMemory
= data_ok
;
291 info
.dSize
= strlen(data_ok
);
292 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
293 ok(hr
== D3DRM_OK
, "Cannot load mesh data (hr = %x)\n", hr
);
295 val
= IDirect3DRMMeshBuilder3_GetVertexCount(pMeshBuilder3
);
296 ok(val
== 4, "Wrong number of vertices %d (must be 4)\n", val
);
298 val
= IDirect3DRMMeshBuilder3_GetFaceCount(pMeshBuilder3
);
299 ok(val
== 3, "Wrong number of faces %d (must be 3)\n", val
);
301 hr
= IDirect3DRMMeshBuilder3_GetVertices(pMeshBuilder3
, 0, &val1
, NULL
);
302 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
303 ok(val1
== 4, "Wrong number of vertices %d (must be 4)\n", val1
);
307 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 1, &valu
, &valv
);
308 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
309 todo_wine
ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
310 todo_wine
ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
314 hr
= IDirect3DRMMeshBuilder3_SetTextureCoordinates(pMeshBuilder3
, 1, valu
, valv
);
315 todo_wine
ok(hr
== D3DRM_OK
, "Cannot set texture coordinates (hr = %x)\n", hr
);
319 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 1, &valu
, &valv
);
320 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
321 todo_wine
ok(valu
== 1.23f
, "Wrong coordinate %f (must be 1.23)\n", valu
);
322 todo_wine
ok(valv
== 3.21f
, "Wrong coordinate %f (must be 3.21)\n", valv
);
324 IDirect3DRMMeshBuilder3_Release(pMeshBuilder3
);
325 IDirect3DRM3_Release(pD3DRM3
);
326 IDirect3DRM_Release(pD3DRM
);
329 static void test_Frame(void)
333 LPDIRECT3DRMFRAME pFrameC
;
334 LPDIRECT3DRMFRAME pFrameP1
;
335 LPDIRECT3DRMFRAME pFrameP2
;
336 LPDIRECT3DRMFRAME pFrameTmp
;
337 LPDIRECT3DRMFRAMEARRAY pArray
;
340 hr
= pDirect3DRMCreate(&pD3DRM
);
341 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
343 hr
= IDirect3DRM_CreateFrame(pD3DRM
, NULL
, &pFrameC
);
344 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
345 CHECK_REFCOUNT(pFrameC
, 1);
347 pFrameTmp
= (void*)0xdeadbeef;
348 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
349 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
350 todo_wine
ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
351 CHECK_REFCOUNT(pFrameC
, 1);
354 hr
= IDirect3DRMFrame_GetChildren(pFrameC
, &pArray
);
355 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
356 todo_wine
ok(pArray
!= NULL
, "pArray = %p\n", pArray
);
359 count
= IDirect3DRMFrameArray_GetSize(pArray
);
360 ok(count
== 0, "count = %u\n", count
);
361 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
362 ok(hr
== D3DRMERR_BADVALUE
, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr
);
363 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
364 IDirect3DRMFrameArray_Release(pArray
);
367 hr
= IDirect3DRM_CreateFrame(pD3DRM
, NULL
, &pFrameP1
);
368 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
370 /* GetParent with NULL pointer */
371 hr
= IDirect3DRMFrame_GetParent(pFrameP1
, NULL
);
372 todo_wine
ok(hr
== D3DRMERR_BADVALUE
, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr
);
373 CHECK_REFCOUNT(pFrameP1
, 1);
375 /* [Add/Delete]Child with NULL pointer */
376 hr
= IDirect3DRMFrame_AddChild(pFrameP1
, NULL
);
377 todo_wine
ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
378 CHECK_REFCOUNT(pFrameP1
, 1);
380 hr
= IDirect3DRMFrame_DeleteChild(pFrameP1
, NULL
);
381 todo_wine
ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
382 CHECK_REFCOUNT(pFrameP1
, 1);
384 /* Add child to first parent */
385 pFrameTmp
= (void*)0xdeadbeef;
386 hr
= IDirect3DRMFrame_GetParent(pFrameP1
, &pFrameTmp
);
387 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
388 todo_wine
ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
390 hr
= IDirect3DRMFrame_AddChild(pFrameP1
, pFrameC
);
391 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
392 CHECK_REFCOUNT(pFrameP1
, 1);
393 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
396 hr
= IDirect3DRMFrame_GetChildren(pFrameP1
, &pArray
);
397 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
400 count
= IDirect3DRMFrameArray_GetSize(pArray
);
401 ok(count
== 1, "count = %u\n", count
);
402 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
403 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
404 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
405 IDirect3DRMFrame_Release(pFrameTmp
);
406 IDirect3DRMFrameArray_Release(pArray
);
409 pFrameTmp
= (void*)0xdeadbeef;
410 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
411 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
412 todo_wine
ok(pFrameTmp
== pFrameP1
, "pFrameTmp = %p\n", pFrameTmp
);
413 todo_wine
CHECK_REFCOUNT(pFrameP1
, 2);
415 /* Add child to second parent */
416 hr
= IDirect3DRM_CreateFrame(pD3DRM
, NULL
, &pFrameP2
);
417 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
419 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
420 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
421 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
424 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &pArray
);
425 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
428 count
= IDirect3DRMFrameArray_GetSize(pArray
);
429 ok(count
== 1, "count = %u\n", count
);
430 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
431 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
432 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
433 IDirect3DRMFrame_Release(pFrameTmp
);
434 IDirect3DRMFrameArray_Release(pArray
);
438 hr
= IDirect3DRMFrame_GetChildren(pFrameP1
, &pArray
);
439 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
442 count
= IDirect3DRMFrameArray_GetSize(pArray
);
443 ok(count
== 0, "count = %u\n", count
);
444 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
445 ok(hr
== D3DRMERR_BADVALUE
, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr
);
446 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
447 IDirect3DRMFrameArray_Release(pArray
);
450 pFrameTmp
= (void*)0xdeadbeef;
451 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
452 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
453 todo_wine
ok(pFrameTmp
== pFrameP2
, "pFrameTmp = %p\n", pFrameTmp
);
454 todo_wine
CHECK_REFCOUNT(pFrameP2
, 2);
455 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
457 /* Add child again */
458 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
459 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
460 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
463 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &pArray
);
464 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
467 count
= IDirect3DRMFrameArray_GetSize(pArray
);
468 ok(count
== 1, "count = %u\n", count
);
469 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
470 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
471 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
472 IDirect3DRMFrame_Release(pFrameTmp
);
473 IDirect3DRMFrameArray_Release(pArray
);
477 hr
= IDirect3DRMFrame_DeleteChild(pFrameP2
, pFrameC
);
478 todo_wine
ok(hr
== D3DRM_OK
, "Cannot delete child frame (hr = %x)\n", hr
);
479 CHECK_REFCOUNT(pFrameC
, 1);
482 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &pArray
);
483 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
486 count
= IDirect3DRMFrameArray_GetSize(pArray
);
487 ok(count
== 0, "count = %u\n", count
);
488 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
489 ok(hr
== D3DRMERR_BADVALUE
, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr
);
490 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
491 IDirect3DRMFrameArray_Release(pArray
);
494 pFrameTmp
= (void*)0xdeadbeef;
495 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
496 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
497 todo_wine
ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
499 /* Add two children */
500 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
501 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
502 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
504 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameP1
);
505 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
506 todo_wine
CHECK_REFCOUNT(pFrameP1
, 3);
509 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &pArray
);
510 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
513 count
= IDirect3DRMFrameArray_GetSize(pArray
);
514 ok(count
== 2, "count = %u\n", count
);
515 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 0, &pFrameTmp
);
516 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
517 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
518 IDirect3DRMFrame_Release(pFrameTmp
);
519 hr
= IDirect3DRMFrameArray_GetElement(pArray
, 1, &pFrameTmp
);
520 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
521 ok(pFrameTmp
== pFrameP1
, "pFrameTmp = %p\n", pFrameTmp
);
522 IDirect3DRMFrame_Release(pFrameTmp
);
523 IDirect3DRMFrameArray_Release(pArray
);
526 IDirect3DRMMeshBuilder_Release(pFrameP2
);
527 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
528 todo_wine
CHECK_REFCOUNT(pFrameP1
, 3);
530 IDirect3DRMMeshBuilder_Release(pFrameC
);
531 IDirect3DRMMeshBuilder_Release(pFrameP1
);
533 IDirect3DRM_Release(pD3DRM
);
538 if (!InitFunctionPtrs())
545 FreeLibrary(d3drm_handle
);