2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for NtGdiDdCreateDirectDrawObject
10 /* Note : OsThunkDdQueryDirectDrawObject is the usermode name of NtGdiDdQueryDirectDrawObject
11 * it lives in d3d8thk.dll and in windows 2000 it doing syscall direcly to win32k.sus
12 * in windows xp and higher it call to gdi32.dll to DdEntry41 and it doing the syscall
14 START_TEST(NtGdiDdQueryDirectDrawObject
)
16 HANDLE hDirectDraw
= NULL
;
17 DD_HALINFO
*pHalInfo
= NULL
;
18 DWORD
*pCallBackFlags
= NULL
;
19 LPD3DNTHAL_CALLBACKS puD3dCallbacks
= NULL
;
20 LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData
= NULL
;
21 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks
= NULL
;
22 LPDDSURFACEDESC puD3dTextureFormats
= NULL
;
23 DWORD
*puNumHeaps
= NULL
;
24 VIDEOMEMORY
*puvmList
= NULL
;
25 DWORD
*puNumFourCC
= NULL
;
26 DWORD
*puFourCC
= NULL
;
29 DD_HALINFO oldHalInfo
;
30 DWORD CallBackFlags
[4];
32 D3DNTHAL_CALLBACKS D3dCallbacks
;
33 D3DNTHAL_CALLBACKS oldD3dCallbacks
;
35 D3DNTHAL_GLOBALDRIVERDATA D3dDriverData
;
36 D3DNTHAL_GLOBALDRIVERDATA oldD3dDriverData
;
38 DD_D3DBUFCALLBACKS D3dBufferCallbacks
;
39 DD_D3DBUFCALLBACKS oldD3dBufferCallbacks
;
41 DDSURFACEDESC2 D3dTextureFormats
[100];
44 //DWORD NumFourCC = 0;
49 DWORD dwTextureCounter
= 0;
50 DDSURFACEDESC
*myDesc
= NULL
;
53 memset(&vmList
,0,sizeof(VIDEOMEMORY
));
54 memset(&D3dTextureFormats
,0,sizeof(DDSURFACEDESC
));
55 memset(&D3dBufferCallbacks
,0,sizeof(DD_D3DBUFCALLBACKS
));
56 memset(&D3dDriverData
,0,sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
57 memset(&D3dCallbacks
,0,sizeof(D3DNTHAL_CALLBACKS
));
58 memset(&HalInfo
,0,sizeof(DD_HALINFO
));
59 memset(CallBackFlags
,0,sizeof(DWORD
)*3);
61 /* Get current display mode */
62 EnumDisplaySettingsA(NULL
, ENUM_CURRENT_SETTINGS
, &devmode
);
64 /* Create hdc that we can use */
65 hdc
= CreateDCW(L
"DISPLAY",NULL
,NULL
,NULL
);
69 /* Create ReactX handle */
70 hDirectDraw
= (HANDLE
) NtGdiDdCreateDirectDrawObject(hdc
);
71 ASSERT(hDirectDraw
!= NULL
);
73 /* Start Test ReactX NtGdiDdQueryDirectDrawObject function */
75 /* testing OsThunkDdQueryDirectDrawObject( NULL, .... */
76 RTEST(NtGdiDdQueryDirectDrawObject( NULL
, pHalInfo
,
77 pCallBackFlags
, puD3dCallbacks
,
78 puD3dDriverData
, puD3dBufferCallbacks
,
79 puD3dTextureFormats
, puNumHeaps
,
80 puvmList
, puNumFourCC
,
83 RTEST(pHalInfo
== NULL
);
84 RTEST(pCallBackFlags
== NULL
);
85 RTEST(puD3dCallbacks
== NULL
);
86 RTEST(puD3dDriverData
== NULL
);
87 RTEST(puD3dBufferCallbacks
== NULL
);
88 RTEST(puD3dTextureFormats
== NULL
);
89 RTEST(puNumFourCC
== NULL
);
90 RTEST(puFourCC
== NULL
);
91 RTEST(puNumHeaps
== NULL
);
92 RTEST(puvmList
== NULL
);
94 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, NULL, .... */
95 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
96 pCallBackFlags
, puD3dCallbacks
,
97 puD3dDriverData
, puD3dBufferCallbacks
,
98 puD3dTextureFormats
, puNumHeaps
,
99 puvmList
, puNumFourCC
,
102 RTEST(pHalInfo
== NULL
);
103 RTEST(pCallBackFlags
== NULL
);
104 RTEST(puD3dCallbacks
== NULL
);
105 RTEST(puD3dDriverData
== NULL
);
106 RTEST(puD3dBufferCallbacks
== NULL
);
107 RTEST(puD3dTextureFormats
== NULL
);
108 RTEST(puNumFourCC
== NULL
);
109 RTEST(puFourCC
== NULL
);
110 RTEST(puNumHeaps
== NULL
);
111 RTEST(puvmList
== NULL
);
113 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, NULL, .... */
115 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
116 pCallBackFlags
, puD3dCallbacks
,
117 puD3dDriverData
, puD3dBufferCallbacks
,
118 puD3dTextureFormats
, puNumHeaps
,
119 puvmList
, puNumFourCC
,
122 RTEST(pHalInfo
!= NULL
);
123 ASSERT(pHalInfo
!= NULL
);
125 RTEST(pCallBackFlags
== NULL
);
126 RTEST(puD3dCallbacks
== NULL
);
127 RTEST(puD3dDriverData
== NULL
);
128 RTEST(puD3dBufferCallbacks
== NULL
);
129 RTEST(puD3dTextureFormats
== NULL
);
130 RTEST(puNumFourCC
== NULL
);
131 RTEST(puFourCC
== NULL
);
132 RTEST(puNumHeaps
== NULL
);
133 RTEST(puvmList
== NULL
);
135 if ((pHalInfo
->dwSize
!= sizeof(DD_HALINFO
)) &&
136 (pHalInfo
->dwSize
!= sizeof(DD_HALINFO_V4
)))
138 RTEST(pHalInfo
->dwSize
!= sizeof(DD_HALINFO
));
139 ASSERT(pHalInfo
->dwSize
!= sizeof(DD_HALINFO
));
142 if (pHalInfo
->dwSize
== sizeof(DD_HALINFO
))
144 /*the offset, in bytes, to primary surface in the display memory */
145 /* some graphic card like sis 760 GX, Nvida GF7900GS does not set any offset at all */
146 // RTEST(pHalInfo->vmiData.fpPrimary != 0 );
148 /* unsuse always 0 */
149 RTEST(pHalInfo
->vmiData
.dwFlags
== 0 );
152 RTEST(pHalInfo
->vmiData
.dwDisplayWidth
== devmode
.dmPelsWidth
);
153 RTEST(pHalInfo
->vmiData
.dwDisplayHeight
== devmode
.dmPelsHeight
);
155 /* This can never be test for it is who big the line is after it been align displayPitch */
156 RTEST(pHalInfo
->vmiData
.lDisplayPitch
!= 0);
158 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwSize
== sizeof(DDPIXELFORMAT
) );
159 ASSERT(pHalInfo
->vmiData
.ddpfDisplay
.dwSize
== sizeof(DDPIXELFORMAT
));
161 /* We can not check if it DDPF_RGB flags been set for primary surface
162 * for it can be DDPF_PALETTEINDEXED1,DDPF_PALETTEINDEXED2,DDPF_PALETTEINDEXED4,DDPF_PALETTEINDEXED8, DDPF_PALETTEINDEXEDTO8, DDPF_RGB, DDPF_YUV
164 RTEST( (pHalInfo
->vmiData
.ddpfDisplay
.dwFlags
& (DDPF_PALETTEINDEXED1
| DDPF_PALETTEINDEXED2
| DDPF_PALETTEINDEXED4
|
165 DDPF_PALETTEINDEXED8
| DDPF_PALETTEINDEXEDTO8
| DDPF_RGB
| DDPF_YUV
)) != 0);
168 /* No fourcc are use on primary screen */
169 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwFourCC
== 0 );
171 /* Count RGB Bits 8/16/24/32 */
172 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwRGBBitCount
== devmode
.dmBitsPerPel
);
174 /* 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
175 * But the mask can never be Zero
177 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwRBitMask
!= 0 );
178 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwGBitMask
!= 0 );
179 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwBBitMask
!= 0 );
181 /* primary never set the alpha blend mask */
182 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwRGBAlphaBitMask
== 0 );
184 /* This can not be test at usermode it is each hardware drv that fill in it,
185 * only way to found them is to use this call */
186 // pHalInfo->vmiData->dwOffscreenAlign
187 // pHalInfo->vmiData->dwOverlayAlign
188 // pHalInfo->vmiData->dwTextureAlign
189 // pHalInfo->vmiData->dwZBufferAlign
190 // pHalInfo->vmiData->dwAlphaAlign
192 /* the primary display address */
193 RTEST( ( (DWORD
)pHalInfo
->vmiData
.pvPrimary
& (~0x80000000)) != 0 );
195 /* test see if we got back the pvmList here
196 * acording msdn vmiData.dwNumHeaps and vmiData.pvmList
197 * exists for _VIDEOMEMORYINFO but they do not, it reviews
198 * in ddk and wdk and own testcase
200 // RTEST(pHalInfo->vmiData.dwNumHeaps != 0 );
201 // RTEST(pHalInfo->vmiData.pvmList != 0 );
203 /* Test see if we got any hardware acclartions for 2d or 3d, this always fill in
204 * that mean we found a bugi drv and dx does not work on this drv
207 /* the SIS 760 GX will never fill it in, it is a bugi drv */
208 RTEST(pHalInfo
->ddCaps
.dwSize
== sizeof(DDCORECAPS
));
210 /* Testing see if we got any hw support for
211 * This test can fail on video card that does not support 2d/overlay/3d
213 RTEST( pHalInfo
->ddCaps
.dwCaps
!= 0);
214 RTEST( pHalInfo
->ddCaps
.ddsCaps
.dwCaps
!= 0);
216 /* This flags is obsolete and should not be used by the driver */
217 RTEST( pHalInfo
->ddCaps
.dwFXAlphaCaps
== 0);
220 /* basic dx 2 is found if this flags not set
221 * if this fail we do not have a dx driver install acodring ms, some version of windows it
222 * is okay this fail and drv does then only support basic dx
225 if (pHalInfo
->dwFlags
!= 0)
227 RTEST( (pHalInfo
->dwFlags
& (DDHALINFO_GETDRIVERINFOSET
| DDHALINFO_GETDRIVERINFO2
)) != 0 );
228 RTEST( ( (DWORD
)pHalInfo
->GetDriverInfo
& 0x80000000) != 0 );
229 ASSERT( ((DWORD
)pHalInfo
->GetDriverInfo
& 0x80000000) != 0 );
232 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
235 /* the pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE will be ignore, only way detect it proper follow code,
236 * 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
237 * if it windows 2000 or windows xp/2003
239 * point to kmode direcly to the win32k.sys, win32k.sys is kmode and it is kmode address we getting back
241 RTEST( ( (DWORD
)pHalInfo
->lpD3DGlobalDriverData
& (~0x80000000)) != 0 );
242 RTEST( ( (DWORD
)pHalInfo
->lpD3DHALCallbacks
& (~0x80000000)) != 0 );
243 RTEST( ( (DWORD
)pHalInfo
->lpD3DHALCallbacks
& (~0x80000000)) != 0 );
246 /* Backup DD_HALINFO so we do not need resting it */
247 RtlCopyMemory(&oldHalInfo
, &HalInfo
, sizeof(DD_HALINFO
));
249 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, pCallBackFlags, NULL, .... */
251 pCallBackFlags
= CallBackFlags
;
252 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
254 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
255 pCallBackFlags
, puD3dCallbacks
,
256 puD3dDriverData
, puD3dBufferCallbacks
,
257 puD3dTextureFormats
, puNumHeaps
,
258 puvmList
, puNumFourCC
,
260 RTEST(pHalInfo
!= NULL
);
261 ASSERT(pHalInfo
!= NULL
);
263 RTEST(pCallBackFlags
!= NULL
);
264 ASSERT(pCallBackFlags
!= NULL
);
266 RTEST(puD3dCallbacks
== NULL
);
267 RTEST(puD3dDriverData
== NULL
);
268 RTEST(puD3dBufferCallbacks
== NULL
);
269 RTEST(puD3dTextureFormats
== NULL
);
270 RTEST(puNumFourCC
== NULL
);
271 RTEST(puFourCC
== NULL
);
272 RTEST(puNumHeaps
== NULL
);
273 RTEST(puvmList
== NULL
);
275 /* We do not retesting DD_HALINFO, instead we compare it */
276 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
278 /* Rember on some nivida drv the pCallBackFlags will not be set even they api exists in the drv
279 * known workaround is to check if the drv really return a kmode pointer for the drv functions
282 RTEST(pCallBackFlags
[0] != 0);
283 RTEST(pCallBackFlags
[1] != 0);
284 RTEST(pCallBackFlags
[2] == 0);
286 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, pCallBackFlags, D3dCallbacks, NULL, .... */
288 pCallBackFlags
= CallBackFlags
;
289 puD3dCallbacks
= &D3dCallbacks
;
291 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
292 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
294 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
295 pCallBackFlags
, puD3dCallbacks
,
296 puD3dDriverData
, puD3dBufferCallbacks
,
297 puD3dTextureFormats
, puNumHeaps
,
298 puvmList
, puNumFourCC
,
300 RTEST(pHalInfo
!= NULL
);
301 ASSERT(pHalInfo
!= NULL
);
303 RTEST(pCallBackFlags
!= NULL
);
304 ASSERT(pCallBackFlags
!= NULL
);
306 /* rember puD3dCallbacks shall never return NULL */
307 RTEST(puD3dCallbacks
!= NULL
);
308 ASSERT(puD3dCallbacks
!= NULL
);
310 /* the pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE will be ignore, only way detect it proper follow code,
311 * 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
312 * if it windows 2000 or windows xp/2003
314 RTEST(puD3dCallbacks
->dwSize
== sizeof(D3DNTHAL_CALLBACKS
));
316 /* Nivda like GF7900GS will not follow ms design rule here,
317 * ContextDestroyAll must alwyas be NULL for it is not longer inuse in windows 2000 and higher
319 RTEST(puD3dCallbacks
->ContextDestroyAll
== NULL
);
321 /* Nivda like GF7900GS will not follow ms design rule here,
322 * SceneCapture must alwyas be NULL for it is not longer inuse in windows 2000 and higher
324 RTEST(puD3dCallbacks
->SceneCapture
== NULL
);
325 RTEST(puD3dCallbacks
->dwReserved10
== 0);
326 RTEST(puD3dCallbacks
->dwReserved11
== 0);
327 RTEST(puD3dCallbacks
->dwReserved22
== 0);
328 RTEST(puD3dCallbacks
->dwReserved23
== 0);
329 RTEST(puD3dCallbacks
->dwReserved
== 0);
330 RTEST(puD3dCallbacks
->TextureCreate
== NULL
);
331 RTEST(puD3dCallbacks
->TextureDestroy
== NULL
);
332 RTEST(puD3dCallbacks
->TextureSwap
== NULL
);
333 RTEST(puD3dCallbacks
->TextureGetSurf
== NULL
);
334 RTEST(puD3dCallbacks
->dwReserved12
== 0);
335 RTEST(puD3dCallbacks
->dwReserved13
== 0);
336 RTEST(puD3dCallbacks
->dwReserved14
== 0);
337 RTEST(puD3dCallbacks
->dwReserved15
== 0);
338 RTEST(puD3dCallbacks
->dwReserved16
== 0);
339 RTEST(puD3dCallbacks
->dwReserved17
== 0);
340 RTEST(puD3dCallbacks
->dwReserved18
== 0);
341 RTEST(puD3dCallbacks
->dwReserved19
== 0);
342 RTEST(puD3dCallbacks
->dwReserved20
== 0);
343 RTEST(puD3dCallbacks
->dwReserved21
== 0);
344 RTEST(puD3dCallbacks
->dwReserved24
== 0);
345 RTEST(puD3dCallbacks
->dwReserved0
== 0);
346 RTEST(puD3dCallbacks
->dwReserved1
== 0);
347 RTEST(puD3dCallbacks
->dwReserved2
== 0);
348 RTEST(puD3dCallbacks
->dwReserved3
== 0);
349 RTEST(puD3dCallbacks
->dwReserved4
== 0);
350 RTEST(puD3dCallbacks
->dwReserved5
== 0);
351 RTEST(puD3dCallbacks
->dwReserved6
== 0);
352 RTEST(puD3dCallbacks
->dwReserved7
== 0);
353 RTEST(puD3dCallbacks
->dwReserved8
== 0);
354 RTEST(puD3dCallbacks
->dwReserved9
== 0);
356 /* how detect puD3dCallbacks->ContextCreate and puD3dCallbacks->ContextDestroy shall be set for bugi drv like nivda ? */
357 /* pointer direcly to the graphic drv, it is kmode pointer */
358 // RTEST( ( (DWORD)puD3dCallbacks->ContextCreate & (~0x80000000)) != 0 );
359 // RTEST( ( (DWORD)puD3dCallbacks->ContextDestroy & (~0x80000000)) != 0 );
361 RTEST(puD3dDriverData
== NULL
);
362 RTEST(puD3dBufferCallbacks
== NULL
);
363 RTEST(puD3dTextureFormats
== NULL
);
364 RTEST(puNumFourCC
== NULL
);
365 RTEST(puFourCC
== NULL
);
366 RTEST(puNumHeaps
== NULL
);
367 RTEST(puvmList
== NULL
);
369 /* We do not retesting DD_HALINFO, instead we compare it */
370 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
371 RTEST(pCallBackFlags
[0] != 0);
372 RTEST(pCallBackFlags
[1] != 0);
373 RTEST(pCallBackFlags
[2] == 0);
375 /* Backup D3DNTHAL_CALLBACKS so we do not need resting it */
376 RtlCopyMemory(&oldD3dCallbacks
, &D3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
379 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, NULL, */
381 pCallBackFlags
= CallBackFlags
;
382 puD3dCallbacks
= &D3dCallbacks
;
383 puD3dDriverData
= &D3dDriverData
;
385 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
386 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
387 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
389 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
390 pCallBackFlags
, puD3dCallbacks
,
391 puD3dDriverData
, puD3dBufferCallbacks
,
392 puD3dTextureFormats
, puNumHeaps
,
393 puvmList
, puNumFourCC
,
395 RTEST(pHalInfo
!= NULL
);
396 ASSERT(pHalInfo
!= NULL
);
398 RTEST(pCallBackFlags
!= NULL
);
399 ASSERT(pCallBackFlags
!= NULL
);
401 RTEST(puD3dCallbacks
!= NULL
);
402 ASSERT(puD3dCallbacks
!= NULL
);
404 RTEST(puD3dDriverData
!= NULL
);
405 ASSERT(puD3dDriverData
!= NULL
);
407 RTEST(puD3dBufferCallbacks
== NULL
);
408 RTEST(puD3dTextureFormats
== NULL
);
409 RTEST(puNumFourCC
== NULL
);
410 RTEST(puFourCC
== NULL
);
411 RTEST(puNumHeaps
== NULL
);
412 RTEST(puvmList
== NULL
);
414 /* We retesting pCallBackFlags */
415 RTEST(pCallBackFlags
[0] != 0);
416 RTEST(pCallBackFlags
[1] != 0);
417 RTEST(pCallBackFlags
[2] == 0);
419 /* We do not retesting instead we compare it */
420 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
421 RTEST(memcmp(&oldD3dCallbacks
, puD3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
)) == 0);
423 /* start test of puD3dDriverData */
425 RTEST(puD3dDriverData
->dwSize
== sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
426 RTEST(puD3dDriverData
->hwCaps
.dwSize
== sizeof(D3DNTHALDEVICEDESC_V1
));
427 RTEST(puD3dDriverData
->hwCaps
.dtcTransformCaps
.dwSize
== sizeof(D3DTRANSFORMCAPS
));
428 RTEST(puD3dDriverData
->hwCaps
.dlcLightingCaps
.dwSize
== sizeof(D3DLIGHTINGCAPS
));
429 RTEST(puD3dDriverData
->hwCaps
.dpcLineCaps
.dwSize
== sizeof(D3DPRIMCAPS
));
430 RTEST(puD3dDriverData
->hwCaps
.dpcTriCaps
.dwSize
== sizeof(D3DPRIMCAPS
));
431 RTEST(puD3dDriverData
->hwCaps
.dwMaxBufferSize
== 0);
432 RTEST(puD3dDriverData
->hwCaps
.dwMaxVertexCount
== 0);
434 /* Backup D3DHAL_GLOBALDRIVERDATA so we do not need resting it */
435 RtlCopyMemory(&oldD3dDriverData
, &D3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
437 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, NULL, */
439 pCallBackFlags
= CallBackFlags
;
440 puD3dCallbacks
= &D3dCallbacks
;
441 puD3dDriverData
= &D3dDriverData
;
442 puD3dBufferCallbacks
= &D3dBufferCallbacks
;
444 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
445 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
446 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
447 RtlZeroMemory(puD3dDriverData
,sizeof(D3DNTHAL_CALLBACKS
));
449 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
450 pCallBackFlags
, puD3dCallbacks
,
451 puD3dDriverData
, puD3dBufferCallbacks
,
452 puD3dTextureFormats
, puNumHeaps
,
453 puvmList
, puNumFourCC
,
455 RTEST(pHalInfo
!= NULL
);
456 RTEST(pCallBackFlags
!= NULL
);
458 if (pHalInfo
->ddCaps
.ddsCaps
.dwCaps
& DDSCAPS_3DDEVICE
)
460 RTEST(puD3dCallbacks
!= NULL
);
461 RTEST(puD3dDriverData
!= NULL
);
462 RTEST(puD3dBufferCallbacks
!= NULL
);
465 RTEST(pHalInfo
!= NULL
);
466 ASSERT(pHalInfo
!= NULL
);
468 RTEST(pCallBackFlags
!= NULL
);
469 ASSERT(pCallBackFlags
!= NULL
);
471 RTEST(puD3dCallbacks
!= NULL
);
472 ASSERT(puD3dCallbacks
!= NULL
);
474 RTEST(puD3dDriverData
!= NULL
);
475 ASSERT(puD3dDriverData
!= NULL
);
477 RTEST(puD3dBufferCallbacks
!= NULL
);
478 ASSERT(puD3dDriverData
!= NULL
);
480 RTEST(puD3dTextureFormats
== NULL
);
481 RTEST(puNumFourCC
== NULL
);
482 RTEST(puFourCC
== NULL
);
483 RTEST(puNumHeaps
== NULL
);
484 RTEST(puvmList
== NULL
);
486 /* We retesting the flags */
487 RTEST(pCallBackFlags
[0] != 0);
488 RTEST(pCallBackFlags
[1] != 0);
489 RTEST(pCallBackFlags
[2] == 0);
491 /* We do not retesting instead we compare it */
492 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
493 RTEST(memcmp(&oldD3dCallbacks
, puD3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
)) == 0);
494 RTEST(memcmp(&oldD3dDriverData
, puD3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
)) == 0);
496 /* start test of puD3dBufferCallbacks */
497 RTEST(puD3dBufferCallbacks
->dwSize
== sizeof(DD_D3DBUFCALLBACKS
));
498 if (puD3dBufferCallbacks
->dwFlags
& DDHAL_D3DBUFCB32_CANCREATED3DBUF
)
500 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
501 RTEST( ( (DWORD
)puD3dBufferCallbacks
->CanCreateD3DBuffer
& (~0x80000000)) != 0 );
505 RTEST( puD3dBufferCallbacks
->CanCreateD3DBuffer
== NULL
);
508 if (puD3dBufferCallbacks
->dwFlags
& DDHAL_D3DBUFCB32_CREATED3DBUF
)
510 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
511 RTEST( ( (DWORD
)puD3dBufferCallbacks
->CreateD3DBuffer
& (~0x80000000)) != 0 );
515 RTEST( puD3dBufferCallbacks
->CreateD3DBuffer
== NULL
);
518 if (puD3dBufferCallbacks
->dwFlags
& DDHAL_D3DBUFCB32_DESTROYD3DBUF
)
520 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
521 RTEST( ( (DWORD
)puD3dBufferCallbacks
->DestroyD3DBuffer
& (~0x80000000)) != 0 );
525 RTEST( puD3dBufferCallbacks
->DestroyD3DBuffer
== NULL
);
528 if (puD3dBufferCallbacks
->dwFlags
& DDHAL_D3DBUFCB32_LOCKD3DBUF
)
530 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
531 RTEST( ( (DWORD
)puD3dBufferCallbacks
->LockD3DBuffer
& (~0x80000000)) != 0 );
535 RTEST( puD3dBufferCallbacks
->LockD3DBuffer
== NULL
);
538 if (puD3dBufferCallbacks
->dwFlags
& DDHAL_D3DBUFCB32_UNLOCKD3DBUF
)
540 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
541 RTEST( ( (DWORD
)puD3dBufferCallbacks
->UnlockD3DBuffer
& (~0x80000000)) != 0 );
545 RTEST( puD3dBufferCallbacks
->UnlockD3DBuffer
== NULL
);
548 /* Backup DD_D3DBUFCALLBACKS so we do not need resting it */
549 RtlCopyMemory(&oldD3dBufferCallbacks
, &D3dBufferCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
552 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, NULL, */
554 pCallBackFlags
= CallBackFlags
;
555 puD3dCallbacks
= &D3dCallbacks
;
556 puD3dDriverData
= &D3dDriverData
;
557 puD3dBufferCallbacks
= &D3dBufferCallbacks
;
559 /* It is forbein to return a DDSURFACEDESC2 it should always be DDSURFACEDESC
560 This is only for detected bad drivers that does not follow the rules, if they
561 does not follow tthe rules, not everthing being copy then in gdi32.dll
562 gdi32.dll always assume it is DDSURFACEDESC size
564 if (puD3dDriverData
->dwNumTextureFormats
!= 0)
566 puD3dTextureFormats
= malloc (puD3dDriverData
->dwNumTextureFormats
* sizeof(DDSURFACEDESC2
));
569 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
570 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
571 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
572 RtlZeroMemory(puD3dDriverData
,sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
573 RtlZeroMemory(&D3dBufferCallbacks
,sizeof(DD_D3DBUFCALLBACKS
));
575 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
576 pCallBackFlags
, puD3dCallbacks
,
577 puD3dDriverData
, puD3dBufferCallbacks
,
578 puD3dTextureFormats
, puNumHeaps
,
579 puvmList
, puNumFourCC
,
582 RTEST(pHalInfo
!= NULL
);
583 ASSERT(pHalInfo
!= NULL
);
585 RTEST(pCallBackFlags
!= NULL
);
586 ASSERT(pCallBackFlags
!= NULL
);
588 RTEST(puD3dCallbacks
!= NULL
);
589 ASSERT(puD3dCallbacks
!= NULL
);
591 RTEST(puD3dDriverData
!= NULL
);
592 ASSERT(puD3dDriverData
!= NULL
);
594 RTEST(puD3dBufferCallbacks
!= NULL
);
595 ASSERT(puD3dDriverData
!= NULL
);
597 RTEST(puD3dTextureFormats
!= NULL
);
598 ASSERT(puD3dTextureFormats
!= NULL
);
600 RTEST(puNumFourCC
== NULL
);
601 RTEST(puFourCC
== NULL
);
602 RTEST(puNumHeaps
== NULL
);
603 RTEST(puvmList
== NULL
);
605 /* We retesting the flags */
606 RTEST(pCallBackFlags
[0] != 0);
607 RTEST(pCallBackFlags
[1] != 0);
608 RTEST(pCallBackFlags
[2] == 0);
610 /* We do not retesting instead we compare it */
611 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
612 RTEST(memcmp(&oldD3dCallbacks
, puD3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
)) == 0);
613 RTEST(memcmp(&oldD3dDriverData
, puD3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
)) == 0);
614 RTEST(memcmp(&oldD3dBufferCallbacks
, puD3dBufferCallbacks
, sizeof(DD_D3DBUFCALLBACKS
)) == 0);
616 /* start test of dwNumTextureFormats */
617 if (puD3dDriverData
->dwNumTextureFormats
!= 0)
619 myDesc
= puD3dTextureFormats
;
620 for (dwTextureCounter
=0;dwTextureCounter
<puD3dDriverData
->dwNumTextureFormats
;dwTextureCounter
++)
622 RTEST(myDesc
->dwSize
== sizeof(DDSURFACEDESC
));
623 ASSERT(myDesc
->dwSize
== sizeof(DDSURFACEDESC
));
625 RTEST( (myDesc
->dwFlags
& (~(DDSD_CAPS
|DDSD_PIXELFORMAT
))) == 0);
626 RTEST(myDesc
->dwHeight
== 0);
627 RTEST(myDesc
->dwWidth
== 0);
628 RTEST(myDesc
->dwLinearSize
== 0);
629 RTEST(myDesc
->dwBackBufferCount
== 0);
630 RTEST(myDesc
->dwZBufferBitDepth
== 0);
631 RTEST(myDesc
->dwAlphaBitDepth
== 0);
632 RTEST(myDesc
->dwReserved
== 0);
633 RTEST(myDesc
->lpSurface
== 0);
634 RTEST(myDesc
->ddckCKDestOverlay
.dwColorSpaceLowValue
== 0);
635 RTEST(myDesc
->ddckCKDestOverlay
.dwColorSpaceHighValue
== 0);
636 RTEST(myDesc
->ddckCKDestBlt
.dwColorSpaceLowValue
== 0);
637 RTEST(myDesc
->ddckCKDestBlt
.dwColorSpaceHighValue
== 0);
638 RTEST(myDesc
->ddckCKSrcOverlay
.dwColorSpaceLowValue
== 0);
639 RTEST(myDesc
->ddckCKSrcOverlay
.dwColorSpaceHighValue
== 0);
640 RTEST(myDesc
->ddckCKSrcBlt
.dwColorSpaceLowValue
== 0);
641 RTEST(myDesc
->ddckCKSrcBlt
.dwColorSpaceHighValue
== 0);
642 RTEST(myDesc
->ddpfPixelFormat
.dwSize
== sizeof(DDPIXELFORMAT
));
643 RTEST(myDesc
->ddpfPixelFormat
.dwFlags
!= 0);
644 if (myDesc
->ddpfPixelFormat
.dwFlags
& DDPF_FOURCC
)
646 RTEST(myDesc
->ddpfPixelFormat
.dwFourCC
!= 0);
648 RTEST(myDesc
->ddsCaps
.dwCaps
== DDSCAPS_TEXTURE
);
650 myDesc
= (DDSURFACEDESC
*) (((DWORD
) myDesc
) + sizeof(DDSURFACEDESC
));
655 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, puNumHeaps, NULL, */
657 pCallBackFlags
= CallBackFlags
;
658 puD3dCallbacks
= &D3dCallbacks
;
659 puD3dDriverData
= &D3dDriverData
;
660 puD3dBufferCallbacks
= &D3dBufferCallbacks
;
661 puNumHeaps
= &NumHeaps
;
663 if (puD3dDriverData
->dwNumTextureFormats
!= 0)
665 RtlZeroMemory(puD3dTextureFormats
, puD3dDriverData
->dwNumTextureFormats
* sizeof(DDSURFACEDESC2
));
667 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
668 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
669 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
670 RtlZeroMemory(puD3dDriverData
,sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
671 RtlZeroMemory(&D3dBufferCallbacks
,sizeof(DD_D3DBUFCALLBACKS
));
673 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
674 pCallBackFlags
, puD3dCallbacks
,
675 puD3dDriverData
, puD3dBufferCallbacks
,
676 puD3dTextureFormats
, puNumHeaps
,
677 puvmList
, puNumFourCC
,
680 RTEST(pHalInfo
!= NULL
);
681 ASSERT(pHalInfo
!= NULL
);
683 RTEST(pCallBackFlags
!= NULL
);
684 ASSERT(pCallBackFlags
!= NULL
);
686 RTEST(puD3dCallbacks
!= NULL
);
687 ASSERT(puD3dCallbacks
!= NULL
);
689 RTEST(puD3dDriverData
!= NULL
);
690 ASSERT(puD3dDriverData
!= NULL
);
692 RTEST(puD3dBufferCallbacks
!= NULL
);
693 ASSERT(puD3dDriverData
!= NULL
);
695 RTEST(puD3dTextureFormats
!= NULL
);
696 ASSERT(puD3dTextureFormats
!= NULL
);
698 RTEST(puNumHeaps
!= NULL
);
699 ASSERT(puNumHeaps
!= NULL
);
700 RTEST(NumHeaps
== 0);
702 RTEST(puNumFourCC
== NULL
);
703 RTEST(puFourCC
== NULL
);
705 RTEST(puvmList
== NULL
);
707 /* We retesting the flags */
708 RTEST(pCallBackFlags
[0] != 0);
709 RTEST(pCallBackFlags
[1] != 0);
710 RTEST(pCallBackFlags
[2] == 0);
712 /* We do not retesting instead we compare it */
713 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
714 RTEST(memcmp(&oldD3dCallbacks
, puD3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
)) == 0);
715 RTEST(memcmp(&oldD3dDriverData
, puD3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
)) == 0);
716 RTEST(memcmp(&oldD3dBufferCallbacks
, puD3dBufferCallbacks
, sizeof(DD_D3DBUFCALLBACKS
)) == 0);
717 /* we skip resting texture */
720 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, puNumHeaps, puvmList, NULL, */
722 pCallBackFlags
= CallBackFlags
;
723 puD3dCallbacks
= &D3dCallbacks
;
724 puD3dDriverData
= &D3dDriverData
;
725 puD3dBufferCallbacks
= &D3dBufferCallbacks
;
726 puNumHeaps
= &NumHeaps
;
729 if (puD3dDriverData
->dwNumTextureFormats
!= 0)
731 RtlZeroMemory(puD3dTextureFormats
, puD3dDriverData
->dwNumTextureFormats
* sizeof(DDSURFACEDESC2
));
733 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
734 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
735 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
736 RtlZeroMemory(puD3dDriverData
,sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
737 RtlZeroMemory(&D3dBufferCallbacks
,sizeof(DD_D3DBUFCALLBACKS
));
739 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
740 pCallBackFlags
, puD3dCallbacks
,
741 puD3dDriverData
, puD3dBufferCallbacks
,
742 puD3dTextureFormats
, puNumHeaps
,
743 puvmList
, puNumFourCC
,
746 RTEST(pHalInfo
!= NULL
);
747 ASSERT(pHalInfo
!= NULL
);
749 RTEST(pCallBackFlags
!= NULL
);
750 ASSERT(pCallBackFlags
!= NULL
);
752 RTEST(puD3dCallbacks
!= NULL
);
753 ASSERT(puD3dCallbacks
!= NULL
);
755 RTEST(puD3dDriverData
!= NULL
);
756 ASSERT(puD3dDriverData
!= NULL
);
758 RTEST(puD3dBufferCallbacks
!= NULL
);
759 ASSERT(puD3dDriverData
!= NULL
);
761 RTEST(puD3dTextureFormats
!= NULL
);
762 ASSERT(puD3dTextureFormats
!= NULL
);
764 RTEST(puNumHeaps
!= NULL
);
765 ASSERT(puNumHeaps
!= NULL
);
766 RTEST(NumHeaps
== 0);
768 RTEST(puvmList
!= NULL
);
770 RTEST(puNumFourCC
== NULL
);
771 RTEST(puFourCC
== NULL
);
775 /* We retesting the flags */
776 RTEST(pCallBackFlags
[0] != 0);
777 RTEST(pCallBackFlags
[1] != 0);
778 RTEST(pCallBackFlags
[2] == 0);
780 /* We do not retesting instead we compare it */
781 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
782 RTEST(memcmp(&oldD3dCallbacks
, puD3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
)) == 0);
783 RTEST(memcmp(&oldD3dDriverData
, puD3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
)) == 0);
784 RTEST(memcmp(&oldD3dBufferCallbacks
, puD3dBufferCallbacks
, sizeof(DD_D3DBUFCALLBACKS
)) == 0);
785 /* we skip resting texture */
793 /* Cleanup ReactX setup */
795 NtGdiDdDeleteDirectDrawObject(hDirectDraw
);