2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for NtGdiDdCreateDirectDrawObject
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
16 START_TEST(NtGdiDdQueryDirectDrawObject
)
18 HANDLE hDirectDraw
= NULL
;
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
;
31 DD_HALINFO oldHalInfo
;
32 DWORD CallBackFlags
[4];
34 D3DNTHAL_CALLBACKS D3dCallbacks
;
35 D3DNTHAL_CALLBACKS oldD3dCallbacks
;
37 D3DNTHAL_GLOBALDRIVERDATA D3dDriverData
;
38 D3DNTHAL_GLOBALDRIVERDATA oldD3dDriverData
;
40 DD_D3DBUFCALLBACKS D3dBufferCallbacks
;
41 DD_D3DBUFCALLBACKS oldD3dBufferCallbacks
;
43 DDSURFACEDESC2 D3dTextureFormats
[100];
46 //DWORD NumFourCC = 0;
51 DWORD dwTextureCounter
= 0;
52 DDSURFACEDESC
*myDesc
= NULL
;
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);
63 /* Get current display mode */
64 EnumDisplaySettingsA(NULL
, ENUM_CURRENT_SETTINGS
, &devmode
);
66 /* Create hdc that we can use */
67 hdc
= CreateDCW(L
"DISPLAY", NULL
, NULL
, NULL
);
71 /* Create ReactX handle */
72 hDirectDraw
= (HANDLE
) NtGdiDdCreateDirectDrawObject(hdc
);
73 RTEST(hDirectDraw
!= NULL
);
74 if (hDirectDraw
== NULL
)
80 /* Start Test ReactX NtGdiDdQueryDirectDrawObject function */
82 /* testing OsThunkDdQueryDirectDrawObject( NULL, .... */
83 RTEST(NtGdiDdQueryDirectDrawObject( NULL
, pHalInfo
,
84 pCallBackFlags
, puD3dCallbacks
,
85 puD3dDriverData
, puD3dBufferCallbacks
,
86 puD3dTextureFormats
, puNumHeaps
,
87 puvmList
, puNumFourCC
,
90 RTEST(pHalInfo
== NULL
);
91 RTEST(pCallBackFlags
== NULL
);
92 RTEST(puD3dCallbacks
== NULL
);
93 RTEST(puD3dDriverData
== NULL
);
94 RTEST(puD3dBufferCallbacks
== NULL
);
95 RTEST(puD3dTextureFormats
== NULL
);
96 RTEST(puNumFourCC
== NULL
);
97 RTEST(puFourCC
== NULL
);
98 RTEST(puNumHeaps
== NULL
);
99 RTEST(puvmList
== NULL
);
101 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, NULL, .... */
102 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
103 pCallBackFlags
, puD3dCallbacks
,
104 puD3dDriverData
, puD3dBufferCallbacks
,
105 puD3dTextureFormats
, puNumHeaps
,
106 puvmList
, puNumFourCC
,
109 RTEST(pHalInfo
== NULL
);
110 RTEST(pCallBackFlags
== NULL
);
111 RTEST(puD3dCallbacks
== NULL
);
112 RTEST(puD3dDriverData
== NULL
);
113 RTEST(puD3dBufferCallbacks
== NULL
);
114 RTEST(puD3dTextureFormats
== NULL
);
115 RTEST(puNumFourCC
== NULL
);
116 RTEST(puFourCC
== NULL
);
117 RTEST(puNumHeaps
== NULL
);
118 RTEST(puvmList
== NULL
);
120 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, NULL, .... */
122 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
123 pCallBackFlags
, puD3dCallbacks
,
124 puD3dDriverData
, puD3dBufferCallbacks
,
125 puD3dTextureFormats
, puNumHeaps
,
126 puvmList
, puNumFourCC
,
129 RTEST(pHalInfo
!= NULL
);
130 ASSERT(pHalInfo
!= NULL
);
132 RTEST(pCallBackFlags
== NULL
);
133 RTEST(puD3dCallbacks
== NULL
);
134 RTEST(puD3dDriverData
== NULL
);
135 RTEST(puD3dBufferCallbacks
== NULL
);
136 RTEST(puD3dTextureFormats
== NULL
);
137 RTEST(puNumFourCC
== NULL
);
138 RTEST(puFourCC
== NULL
);
139 RTEST(puNumHeaps
== NULL
);
140 RTEST(puvmList
== NULL
);
142 if ((pHalInfo
->dwSize
!= sizeof(DD_HALINFO
)) &&
143 (pHalInfo
->dwSize
!= sizeof(DD_HALINFO_V4
)))
145 RTEST(pHalInfo
->dwSize
!= sizeof(DD_HALINFO
));
146 ASSERT(pHalInfo
->dwSize
!= sizeof(DD_HALINFO
));
149 if (pHalInfo
->dwSize
== sizeof(DD_HALINFO
))
151 /*the offset, in bytes, to primary surface in the display memory */
152 /* some graphic card like sis 760 GX, Nvida GF7900GS does not set any offset at all */
153 // RTEST(pHalInfo->vmiData.fpPrimary != 0 );
155 /* unsuse always 0 */
156 RTEST(pHalInfo
->vmiData
.dwFlags
== 0 );
159 RTEST(pHalInfo
->vmiData
.dwDisplayWidth
== devmode
.dmPelsWidth
);
160 RTEST(pHalInfo
->vmiData
.dwDisplayHeight
== devmode
.dmPelsHeight
);
162 /* This can never be test for it is who big the line is after it been align displayPitch */
163 RTEST(pHalInfo
->vmiData
.lDisplayPitch
!= 0);
165 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwSize
== sizeof(DDPIXELFORMAT
) );
166 ASSERT(pHalInfo
->vmiData
.ddpfDisplay
.dwSize
== sizeof(DDPIXELFORMAT
));
168 /* We can not check if it DDPF_RGB flags been set for primary surface
169 * for it can be DDPF_PALETTEINDEXED1,DDPF_PALETTEINDEXED2,DDPF_PALETTEINDEXED4,DDPF_PALETTEINDEXED8, DDPF_PALETTEINDEXEDTO8, DDPF_RGB, DDPF_YUV
171 RTEST( (pHalInfo
->vmiData
.ddpfDisplay
.dwFlags
& (DDPF_PALETTEINDEXED1
| DDPF_PALETTEINDEXED2
| DDPF_PALETTEINDEXED4
|
172 DDPF_PALETTEINDEXED8
| DDPF_PALETTEINDEXEDTO8
| DDPF_RGB
| DDPF_YUV
)) != 0);
175 /* No fourcc are use on primary screen */
176 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwFourCC
== 0 );
178 /* Count RGB Bits 8/16/24/32 */
179 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwRGBBitCount
== devmode
.dmBitsPerPel
);
181 /* 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
182 * But the mask can never be Zero
184 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwRBitMask
!= 0 );
185 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwGBitMask
!= 0 );
186 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwBBitMask
!= 0 );
188 /* primary never set the alpha blend mask */
189 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwRGBAlphaBitMask
== 0 );
191 /* This can not be test at usermode it is each hardware drv that fill in it,
192 * only way to found them is to use this call */
193 // pHalInfo->vmiData->dwOffscreenAlign
194 // pHalInfo->vmiData->dwOverlayAlign
195 // pHalInfo->vmiData->dwTextureAlign
196 // pHalInfo->vmiData->dwZBufferAlign
197 // pHalInfo->vmiData->dwAlphaAlign
199 /* the primary display address */
200 RTEST( ( (DWORD
)pHalInfo
->vmiData
.pvPrimary
& (~0x80000000)) != 0 );
202 /* test see if we got back the pvmList here
203 * acording msdn vmiData.dwNumHeaps and vmiData.pvmList
204 * exists for _VIDEOMEMORYINFO but they do not, it reviews
205 * in ddk and wdk and own testcase
207 // RTEST(pHalInfo->vmiData.dwNumHeaps != 0 );
208 // RTEST(pHalInfo->vmiData.pvmList != 0 );
210 /* Test see if we got any hardware acclartions for 2d or 3d, this always fill in
211 * that mean we found a bugi drv and dx does not work on this drv
214 /* the SIS 760 GX will never fill it in, it is a bugi drv */
215 RTEST(pHalInfo
->ddCaps
.dwSize
== sizeof(DDCORECAPS
));
217 /* Testing see if we got any hw support for
218 * This test can fail on video card that does not support 2d/overlay/3d
220 RTEST( pHalInfo
->ddCaps
.dwCaps
!= 0);
221 RTEST( pHalInfo
->ddCaps
.ddsCaps
.dwCaps
!= 0);
223 /* This flags is obsolete and should not be used by the driver */
224 RTEST( pHalInfo
->ddCaps
.dwFXAlphaCaps
== 0);
227 /* basic dx 2 is found if this flags not set
228 * if this fail we do not have a dx driver install acodring ms, some version of windows it
229 * is okay this fail and drv does then only support basic dx
232 if (pHalInfo
->dwFlags
!= 0)
234 RTEST( (pHalInfo
->dwFlags
& (DDHALINFO_GETDRIVERINFOSET
| DDHALINFO_GETDRIVERINFO2
)) != 0 );
235 RTEST( ( (DWORD
)pHalInfo
->GetDriverInfo
& 0x80000000) != 0 );
236 ASSERT( ((DWORD
)pHalInfo
->GetDriverInfo
& 0x80000000) != 0 );
239 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
242 /* the pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE will be ignore, only way detect it proper follow code,
243 * 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
244 * if it windows 2000 or windows xp/2003
246 * point to kmode direcly to the win32k.sys, win32k.sys is kmode and it is kmode address we getting back
248 RTEST( ( (DWORD
)pHalInfo
->lpD3DGlobalDriverData
& (~0x80000000)) != 0 );
249 RTEST( ( (DWORD
)pHalInfo
->lpD3DHALCallbacks
& (~0x80000000)) != 0 );
250 RTEST( ( (DWORD
)pHalInfo
->lpD3DHALCallbacks
& (~0x80000000)) != 0 );
253 /* Backup DD_HALINFO so we do not need resting it */
254 RtlCopyMemory(&oldHalInfo
, &HalInfo
, sizeof(DD_HALINFO
));
256 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, pCallBackFlags, NULL, .... */
258 pCallBackFlags
= CallBackFlags
;
259 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
261 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
262 pCallBackFlags
, puD3dCallbacks
,
263 puD3dDriverData
, puD3dBufferCallbacks
,
264 puD3dTextureFormats
, puNumHeaps
,
265 puvmList
, puNumFourCC
,
267 RTEST(pHalInfo
!= NULL
);
268 ASSERT(pHalInfo
!= NULL
);
270 RTEST(pCallBackFlags
!= NULL
);
271 ASSERT(pCallBackFlags
!= NULL
);
273 RTEST(puD3dCallbacks
== NULL
);
274 RTEST(puD3dDriverData
== NULL
);
275 RTEST(puD3dBufferCallbacks
== NULL
);
276 RTEST(puD3dTextureFormats
== NULL
);
277 RTEST(puNumFourCC
== NULL
);
278 RTEST(puFourCC
== NULL
);
279 RTEST(puNumHeaps
== NULL
);
280 RTEST(puvmList
== NULL
);
282 /* We do not retesting DD_HALINFO, instead we compare it */
283 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
285 /* Rember on some nivida drv the pCallBackFlags will not be set even they api exists in the drv
286 * known workaround is to check if the drv really return a kmode pointer for the drv functions
289 RTEST(pCallBackFlags
[0] != 0);
290 RTEST(pCallBackFlags
[1] != 0);
291 RTEST(pCallBackFlags
[2] == 0);
293 /* testing NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, pCallBackFlags, D3dCallbacks, NULL, .... */
295 pCallBackFlags
= CallBackFlags
;
296 puD3dCallbacks
= &D3dCallbacks
;
298 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
299 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
301 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
302 pCallBackFlags
, puD3dCallbacks
,
303 puD3dDriverData
, puD3dBufferCallbacks
,
304 puD3dTextureFormats
, puNumHeaps
,
305 puvmList
, puNumFourCC
,
307 RTEST(pHalInfo
!= NULL
);
308 ASSERT(pHalInfo
!= NULL
);
310 RTEST(pCallBackFlags
!= NULL
);
311 ASSERT(pCallBackFlags
!= NULL
);
313 /* rember puD3dCallbacks shall never return NULL */
314 RTEST(puD3dCallbacks
!= NULL
);
315 ASSERT(puD3dCallbacks
!= NULL
);
317 /* the pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE will be ignore, only way detect it proper follow code,
318 * 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
319 * if it windows 2000 or windows xp/2003
321 RTEST(puD3dCallbacks
->dwSize
== sizeof(D3DNTHAL_CALLBACKS
));
323 /* Nivda like GF7900GS will not follow ms design rule here,
324 * ContextDestroyAll must alwyas be NULL for it is not longer inuse in windows 2000 and higher
326 RTEST(puD3dCallbacks
->ContextDestroyAll
== NULL
);
328 /* Nivda like GF7900GS will not follow ms design rule here,
329 * SceneCapture must alwyas be NULL for it is not longer inuse in windows 2000 and higher
331 RTEST(puD3dCallbacks
->SceneCapture
== NULL
);
332 RTEST(puD3dCallbacks
->dwReserved10
== 0);
333 RTEST(puD3dCallbacks
->dwReserved11
== 0);
334 RTEST(puD3dCallbacks
->dwReserved22
== 0);
335 RTEST(puD3dCallbacks
->dwReserved23
== 0);
336 RTEST(puD3dCallbacks
->dwReserved
== 0);
337 RTEST(puD3dCallbacks
->TextureCreate
== NULL
);
338 RTEST(puD3dCallbacks
->TextureDestroy
== NULL
);
339 RTEST(puD3dCallbacks
->TextureSwap
== NULL
);
340 RTEST(puD3dCallbacks
->TextureGetSurf
== NULL
);
341 RTEST(puD3dCallbacks
->dwReserved12
== 0);
342 RTEST(puD3dCallbacks
->dwReserved13
== 0);
343 RTEST(puD3dCallbacks
->dwReserved14
== 0);
344 RTEST(puD3dCallbacks
->dwReserved15
== 0);
345 RTEST(puD3dCallbacks
->dwReserved16
== 0);
346 RTEST(puD3dCallbacks
->dwReserved17
== 0);
347 RTEST(puD3dCallbacks
->dwReserved18
== 0);
348 RTEST(puD3dCallbacks
->dwReserved19
== 0);
349 RTEST(puD3dCallbacks
->dwReserved20
== 0);
350 RTEST(puD3dCallbacks
->dwReserved21
== 0);
351 RTEST(puD3dCallbacks
->dwReserved24
== 0);
352 RTEST(puD3dCallbacks
->dwReserved0
== 0);
353 RTEST(puD3dCallbacks
->dwReserved1
== 0);
354 RTEST(puD3dCallbacks
->dwReserved2
== 0);
355 RTEST(puD3dCallbacks
->dwReserved3
== 0);
356 RTEST(puD3dCallbacks
->dwReserved4
== 0);
357 RTEST(puD3dCallbacks
->dwReserved5
== 0);
358 RTEST(puD3dCallbacks
->dwReserved6
== 0);
359 RTEST(puD3dCallbacks
->dwReserved7
== 0);
360 RTEST(puD3dCallbacks
->dwReserved8
== 0);
361 RTEST(puD3dCallbacks
->dwReserved9
== 0);
363 /* how detect puD3dCallbacks->ContextCreate and puD3dCallbacks->ContextDestroy shall be set for bugi drv like nivda ? */
364 /* pointer direcly to the graphic drv, it is kmode pointer */
365 // RTEST( ( (DWORD)puD3dCallbacks->ContextCreate & (~0x80000000)) != 0 );
366 // RTEST( ( (DWORD)puD3dCallbacks->ContextDestroy & (~0x80000000)) != 0 );
368 RTEST(puD3dDriverData
== NULL
);
369 RTEST(puD3dBufferCallbacks
== NULL
);
370 RTEST(puD3dTextureFormats
== NULL
);
371 RTEST(puNumFourCC
== NULL
);
372 RTEST(puFourCC
== NULL
);
373 RTEST(puNumHeaps
== NULL
);
374 RTEST(puvmList
== NULL
);
376 /* We do not retesting DD_HALINFO, instead we compare it */
377 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
378 RTEST(pCallBackFlags
[0] != 0);
379 RTEST(pCallBackFlags
[1] != 0);
380 RTEST(pCallBackFlags
[2] == 0);
382 /* Backup D3DNTHAL_CALLBACKS so we do not need resting it */
383 RtlCopyMemory(&oldD3dCallbacks
, &D3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
386 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, NULL, */
388 pCallBackFlags
= CallBackFlags
;
389 puD3dCallbacks
= &D3dCallbacks
;
390 puD3dDriverData
= &D3dDriverData
;
392 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
393 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
394 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
396 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
397 pCallBackFlags
, puD3dCallbacks
,
398 puD3dDriverData
, puD3dBufferCallbacks
,
399 puD3dTextureFormats
, puNumHeaps
,
400 puvmList
, puNumFourCC
,
402 RTEST(pHalInfo
!= NULL
);
403 ASSERT(pHalInfo
!= NULL
);
405 RTEST(pCallBackFlags
!= NULL
);
406 ASSERT(pCallBackFlags
!= NULL
);
408 RTEST(puD3dCallbacks
!= NULL
);
409 ASSERT(puD3dCallbacks
!= NULL
);
411 RTEST(puD3dDriverData
!= NULL
);
412 ASSERT(puD3dDriverData
!= NULL
);
414 RTEST(puD3dBufferCallbacks
== NULL
);
415 RTEST(puD3dTextureFormats
== NULL
);
416 RTEST(puNumFourCC
== NULL
);
417 RTEST(puFourCC
== NULL
);
418 RTEST(puNumHeaps
== NULL
);
419 RTEST(puvmList
== NULL
);
421 /* We retesting pCallBackFlags */
422 RTEST(pCallBackFlags
[0] != 0);
423 RTEST(pCallBackFlags
[1] != 0);
424 RTEST(pCallBackFlags
[2] == 0);
426 /* We do not retesting instead we compare it */
427 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
428 RTEST(memcmp(&oldD3dCallbacks
, puD3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
)) == 0);
430 /* start test of puD3dDriverData */
432 RTEST(puD3dDriverData
->dwSize
== sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
433 RTEST(puD3dDriverData
->hwCaps
.dwSize
== sizeof(D3DNTHALDEVICEDESC_V1
));
434 RTEST(puD3dDriverData
->hwCaps
.dtcTransformCaps
.dwSize
== sizeof(D3DTRANSFORMCAPS
));
435 RTEST(puD3dDriverData
->hwCaps
.dlcLightingCaps
.dwSize
== sizeof(D3DLIGHTINGCAPS
));
436 RTEST(puD3dDriverData
->hwCaps
.dpcLineCaps
.dwSize
== sizeof(D3DPRIMCAPS
));
437 RTEST(puD3dDriverData
->hwCaps
.dpcTriCaps
.dwSize
== sizeof(D3DPRIMCAPS
));
438 RTEST(puD3dDriverData
->hwCaps
.dwMaxBufferSize
== 0);
439 RTEST(puD3dDriverData
->hwCaps
.dwMaxVertexCount
== 0);
441 /* Backup D3DHAL_GLOBALDRIVERDATA so we do not need resting it */
442 RtlCopyMemory(&oldD3dDriverData
, &D3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
444 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, NULL, */
446 pCallBackFlags
= CallBackFlags
;
447 puD3dCallbacks
= &D3dCallbacks
;
448 puD3dDriverData
= &D3dDriverData
;
449 puD3dBufferCallbacks
= &D3dBufferCallbacks
;
451 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
452 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
453 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
454 RtlZeroMemory(puD3dDriverData
,sizeof(D3DNTHAL_CALLBACKS
));
456 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
457 pCallBackFlags
, puD3dCallbacks
,
458 puD3dDriverData
, puD3dBufferCallbacks
,
459 puD3dTextureFormats
, puNumHeaps
,
460 puvmList
, puNumFourCC
,
462 RTEST(pHalInfo
!= NULL
);
463 RTEST(pCallBackFlags
!= NULL
);
465 if (pHalInfo
->ddCaps
.ddsCaps
.dwCaps
& DDSCAPS_3DDEVICE
)
467 RTEST(puD3dCallbacks
!= NULL
);
468 RTEST(puD3dDriverData
!= NULL
);
469 RTEST(puD3dBufferCallbacks
!= NULL
);
472 RTEST(pHalInfo
!= NULL
);
473 ASSERT(pHalInfo
!= NULL
);
475 RTEST(pCallBackFlags
!= NULL
);
476 ASSERT(pCallBackFlags
!= NULL
);
478 RTEST(puD3dCallbacks
!= NULL
);
479 ASSERT(puD3dCallbacks
!= NULL
);
481 RTEST(puD3dDriverData
!= NULL
);
482 ASSERT(puD3dDriverData
!= NULL
);
484 RTEST(puD3dBufferCallbacks
!= NULL
);
485 ASSERT(puD3dDriverData
!= NULL
);
487 RTEST(puD3dTextureFormats
== NULL
);
488 RTEST(puNumFourCC
== NULL
);
489 RTEST(puFourCC
== NULL
);
490 RTEST(puNumHeaps
== NULL
);
491 RTEST(puvmList
== NULL
);
493 /* We retesting the flags */
494 RTEST(pCallBackFlags
[0] != 0);
495 RTEST(pCallBackFlags
[1] != 0);
496 RTEST(pCallBackFlags
[2] == 0);
498 /* We do not retesting instead we compare it */
499 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
500 RTEST(memcmp(&oldD3dCallbacks
, puD3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
)) == 0);
501 RTEST(memcmp(&oldD3dDriverData
, puD3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
)) == 0);
503 /* start test of puD3dBufferCallbacks */
504 RTEST(puD3dBufferCallbacks
->dwSize
== sizeof(DD_D3DBUFCALLBACKS
));
505 if (puD3dBufferCallbacks
->dwFlags
& DDHAL_D3DBUFCB32_CANCREATED3DBUF
)
507 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
508 RTEST( ( (DWORD
)puD3dBufferCallbacks
->CanCreateD3DBuffer
& (~0x80000000)) != 0 );
512 RTEST( puD3dBufferCallbacks
->CanCreateD3DBuffer
== NULL
);
515 if (puD3dBufferCallbacks
->dwFlags
& DDHAL_D3DBUFCB32_CREATED3DBUF
)
517 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
518 RTEST( ( (DWORD
)puD3dBufferCallbacks
->CreateD3DBuffer
& (~0x80000000)) != 0 );
522 RTEST( puD3dBufferCallbacks
->CreateD3DBuffer
== NULL
);
525 if (puD3dBufferCallbacks
->dwFlags
& DDHAL_D3DBUFCB32_DESTROYD3DBUF
)
527 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
528 RTEST( ( (DWORD
)puD3dBufferCallbacks
->DestroyD3DBuffer
& (~0x80000000)) != 0 );
532 RTEST( puD3dBufferCallbacks
->DestroyD3DBuffer
== NULL
);
535 if (puD3dBufferCallbacks
->dwFlags
& DDHAL_D3DBUFCB32_LOCKD3DBUF
)
537 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
538 RTEST( ( (DWORD
)puD3dBufferCallbacks
->LockD3DBuffer
& (~0x80000000)) != 0 );
542 RTEST( puD3dBufferCallbacks
->LockD3DBuffer
== NULL
);
545 if (puD3dBufferCallbacks
->dwFlags
& DDHAL_D3DBUFCB32_UNLOCKD3DBUF
)
547 /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
548 RTEST( ( (DWORD
)puD3dBufferCallbacks
->UnlockD3DBuffer
& (~0x80000000)) != 0 );
552 RTEST( puD3dBufferCallbacks
->UnlockD3DBuffer
== NULL
);
555 /* Backup DD_D3DBUFCALLBACKS so we do not need resting it */
556 RtlCopyMemory(&oldD3dBufferCallbacks
, &D3dBufferCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
559 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, NULL, */
561 pCallBackFlags
= CallBackFlags
;
562 puD3dCallbacks
= &D3dCallbacks
;
563 puD3dDriverData
= &D3dDriverData
;
564 puD3dBufferCallbacks
= &D3dBufferCallbacks
;
566 /* It is forbein to return a DDSURFACEDESC2 it should always be DDSURFACEDESC
567 This is only for detected bad drivers that does not follow the rules, if they
568 does not follow tthe rules, not everthing being copy then in gdi32.dll
569 gdi32.dll always assume it is DDSURFACEDESC size
571 if (puD3dDriverData
->dwNumTextureFormats
!= 0)
573 puD3dTextureFormats
= malloc (puD3dDriverData
->dwNumTextureFormats
* sizeof(DDSURFACEDESC2
));
576 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
577 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
578 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
579 RtlZeroMemory(puD3dDriverData
,sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
580 RtlZeroMemory(&D3dBufferCallbacks
,sizeof(DD_D3DBUFCALLBACKS
));
582 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
583 pCallBackFlags
, puD3dCallbacks
,
584 puD3dDriverData
, puD3dBufferCallbacks
,
585 puD3dTextureFormats
, puNumHeaps
,
586 puvmList
, puNumFourCC
,
589 RTEST(pHalInfo
!= NULL
);
590 ASSERT(pHalInfo
!= NULL
);
592 RTEST(pCallBackFlags
!= NULL
);
593 ASSERT(pCallBackFlags
!= NULL
);
595 RTEST(puD3dCallbacks
!= NULL
);
596 ASSERT(puD3dCallbacks
!= NULL
);
598 RTEST(puD3dDriverData
!= NULL
);
599 ASSERT(puD3dDriverData
!= NULL
);
601 RTEST(puD3dBufferCallbacks
!= NULL
);
602 ASSERT(puD3dDriverData
!= NULL
);
604 RTEST(puD3dTextureFormats
!= NULL
);
605 ASSERT(puD3dTextureFormats
!= NULL
);
607 RTEST(puNumFourCC
== NULL
);
608 RTEST(puFourCC
== NULL
);
609 RTEST(puNumHeaps
== NULL
);
610 RTEST(puvmList
== NULL
);
612 /* We retesting the flags */
613 RTEST(pCallBackFlags
[0] != 0);
614 RTEST(pCallBackFlags
[1] != 0);
615 RTEST(pCallBackFlags
[2] == 0);
617 /* We do not retesting instead we compare it */
618 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
619 RTEST(memcmp(&oldD3dCallbacks
, puD3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
)) == 0);
620 RTEST(memcmp(&oldD3dDriverData
, puD3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
)) == 0);
621 RTEST(memcmp(&oldD3dBufferCallbacks
, puD3dBufferCallbacks
, sizeof(DD_D3DBUFCALLBACKS
)) == 0);
623 /* start test of dwNumTextureFormats */
624 if (puD3dDriverData
->dwNumTextureFormats
!= 0)
626 myDesc
= puD3dTextureFormats
;
627 for (dwTextureCounter
=0;dwTextureCounter
<puD3dDriverData
->dwNumTextureFormats
;dwTextureCounter
++)
629 RTEST(myDesc
->dwSize
== sizeof(DDSURFACEDESC
));
630 ASSERT(myDesc
->dwSize
== sizeof(DDSURFACEDESC
));
632 RTEST( (myDesc
->dwFlags
& (~(DDSD_CAPS
|DDSD_PIXELFORMAT
))) == 0);
633 RTEST(myDesc
->dwHeight
== 0);
634 RTEST(myDesc
->dwWidth
== 0);
635 RTEST(myDesc
->dwLinearSize
== 0);
636 RTEST(myDesc
->dwBackBufferCount
== 0);
637 RTEST(myDesc
->dwZBufferBitDepth
== 0);
638 RTEST(myDesc
->dwAlphaBitDepth
== 0);
639 RTEST(myDesc
->dwReserved
== 0);
640 RTEST(myDesc
->lpSurface
== 0);
641 RTEST(myDesc
->ddckCKDestOverlay
.dwColorSpaceLowValue
== 0);
642 RTEST(myDesc
->ddckCKDestOverlay
.dwColorSpaceHighValue
== 0);
643 RTEST(myDesc
->ddckCKDestBlt
.dwColorSpaceLowValue
== 0);
644 RTEST(myDesc
->ddckCKDestBlt
.dwColorSpaceHighValue
== 0);
645 RTEST(myDesc
->ddckCKSrcOverlay
.dwColorSpaceLowValue
== 0);
646 RTEST(myDesc
->ddckCKSrcOverlay
.dwColorSpaceHighValue
== 0);
647 RTEST(myDesc
->ddckCKSrcBlt
.dwColorSpaceLowValue
== 0);
648 RTEST(myDesc
->ddckCKSrcBlt
.dwColorSpaceHighValue
== 0);
649 RTEST(myDesc
->ddpfPixelFormat
.dwSize
== sizeof(DDPIXELFORMAT
));
650 RTEST(myDesc
->ddpfPixelFormat
.dwFlags
!= 0);
651 if (myDesc
->ddpfPixelFormat
.dwFlags
& DDPF_FOURCC
)
653 RTEST(myDesc
->ddpfPixelFormat
.dwFourCC
!= 0);
655 RTEST(myDesc
->ddsCaps
.dwCaps
== DDSCAPS_TEXTURE
);
657 myDesc
= (DDSURFACEDESC
*) (((DWORD
) myDesc
) + sizeof(DDSURFACEDESC
));
662 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, puNumHeaps, NULL, */
664 pCallBackFlags
= CallBackFlags
;
665 puD3dCallbacks
= &D3dCallbacks
;
666 puD3dDriverData
= &D3dDriverData
;
667 puD3dBufferCallbacks
= &D3dBufferCallbacks
;
668 puNumHeaps
= &NumHeaps
;
670 if (puD3dDriverData
->dwNumTextureFormats
!= 0)
672 RtlZeroMemory(puD3dTextureFormats
, puD3dDriverData
->dwNumTextureFormats
* sizeof(DDSURFACEDESC2
));
674 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
675 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
676 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
677 RtlZeroMemory(puD3dDriverData
,sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
678 RtlZeroMemory(&D3dBufferCallbacks
,sizeof(DD_D3DBUFCALLBACKS
));
680 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
681 pCallBackFlags
, puD3dCallbacks
,
682 puD3dDriverData
, puD3dBufferCallbacks
,
683 puD3dTextureFormats
, puNumHeaps
,
684 puvmList
, puNumFourCC
,
687 RTEST(pHalInfo
!= NULL
);
688 ASSERT(pHalInfo
!= NULL
);
690 RTEST(pCallBackFlags
!= NULL
);
691 ASSERT(pCallBackFlags
!= NULL
);
693 RTEST(puD3dCallbacks
!= NULL
);
694 ASSERT(puD3dCallbacks
!= NULL
);
696 RTEST(puD3dDriverData
!= NULL
);
697 ASSERT(puD3dDriverData
!= NULL
);
699 RTEST(puD3dBufferCallbacks
!= NULL
);
700 ASSERT(puD3dDriverData
!= NULL
);
702 RTEST(puD3dTextureFormats
!= NULL
);
703 ASSERT(puD3dTextureFormats
!= NULL
);
705 RTEST(puNumHeaps
!= NULL
);
706 ASSERT(puNumHeaps
!= NULL
);
707 RTEST(NumHeaps
== 0);
709 RTEST(puNumFourCC
== NULL
);
710 RTEST(puFourCC
== NULL
);
712 RTEST(puvmList
== NULL
);
714 /* We retesting the flags */
715 RTEST(pCallBackFlags
[0] != 0);
716 RTEST(pCallBackFlags
[1] != 0);
717 RTEST(pCallBackFlags
[2] == 0);
719 /* We do not retesting instead we compare it */
720 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
721 RTEST(memcmp(&oldD3dCallbacks
, puD3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
)) == 0);
722 RTEST(memcmp(&oldD3dDriverData
, puD3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
)) == 0);
723 RTEST(memcmp(&oldD3dBufferCallbacks
, puD3dBufferCallbacks
, sizeof(DD_D3DBUFCALLBACKS
)) == 0);
724 /* we skip resting texture */
727 /* testing NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, puNumHeaps, puvmList, NULL, */
729 pCallBackFlags
= CallBackFlags
;
730 puD3dCallbacks
= &D3dCallbacks
;
731 puD3dDriverData
= &D3dDriverData
;
732 puD3dBufferCallbacks
= &D3dBufferCallbacks
;
733 puNumHeaps
= &NumHeaps
;
736 if (puD3dDriverData
->dwNumTextureFormats
!= 0)
738 RtlZeroMemory(puD3dTextureFormats
, puD3dDriverData
->dwNumTextureFormats
* sizeof(DDSURFACEDESC2
));
740 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
741 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
742 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
743 RtlZeroMemory(puD3dDriverData
,sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
744 RtlZeroMemory(&D3dBufferCallbacks
,sizeof(DD_D3DBUFCALLBACKS
));
746 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
747 pCallBackFlags
, puD3dCallbacks
,
748 puD3dDriverData
, puD3dBufferCallbacks
,
749 puD3dTextureFormats
, puNumHeaps
,
750 puvmList
, puNumFourCC
,
753 RTEST(pHalInfo
!= NULL
);
754 ASSERT(pHalInfo
!= NULL
);
756 RTEST(pCallBackFlags
!= NULL
);
757 ASSERT(pCallBackFlags
!= NULL
);
759 RTEST(puD3dCallbacks
!= NULL
);
760 ASSERT(puD3dCallbacks
!= NULL
);
762 RTEST(puD3dDriverData
!= NULL
);
763 ASSERT(puD3dDriverData
!= NULL
);
765 RTEST(puD3dBufferCallbacks
!= NULL
);
766 ASSERT(puD3dDriverData
!= NULL
);
768 RTEST(puD3dTextureFormats
!= NULL
);
769 ASSERT(puD3dTextureFormats
!= NULL
);
771 RTEST(puNumHeaps
!= NULL
);
772 ASSERT(puNumHeaps
!= NULL
);
773 RTEST(NumHeaps
== 0);
775 RTEST(puvmList
!= NULL
);
777 RTEST(puNumFourCC
== NULL
);
778 RTEST(puFourCC
== NULL
);
782 /* We retesting the flags */
783 RTEST(pCallBackFlags
[0] != 0);
784 RTEST(pCallBackFlags
[1] != 0);
785 RTEST(pCallBackFlags
[2] == 0);
787 /* We do not retesting instead we compare it */
788 RTEST(memcmp(&oldHalInfo
, pHalInfo
, sizeof(DD_HALINFO
)) == 0);
789 RTEST(memcmp(&oldD3dCallbacks
, puD3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
)) == 0);
790 RTEST(memcmp(&oldD3dDriverData
, puD3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
)) == 0);
791 RTEST(memcmp(&oldD3dBufferCallbacks
, puD3dBufferCallbacks
, sizeof(DD_D3DBUFCALLBACKS
)) == 0);
792 /* we skip resting texture */
800 /* Cleanup ReactX setup */
802 NtGdiDdDeleteDirectDrawObject(hDirectDraw
);