d3dcompiler: Trace compilation messages.
[wine] / dlls / d3drm / tests / d3drm.c
1 /*
2  * Copyright 2010, 2012 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 D3DRMMATRIX4D identity = {
67     { 1.0f, 0.0f, 0.0f, 0.0f },
68     { 0.0f, 1.0f, 0.0f, 0.0f },
69     { 0.0f, 0.0f, 1.0f, 0.0f },
70     { 0.0f, 0.0f, 0.0f, 1.0f }
71 };
72
73 static char data_bad_version[] =
74 "xof 0302txt 0064\n"
75 "Header Object\n"
76 "{\n"
77 "1; 2; 3;\n"
78 "}\n";
79
80 static char data_no_mesh[] =
81 "xof 0302txt 0064\n"
82 "Header Object\n"
83 "{\n"
84 "1; 0; 1;\n"
85 "}\n";
86
87 static char data_ok[] =
88 "xof 0302txt 0064\n"
89 "Header Object\n"
90 "{\n"
91 "1; 0; 1;\n"
92 "}\n"
93 "Mesh Object\n"
94 "{\n"
95 "4;\n"
96 "1.0; 0.0; 0.0;,\n"
97 "0.0; 1.0; 0.0;,\n"
98 "0.0; 0.0; 1.0;,\n"
99 "1.0; 1.0; 1.0;;\n"
100 "3;\n"
101 "3; 0, 1, 2;,\n"
102 "3; 1, 2, 3;,\n"
103 "3; 3, 1, 2;;\n"
104 "}\n";
105
106 static char data_full[] =
107 "xof 0302txt 0064\n"
108 "Header { 1; 0; 1; }\n"
109 "Mesh {\n"
110 " 3;\n"
111 " 0.1; 0.2; 0.3;,\n"
112 " 0.4; 0.5; 0.6;,\n"
113 " 0.7; 0.8; 0.9;;\n"
114 " 1;\n"
115 " 3; 0, 1, 2;;\n"
116 " MeshMaterialList {\n"
117 "  1; 1; 0;\n"
118 "  Material {\n"
119 "   0.0; 1.0; 0.0; 1.0;;\n"
120 "   30.0;\n"
121 "   1.0; 0.0; 0.0;;\n"
122 "   0.5; 0.5; 0.5;;\n"
123 "   TextureFileName {\n"
124 "    \"Texture.bmp\";\n"
125 "   }\n"
126 "  }\n"
127 " }\n"
128 " MeshNormals {\n"
129 "  3;\n"
130 "  1.1; 1.2; 1.3;,\n"
131 "  1.4; 1.5; 1.6;,\n"
132 "  1.7; 1.8; 1.9;;\n"
133 "  1;"
134 "  3; 0, 1, 2;;\n"
135 " }\n"
136 " MeshTextureCoords {\n"
137 "  3;\n"
138 "  0.13; 0.17;,\n"
139 "  0.23; 0.27;,\n"
140 "  0.33; 0.37;;\n"
141 " }\n"
142 "}\n";
143
144 static char data_d3drm_load[] =
145 "xof 0302txt 0064\n"
146 "Header Object\n"
147 "{\n"
148 "1; 0; 1;\n"
149 "}\n"
150 "Mesh Object1\n"
151 "{\n"
152 " 1;\n"
153 " 0.1; 0.2; 0.3;,\n"
154 " 1;\n"
155 " 3; 0, 1, 2;;\n"
156 "}\n"
157 "Mesh Object2\n"
158 "{\n"
159 " 1;\n"
160 " 0.1; 0.2; 0.3;,\n"
161 " 1;\n"
162 " 3; 0, 1, 2;;\n"
163 "}\n"
164 "Frame Scene\n"
165 "{\n"
166 " {Object1}\n"
167 " {Object2}\n"
168 "}\n";
169
170 static void test_MeshBuilder(void)
171 {
172     HRESULT hr;
173     LPDIRECT3DRM pD3DRM;
174     LPDIRECT3DRMMESHBUILDER pMeshBuilder;
175     D3DRMLOADMEMORY info;
176     int val;
177     DWORD val1, val2, val3;
178     D3DVALUE valu, valv;
179     D3DVECTOR v[3];
180     D3DVECTOR n[3];
181     DWORD f[8];
182     char name[10];
183     DWORD size;
184
185     hr = pDirect3DRMCreate(&pD3DRM);
186     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
187
188     hr = IDirect3DRM_CreateMeshBuilder(pD3DRM, &pMeshBuilder);
189     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr);
190
191     info.lpMemory = data_bad_version;
192     info.dSize = strlen(data_bad_version);
193     hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &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 = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &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 = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
204     ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);
205
206     size = sizeof(name);
207     hr = IDirect3DRMMeshBuilder_GetName(pMeshBuilder, &size, name);
208     ok(hr == D3DRM_OK, "IDirect3DRMMeshBuilder_GetName returned hr = %x\n", hr);
209     ok(!strcmp(name, "Object"), "Retreived name '%s' instead of 'Object'\n", name);
210     size = strlen("Object"); /* No space for null character */
211     hr = IDirect3DRMMeshBuilder_GetName(pMeshBuilder, &size, name);
212     ok(hr == E_INVALIDARG, "IDirect3DRMMeshBuilder_GetName returned hr = %x\n", hr);
213     hr = IDirect3DRMMeshBuilder_SetName(pMeshBuilder, NULL);
214     ok(hr == D3DRM_OK, "IDirect3DRMMeshBuilder_SetName returned hr = %x\n", hr);
215     size = sizeof(name);
216     hr = IDirect3DRMMeshBuilder_GetName(pMeshBuilder, &size, name);
217     ok(hr == D3DRM_OK, "IDirect3DRMMeshBuilder_GetName returned hr = %x\n", hr);
218     ok(size == 0, "Size should be 0 instead of %u\n", size);
219     hr = IDirect3DRMMeshBuilder_SetName(pMeshBuilder, "");
220     ok(hr == D3DRM_OK, "IDirect3DRMMeshBuilder_SetName returned hr = %x\n", hr);
221     size = sizeof(name);
222     hr = IDirect3DRMMeshBuilder_GetName(pMeshBuilder, &size, name);
223     ok(hr == D3DRM_OK, "IDirect3DRMMeshBuilder_GetName returned hr = %x\n", hr);
224     ok(!strcmp(name, ""), "Retreived name '%s' instead of ''\n", name);
225
226     val = IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder);
227     ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
228
229     val = IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder);
230     ok(val == 3, "Wrong number of faces %d (must be 3)\n", val);
231
232     hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, &val1, NULL, &val2, NULL, &val3, NULL);
233     ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr);
234     ok(val1 == 4, "Wrong number of vertices %d (must be 4)\n", val1);
235     todo_wine ok(val2 == 4, "Wrong number of normals %d (must be 4)\n", val2);
236     ok(val3 == 22, "Wrong number of face data bytes %d (must be 22)\n", val3);
237
238     /* Check that Load method generated default texture coordinates (0.0f, 0.0f) for each vertex */
239     valu = 1.23f;
240     valv = 3.21f;
241     hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 0, &valu, &valv);
242     ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
243     ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
244     ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
245     valu = 1.23f;
246     valv = 3.21f;
247     hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 1, &valu, &valv);
248     ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
249     ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
250     ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
251     valu = 1.23f;
252     valv = 3.21f;
253     hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 2, &valu, &valv);
254     ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
255     ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
256     ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
257     valu = 1.23f;
258     valv = 3.21f;
259     hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 3, &valu, &valv);
260     ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
261     ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
262     ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
263     hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 4, &valu, &valv);
264     ok(hr == D3DRMERR_BADVALUE, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr);
265
266     valu = 1.23f;
267     valv = 3.21f;
268     hr = IDirect3DRMMeshBuilder_SetTextureCoordinates(pMeshBuilder, 0, valu, valv);
269     ok(hr == D3DRM_OK, "Cannot set texture coordinates (hr = %x)\n", hr);
270     hr = IDirect3DRMMeshBuilder_SetTextureCoordinates(pMeshBuilder, 4, valu, valv);
271     ok(hr == D3DRMERR_BADVALUE, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr);
272
273     valu = 0.0f;
274     valv = 0.0f;
275     hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 0, &valu, &valv);
276     ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
277     ok(valu == 1.23f, "Wrong coordinate %f (must be 1.23)\n", valu);
278     ok(valv == 3.21f, "Wrong coordinate %f (must be 3.21)\n", valv);
279
280     IDirect3DRMMeshBuilder_Release(pMeshBuilder);
281
282     hr = IDirect3DRM_CreateMeshBuilder(pD3DRM, &pMeshBuilder);
283     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr);
284
285     info.lpMemory = data_full;
286     info.dSize = strlen(data_full);
287     hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
288     ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);
289
290     val = IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder);
291     ok(val == 3, "Wrong number of vertices %d (must be 3)\n", val);
292
293     val = IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder);
294     ok(val == 1, "Wrong number of faces %d (must be 1)\n", val);
295
296     hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, &val1, v, &val2, n, &val3, f);
297     ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr);
298     ok(val1 == 3, "Wrong number of vertices %d (must be 3)\n", val1);
299     ok(val2 == 3, "Wrong number of normals %d (must be 3)\n", val2);
300     ok(val3 == 8, "Wrong number of face data bytes %d (must be 8)\n", val3);
301     ok(U1(v[0]).x == 0.1f, "Wrong component v[0].x = %f (expected 0.1)\n", U1(v[0]).x);
302     ok(U2(v[0]).y == 0.2f, "Wrong component v[0].y = %f (expected 0.2)\n", U2(v[0]).y);
303     ok(U3(v[0]).z == 0.3f, "Wrong component v[0].z = %f (expected 0.3)\n", U3(v[0]).z);
304     ok(U1(v[1]).x == 0.4f, "Wrong component v[1].x = %f (expected 0.4)\n", U1(v[1]).x);
305     ok(U2(v[1]).y == 0.5f, "Wrong component v[1].y = %f (expected 0.5)\n", U2(v[1]).y);
306     ok(U3(v[1]).z == 0.6f, "Wrong component v[1].z = %f (expected 0.6)\n", U3(v[1]).z);
307     ok(U1(v[2]).x == 0.7f, "Wrong component v[2].x = %f (expected 0.7)\n", U1(v[2]).x);
308     ok(U2(v[2]).y == 0.8f, "Wrong component v[2].y = %f (expected 0.8)\n", U2(v[2]).y);
309     ok(U3(v[2]).z == 0.9f, "Wrong component v[2].z = %f (expected 0.9)\n", U3(v[2]).z);
310     ok(U1(n[0]).x == 1.1f, "Wrong component n[0].x = %f (expected 1.1)\n", U1(n[0]).x);
311     ok(U2(n[0]).y == 1.2f, "Wrong component n[0].y = %f (expected 1.2)\n", U2(n[0]).y);
312     ok(U3(n[0]).z == 1.3f, "Wrong component n[0].z = %f (expected 1.3)\n", U3(n[0]).z);
313     ok(U1(n[1]).x == 1.4f, "Wrong component n[1].x = %f (expected 1.4)\n", U1(n[1]).x);
314     ok(U2(n[1]).y == 1.5f, "Wrong component n[1].y = %f (expected 1.5)\n", U2(n[1]).y);
315     ok(U3(n[1]).z == 1.6f, "Wrong component n[1].z = %f (expected 1.6)\n", U3(n[1]).z);
316     ok(U1(n[2]).x == 1.7f, "Wrong component n[2].x = %f (expected 1.7)\n", U1(n[2]).x);
317     ok(U2(n[2]).y == 1.8f, "Wrong component n[2].y = %f (expected 1.8)\n", U2(n[2]).y);
318     ok(U3(n[2]).z == 1.9f, "Wrong component n[2].z = %f (expected 1.9)\n", U3(n[2]).z);
319     ok(f[0] == 3 , "Wrong component f[0] = %d (expected 3)\n", f[0]);
320     ok(f[1] == 0 , "Wrong component f[1] = %d (expected 0)\n", f[1]);
321     ok(f[2] == 0 , "Wrong component f[2] = %d (expected 0)\n", f[2]);
322     ok(f[3] == 1 , "Wrong component f[3] = %d (expected 1)\n", f[3]);
323     ok(f[4] == 1 , "Wrong component f[4] = %d (expected 1)\n", f[4]);
324     ok(f[5] == 2 , "Wrong component f[5] = %d (expected 2)\n", f[5]);
325     ok(f[6] == 2 , "Wrong component f[6] = %d (expected 2)\n", f[6]);
326     ok(f[7] == 0 , "Wrong component f[7] = %d (expected 0)\n", f[7]);
327
328     IDirect3DRMMeshBuilder_Release(pMeshBuilder);
329
330     IDirect3DRM_Release(pD3DRM);
331 }
332
333 static void test_MeshBuilder3(void)
334 {
335     HRESULT hr;
336     LPDIRECT3DRM pD3DRM;
337     LPDIRECT3DRM3 pD3DRM3;
338     LPDIRECT3DRMMESHBUILDER3 pMeshBuilder3;
339     D3DRMLOADMEMORY info;
340     int val;
341     DWORD val1;
342     D3DVALUE valu, valv;
343
344     hr = pDirect3DRMCreate(&pD3DRM);
345     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
346
347     hr = IDirect3DRM_QueryInterface(pD3DRM, &IID_IDirect3DRM3, (LPVOID*)&pD3DRM3);
348     if (FAILED(hr))
349     {
350         win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr);
351         IDirect3DRM_Release(pD3DRM);
352         return;
353     }
354
355     hr = IDirect3DRM3_CreateMeshBuilder(pD3DRM3, &pMeshBuilder3);
356     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder3 interface (hr = %x)\n", hr);
357
358     info.lpMemory = data_bad_version;
359     info.dSize = strlen(data_bad_version);
360     hr = IDirect3DRMMeshBuilder3_Load(pMeshBuilder3, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
361     ok(hr == D3DRMERR_BADFILE, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr);
362
363     info.lpMemory = data_no_mesh;
364     info.dSize = strlen(data_no_mesh);
365     hr = IDirect3DRMMeshBuilder3_Load(pMeshBuilder3, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
366     ok(hr == D3DRMERR_NOTFOUND, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr);
367
368     info.lpMemory = data_ok;
369     info.dSize = strlen(data_ok);
370     hr = IDirect3DRMMeshBuilder3_Load(pMeshBuilder3, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
371     ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);
372
373     val = IDirect3DRMMeshBuilder3_GetVertexCount(pMeshBuilder3);
374     ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
375
376     val = IDirect3DRMMeshBuilder3_GetFaceCount(pMeshBuilder3);
377     ok(val == 3, "Wrong number of faces %d (must be 3)\n", val);
378
379     hr = IDirect3DRMMeshBuilder3_GetVertices(pMeshBuilder3, 0, &val1, NULL);
380     ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr);
381     ok(val1 == 4, "Wrong number of vertices %d (must be 4)\n", val1);
382
383     /* Check that Load method generated default texture coordinates (0.0f, 0.0f) for each vertex */
384     valu = 1.23f;
385     valv = 3.21f;
386     hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 0, &valu, &valv);
387     ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
388     ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
389     ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
390     valu = 1.23f;
391     valv = 3.21f;
392     hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 1, &valu, &valv);
393     ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
394     ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
395     ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
396     valu = 1.23f;
397     valv = 3.21f;
398     hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 2, &valu, &valv);
399     ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
400     ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
401     ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
402     valu = 1.23f;
403     valv = 3.21f;
404     hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 3, &valu, &valv);
405     ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
406     ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
407     ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
408     hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 4, &valu, &valv);
409     ok(hr == D3DRMERR_BADVALUE, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr);
410
411     valu = 1.23f;
412     valv = 3.21f;
413     hr = IDirect3DRMMeshBuilder3_SetTextureCoordinates(pMeshBuilder3, 0, valu, valv);
414     ok(hr == D3DRM_OK, "Cannot set texture coordinates (hr = %x)\n", hr);
415     hr = IDirect3DRMMeshBuilder3_SetTextureCoordinates(pMeshBuilder3, 4, valu, valv);
416     ok(hr == D3DRMERR_BADVALUE, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr);
417
418     valu = 0.0f;
419     valv = 0.0f;
420     hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 0, &valu, &valv);
421     ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
422     ok(valu == 1.23f, "Wrong coordinate %f (must be 1.23)\n", valu);
423     ok(valv == 3.21f, "Wrong coordinate %f (must be 3.21)\n", valv);
424
425     IDirect3DRMMeshBuilder3_Release(pMeshBuilder3);
426     IDirect3DRM3_Release(pD3DRM3);
427     IDirect3DRM_Release(pD3DRM);
428 }
429
430 static void test_Frame(void)
431 {
432     HRESULT hr;
433     LPDIRECT3DRM pD3DRM;
434     LPDIRECT3DRMFRAME pFrameC;
435     LPDIRECT3DRMFRAME pFrameP1;
436     LPDIRECT3DRMFRAME pFrameP2;
437     LPDIRECT3DRMFRAME pFrameTmp;
438     LPDIRECT3DRMFRAMEARRAY pArray;
439     LPDIRECT3DRMMESHBUILDER pMeshBuilder;
440     LPDIRECT3DRMVISUAL pVisual1;
441     LPDIRECT3DRMVISUAL pVisualTmp;
442     LPDIRECT3DRMVISUALARRAY pVisualArray;
443     LPDIRECT3DRMLIGHT pLight1;
444     LPDIRECT3DRMLIGHT pLightTmp;
445     LPDIRECT3DRMLIGHTARRAY pLightArray;
446     DWORD count;
447
448     hr = pDirect3DRMCreate(&pD3DRM);
449     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
450
451     hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameC);
452     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
453     CHECK_REFCOUNT(pFrameC, 1);
454
455     hr = IDirect3DRMFrame_GetParent(pFrameC, NULL);
456     ok(hr == D3DRMERR_BADVALUE, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr);
457     pFrameTmp = (void*)0xdeadbeef;
458     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
459     ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
460     ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
461     CHECK_REFCOUNT(pFrameC, 1);
462
463     pArray = NULL;
464     hr = IDirect3DRMFrame_GetChildren(pFrameC, &pArray);
465     ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
466     ok(pArray != NULL, "pArray = %p\n", pArray);
467     if (pArray)
468     {
469         count = IDirect3DRMFrameArray_GetSize(pArray);
470         ok(count == 0, "count = %u\n", count);
471         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
472         ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
473         ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
474         IDirect3DRMFrameArray_Release(pArray);
475     }
476
477     hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameP1);
478     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
479
480     /* GetParent with NULL pointer */
481     hr = IDirect3DRMFrame_GetParent(pFrameP1, NULL);
482     ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
483     CHECK_REFCOUNT(pFrameP1, 1);
484
485     /* [Add/Delete]Child with NULL pointer */
486     hr = IDirect3DRMFrame_AddChild(pFrameP1, NULL);
487     ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
488     CHECK_REFCOUNT(pFrameP1, 1);
489
490     hr = IDirect3DRMFrame_DeleteChild(pFrameP1, NULL);
491     ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
492     CHECK_REFCOUNT(pFrameP1, 1);
493
494     /* Add child to first parent */
495     pFrameTmp = (void*)0xdeadbeef;
496     hr = IDirect3DRMFrame_GetParent(pFrameP1, &pFrameTmp);
497     ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
498     ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
499
500     hr = IDirect3DRMFrame_AddChild(pFrameP1, pFrameC);
501     ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
502     CHECK_REFCOUNT(pFrameP1, 1);
503     CHECK_REFCOUNT(pFrameC, 2);
504
505     pArray = NULL;
506     hr = IDirect3DRMFrame_GetChildren(pFrameP1, &pArray);
507     ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
508     /* In some older version of d3drm, creating IDirect3DRMFrameArray object with GetChildren does not increment refcount of children frames */
509     ok((get_refcount((IUnknown*)pFrameC) == 3) || broken(get_refcount((IUnknown*)pFrameC) == 2), "Invalid refcount. Expected 3 (or 2) got %d\n", get_refcount((IUnknown*)pFrameC)); \
510     if (pArray)
511     {
512         count = IDirect3DRMFrameArray_GetSize(pArray);
513         ok(count == 1, "count = %u\n", count);
514         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
515         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
516         ok(pFrameTmp == pFrameC, "pFrameTmp = %p\n", pFrameTmp);
517         ok((get_refcount((IUnknown*)pFrameC) == 4) || broken(get_refcount((IUnknown*)pFrameC) == 3), "Invalid refcount. Expected 4 (or 3) got %d\n", get_refcount((IUnknown*)pFrameC)); \
518         IDirect3DRMFrame_Release(pFrameTmp);
519         ok((get_refcount((IUnknown*)pFrameC) == 3) || broken(get_refcount((IUnknown*)pFrameC) == 2), "Invalid refcount. Expected 3 (or 2) got %d\n", get_refcount((IUnknown*)pFrameC)); \
520         IDirect3DRMFrameArray_Release(pArray);
521         CHECK_REFCOUNT(pFrameC, 2);
522     }
523
524     pFrameTmp = (void*)0xdeadbeef;
525     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
526     ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
527     ok(pFrameTmp == pFrameP1, "pFrameTmp = %p\n", pFrameTmp);
528     CHECK_REFCOUNT(pFrameP1, 2);
529
530     /* Add child to second parent */
531     hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameP2);
532     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
533
534     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
535     ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
536     CHECK_REFCOUNT(pFrameC, 2);
537
538     pArray = NULL;
539     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
540     ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
541     if (pArray)
542     {
543         count = IDirect3DRMFrameArray_GetSize(pArray);
544         ok(count == 1, "count = %u\n", count);
545         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
546         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
547         ok(pFrameTmp == pFrameC, "pFrameTmp = %p\n", pFrameTmp);
548         IDirect3DRMFrame_Release(pFrameTmp);
549         IDirect3DRMFrameArray_Release(pArray);
550     }
551
552     pArray = NULL;
553     hr = IDirect3DRMFrame_GetChildren(pFrameP1, &pArray);
554     ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
555     if (pArray)
556     {
557         count = IDirect3DRMFrameArray_GetSize(pArray);
558         ok(count == 0, "count = %u\n", count);
559         pFrameTmp = (void*)0xdeadbeef;
560         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
561         ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
562         ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
563         IDirect3DRMFrameArray_Release(pArray);
564     }
565
566     pFrameTmp = (void*)0xdeadbeef;
567     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
568     ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
569     ok(pFrameTmp == pFrameP2, "pFrameTmp = %p\n", pFrameTmp);
570     CHECK_REFCOUNT(pFrameP2, 2);
571     CHECK_REFCOUNT(pFrameC, 2);
572
573     /* Add child again */
574     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
575     ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
576     CHECK_REFCOUNT(pFrameC, 2);
577
578     pArray = NULL;
579     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
580     ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
581     if (pArray)
582     {
583         count = IDirect3DRMFrameArray_GetSize(pArray);
584         ok(count == 1, "count = %u\n", count);
585         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
586         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
587         ok(pFrameTmp == pFrameC, "pFrameTmp = %p\n", pFrameTmp);
588         IDirect3DRMFrame_Release(pFrameTmp);
589         IDirect3DRMFrameArray_Release(pArray);
590     }
591
592     /* Delete child */
593     hr = IDirect3DRMFrame_DeleteChild(pFrameP2, pFrameC);
594     ok(hr == D3DRM_OK, "Cannot delete child frame (hr = %x)\n", hr);
595     CHECK_REFCOUNT(pFrameC, 1);
596
597     pArray = NULL;
598     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
599     ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
600     if (pArray)
601     {
602         count = IDirect3DRMFrameArray_GetSize(pArray);
603         ok(count == 0, "count = %u\n", count);
604         pFrameTmp = (void*)0xdeadbeef;
605         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
606         ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
607         ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
608         IDirect3DRMFrameArray_Release(pArray);
609     }
610
611     pFrameTmp = (void*)0xdeadbeef;
612     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
613     ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
614     ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
615
616     /* Add two children */
617     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
618     ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
619     CHECK_REFCOUNT(pFrameC, 2);
620
621     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameP1);
622     ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
623     CHECK_REFCOUNT(pFrameP1, 3);
624
625     pArray = NULL;
626     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
627     ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
628     if (pArray)
629     {
630         count = IDirect3DRMFrameArray_GetSize(pArray);
631         ok(count == 2, "count = %u\n", count);
632         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
633         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
634         ok(pFrameTmp == pFrameC, "pFrameTmp = %p\n", pFrameTmp);
635         IDirect3DRMFrame_Release(pFrameTmp);
636         hr = IDirect3DRMFrameArray_GetElement(pArray, 1, &pFrameTmp);
637         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
638         ok(pFrameTmp == pFrameP1, "pFrameTmp = %p\n", pFrameTmp);
639         IDirect3DRMFrame_Release(pFrameTmp);
640         IDirect3DRMFrameArray_Release(pArray);
641     }
642
643     /* [Add/Delete]Visual with NULL pointer */
644     hr = IDirect3DRMFrame_AddVisual(pFrameP1, NULL);
645     ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
646     CHECK_REFCOUNT(pFrameP1, 3);
647
648     hr = IDirect3DRMFrame_DeleteVisual(pFrameP1, NULL);
649     ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
650     CHECK_REFCOUNT(pFrameP1, 3);
651
652     /* Create Visual */
653     hr = IDirect3DRM_CreateMeshBuilder(pD3DRM, &pMeshBuilder);
654     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr);
655     pVisual1 = (LPDIRECT3DRMVISUAL)pMeshBuilder;
656
657     /* Add Visual to first parent */
658     hr = IDirect3DRMFrame_AddVisual(pFrameP1, pVisual1);
659     ok(hr == D3DRM_OK, "Cannot add visual (hr = %x)\n", hr);
660     CHECK_REFCOUNT(pFrameP1, 3);
661     CHECK_REFCOUNT(pVisual1, 2);
662
663     pVisualArray = NULL;
664     hr = IDirect3DRMFrame_GetVisuals(pFrameP1, &pVisualArray);
665     todo_wine ok(hr == D3DRM_OK, "Cannot get visuals (hr = %x)\n", hr);
666     if (pVisualArray)
667     {
668         count = IDirect3DRMVisualArray_GetSize(pVisualArray);
669         ok(count == 1, "count = %u\n", count);
670         hr = IDirect3DRMVisualArray_GetElement(pVisualArray, 0, &pVisualTmp);
671         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
672         ok(pVisualTmp == pVisual1, "pVisualTmp = %p\n", pVisualTmp);
673         IDirect3DRMVisual_Release(pVisualTmp);
674         IDirect3DRMVisualArray_Release(pVisualArray);
675     }
676
677     /* Delete Visual */
678     hr = IDirect3DRMFrame_DeleteVisual(pFrameP1, pVisual1);
679     ok(hr == D3DRM_OK, "Cannot delete visual (hr = %x)\n", hr);
680     CHECK_REFCOUNT(pFrameP1, 3);
681     IDirect3DRMMeshBuilder_Release(pMeshBuilder);
682
683     /* [Add/Delete]Light with NULL pointer */
684     hr = IDirect3DRMFrame_AddLight(pFrameP1, NULL);
685     ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
686     CHECK_REFCOUNT(pFrameP1, 3);
687
688     hr = IDirect3DRMFrame_DeleteLight(pFrameP1, NULL);
689     ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
690     CHECK_REFCOUNT(pFrameP1, 3);
691
692     /* Create Light */
693     hr = IDirect3DRM_CreateLightRGB(pD3DRM, D3DRMLIGHT_SPOT, 0.1, 0.2, 0.3, &pLight1);
694     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMLight interface (hr = %x)\n", hr);
695
696     /* Add Light to first parent */
697     hr = IDirect3DRMFrame_AddLight(pFrameP1, pLight1);
698     ok(hr == D3DRM_OK, "Cannot add light (hr = %x)\n", hr);
699     CHECK_REFCOUNT(pFrameP1, 3);
700     CHECK_REFCOUNT(pLight1, 2);
701
702     pLightArray = NULL;
703     hr = IDirect3DRMFrame_GetLights(pFrameP1, &pLightArray);
704     todo_wine ok(hr == D3DRM_OK, "Cannot get lights (hr = %x)\n", hr);
705     if (pLightArray)
706     {
707         count = IDirect3DRMLightArray_GetSize(pLightArray);
708         ok(count == 1, "count = %u\n", count);
709         hr = IDirect3DRMLightArray_GetElement(pLightArray, 0, &pLightTmp);
710         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
711         ok(pLightTmp == pLight1, "pLightTmp = %p\n", pLightTmp);
712         IDirect3DRMLight_Release(pLightTmp);
713         IDirect3DRMLightArray_Release(pLightArray);
714     }
715
716     /* Delete Light */
717     hr = IDirect3DRMFrame_DeleteLight(pFrameP1, pLight1);
718     ok(hr == D3DRM_OK, "Cannot delete light (hr = %x)\n", hr);
719     CHECK_REFCOUNT(pFrameP1, 3);
720     IDirect3DRMLight_Release(pLight1);
721
722     /* Cleanup */
723     IDirect3DRMFrame_Release(pFrameP2);
724     CHECK_REFCOUNT(pFrameC, 2);
725     CHECK_REFCOUNT(pFrameP1, 3);
726
727     IDirect3DRMFrame_Release(pFrameC);
728     IDirect3DRMFrame_Release(pFrameP1);
729
730     IDirect3DRM_Release(pD3DRM);
731 }
732
733 static void test_Light(void)
734 {
735     HRESULT hr;
736     LPDIRECT3DRM pD3DRM;
737     LPDIRECT3DRMLIGHT pLight;
738     D3DRMLIGHTTYPE type;
739     D3DCOLOR color;
740
741     hr = pDirect3DRMCreate(&pD3DRM);
742     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
743
744     hr = IDirect3DRM_CreateLightRGB(pD3DRM, D3DRMLIGHT_SPOT, 0.5, 0.5, 0.5, &pLight);
745     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMLight interface (hr = %x)\n", hr);
746
747     type = IDirect3DRMLight_GetType(pLight);
748     todo_wine ok(type == D3DRMLIGHT_SPOT, "wrong type (%u)\n", type);
749
750     color = IDirect3DRMLight_GetColor(pLight);
751     todo_wine ok(color == 0xff7f7f7f, "wrong color (%x)\n", color);
752
753     hr = IDirect3DRMLight_SetType(pLight, D3DRMLIGHT_POINT);
754     todo_wine ok(hr == D3DRM_OK, "Cannot set type (hr = %x)\n", hr);
755     type = IDirect3DRMLight_GetType(pLight);
756     todo_wine ok(type == D3DRMLIGHT_POINT, "wrong type (%u)\n", type);
757
758     hr = IDirect3DRMLight_SetColor(pLight, 0xff180587);
759     todo_wine ok(hr == D3DRM_OK, "Cannot set color (hr = %x)\n", hr);
760     color = IDirect3DRMLight_GetColor(pLight);
761     todo_wine ok(color == 0xff180587, "wrong color (%x)\n", color);
762
763     hr = IDirect3DRMLight_SetColorRGB(pLight, 0.5, 0.5, 0.5);
764     todo_wine ok(hr == D3DRM_OK, "Cannot set color (hr = %x)\n", hr);
765     color = IDirect3DRMLight_GetColor(pLight);
766     todo_wine ok(color == 0xff7f7f7f, "wrong color (%x)\n", color);
767
768     IDirect3DRMLight_Release(pLight);
769
770     IDirect3DRM_Release(pD3DRM);
771 }
772
773 static void test_frame_transform(void)
774 {
775     HRESULT hr;
776     LPDIRECT3DRM d3drm;
777     LPDIRECT3DRMFRAME frame;
778     D3DRMMATRIX4D matrix;
779
780     hr = pDirect3DRMCreate(&d3drm);
781     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
782
783     hr = IDirect3DRM_CreateFrame(d3drm, NULL, &frame);
784     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
785
786     hr = IDirect3DRMFrame_GetTransform(frame, matrix);
787     ok(hr == D3DRM_OK, "IDirect3DRMFrame_GetTransform returned hr = %x\n", hr);
788     ok(!memcmp(matrix, identity, sizeof(D3DRMMATRIX4D)), "Returned matrix is not identity\n");
789
790     IDirect3DRM_Release(d3drm);
791 }
792
793 static int nb_objects = 0;
794 static const GUID* refiids[] =
795 {
796     &IID_IDirect3DRMMeshBuilder,
797     &IID_IDirect3DRMMeshBuilder,
798     &IID_IDirect3DRMFrame
799 };
800
801 static void __cdecl object_load_callback(LPDIRECT3DRMOBJECT object, REFIID objectguid, LPVOID arg)
802 {
803     ok(object != NULL, "Arg 1 should not be null\n");
804     ok(IsEqualGUID(objectguid, refiids[nb_objects]), "Arg 2 is incorrect\n");
805     ok(arg == (LPVOID)0xdeadbeef, "Arg 3 should be 0xdeadbeef (got %p)\n", arg);
806     nb_objects++;
807 }
808
809 static void test_d3drm_load(void)
810 {
811     HRESULT hr;
812     LPDIRECT3DRM pD3DRM;
813     D3DRMLOADMEMORY info;
814     const GUID* req_refiids[] = { &IID_IDirect3DRMMeshBuilder, &IID_IDirect3DRMFrame };
815
816     hr = pDirect3DRMCreate(&pD3DRM);
817     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
818
819     info.lpMemory = data_d3drm_load;
820     info.dSize = strlen(data_d3drm_load);
821     hr = IDirect3DRM_Load(pD3DRM, &info, NULL, (GUID**)req_refiids, 2, D3DRMLOAD_FROMMEMORY, object_load_callback, (LPVOID)0xdeadbeef, NULL, NULL, NULL);
822     ok(hr == D3DRM_OK, "Cannot load data (hr = %x)\n", hr);
823     ok(nb_objects == 3, "Should have loaded 3 objects (got %d)\n", nb_objects);
824
825     IDirect3DRM_Release(pD3DRM);
826 }
827
828 START_TEST(d3drm)
829 {
830     if (!InitFunctionPtrs())
831         return;
832
833     test_MeshBuilder();
834     test_MeshBuilder3();
835     test_Frame();
836     test_Light();
837     test_frame_transform();
838     test_d3drm_load();
839
840     FreeLibrary(d3drm_handle);
841 }