2 * Copyright 2010 Christian Costa
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
23 #include "wine/test.h"
25 static HMODULE d3drm_handle
= 0;
27 static HRESULT (WINAPI
* pDirect3DRMCreate
)(LPDIRECT3DRM
* ppDirect3DRM
);
29 #define CHECK_REFCOUNT(obj,rc) \
32 int count = get_refcount( (IUnknown *)obj ); \
33 ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
36 #define D3DRM_GET_PROC(func) \
37 p ## func = (void*)GetProcAddress(d3drm_handle, #func); \
39 trace("GetProcAddress(%s) failed\n", #func); \
40 FreeLibrary(d3drm_handle); \
44 static BOOL
InitFunctionPtrs(void)
46 d3drm_handle
= LoadLibraryA("d3drm.dll");
50 skip("Could not load d3drm.dll\n");
54 D3DRM_GET_PROC(Direct3DRMCreate
)
59 static int get_refcount(IUnknown
*object
)
61 IUnknown_AddRef( object
);
62 return IUnknown_Release( object
);
65 static char data_bad_version
[] =
72 static char data_no_mesh
[] =
79 static char data_ok
[] =
98 static void test_MeshBuilder(void)
102 LPDIRECT3DRMMESHBUILDER pMeshBuilder
;
103 D3DRMLOADMEMORY info
;
105 DWORD val1
, val2
, val3
;
108 hr
= pDirect3DRMCreate(&pD3DRM
);
109 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
111 hr
= IDirect3DRM_CreateMeshBuilder(pD3DRM
, &pMeshBuilder
);
112 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr
);
114 info
.lpMemory
= data_bad_version
;
115 info
.dSize
= strlen(data_bad_version
);
116 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
117 ok(hr
== D3DRMERR_BADFILE
, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr
);
119 info
.lpMemory
= data_no_mesh
;
120 info
.dSize
= strlen(data_no_mesh
);
121 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
122 ok(hr
== D3DRMERR_NOTFOUND
, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr
);
124 info
.lpMemory
= data_ok
;
125 info
.dSize
= strlen(data_ok
);
126 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
127 ok(hr
== D3DRM_OK
, "Cannot load mesh data (hr = %x)\n", hr
);
129 val
= IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder
);
130 ok(val
== 4, "Wrong number of vertices %d (must be 4)\n", val
);
132 val
= IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder
);
133 ok(val
== 3, "Wrong number of faces %d (must be 3)\n", val
);
135 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, NULL
, &val2
, NULL
, &val3
, NULL
);
136 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
137 ok(val1
== 4, "Wrong number of vertices %d (must be 4)\n", val1
);
138 todo_wine
ok(val2
== 4, "Wrong number of normals %d (must be 4)\n", val2
);
139 todo_wine
ok(val3
== 22, "Wrong number of face data bytes %d (must be 22)\n", val3
);
143 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 1, &valu
, &valv
);
144 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
145 todo_wine
ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
146 todo_wine
ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
150 hr
= IDirect3DRMMeshBuilder_SetTextureCoordinates(pMeshBuilder
, 1, valu
, valv
);
151 todo_wine
ok(hr
== D3DRM_OK
, "Cannot set texture coordinates (hr = %x)\n", hr
);
155 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 1, &valu
, &valv
);
156 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
157 todo_wine
ok(valu
== 1.23f
, "Wrong coordinate %f (must be 1.23)\n", valu
);
158 todo_wine
ok(valv
== 3.21f
, "Wrong coordinate %f (must be 3.21)\n", valv
);
160 IDirect3DRMMeshBuilder_Release(pMeshBuilder
);
162 IDirect3DRM_Release(pD3DRM
);
165 static void test_MeshBuilder3(void)
169 LPDIRECT3DRM3 pD3DRM3
;
170 LPDIRECT3DRMMESHBUILDER3 pMeshBuilder3
;
171 D3DRMLOADMEMORY info
;
176 hr
= pDirect3DRMCreate(&pD3DRM
);
177 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
179 hr
= IDirect3DRM_QueryInterface(pD3DRM
, &IID_IDirect3DRM3
, (LPVOID
*)&pD3DRM3
);
182 win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr
);
183 IDirect3DRM_Release(pD3DRM
);
187 hr
= IDirect3DRM3_CreateMeshBuilder(pD3DRM3
, &pMeshBuilder3
);
188 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder3 interface (hr = %x)\n", hr
);
190 info
.lpMemory
= data_bad_version
;
191 info
.dSize
= strlen(data_bad_version
);
192 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
193 ok(hr
== D3DRMERR_BADFILE
, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr
);
195 info
.lpMemory
= data_no_mesh
;
196 info
.dSize
= strlen(data_no_mesh
);
197 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
198 ok(hr
== D3DRMERR_NOTFOUND
, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr
);
200 info
.lpMemory
= data_ok
;
201 info
.dSize
= strlen(data_ok
);
202 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
203 ok(hr
== D3DRM_OK
, "Cannot load mesh data (hr = %x)\n", hr
);
205 val
= IDirect3DRMMeshBuilder3_GetVertexCount(pMeshBuilder3
);
206 ok(val
== 4, "Wrong number of vertices %d (must be 4)\n", val
);
208 val
= IDirect3DRMMeshBuilder3_GetFaceCount(pMeshBuilder3
);
209 ok(val
== 3, "Wrong number of faces %d (must be 3)\n", val
);
211 hr
= IDirect3DRMMeshBuilder3_GetVertices(pMeshBuilder3
, 0, &val1
, NULL
);
212 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
213 ok(val1
== 4, "Wrong number of vertices %d (must be 4)\n", val1
);
217 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 1, &valu
, &valv
);
218 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
219 todo_wine
ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
220 todo_wine
ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
224 hr
= IDirect3DRMMeshBuilder3_SetTextureCoordinates(pMeshBuilder3
, 1, valu
, valv
);
225 todo_wine
ok(hr
== D3DRM_OK
, "Cannot set texture coordinates (hr = %x)\n", hr
);
229 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 1, &valu
, &valv
);
230 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
231 todo_wine
ok(valu
== 1.23f
, "Wrong coordinate %f (must be 1.23)\n", valu
);
232 todo_wine
ok(valv
== 3.21f
, "Wrong coordinate %f (must be 3.21)\n", valv
);
234 IDirect3DRMMeshBuilder3_Release(pMeshBuilder3
);
235 IDirect3DRM3_Release(pD3DRM3
);
236 IDirect3DRM_Release(pD3DRM
);
239 static void test_Frame(void)
243 LPDIRECT3DRMFRAME pFrameC
;
244 LPDIRECT3DRMFRAME pFrameP1
;
245 LPDIRECT3DRMFRAME pFrameP2
;
246 LPDIRECT3DRMFRAME pFrameTmp
;
247 LPDIRECT3DRMFRAMEARRAY pArray
;
250 hr
= pDirect3DRMCreate(&pD3DRM
);
251 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
253 hr
= IDirect3DRM_CreateFrame(pD3DRM
, NULL
, &pFrameC
);
254 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
255 CHECK_REFCOUNT(pFrameC
, 1);
257 pFrameTmp
= (void*)0xdeadbeef;
258 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
259 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
260 todo_wine
ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
261 CHECK_REFCOUNT(pFrameC
, 1);
264 hr
= IDirect3DRMFrame_GetChildren(pFrameC
, &pArray
);
265 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
266 todo_wine
ok(pArray
!= NULL
, "pArray = %p\n", pArray
);
269 count
= IDirect3DRMFrameArray_GetSize(pArray
);
270 ok(count
== 0, "count = %u\n", count
);
271 IDirect3DRMFrameArray_Release(pArray
);
274 hr
= IDirect3DRM_CreateFrame(pD3DRM
, NULL
, &pFrameP1
);
275 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
277 /* [Add/Delete]Child with NULL pointer */
278 hr
= IDirect3DRMFrame_AddChild(pFrameP1
, NULL
);
279 todo_wine
ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
280 CHECK_REFCOUNT(pFrameP1
, 1);
282 hr
= IDirect3DRMFrame_DeleteChild(pFrameP1
, NULL
);
283 todo_wine
ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
284 CHECK_REFCOUNT(pFrameP1
, 1);
286 /* Add child to first parent */
287 pFrameTmp
= (void*)0xdeadbeef;
288 hr
= IDirect3DRMFrame_GetParent(pFrameP1
, &pFrameTmp
);
289 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
290 todo_wine
ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
292 hr
= IDirect3DRMFrame_AddChild(pFrameP1
, pFrameC
);
293 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
294 CHECK_REFCOUNT(pFrameP1
, 1);
295 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
298 hr
= IDirect3DRMFrame_GetChildren(pFrameP1
, &pArray
);
299 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
302 count
= IDirect3DRMFrameArray_GetSize(pArray
);
303 ok(count
== 1, "count = %u\n", count
);
304 IDirect3DRMFrameArray_Release(pArray
);
307 pFrameTmp
= (void*)0xdeadbeef;
308 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
309 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
310 todo_wine
ok(pFrameTmp
== pFrameP1
, "pFrameTmp = %p\n", pFrameTmp
);
311 todo_wine
CHECK_REFCOUNT(pFrameP1
, 2);
313 /* Add child to second parent */
314 hr
= IDirect3DRM_CreateFrame(pD3DRM
, NULL
, &pFrameP2
);
315 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
317 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
318 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
319 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
322 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &pArray
);
323 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
326 count
= IDirect3DRMFrameArray_GetSize(pArray
);
327 ok(count
== 1, "count = %u\n", count
);
328 IDirect3DRMFrameArray_Release(pArray
);
332 hr
= IDirect3DRMFrame_GetChildren(pFrameP1
, &pArray
);
333 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
336 count
= IDirect3DRMFrameArray_GetSize(pArray
);
337 ok(count
== 0, "count = %u\n", count
);
338 IDirect3DRMFrameArray_Release(pArray
);
341 pFrameTmp
= (void*)0xdeadbeef;
342 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
343 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
344 todo_wine
ok(pFrameTmp
== pFrameP2
, "pFrameTmp = %p\n", pFrameTmp
);
345 todo_wine
CHECK_REFCOUNT(pFrameP2
, 2);
346 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
348 /* Add child again */
349 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
350 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
351 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
354 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &pArray
);
355 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
358 count
= IDirect3DRMFrameArray_GetSize(pArray
);
359 ok(count
== 1, "count = %u\n", count
);
360 IDirect3DRMFrameArray_Release(pArray
);
364 hr
= IDirect3DRMFrame_DeleteChild(pFrameP2
, pFrameC
);
365 todo_wine
ok(hr
== D3DRM_OK
, "Cannot delete child frame (hr = %x)\n", hr
);
366 CHECK_REFCOUNT(pFrameC
, 1);
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
== 0, "count = %u\n", count
);
375 IDirect3DRMFrameArray_Release(pArray
);
378 pFrameTmp
= (void*)0xdeadbeef;
379 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
380 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
381 todo_wine
ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
383 /* Add two children */
384 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
385 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
386 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
388 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameP1
);
389 todo_wine
ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
390 todo_wine
CHECK_REFCOUNT(pFrameP1
, 3);
393 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &pArray
);
394 todo_wine
ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
397 count
= IDirect3DRMFrameArray_GetSize(pArray
);
398 ok(count
== 2, "count = %u\n", count
);
399 IDirect3DRMFrameArray_Release(pArray
);
402 IDirect3DRMMeshBuilder_Release(pFrameP2
);
403 todo_wine
CHECK_REFCOUNT(pFrameC
, 2);
404 todo_wine
CHECK_REFCOUNT(pFrameP1
, 3);
406 IDirect3DRMMeshBuilder_Release(pFrameC
);
407 IDirect3DRMMeshBuilder_Release(pFrameP1
);
409 IDirect3DRM_Release(pD3DRM
);
414 if (!InitFunctionPtrs())
421 FreeLibrary(d3drm_handle
);