- header update
[reactos.git] / rostests / apitests / w32knapi / ntdd / NtGdiDdQueryDirectDrawObject.c
1
2 INT
3 Test_NtGdiDdQueryDirectDrawObject(PTESTINFO pti)
4 {
5 HANDLE hDirectDraw = NULL;
6 DD_HALINFO *pHalInfo = NULL;
7 DWORD *pCallBackFlags = NULL;
8 LPD3DNTHAL_CALLBACKS puD3dCallbacks = NULL;
9 LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData = NULL;
10 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks = NULL;
11 LPDDSURFACEDESC puD3dTextureFormats = NULL;
12 DWORD *puNumHeaps = NULL;
13 VIDEOMEMORY *puvmList = NULL;
14 DWORD *puNumFourCC = NULL;
15 DWORD *puFourCC = NULL;
16
17 DD_HALINFO HalInfo;
18 DD_HALINFO oldHalInfo;
19 DWORD CallBackFlags[4];
20 D3DNTHAL_CALLBACKS D3dCallbacks;
21 D3DNTHAL_GLOBALDRIVERDATA D3dDriverData;
22 DD_D3DBUFCALLBACKS D3dBufferCallbacks;
23 DDSURFACEDESC2 D3dTextureFormats[100];
24 //DWORD NumHeaps = 0;
25 VIDEOMEMORY vmList;
26 //DWORD NumFourCC = 0;
27 //DWORD FourCC = 0;
28 DEVMODE devmode;
29 HDC hdc;
30
31
32 /* clear data */
33 memset(&vmList,0,sizeof(VIDEOMEMORY));
34 memset(&D3dTextureFormats,0,sizeof(DDSURFACEDESC));
35 memset(&D3dBufferCallbacks,0,sizeof(DD_D3DBUFCALLBACKS));
36 memset(&D3dDriverData,0,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
37 memset(&D3dCallbacks,0,sizeof(D3DNTHAL_CALLBACKS));
38 memset(&HalInfo,0,sizeof(DD_HALINFO));
39 memset(CallBackFlags,0,sizeof(DWORD)*3);
40
41
42
43 /* Get currenet display mode */
44 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode);
45
46 hdc = CreateDCW(L"DISPLAY",NULL,NULL,NULL);
47 ASSERT(hdc != NULL);
48
49 hDirectDraw = (HANDLE) Syscall(L"NtGdiDdCreateDirectDrawObject", 1, &hdc);
50 ASSERT(hDirectDraw != NULL);
51
52 /* Test ReactX */
53 hDirectDraw = (HANDLE) Syscall(L"NtGdiDdCreateDirectDrawObject", 1, &hdc);
54
55 RTEST(NtGdiDdQueryDirectDrawObject( NULL, pHalInfo,
56 pCallBackFlags, puD3dCallbacks,
57 puD3dDriverData, puD3dBufferCallbacks,
58 puD3dTextureFormats, puNumHeaps,
59 puvmList, puNumFourCC,
60 puFourCC) == FALSE);
61
62 RTEST(pHalInfo == NULL);
63 RTEST(pCallBackFlags == NULL);
64 RTEST(puD3dCallbacks == NULL);
65 RTEST(puD3dDriverData == NULL);
66 RTEST(puD3dBufferCallbacks == NULL);
67 RTEST(puD3dTextureFormats == NULL);
68 RTEST(puNumFourCC == NULL);
69 RTEST(puFourCC == NULL);
70 RTEST(puNumHeaps == NULL);
71 RTEST(puvmList == NULL);
72
73 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
74 pCallBackFlags, puD3dCallbacks,
75 puD3dDriverData, puD3dBufferCallbacks,
76 puD3dTextureFormats, puNumHeaps,
77 puvmList, puNumFourCC,
78 puFourCC) == FALSE);
79
80 RTEST(pHalInfo == NULL);
81 RTEST(pCallBackFlags == NULL);
82 RTEST(puD3dCallbacks == NULL);
83 RTEST(puD3dDriverData == NULL);
84 RTEST(puD3dBufferCallbacks == NULL);
85 RTEST(puD3dTextureFormats == NULL);
86 RTEST(puNumFourCC == NULL);
87 RTEST(puFourCC == NULL);
88 RTEST(puNumHeaps == NULL);
89 RTEST(puvmList == NULL);
90
91 pHalInfo = &HalInfo;
92 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
93 pCallBackFlags, puD3dCallbacks,
94 puD3dDriverData, puD3dBufferCallbacks,
95 puD3dTextureFormats, puNumHeaps,
96 puvmList, puNumFourCC,
97 puFourCC)== FALSE);
98 RTEST(pHalInfo != NULL);
99 RTEST(pCallBackFlags == NULL);
100 RTEST(puD3dCallbacks == NULL);
101 RTEST(puD3dDriverData == NULL);
102 RTEST(puD3dBufferCallbacks == NULL);
103 RTEST(puD3dTextureFormats == NULL);
104 RTEST(puNumFourCC == NULL);
105 RTEST(puFourCC == NULL);
106 ASSERT(pHalInfo != NULL);
107 RTEST(puNumHeaps == NULL);
108 RTEST(puvmList == NULL);
109
110 if ((pHalInfo->dwSize != sizeof(DD_HALINFO)) &&
111 (pHalInfo->dwSize != sizeof(DD_HALINFO_V4)))
112 {
113 RTEST(pHalInfo->dwSize != sizeof(DD_HALINFO));
114 ASSERT(pHalInfo->dwSize != sizeof(DD_HALINFO));
115 }
116
117 if (pHalInfo->dwSize == sizeof(DD_HALINFO))
118 {
119 /*the offset, in bytes, to primary surface in the display memory */
120 RTEST(pHalInfo->vmiData.fpPrimary != 0 );
121
122 /* unsuse always 0 */
123 RTEST(pHalInfo->vmiData.dwFlags == 0 );
124
125 /* Check the res */
126 RTEST(pHalInfo->vmiData.dwDisplayWidth == devmode.dmPelsWidth );
127 RTEST(pHalInfo->vmiData.dwDisplayHeight == devmode.dmPelsHeight );
128 /* FIXME
129 RTEST(pHalInfo->vmiData.lDisplayPitch == 0x1700;
130 */
131 RTEST(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT) );
132 ASSERT(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT));
133
134 /* Fail on 8bit screen deep */
135 RTEST(pHalInfo->vmiData.ddpfDisplay.dwFlags == DDPF_RGB);
136
137
138 /* No fourcc are use on primary screen */
139 RTEST(pHalInfo->vmiData.ddpfDisplay.dwFourCC == 0 );
140
141 /* Count RGB Bits 8/16/24/32 */
142 RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBBitCount == devmode.dmBitsPerPel );
143
144 /* FIXME RGB mask */
145 //RTEST(pHalInfo->vmiData.ddpfDisplay.dwRBitMask == 0 );
146 //RTEST(pHalInfo->vmiData.ddpfDisplay.dwGBitMask == 0 );
147 //RTEST(pHalInfo->vmiData.ddpfDisplay.dwBBitMask == 0 );
148
149 /* primary never set the alpha blend mask */
150 RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBAlphaBitMask == 0 );
151
152 /* FIXME do not known how test follow thing, for it is diffent for each drv */
153 // pHalInfo->vmiData->dwOffscreenAlign : 0x00000100
154 // pHalInfo->vmiData->dwOverlayAlign : 0x00000010
155 // pHalInfo->vmiData->dwTextureAlign : 0x00000020
156 // pHalInfo->vmiData->dwZBufferAlign : 0x00001000
157 // pHalInfo->vmiData->dwAlphaAlign : 0x00000000
158
159 /* the primary display address */
160 /* test see if it in kmode memory or not */
161 RTEST(pHalInfo->vmiData.pvPrimary != 0 );
162
163 /* Test see if we got any hardware acclartions for 2d or 3d */
164 //RTEST(pHalInfo->ddCaps.dwSize == sizeof(DDCORECAPS));
165
166 /* Testing see if we got any hw support for
167 * This test can fail on video card that does not support 2d/overlay/3d
168 */
169 RTEST( pHalInfo->ddCaps.dwCaps != 0);
170 RTEST( pHalInfo->ddCaps.ddsCaps.dwCaps != 0);
171
172 /* if this fail we do not have a dx driver install acodring ms, some version of windows it
173 * is okay this fail and drv does then only support basic dx
174 */
175 RTEST( (pHalInfo->dwFlags & (DDHALINFO_GETDRIVERINFOSET | DDHALINFO_GETDRIVERINFO2)) != 0 );
176
177 if (pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE )
178 {
179 RTEST( pHalInfo->lpD3DGlobalDriverData != 0);
180 RTEST( pHalInfo->lpD3DHALCallbacks != 0);
181 RTEST( pHalInfo->lpD3DBufCallbacks != 0);
182 }
183 }
184
185 /* FIXME DD_HALINFO_V4 test */
186
187 /* Next Start 2 */
188 RtlCopyMemory(&oldHalInfo, &HalInfo, sizeof(DD_HALINFO));
189
190 pHalInfo = &HalInfo;
191 pCallBackFlags = CallBackFlags;
192 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
193
194 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
195 pCallBackFlags, puD3dCallbacks,
196 puD3dDriverData, puD3dBufferCallbacks,
197 puD3dTextureFormats, puNumHeaps,
198 puvmList, puNumFourCC,
199 puFourCC)== FALSE);
200 RTEST(pHalInfo != NULL);
201 RTEST(pCallBackFlags != NULL);
202 RTEST(puD3dCallbacks == NULL);
203 RTEST(puD3dDriverData == NULL);
204 RTEST(puD3dBufferCallbacks == NULL);
205 RTEST(puD3dTextureFormats == NULL);
206 RTEST(puNumFourCC == NULL);
207 RTEST(puFourCC == NULL);
208 ASSERT(pHalInfo != NULL);
209 RTEST(puNumHeaps == NULL);
210 RTEST(puvmList == NULL);
211
212 /* We do not retesting DD_HALINFO, instead we compare it */
213 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
214 RTEST(pCallBackFlags[0] != 0);
215 RTEST(pCallBackFlags[1] != 0);
216
217 /* NT4 this will fail */
218 RTEST(pCallBackFlags[2] == 0);
219
220 /* Next Start 3 */
221 pHalInfo = &HalInfo;
222 pCallBackFlags = CallBackFlags;
223 puD3dCallbacks = &D3dCallbacks;
224
225 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
226 RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
227
228 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
229 pCallBackFlags, puD3dCallbacks,
230 puD3dDriverData, puD3dBufferCallbacks,
231 puD3dTextureFormats, puNumHeaps,
232 puvmList, puNumFourCC,
233 puFourCC)== FALSE);
234 RTEST(pHalInfo != NULL);
235 RTEST(pCallBackFlags != NULL);
236
237 if (pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE )
238 {
239 RTEST(puD3dCallbacks != NULL);
240 }
241
242 RTEST(puD3dDriverData == NULL);
243 RTEST(puD3dBufferCallbacks == NULL);
244 RTEST(puD3dTextureFormats == NULL);
245 RTEST(puNumFourCC == NULL);
246 RTEST(puFourCC == NULL);
247 RTEST(puNumHeaps == NULL);
248 RTEST(puvmList == NULL);
249 ASSERT(pHalInfo != NULL);
250
251 /* We do not retesting DD_HALINFO, instead we compare it */
252 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
253 RTEST(pCallBackFlags[0] != 0);
254 RTEST(pCallBackFlags[1] != 0);
255
256 /* NT4 this will fail */
257 RTEST(pCallBackFlags[2] == 0);
258
259 /* Next Start 4 */
260 pHalInfo = &HalInfo;
261 pCallBackFlags = CallBackFlags;
262 puD3dCallbacks = &D3dCallbacks;
263 puD3dDriverData = &D3dDriverData;
264
265 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
266 RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
267 RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
268
269 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
270 pCallBackFlags, puD3dCallbacks,
271 puD3dDriverData, puD3dBufferCallbacks,
272 puD3dTextureFormats, puNumHeaps,
273 puvmList, puNumFourCC,
274 puFourCC)== FALSE);
275 RTEST(pHalInfo != NULL);
276 RTEST(pCallBackFlags != NULL);
277
278 if (pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE )
279 {
280 RTEST(puD3dCallbacks != NULL);
281 RTEST(puD3dDriverData != NULL);
282 }
283
284 RTEST(puD3dBufferCallbacks == NULL);
285 RTEST(puD3dTextureFormats == NULL);
286 RTEST(puNumFourCC == NULL);
287 RTEST(puFourCC == NULL);
288 RTEST(puNumHeaps == NULL);
289 RTEST(puvmList == NULL);
290 ASSERT(pHalInfo != NULL);
291
292 /* We do not retesting DD_HALINFO, instead we compare it */
293 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
294 RTEST(pCallBackFlags[0] != 0);
295 RTEST(pCallBackFlags[1] != 0);
296
297 /* NT4 this will fail */
298 RTEST(pCallBackFlags[2] == 0);
299
300 /* Next Start 5 */
301 pHalInfo = &HalInfo;
302 pCallBackFlags = CallBackFlags;
303 puD3dCallbacks = &D3dCallbacks;
304 puD3dDriverData = &D3dDriverData;
305 puD3dBufferCallbacks = &D3dBufferCallbacks;
306
307 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
308 RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
309 RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
310 RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_CALLBACKS));
311
312 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
313 pCallBackFlags, puD3dCallbacks,
314 puD3dDriverData, puD3dBufferCallbacks,
315 puD3dTextureFormats, puNumHeaps,
316 puvmList, puNumFourCC,
317 puFourCC)== FALSE);
318 RTEST(pHalInfo != NULL);
319 RTEST(pCallBackFlags != NULL);
320
321 if (pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE )
322 {
323 RTEST(puD3dCallbacks != NULL);
324 RTEST(puD3dDriverData != NULL);
325 RTEST(puD3dBufferCallbacks != NULL);
326 }
327
328
329 RTEST(puD3dTextureFormats == NULL);
330 RTEST(puNumFourCC == NULL);
331 RTEST(puFourCC == NULL);
332 RTEST(puNumHeaps == NULL);
333 RTEST(puvmList == NULL);
334 ASSERT(pHalInfo != NULL);
335
336 /* We do not retesting DD_HALINFO, instead we compare it */
337 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
338 RTEST(pCallBackFlags[0] != 0);
339 RTEST(pCallBackFlags[1] != 0);
340
341 /* NT4 this will fail */
342 RTEST(pCallBackFlags[2] == 0);
343
344 /* Next Start 6 */
345 pHalInfo = &HalInfo;
346 pCallBackFlags = CallBackFlags;
347 puD3dCallbacks = &D3dCallbacks;
348 puD3dDriverData = &D3dDriverData;
349 puD3dBufferCallbacks = &D3dBufferCallbacks;
350
351 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
352 RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
353 RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
354 RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
355 RtlZeroMemory(&D3dBufferCallbacks,sizeof(DD_D3DBUFCALLBACKS));
356
357 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
358 pCallBackFlags, puD3dCallbacks,
359 puD3dDriverData, puD3dBufferCallbacks,
360 puD3dTextureFormats, puNumHeaps,
361 puvmList, puNumFourCC,
362 puFourCC)== FALSE);
363 RTEST(pHalInfo != NULL);
364 RTEST(pCallBackFlags != NULL);
365
366 if (pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE )
367 {
368 RTEST(puD3dCallbacks != NULL);
369 RTEST(puD3dDriverData != NULL);
370 RTEST(puD3dBufferCallbacks != NULL);
371 }
372
373 RTEST(puD3dTextureFormats == NULL);
374 RTEST(puNumFourCC == NULL);
375 RTEST(puFourCC == NULL);
376 RTEST(puNumHeaps == NULL);
377 RTEST(puvmList == NULL);
378 ASSERT(pHalInfo != NULL);
379
380 /* We do not retesting DD_HALINFO, instead we compare it */
381 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
382 RTEST(pCallBackFlags[0] != 0);
383 RTEST(pCallBackFlags[1] != 0);
384
385 /* NT4 this will fail */
386 RTEST(pCallBackFlags[2] == 0);
387
388 /* Next Start 7 */
389 pHalInfo = &HalInfo;
390 pCallBackFlags = CallBackFlags;
391 puD3dCallbacks = &D3dCallbacks;
392 puD3dDriverData = &D3dDriverData;
393 puD3dBufferCallbacks = &D3dBufferCallbacks;
394
395 /* It is forbein to return a DDSURFACEDESC2 it should always be DDSURFACEDESC
396 This is only for detected bad drivers that does not follow the rules, if they
397 does not follow tthe rules only not everthing being copy then in gdi32.dll
398 gdi32.dll always assume it is DDSURFACEDESC size
399 */
400 if (puD3dDriverData->dwNumTextureFormats != 0)
401 {
402 puD3dTextureFormats = malloc (puD3dDriverData->dwNumTextureFormats * sizeof(DDSURFACEDESC2));
403 }
404
405 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
406 RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
407 RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
408 RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
409 RtlZeroMemory(&D3dBufferCallbacks,sizeof(DD_D3DBUFCALLBACKS));
410
411 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
412 pCallBackFlags, puD3dCallbacks,
413 puD3dDriverData, puD3dBufferCallbacks,
414 puD3dTextureFormats, puNumHeaps,
415 puvmList, puNumFourCC,
416 puFourCC)== FALSE);
417 RTEST(pHalInfo != NULL);
418 RTEST(pCallBackFlags != NULL);
419
420 if (pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE )
421 {
422 RTEST(puD3dCallbacks != NULL);
423 RTEST(puD3dDriverData != NULL);
424 RTEST(puD3dBufferCallbacks != NULL);
425 if (puD3dDriverData->dwNumTextureFormats != 0)
426 {
427 /* FIXME add a better test for texture */
428 RTEST(puD3dTextureFormats != NULL);
429 }
430 }
431
432 RTEST(puNumFourCC == NULL);
433 RTEST(puFourCC == NULL);
434 RTEST(puNumHeaps == NULL);
435 RTEST(puvmList == NULL);
436 ASSERT(pHalInfo != NULL);
437
438 /* We do not retesting DD_HALINFO, instead we compare it */
439 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
440 RTEST(pCallBackFlags[0] != 0);
441 RTEST(pCallBackFlags[1] != 0);
442
443 /* NT4 this will fail */
444 RTEST(pCallBackFlags[2] == 0);
445
446
447
448 /* Todo
449 * adding test for
450 * puD3dCallbacks
451 * puD3dDriverData
452 * puD3dBufferCallbacks
453 * puNumFourCC
454 * puFourCC
455 * puNumHeaps
456 * puvmList
457 */
458
459 /* Cleanup ReactX setup */
460 DeleteDC(hdc);
461 Syscall(L"NtGdiDdDeleteDirectDrawObject", 1, &hDirectDraw);
462
463 return APISTATUS_NORMAL;
464 }