[WIN32KNT_APITEST:NTDD] Improve failure handling
[reactos.git] / modules / rostests / apitests / win32nt / ntdd / NtGdiDdQueryDirectDrawObject.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for NtGdiDdCreateDirectDrawObject
5 * PROGRAMMERS:
6 */
7
8 #include <win32nt.h>
9
10 #include <ddrawi.h>
11
12 /* Note : OsThunkDdQueryDirectDrawObject is the usermode name of NtGdiDdQueryDirectDrawObject
13 * it lives in d3d8thk.dll and in windows 2000 it doing syscall direcly to win32k.sus
14 * in windows xp and higher it call to gdi32.dll to DdEntry41 and it doing the syscall
15 */
16 START_TEST(NtGdiDdQueryDirectDrawObject)
17 {
18 HANDLE hDirectDraw;
19 DD_HALINFO *pHalInfo = NULL;
20 DWORD *pCallBackFlags = NULL;
21 LPD3DNTHAL_CALLBACKS puD3dCallbacks = NULL;
22 LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData = NULL;
23 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks = NULL;
24 LPDDSURFACEDESC puD3dTextureFormats = NULL;
25 DWORD *puNumHeaps = NULL;
26 VIDEOMEMORY *puvmList = NULL;
27 DWORD *puNumFourCC = NULL;
28 DWORD *puFourCC = NULL;
29
30 DD_HALINFO HalInfo;
31 DD_HALINFO oldHalInfo;
32 DWORD CallBackFlags[4];
33
34 D3DNTHAL_CALLBACKS D3dCallbacks;
35 D3DNTHAL_CALLBACKS oldD3dCallbacks;
36
37 D3DNTHAL_GLOBALDRIVERDATA D3dDriverData;
38 D3DNTHAL_GLOBALDRIVERDATA oldD3dDriverData;
39
40 DD_D3DBUFCALLBACKS D3dBufferCallbacks;
41 DD_D3DBUFCALLBACKS oldD3dBufferCallbacks;
42
43 DDSURFACEDESC2 D3dTextureFormats[100];
44 DWORD NumHeaps = 0;
45 VIDEOMEMORY vmList;
46 //DWORD NumFourCC = 0;
47 //DWORD FourCC = 0;
48 DEVMODE devmode;
49 HDC hdc;
50
51 DWORD dwTextureCounter = 0;
52 DDSURFACEDESC *myDesc = NULL;
53
54 /* clear data */
55 memset(&vmList,0,sizeof(VIDEOMEMORY));
56 memset(&D3dTextureFormats,0,sizeof(DDSURFACEDESC));
57 memset(&D3dBufferCallbacks,0,sizeof(DD_D3DBUFCALLBACKS));
58 memset(&D3dDriverData,0,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
59 memset(&D3dCallbacks,0,sizeof(D3DNTHAL_CALLBACKS));
60 memset(&HalInfo,0,sizeof(DD_HALINFO));
61 memset(CallBackFlags,0,sizeof(DWORD)*3);
62
63 /* Get current display mode */
64 EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &devmode);
65
66 /* Create hdc that we can use */
67 hdc = CreateDCW(L"DISPLAY", NULL, NULL, NULL);
68 ASSERT(hdc != NULL);
69
70
71 hDirectDraw = NtGdiDdCreateDirectDrawObject(hdc);
72 RTEST(hDirectDraw != NULL);
73
74 /* testing OsThunkDdQueryDirectDrawObject( NULL, .... */
75 RTEST(NtGdiDdQueryDirectDrawObject( NULL, pHalInfo,
76 pCallBackFlags, puD3dCallbacks,
77 puD3dDriverData, puD3dBufferCallbacks,
78 puD3dTextureFormats, puNumHeaps,
79 puvmList, puNumFourCC,
80 puFourCC) == FALSE);
81
82 RTEST(pHalInfo == NULL);
83 RTEST(pCallBackFlags == NULL);
84 RTEST(puD3dCallbacks == NULL);
85 RTEST(puD3dDriverData == NULL);
86 RTEST(puD3dBufferCallbacks == NULL);
87 RTEST(puD3dTextureFormats == NULL);
88 RTEST(puNumFourCC == NULL);
89 RTEST(puFourCC == NULL);
90 RTEST(puNumHeaps == NULL);
91 RTEST(puvmList == NULL);
92
93 if (hDirectDraw == NULL)
94 {
95 skip("No DirectDrawObject\n");
96 ok(DeleteDC(hdc) != 0, "DeleteDC() failed\n");
97 return;
98 }
99
100 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, NULL, .... */
101 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
102 pCallBackFlags, puD3dCallbacks,
103 puD3dDriverData, puD3dBufferCallbacks,
104 puD3dTextureFormats, puNumHeaps,
105 puvmList, puNumFourCC,
106 puFourCC) == FALSE);
107
108 RTEST(pHalInfo == NULL);
109 RTEST(pCallBackFlags == NULL);
110 RTEST(puD3dCallbacks == NULL);
111 RTEST(puD3dDriverData == NULL);
112 RTEST(puD3dBufferCallbacks == NULL);
113 RTEST(puD3dTextureFormats == NULL);
114 RTEST(puNumFourCC == NULL);
115 RTEST(puFourCC == NULL);
116 RTEST(puNumHeaps == NULL);
117 RTEST(puvmList == NULL);
118
119 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, NULL, .... */
120 pHalInfo = &HalInfo;
121 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
122 pCallBackFlags, puD3dCallbacks,
123 puD3dDriverData, puD3dBufferCallbacks,
124 puD3dTextureFormats, puNumHeaps,
125 puvmList, puNumFourCC,
126 puFourCC)== FALSE);
127
128 RTEST(pHalInfo != NULL);
129 ASSERT(pHalInfo != NULL);
130
131 RTEST(pCallBackFlags == NULL);
132 RTEST(puD3dCallbacks == NULL);
133 RTEST(puD3dDriverData == NULL);
134 RTEST(puD3dBufferCallbacks == NULL);
135 RTEST(puD3dTextureFormats == NULL);
136 RTEST(puNumFourCC == NULL);
137 RTEST(puFourCC == NULL);
138 RTEST(puNumHeaps == NULL);
139 RTEST(puvmList == NULL);
140
141 if ((pHalInfo->dwSize != sizeof(DD_HALINFO)) &&
142 (pHalInfo->dwSize != sizeof(DD_HALINFO_V4)))
143 {
144 RTEST(pHalInfo->dwSize != sizeof(DD_HALINFO));
145 ASSERT(pHalInfo->dwSize != sizeof(DD_HALINFO));
146 }
147
148 if (pHalInfo->dwSize == sizeof(DD_HALINFO))
149 {
150 /*the offset, in bytes, to primary surface in the display memory */
151 /* some graphic card like sis 760 GX, Nvida GF7900GS does not set any offset at all */
152 // RTEST(pHalInfo->vmiData.fpPrimary != 0 );
153
154 /* unsuse always 0 */
155 RTEST(pHalInfo->vmiData.dwFlags == 0 );
156
157 /* Check the res */
158 RTEST(pHalInfo->vmiData.dwDisplayWidth == devmode.dmPelsWidth );
159 RTEST(pHalInfo->vmiData.dwDisplayHeight == devmode.dmPelsHeight );
160
161 /* This can never be test for it is who big the line is after it been align displayPitch */
162 RTEST(pHalInfo->vmiData.lDisplayPitch != 0);
163
164 RTEST(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT) );
165 ASSERT(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT));
166
167 /* We can not check if it DDPF_RGB flags been set for primary surface
168 * for it can be DDPF_PALETTEINDEXED1,DDPF_PALETTEINDEXED2,DDPF_PALETTEINDEXED4,DDPF_PALETTEINDEXED8, DDPF_PALETTEINDEXEDTO8, DDPF_RGB, DDPF_YUV
169 */
170 RTEST( (pHalInfo->vmiData.ddpfDisplay.dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 | DDPF_PALETTEINDEXED4 |
171 DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8 | DDPF_RGB | DDPF_YUV)) != 0);
172
173
174 /* No fourcc are use on primary screen */
175 RTEST(pHalInfo->vmiData.ddpfDisplay.dwFourCC == 0 );
176
177 /* Count RGB Bits 8/16/24/32 */
178 RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBBitCount == devmode.dmBitsPerPel );
179
180 /* The rgb mask can not be detected in user mode, for it can be 15Bpp convert to 16Bpp mode, so we have no way detect correct mask
181 * But the mask can never be Zero
182 */
183 RTEST(pHalInfo->vmiData.ddpfDisplay.dwRBitMask != 0 );
184 RTEST(pHalInfo->vmiData.ddpfDisplay.dwGBitMask != 0 );
185 RTEST(pHalInfo->vmiData.ddpfDisplay.dwBBitMask != 0 );
186
187 /* primary never set the alpha blend mask */
188 RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBAlphaBitMask == 0 );
189
190 /* This can not be test at usermode it is each hardware drv that fill in it,
191 * only way to found them is to use this call */
192 // pHalInfo->vmiData->dwOffscreenAlign
193 // pHalInfo->vmiData->dwOverlayAlign
194 // pHalInfo->vmiData->dwTextureAlign
195 // pHalInfo->vmiData->dwZBufferAlign
196 // pHalInfo->vmiData->dwAlphaAlign
197
198 /* the primary display address */
199 RTEST( ( (DWORD)pHalInfo->vmiData.pvPrimary & (~0x80000000)) != 0 );
200
201 /* test see if we got back the pvmList here
202 * acording msdn vmiData.dwNumHeaps and vmiData.pvmList
203 * exists for _VIDEOMEMORYINFO but they do not, it reviews
204 * in ddk and wdk and own testcase
205 */
206 // RTEST(pHalInfo->vmiData.dwNumHeaps != 0 );
207 // RTEST(pHalInfo->vmiData.pvmList != 0 );
208
209 /* Test see if we got any hardware acclartions for 2d or 3d, this always fill in
210 * that mean we found a bugi drv and dx does not work on this drv
211 */
212
213 /* the SIS 760 GX will never fill it in, it is a bugi drv */
214 RTEST(pHalInfo->ddCaps.dwSize == sizeof(DDCORECAPS));
215
216 /* Testing see if we got any hw support for
217 * This test can fail on video card that does not support 2d/overlay/3d
218 */
219 RTEST( pHalInfo->ddCaps.dwCaps != 0);
220 RTEST( pHalInfo->ddCaps.ddsCaps.dwCaps != 0);
221
222 /* This flags is obsolete and should not be used by the driver */
223 RTEST( pHalInfo->ddCaps.dwFXAlphaCaps == 0);
224
225
226 /* basic dx 2 is found if this flags not set
227 * if this fail we do not have a dx driver install acodring ms, some version of windows it
228 * is okay this fail and drv does then only support basic dx
229 *
230 */
231 if (pHalInfo->dwFlags != 0)
232 {
233 RTEST( (pHalInfo->dwFlags & (DDHALINFO_GETDRIVERINFOSET | DDHALINFO_GETDRIVERINFO2)) != 0 );
234 RTEST( ( (DWORD)pHalInfo->GetDriverInfo & 0x80000000) != 0 );
235 ASSERT( ((DWORD)pHalInfo->GetDriverInfo & 0x80000000) != 0 );
236 }
237
238 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
239
240
241 /* the pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE will be ignore, only way detect it proper follow code,
242 * this will be fill in of all drv, it is not only for 3d stuff, this always fill by win32k.sys or dxg.sys depns
243 * if it windows 2000 or windows xp/2003
244 *
245 * point to kmode direcly to the win32k.sys, win32k.sys is kmode and it is kmode address we getting back
246 */
247 RTEST( ( (DWORD)pHalInfo->lpD3DGlobalDriverData & (~0x80000000)) != 0 );
248 RTEST( ( (DWORD)pHalInfo->lpD3DHALCallbacks & (~0x80000000)) != 0 );
249 RTEST( ( (DWORD)pHalInfo->lpD3DHALCallbacks & (~0x80000000)) != 0 );
250 }
251
252 /* Backup DD_HALINFO so we do not need resting it */
253 RtlCopyMemory(&oldHalInfo, &HalInfo, sizeof(DD_HALINFO));
254
255 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, pCallBackFlags, NULL, .... */
256 pHalInfo = &HalInfo;
257 pCallBackFlags = CallBackFlags;
258 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
259
260 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
261 pCallBackFlags, puD3dCallbacks,
262 puD3dDriverData, puD3dBufferCallbacks,
263 puD3dTextureFormats, puNumHeaps,
264 puvmList, puNumFourCC,
265 puFourCC)== FALSE);
266 RTEST(pHalInfo != NULL);
267 ASSERT(pHalInfo != NULL);
268
269 RTEST(pCallBackFlags != NULL);
270 ASSERT(pCallBackFlags != NULL);
271
272 RTEST(puD3dCallbacks == NULL);
273 RTEST(puD3dDriverData == NULL);
274 RTEST(puD3dBufferCallbacks == NULL);
275 RTEST(puD3dTextureFormats == NULL);
276 RTEST(puNumFourCC == NULL);
277 RTEST(puFourCC == NULL);
278 RTEST(puNumHeaps == NULL);
279 RTEST(puvmList == NULL);
280
281 /* We do not retesting DD_HALINFO, instead we compare it */
282 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
283
284 /* Rember on some nivida drv the pCallBackFlags will not be set even they api exists in the drv
285 * known workaround is to check if the drv really return a kmode pointer for the drv functions
286 * we want to use.
287 */
288 RTEST(pCallBackFlags[0] != 0);
289 RTEST(pCallBackFlags[1] != 0);
290 RTEST(pCallBackFlags[2] == 0);
291
292 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, pCallBackFlags, D3dCallbacks, NULL, .... */
293 pHalInfo = &HalInfo;
294 pCallBackFlags = CallBackFlags;
295 puD3dCallbacks = &D3dCallbacks;
296
297 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
298 RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
299
300 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
301 pCallBackFlags, puD3dCallbacks,
302 puD3dDriverData, puD3dBufferCallbacks,
303 puD3dTextureFormats, puNumHeaps,
304 puvmList, puNumFourCC,
305 puFourCC)== FALSE);
306 RTEST(pHalInfo != NULL);
307 ASSERT(pHalInfo != NULL);
308
309 RTEST(pCallBackFlags != NULL);
310 ASSERT(pCallBackFlags != NULL);
311
312 /* rember puD3dCallbacks shall never return NULL */
313 RTEST(puD3dCallbacks != NULL);
314 ASSERT(puD3dCallbacks != NULL);
315
316 /* the pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE will be ignore, only way detect it proper follow code,
317 * this will be fill in of all drv, it is not only for 3d stuff, this always fill by win32k.sys or dxg.sys depns
318 * if it windows 2000 or windows xp/2003
319 */
320 RTEST(puD3dCallbacks->dwSize == sizeof(D3DNTHAL_CALLBACKS));
321
322 /* Nivda like GF7900GS will not follow ms design rule here,
323 * ContextDestroyAll must alwyas be NULL for it is not longer inuse in windows 2000 and higher
324 */
325 RTEST(puD3dCallbacks->ContextDestroyAll == NULL);
326
327 /* Nivda like GF7900GS will not follow ms design rule here,
328 * SceneCapture must alwyas be NULL for it is not longer inuse in windows 2000 and higher
329 */
330 RTEST(puD3dCallbacks->SceneCapture == NULL);
331 RTEST(puD3dCallbacks->dwReserved10 == 0);
332 RTEST(puD3dCallbacks->dwReserved11 == 0);
333 RTEST(puD3dCallbacks->dwReserved22 == 0);
334 RTEST(puD3dCallbacks->dwReserved23 == 0);
335 RTEST(puD3dCallbacks->dwReserved == 0);
336 RTEST(puD3dCallbacks->TextureCreate == NULL);
337 RTEST(puD3dCallbacks->TextureDestroy == NULL);
338 RTEST(puD3dCallbacks->TextureSwap == NULL);
339 RTEST(puD3dCallbacks->TextureGetSurf == NULL);
340 RTEST(puD3dCallbacks->dwReserved12 == 0);
341 RTEST(puD3dCallbacks->dwReserved13 == 0);
342 RTEST(puD3dCallbacks->dwReserved14 == 0);
343 RTEST(puD3dCallbacks->dwReserved15 == 0);
344 RTEST(puD3dCallbacks->dwReserved16 == 0);
345 RTEST(puD3dCallbacks->dwReserved17 == 0);
346 RTEST(puD3dCallbacks->dwReserved18 == 0);
347 RTEST(puD3dCallbacks->dwReserved19 == 0);
348 RTEST(puD3dCallbacks->dwReserved20 == 0);
349 RTEST(puD3dCallbacks->dwReserved21 == 0);
350 RTEST(puD3dCallbacks->dwReserved24 == 0);
351 RTEST(puD3dCallbacks->dwReserved0 == 0);
352 RTEST(puD3dCallbacks->dwReserved1 == 0);
353 RTEST(puD3dCallbacks->dwReserved2 == 0);
354 RTEST(puD3dCallbacks->dwReserved3 == 0);
355 RTEST(puD3dCallbacks->dwReserved4 == 0);
356 RTEST(puD3dCallbacks->dwReserved5 == 0);
357 RTEST(puD3dCallbacks->dwReserved6 == 0);
358 RTEST(puD3dCallbacks->dwReserved7 == 0);
359 RTEST(puD3dCallbacks->dwReserved8 == 0);
360 RTEST(puD3dCallbacks->dwReserved9 == 0);
361
362 /* how detect puD3dCallbacks->ContextCreate and puD3dCallbacks->ContextDestroy shall be set for bugi drv like nivda ? */
363 /* pointer direcly to the graphic drv, it is kmode pointer */
364 // RTEST( ( (DWORD)puD3dCallbacks->ContextCreate & (~0x80000000)) != 0 );
365 // RTEST( ( (DWORD)puD3dCallbacks->ContextDestroy & (~0x80000000)) != 0 );
366
367 RTEST(puD3dDriverData == NULL);
368 RTEST(puD3dBufferCallbacks == NULL);
369 RTEST(puD3dTextureFormats == NULL);
370 RTEST(puNumFourCC == NULL);
371 RTEST(puFourCC == NULL);
372 RTEST(puNumHeaps == NULL);
373 RTEST(puvmList == NULL);
374
375 /* We do not retesting DD_HALINFO, instead we compare it */
376 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
377 RTEST(pCallBackFlags[0] != 0);
378 RTEST(pCallBackFlags[1] != 0);
379 RTEST(pCallBackFlags[2] == 0);
380
381 /* Backup D3DNTHAL_CALLBACKS so we do not need resting it */
382 RtlCopyMemory(&oldD3dCallbacks, &D3dCallbacks, sizeof(D3DNTHAL_CALLBACKS));
383
384
385 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, NULL, */
386 pHalInfo = &HalInfo;
387 pCallBackFlags = CallBackFlags;
388 puD3dCallbacks = &D3dCallbacks;
389 puD3dDriverData = &D3dDriverData;
390
391 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
392 RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
393 RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
394
395 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
396 pCallBackFlags, puD3dCallbacks,
397 puD3dDriverData, puD3dBufferCallbacks,
398 puD3dTextureFormats, puNumHeaps,
399 puvmList, puNumFourCC,
400 puFourCC)== FALSE);
401 RTEST(pHalInfo != NULL);
402 ASSERT(pHalInfo != NULL);
403
404 RTEST(pCallBackFlags != NULL);
405 ASSERT(pCallBackFlags != NULL);
406
407 RTEST(puD3dCallbacks != NULL);
408 ASSERT(puD3dCallbacks != NULL);
409
410 RTEST(puD3dDriverData != NULL);
411 ASSERT(puD3dDriverData != NULL);
412
413 RTEST(puD3dBufferCallbacks == NULL);
414 RTEST(puD3dTextureFormats == NULL);
415 RTEST(puNumFourCC == NULL);
416 RTEST(puFourCC == NULL);
417 RTEST(puNumHeaps == NULL);
418 RTEST(puvmList == NULL);
419
420 /* We retesting pCallBackFlags */
421 RTEST(pCallBackFlags[0] != 0);
422 RTEST(pCallBackFlags[1] != 0);
423 RTEST(pCallBackFlags[2] == 0);
424
425 /* We do not retesting instead we compare it */
426 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
427 RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);
428
429 /* start test of puD3dDriverData */
430
431 RTEST(puD3dDriverData->dwSize == sizeof(D3DNTHAL_GLOBALDRIVERDATA));
432 RTEST(puD3dDriverData->hwCaps.dwSize == sizeof(D3DNTHALDEVICEDESC_V1));
433 RTEST(puD3dDriverData->hwCaps.dtcTransformCaps.dwSize == sizeof(D3DTRANSFORMCAPS));
434 RTEST(puD3dDriverData->hwCaps.dlcLightingCaps.dwSize == sizeof(D3DLIGHTINGCAPS));
435 RTEST(puD3dDriverData->hwCaps.dpcLineCaps.dwSize == sizeof(D3DPRIMCAPS));
436 RTEST(puD3dDriverData->hwCaps.dpcTriCaps.dwSize == sizeof(D3DPRIMCAPS));
437 RTEST(puD3dDriverData->hwCaps.dwMaxBufferSize == 0);
438 RTEST(puD3dDriverData->hwCaps.dwMaxVertexCount == 0);
439
440 /* Backup D3DHAL_GLOBALDRIVERDATA so we do not need resting it */
441 RtlCopyMemory(&oldD3dDriverData, &D3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
442
443 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, NULL, */
444 pHalInfo = &HalInfo;
445 pCallBackFlags = CallBackFlags;
446 puD3dCallbacks = &D3dCallbacks;
447 puD3dDriverData = &D3dDriverData;
448 puD3dBufferCallbacks = &D3dBufferCallbacks;
449
450 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
451 RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
452 RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
453 RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_CALLBACKS));
454
455 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
456 pCallBackFlags, puD3dCallbacks,
457 puD3dDriverData, puD3dBufferCallbacks,
458 puD3dTextureFormats, puNumHeaps,
459 puvmList, puNumFourCC,
460 puFourCC)== FALSE);
461 RTEST(pHalInfo != NULL);
462 RTEST(pCallBackFlags != NULL);
463
464 if (pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE )
465 {
466 RTEST(puD3dCallbacks != NULL);
467 RTEST(puD3dDriverData != NULL);
468 RTEST(puD3dBufferCallbacks != NULL);
469 }
470
471 RTEST(pHalInfo != NULL);
472 ASSERT(pHalInfo != NULL);
473
474 RTEST(pCallBackFlags != NULL);
475 ASSERT(pCallBackFlags != NULL);
476
477 RTEST(puD3dCallbacks != NULL);
478 ASSERT(puD3dCallbacks != NULL);
479
480 RTEST(puD3dDriverData != NULL);
481 ASSERT(puD3dDriverData != NULL);
482
483 RTEST(puD3dBufferCallbacks != NULL);
484 ASSERT(puD3dDriverData != NULL);
485
486 RTEST(puD3dTextureFormats == NULL);
487 RTEST(puNumFourCC == NULL);
488 RTEST(puFourCC == NULL);
489 RTEST(puNumHeaps == NULL);
490 RTEST(puvmList == NULL);
491
492 /* We retesting the flags */
493 RTEST(pCallBackFlags[0] != 0);
494 RTEST(pCallBackFlags[1] != 0);
495 RTEST(pCallBackFlags[2] == 0);
496
497 /* We do not retesting instead we compare it */
498 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
499 RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);
500 RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);
501
502 /* start test of puD3dBufferCallbacks */
503 RTEST(puD3dBufferCallbacks->dwSize == sizeof(DD_D3DBUFCALLBACKS));
504 if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_CANCREATED3DBUF)
505 {
506 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
507 RTEST( ( (DWORD)puD3dBufferCallbacks->CanCreateD3DBuffer & (~0x80000000)) != 0 );
508 }
509 else
510 {
511 RTEST( puD3dBufferCallbacks->CanCreateD3DBuffer == NULL);
512 }
513
514 if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_CREATED3DBUF)
515 {
516 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
517 RTEST( ( (DWORD)puD3dBufferCallbacks->CreateD3DBuffer & (~0x80000000)) != 0 );
518 }
519 else
520 {
521 RTEST( puD3dBufferCallbacks->CreateD3DBuffer == NULL);
522 }
523
524 if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_DESTROYD3DBUF)
525 {
526 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
527 RTEST( ( (DWORD)puD3dBufferCallbacks->DestroyD3DBuffer & (~0x80000000)) != 0 );
528 }
529 else
530 {
531 RTEST( puD3dBufferCallbacks->DestroyD3DBuffer == NULL);
532 }
533
534 if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_LOCKD3DBUF)
535 {
536 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
537 RTEST( ( (DWORD)puD3dBufferCallbacks->LockD3DBuffer & (~0x80000000)) != 0 );
538 }
539 else
540 {
541 RTEST( puD3dBufferCallbacks->LockD3DBuffer == NULL);
542 }
543
544 if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_UNLOCKD3DBUF)
545 {
546 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
547 RTEST( ( (DWORD)puD3dBufferCallbacks->UnlockD3DBuffer & (~0x80000000)) != 0 );
548 }
549 else
550 {
551 RTEST( puD3dBufferCallbacks->UnlockD3DBuffer == NULL);
552 }
553
554 /* Backup DD_D3DBUFCALLBACKS so we do not need resting it */
555 RtlCopyMemory(&oldD3dBufferCallbacks, &D3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS));
556
557
558 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, NULL, */
559 pHalInfo = &HalInfo;
560 pCallBackFlags = CallBackFlags;
561 puD3dCallbacks = &D3dCallbacks;
562 puD3dDriverData = &D3dDriverData;
563 puD3dBufferCallbacks = &D3dBufferCallbacks;
564
565 /* It is forbein to return a DDSURFACEDESC2 it should always be DDSURFACEDESC
566 This is only for detected bad drivers that does not follow the rules, if they
567 does not follow tthe rules, not everthing being copy then in gdi32.dll
568 gdi32.dll always assume it is DDSURFACEDESC size
569 */
570 if (puD3dDriverData->dwNumTextureFormats != 0)
571 {
572 puD3dTextureFormats = malloc (puD3dDriverData->dwNumTextureFormats * sizeof(DDSURFACEDESC2));
573 }
574
575 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
576 RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
577 RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
578 RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
579 RtlZeroMemory(&D3dBufferCallbacks,sizeof(DD_D3DBUFCALLBACKS));
580
581 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
582 pCallBackFlags, puD3dCallbacks,
583 puD3dDriverData, puD3dBufferCallbacks,
584 puD3dTextureFormats, puNumHeaps,
585 puvmList, puNumFourCC,
586 puFourCC)== FALSE);
587
588 RTEST(pHalInfo != NULL);
589 ASSERT(pHalInfo != NULL);
590
591 RTEST(pCallBackFlags != NULL);
592 ASSERT(pCallBackFlags != NULL);
593
594 RTEST(puD3dCallbacks != NULL);
595 ASSERT(puD3dCallbacks != NULL);
596
597 RTEST(puD3dDriverData != NULL);
598 ASSERT(puD3dDriverData != NULL);
599
600 RTEST(puD3dBufferCallbacks != NULL);
601 ASSERT(puD3dDriverData != NULL);
602
603 RTEST(puD3dTextureFormats != NULL);
604 ASSERT(puD3dTextureFormats != NULL);
605
606 RTEST(puNumFourCC == NULL);
607 RTEST(puFourCC == NULL);
608 RTEST(puNumHeaps == NULL);
609 RTEST(puvmList == NULL);
610
611 /* We retesting the flags */
612 RTEST(pCallBackFlags[0] != 0);
613 RTEST(pCallBackFlags[1] != 0);
614 RTEST(pCallBackFlags[2] == 0);
615
616 /* We do not retesting instead we compare it */
617 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
618 RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);
619 RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);
620 RTEST(memcmp(&oldD3dBufferCallbacks, puD3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS)) == 0);
621
622 /* start test of dwNumTextureFormats */
623 if (puD3dDriverData->dwNumTextureFormats != 0)
624 {
625 myDesc = puD3dTextureFormats;
626 for (dwTextureCounter=0;dwTextureCounter<puD3dDriverData->dwNumTextureFormats;dwTextureCounter++)
627 {
628 RTEST(myDesc->dwSize == sizeof(DDSURFACEDESC));
629 ASSERT(myDesc->dwSize == sizeof(DDSURFACEDESC));
630
631 RTEST( (myDesc->dwFlags & (~(DDSD_CAPS|DDSD_PIXELFORMAT))) == 0);
632 RTEST(myDesc->dwHeight == 0);
633 RTEST(myDesc->dwWidth == 0);
634 RTEST(myDesc->dwLinearSize == 0);
635 RTEST(myDesc->dwBackBufferCount == 0);
636 RTEST(myDesc->dwZBufferBitDepth == 0);
637 RTEST(myDesc->dwAlphaBitDepth == 0);
638 RTEST(myDesc->dwReserved == 0);
639 RTEST(myDesc->lpSurface == 0);
640 RTEST(myDesc->ddckCKDestOverlay.dwColorSpaceLowValue == 0);
641 RTEST(myDesc->ddckCKDestOverlay.dwColorSpaceHighValue == 0);
642 RTEST(myDesc->ddckCKDestBlt.dwColorSpaceLowValue == 0);
643 RTEST(myDesc->ddckCKDestBlt.dwColorSpaceHighValue == 0);
644 RTEST(myDesc->ddckCKSrcOverlay.dwColorSpaceLowValue == 0);
645 RTEST(myDesc->ddckCKSrcOverlay.dwColorSpaceHighValue == 0);
646 RTEST(myDesc->ddckCKSrcBlt.dwColorSpaceLowValue == 0);
647 RTEST(myDesc->ddckCKSrcBlt.dwColorSpaceHighValue == 0);
648 RTEST(myDesc->ddpfPixelFormat.dwSize == sizeof(DDPIXELFORMAT));
649 RTEST(myDesc->ddpfPixelFormat.dwFlags != 0);
650 if (myDesc->ddpfPixelFormat.dwFlags & DDPF_FOURCC)
651 {
652 RTEST(myDesc->ddpfPixelFormat.dwFourCC != 0);
653 }
654 RTEST(myDesc->ddsCaps.dwCaps == DDSCAPS_TEXTURE);
655
656 myDesc = (DDSURFACEDESC *) (((DWORD) myDesc) + sizeof(DDSURFACEDESC));
657 }
658 }
659
660
661 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, puNumHeaps, NULL, */
662 pHalInfo = &HalInfo;
663 pCallBackFlags = CallBackFlags;
664 puD3dCallbacks = &D3dCallbacks;
665 puD3dDriverData = &D3dDriverData;
666 puD3dBufferCallbacks = &D3dBufferCallbacks;
667 puNumHeaps = &NumHeaps;
668
669 if (puD3dDriverData->dwNumTextureFormats != 0)
670 {
671 RtlZeroMemory(puD3dTextureFormats, puD3dDriverData->dwNumTextureFormats * sizeof(DDSURFACEDESC2));
672 }
673 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
674 RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
675 RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
676 RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
677 RtlZeroMemory(&D3dBufferCallbacks,sizeof(DD_D3DBUFCALLBACKS));
678
679 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
680 pCallBackFlags, puD3dCallbacks,
681 puD3dDriverData, puD3dBufferCallbacks,
682 puD3dTextureFormats, puNumHeaps,
683 puvmList, puNumFourCC,
684 puFourCC)== FALSE);
685
686 RTEST(pHalInfo != NULL);
687 ASSERT(pHalInfo != NULL);
688
689 RTEST(pCallBackFlags != NULL);
690 ASSERT(pCallBackFlags != NULL);
691
692 RTEST(puD3dCallbacks != NULL);
693 ASSERT(puD3dCallbacks != NULL);
694
695 RTEST(puD3dDriverData != NULL);
696 ASSERT(puD3dDriverData != NULL);
697
698 RTEST(puD3dBufferCallbacks != NULL);
699 ASSERT(puD3dDriverData != NULL);
700
701 RTEST(puD3dTextureFormats != NULL);
702 ASSERT(puD3dTextureFormats != NULL);
703
704 RTEST(puNumHeaps != NULL);
705 ASSERT(puNumHeaps != NULL);
706 RTEST(NumHeaps == 0);
707
708 RTEST(puNumFourCC == NULL);
709 RTEST(puFourCC == NULL);
710
711 RTEST(puvmList == NULL);
712
713 /* We retesting the flags */
714 RTEST(pCallBackFlags[0] != 0);
715 RTEST(pCallBackFlags[1] != 0);
716 RTEST(pCallBackFlags[2] == 0);
717
718 /* We do not retesting instead we compare it */
719 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
720 RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);
721 RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);
722 RTEST(memcmp(&oldD3dBufferCallbacks, puD3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS)) == 0);
723 /* we skip resting texture */
724
725
726 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, puNumHeaps, puvmList, NULL, */
727 pHalInfo = &HalInfo;
728 pCallBackFlags = CallBackFlags;
729 puD3dCallbacks = &D3dCallbacks;
730 puD3dDriverData = &D3dDriverData;
731 puD3dBufferCallbacks = &D3dBufferCallbacks;
732 puNumHeaps = &NumHeaps;
733 puvmList = &vmList;
734
735 if (puD3dDriverData->dwNumTextureFormats != 0)
736 {
737 RtlZeroMemory(puD3dTextureFormats, puD3dDriverData->dwNumTextureFormats * sizeof(DDSURFACEDESC2));
738 }
739 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
740 RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
741 RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
742 RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
743 RtlZeroMemory(&D3dBufferCallbacks,sizeof(DD_D3DBUFCALLBACKS));
744
745 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
746 pCallBackFlags, puD3dCallbacks,
747 puD3dDriverData, puD3dBufferCallbacks,
748 puD3dTextureFormats, puNumHeaps,
749 puvmList, puNumFourCC,
750 puFourCC)== FALSE);
751
752 RTEST(pHalInfo != NULL);
753 ASSERT(pHalInfo != NULL);
754
755 RTEST(pCallBackFlags != NULL);
756 ASSERT(pCallBackFlags != NULL);
757
758 RTEST(puD3dCallbacks != NULL);
759 ASSERT(puD3dCallbacks != NULL);
760
761 RTEST(puD3dDriverData != NULL);
762 ASSERT(puD3dDriverData != NULL);
763
764 RTEST(puD3dBufferCallbacks != NULL);
765 ASSERT(puD3dDriverData != NULL);
766
767 RTEST(puD3dTextureFormats != NULL);
768 ASSERT(puD3dTextureFormats != NULL);
769
770 RTEST(puNumHeaps != NULL);
771 ASSERT(puNumHeaps != NULL);
772 RTEST(NumHeaps == 0);
773
774 RTEST(puvmList != NULL);
775
776 RTEST(puNumFourCC == NULL);
777 RTEST(puFourCC == NULL);
778
779
780
781 /* We retesting the flags */
782 RTEST(pCallBackFlags[0] != 0);
783 RTEST(pCallBackFlags[1] != 0);
784 RTEST(pCallBackFlags[2] == 0);
785
786 /* We do not retesting instead we compare it */
787 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
788 RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);
789 RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);
790 RTEST(memcmp(&oldD3dBufferCallbacks, puD3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS)) == 0);
791 /* we skip resting texture */
792
793 /* Todo
794 * adding test for
795 * puNumFourCC
796 * puFourCC
797 */
798
799 ok(NtGdiDdDeleteDirectDrawObject(hDirectDraw) == TRUE,
800 "NtGdiDdDeleteDirectDrawObject() failed\n");
801
802 ok(DeleteDC(hdc) != 0, "DeleteDC() failed\n");
803 }