d3drm: Fix leakage of pData2 on error.
[wine] / dlls / d3drm / tests / d3drm.c
1 /*
2  * Copyright 2010 Christian Costa
3  * Copyright 2012 AndrĂ© Hentschel
4  *
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.
9  *
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.
14  *
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
18  */
19
20 #define COBJMACROS
21 #include <d3drm.h>
22 #include <initguid.h>
23
24 #include "wine/test.h"
25
26 static HMODULE d3drm_handle = 0;
27
28 static HRESULT (WINAPI * pDirect3DRMCreate)(LPDIRECT3DRM* ppDirect3DRM);
29
30 #define CHECK_REFCOUNT(obj,rc) \
31     { \
32         int rc_new = rc; \
33         int count = get_refcount( (IUnknown *)obj ); \
34         ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
35     }
36
37 #define D3DRM_GET_PROC(func) \
38     p ## func = (void*)GetProcAddress(d3drm_handle, #func); \
39     if(!p ## func) { \
40       trace("GetProcAddress(%s) failed\n", #func); \
41       FreeLibrary(d3drm_handle); \
42       return FALSE; \
43     }
44
45 static BOOL InitFunctionPtrs(void)
46 {
47     d3drm_handle = LoadLibraryA("d3drm.dll");
48
49     if(!d3drm_handle)
50     {
51         skip("Could not load d3drm.dll\n");
52         return FALSE;
53     }
54
55     D3DRM_GET_PROC(Direct3DRMCreate)
56
57     return TRUE;
58 }
59
60 static int get_refcount(IUnknown *object)
61 {
62     IUnknown_AddRef( object );
63     return IUnknown_Release( object );
64 }
65
66 static char data_bad_version[] =
67 "xof 0302txt 0064\n"
68 "Header Object\n"
69 "{\n"
70 "1; 2; 3;\n"
71 "}\n";
72
73 static char data_no_mesh[] =
74 "xof 0302txt 0064\n"
75 "Header Object\n"
76 "{\n"
77 "1; 0; 1;\n"
78 "}\n";
79
80 static char data_ok[] =
81 "xof 0302txt 0064\n"
82 "Header Object\n"
83 "{\n"
84 "1; 0; 1;\n"
85 "}\n"
86 "Mesh Object\n"
87 "{\n"
88 "4;\n"
89 "1.0; 0.0; 0.0;,\n"
90 "0.0; 1.0; 0.0;,\n"
91 "0.0; 0.0; 1.0;,\n"
92 "1.0; 1.0; 1.0;;\n"
93 "3;\n"
94 "3; 0, 1, 2;,\n"
95 "3; 1, 2, 3;,\n"
96 "3; 3, 1, 2;;\n"
97 "}\n";
98
99 static void test_MeshBuilder(void)
100 {
101     HRESULT hr;
102     LPDIRECT3DRM pD3DRM;
103     LPDIRECT3DRMMESHBUILDER pMeshBuilder;
104     D3DRMLOADMEMORY info;
105     int val;
106     DWORD val1, val2, val3;
107     D3DVALUE valu, valv;
108
109     hr = pDirect3DRMCreate(&pD3DRM);
110     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
111
112     hr = IDirect3DRM_CreateMeshBuilder(pD3DRM, &pMeshBuilder);
113     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr);
114
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);
119
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);
124
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);
129
130     val = IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder);
131     ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
132
133     val = IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder);
134     ok(val == 3, "Wrong number of faces %d (must be 3)\n", val);
135
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);
141
142     valu = 1.23f;
143     valv = 3.21f;
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);
148
149     valu = 1.23f;
150     valv = 3.21f;
151     hr = IDirect3DRMMeshBuilder_SetTextureCoordinates(pMeshBuilder, 1, valu, valv);
152     todo_wine ok(hr == D3DRM_OK, "Cannot set texture coordinates (hr = %x)\n", hr);
153
154     valu = 0.0f;
155     valv = 0.0f;
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);
160
161     IDirect3DRMMeshBuilder_Release(pMeshBuilder);
162
163     IDirect3DRM_Release(pD3DRM);
164 }
165
166 static void test_MeshBuilder3(void)
167 {
168     HRESULT hr;
169     LPDIRECT3DRM pD3DRM;
170     LPDIRECT3DRM3 pD3DRM3;
171     LPDIRECT3DRMMESHBUILDER3 pMeshBuilder3;
172     D3DRMLOADMEMORY info;
173     int val;
174     DWORD val1;
175     D3DVALUE valu, valv;
176
177     hr = pDirect3DRMCreate(&pD3DRM);
178     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
179
180     hr = IDirect3DRM_QueryInterface(pD3DRM, &IID_IDirect3DRM3, (LPVOID*)&pD3DRM3);
181     if (FAILED(hr))
182     {
183         win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr);
184         IDirect3DRM_Release(pD3DRM);
185         return;
186     }
187
188     hr = IDirect3DRM3_CreateMeshBuilder(pD3DRM3, &pMeshBuilder3);
189     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder3 interface (hr = %x)\n", hr);
190
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);
195
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);
200
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);
205
206     val = IDirect3DRMMeshBuilder3_GetVertexCount(pMeshBuilder3);
207     ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
208
209     val = IDirect3DRMMeshBuilder3_GetFaceCount(pMeshBuilder3);
210     ok(val == 3, "Wrong number of faces %d (must be 3)\n", val);
211
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);
215
216     valu = 1.23f;
217     valv = 3.21f;
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);
222
223     valu = 1.23f;
224     valv = 3.21f;
225     hr = IDirect3DRMMeshBuilder3_SetTextureCoordinates(pMeshBuilder3, 1, valu, valv);
226     todo_wine ok(hr == D3DRM_OK, "Cannot set texture coordinates (hr = %x)\n", hr);
227
228     valu = 0.0f;
229     valv = 0.0f;
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);
234
235     IDirect3DRMMeshBuilder3_Release(pMeshBuilder3);
236     IDirect3DRM3_Release(pD3DRM3);
237     IDirect3DRM_Release(pD3DRM);
238 }
239
240 static void test_Frame(void)
241 {
242     HRESULT hr;
243     LPDIRECT3DRM pD3DRM;
244     LPDIRECT3DRMFRAME pFrameC;
245     LPDIRECT3DRMFRAME pFrameP1;
246     LPDIRECT3DRMFRAME pFrameP2;
247     LPDIRECT3DRMFRAME pFrameTmp;
248     LPDIRECT3DRMFRAMEARRAY pArray;
249     DWORD count;
250
251     hr = pDirect3DRMCreate(&pD3DRM);
252     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
253
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);
257
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);
263
264     pArray = NULL;
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);
268     if (pArray)
269     {
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);
276     }
277
278     hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameP1);
279     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
280
281     /* GetParent with NULL pointer */
282     hr = IDirect3DRMFrame_GetParent(pFrameP1, NULL);
283     todo_wine ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
284     CHECK_REFCOUNT(pFrameP1, 1);
285
286     /* [Add/Delete]Child with NULL pointer */
287     hr = IDirect3DRMFrame_AddChild(pFrameP1, NULL);
288     todo_wine ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
289     CHECK_REFCOUNT(pFrameP1, 1);
290
291     hr = IDirect3DRMFrame_DeleteChild(pFrameP1, NULL);
292     todo_wine ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
293     CHECK_REFCOUNT(pFrameP1, 1);
294
295     /* Add child to first parent */
296     pFrameTmp = (void*)0xdeadbeef;
297     hr = IDirect3DRMFrame_GetParent(pFrameP1, &pFrameTmp);
298     todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
299     todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
300
301     hr = IDirect3DRMFrame_AddChild(pFrameP1, pFrameC);
302     todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
303     CHECK_REFCOUNT(pFrameP1, 1);
304     todo_wine CHECK_REFCOUNT(pFrameC, 2);
305
306     pArray = NULL;
307     hr = IDirect3DRMFrame_GetChildren(pFrameP1, &pArray);
308     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
309     if (pArray)
310     {
311         count = IDirect3DRMFrameArray_GetSize(pArray);
312         ok(count == 1, "count = %u\n", count);
313         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
314         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
315         ok(pFrameTmp == pFrameC, "pFrameTmp = %p\n", pFrameTmp);
316         IDirect3DRMFrame_Release(pFrameTmp);
317         IDirect3DRMFrameArray_Release(pArray);
318     }
319
320     pFrameTmp = (void*)0xdeadbeef;
321     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
322     todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
323     todo_wine ok(pFrameTmp == pFrameP1, "pFrameTmp = %p\n", pFrameTmp);
324     todo_wine CHECK_REFCOUNT(pFrameP1, 2);
325
326     /* Add child to second parent */
327     hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameP2);
328     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
329
330     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
331     todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
332     todo_wine CHECK_REFCOUNT(pFrameC, 2);
333
334     pArray = NULL;
335     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
336     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
337     if (pArray)
338     {
339         count = IDirect3DRMFrameArray_GetSize(pArray);
340         ok(count == 1, "count = %u\n", count);
341         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
342         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
343         ok(pFrameTmp == pFrameC, "pFrameTmp = %p\n", pFrameTmp);
344         IDirect3DRMFrame_Release(pFrameTmp);
345         IDirect3DRMFrameArray_Release(pArray);
346     }
347
348     pArray = NULL;
349     hr = IDirect3DRMFrame_GetChildren(pFrameP1, &pArray);
350     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
351     if (pArray)
352     {
353         count = IDirect3DRMFrameArray_GetSize(pArray);
354         ok(count == 0, "count = %u\n", count);
355         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
356         ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
357         ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
358         IDirect3DRMFrameArray_Release(pArray);
359     }
360
361     pFrameTmp = (void*)0xdeadbeef;
362     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
363     todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
364     todo_wine ok(pFrameTmp == pFrameP2, "pFrameTmp = %p\n", pFrameTmp);
365     todo_wine CHECK_REFCOUNT(pFrameP2, 2);
366     todo_wine CHECK_REFCOUNT(pFrameC, 2);
367
368     /* Add child again */
369     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
370     todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
371     todo_wine CHECK_REFCOUNT(pFrameC, 2);
372
373     pArray = NULL;
374     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
375     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
376     if (pArray)
377     {
378         count = IDirect3DRMFrameArray_GetSize(pArray);
379         ok(count == 1, "count = %u\n", count);
380         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
381         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
382         ok(pFrameTmp == pFrameC, "pFrameTmp = %p\n", pFrameTmp);
383         IDirect3DRMFrame_Release(pFrameTmp);
384         IDirect3DRMFrameArray_Release(pArray);
385     }
386
387     /* Delete child */
388     hr = IDirect3DRMFrame_DeleteChild(pFrameP2, pFrameC);
389     todo_wine ok(hr == D3DRM_OK, "Cannot delete child frame (hr = %x)\n", hr);
390     CHECK_REFCOUNT(pFrameC, 1);
391
392     pArray = NULL;
393     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
394     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
395     if (pArray)
396     {
397         count = IDirect3DRMFrameArray_GetSize(pArray);
398         ok(count == 0, "count = %u\n", count);
399         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
400         ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
401         ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
402         IDirect3DRMFrameArray_Release(pArray);
403     }
404
405     pFrameTmp = (void*)0xdeadbeef;
406     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
407     todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
408     todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
409
410     /* Add two children */
411     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
412     todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
413     todo_wine CHECK_REFCOUNT(pFrameC, 2);
414
415     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameP1);
416     todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
417     todo_wine CHECK_REFCOUNT(pFrameP1, 3);
418
419     pArray = NULL;
420     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
421     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
422     if (pArray)
423     {
424         count = IDirect3DRMFrameArray_GetSize(pArray);
425         ok(count == 2, "count = %u\n", count);
426         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
427         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
428         ok(pFrameTmp == pFrameC, "pFrameTmp = %p\n", pFrameTmp);
429         IDirect3DRMFrame_Release(pFrameTmp);
430         hr = IDirect3DRMFrameArray_GetElement(pArray, 1, &pFrameTmp);
431         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
432         ok(pFrameTmp == pFrameP1, "pFrameTmp = %p\n", pFrameTmp);
433         IDirect3DRMFrame_Release(pFrameTmp);
434         IDirect3DRMFrameArray_Release(pArray);
435     }
436
437     IDirect3DRMMeshBuilder_Release(pFrameP2);
438     todo_wine CHECK_REFCOUNT(pFrameC, 2);
439     todo_wine CHECK_REFCOUNT(pFrameP1, 3);
440
441     IDirect3DRMMeshBuilder_Release(pFrameC);
442     IDirect3DRMMeshBuilder_Release(pFrameP1);
443
444     IDirect3DRM_Release(pD3DRM);
445 }
446
447 START_TEST(d3drm)
448 {
449     if (!InitFunctionPtrs())
450         return;
451
452     test_MeshBuilder();
453     test_MeshBuilder3();
454     test_Frame();
455
456     FreeLibrary(d3drm_handle);
457 }