3 Test_NtGdiDdQueryDirectDrawObject(PTESTINFO pti
)
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
;
18 DD_HALINFO oldHalInfo
;
19 DWORD CallBackFlags
[4];
20 D3DNTHAL_CALLBACKS D3dCallbacks
;
21 D3DNTHAL_GLOBALDRIVERDATA D3dDriverData
;
22 DD_D3DBUFCALLBACKS D3dBufferCallbacks
;
23 DDSURFACEDESC2 D3dTextureFormats
[100];
26 //DWORD NumFourCC = 0;
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);
43 /* Get currenet display mode */
44 EnumDisplaySettings(NULL
, ENUM_CURRENT_SETTINGS
, &devmode
);
46 hdc
= CreateDCW(L
"DISPLAY",NULL
,NULL
,NULL
);
49 hDirectDraw
= (HANDLE
) Syscall(L
"NtGdiDdCreateDirectDrawObject", 1, &hdc
);
50 ASSERT(hDirectDraw
!= NULL
);
53 hDirectDraw
= (HANDLE
) Syscall(L
"NtGdiDdCreateDirectDrawObject", 1, &hdc
);
55 RTEST(NtGdiDdQueryDirectDrawObject( NULL
, pHalInfo
,
56 pCallBackFlags
, puD3dCallbacks
,
57 puD3dDriverData
, puD3dBufferCallbacks
,
58 puD3dTextureFormats
, puNumHeaps
,
59 puvmList
, puNumFourCC
,
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
);
73 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
74 pCallBackFlags
, puD3dCallbacks
,
75 puD3dDriverData
, puD3dBufferCallbacks
,
76 puD3dTextureFormats
, puNumHeaps
,
77 puvmList
, puNumFourCC
,
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
);
92 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
93 pCallBackFlags
, puD3dCallbacks
,
94 puD3dDriverData
, puD3dBufferCallbacks
,
95 puD3dTextureFormats
, puNumHeaps
,
96 puvmList
, puNumFourCC
,
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
);
110 if ((pHalInfo
->dwSize
!= sizeof(DD_HALINFO
)) &&
111 (pHalInfo
->dwSize
!= sizeof(DD_HALINFO_V4
)))
113 RTEST(pHalInfo
->dwSize
!= sizeof(DD_HALINFO
));
114 ASSERT(pHalInfo
->dwSize
!= sizeof(DD_HALINFO
));
117 if (pHalInfo
->dwSize
== sizeof(DD_HALINFO
))
119 /*the offset, in bytes, to primary surface in the display memory */
120 RTEST(pHalInfo
->vmiData
.fpPrimary
!= 0 );
122 /* unsuse always 0 */
123 RTEST(pHalInfo
->vmiData
.dwFlags
== 0 );
126 RTEST(pHalInfo
->vmiData
.dwDisplayWidth
== devmode
.dmPelsWidth
);
127 RTEST(pHalInfo
->vmiData
.dwDisplayHeight
== devmode
.dmPelsHeight
);
129 RTEST(pHalInfo->vmiData.lDisplayPitch == 0x1700;
131 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwSize
== sizeof(DDPIXELFORMAT
) );
132 ASSERT(pHalInfo
->vmiData
.ddpfDisplay
.dwSize
== sizeof(DDPIXELFORMAT
));
134 /* Fail on 8bit screen deep */
135 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwFlags
== DDPF_RGB
);
138 /* No fourcc are use on primary screen */
139 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwFourCC
== 0 );
141 /* Count RGB Bits 8/16/24/32 */
142 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwRGBBitCount
== devmode
.dmBitsPerPel
);
145 //RTEST(pHalInfo->vmiData.ddpfDisplay.dwRBitMask == 0 );
146 //RTEST(pHalInfo->vmiData.ddpfDisplay.dwGBitMask == 0 );
147 //RTEST(pHalInfo->vmiData.ddpfDisplay.dwBBitMask == 0 );
149 /* primary never set the alpha blend mask */
150 RTEST(pHalInfo
->vmiData
.ddpfDisplay
.dwRGBAlphaBitMask
== 0 );
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
159 /* the primary display address */
160 /* test see if it in kmode memory or not */
161 RTEST(pHalInfo
->vmiData
.pvPrimary
!= 0 );
163 /* Test see if we got any hardware acclartions for 2d or 3d */
164 //RTEST(pHalInfo->ddCaps.dwSize == sizeof(DDCORECAPS));
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
169 RTEST( pHalInfo
->ddCaps
.dwCaps
!= 0);
170 RTEST( pHalInfo
->ddCaps
.ddsCaps
.dwCaps
!= 0);
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
175 RTEST( (pHalInfo
->dwFlags
& (DDHALINFO_GETDRIVERINFOSET
| DDHALINFO_GETDRIVERINFO2
)) != 0 );
177 if (pHalInfo
->ddCaps
.ddsCaps
.dwCaps
& DDSCAPS_3DDEVICE
)
179 RTEST( pHalInfo
->lpD3DGlobalDriverData
!= 0);
180 RTEST( pHalInfo
->lpD3DHALCallbacks
!= 0);
181 RTEST( pHalInfo
->lpD3DBufCallbacks
!= 0);
185 /* FIXME DD_HALINFO_V4 test */
188 RtlCopyMemory(&oldHalInfo
, &HalInfo
, sizeof(DD_HALINFO
));
191 pCallBackFlags
= CallBackFlags
;
192 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
194 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
195 pCallBackFlags
, puD3dCallbacks
,
196 puD3dDriverData
, puD3dBufferCallbacks
,
197 puD3dTextureFormats
, puNumHeaps
,
198 puvmList
, puNumFourCC
,
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
);
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);
217 /* NT4 this will fail */
218 RTEST(pCallBackFlags
[2] == 0);
222 pCallBackFlags
= CallBackFlags
;
223 puD3dCallbacks
= &D3dCallbacks
;
225 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
226 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
228 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
229 pCallBackFlags
, puD3dCallbacks
,
230 puD3dDriverData
, puD3dBufferCallbacks
,
231 puD3dTextureFormats
, puNumHeaps
,
232 puvmList
, puNumFourCC
,
234 RTEST(pHalInfo
!= NULL
);
235 RTEST(pCallBackFlags
!= NULL
);
237 if (pHalInfo
->ddCaps
.ddsCaps
.dwCaps
& DDSCAPS_3DDEVICE
)
239 RTEST(puD3dCallbacks
!= NULL
);
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
);
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);
256 /* NT4 this will fail */
257 RTEST(pCallBackFlags
[2] == 0);
261 pCallBackFlags
= CallBackFlags
;
262 puD3dCallbacks
= &D3dCallbacks
;
263 puD3dDriverData
= &D3dDriverData
;
265 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
266 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
267 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
269 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
270 pCallBackFlags
, puD3dCallbacks
,
271 puD3dDriverData
, puD3dBufferCallbacks
,
272 puD3dTextureFormats
, puNumHeaps
,
273 puvmList
, puNumFourCC
,
275 RTEST(pHalInfo
!= NULL
);
276 RTEST(pCallBackFlags
!= NULL
);
278 if (pHalInfo
->ddCaps
.ddsCaps
.dwCaps
& DDSCAPS_3DDEVICE
)
280 RTEST(puD3dCallbacks
!= NULL
);
281 RTEST(puD3dDriverData
!= NULL
);
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
);
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);
297 /* NT4 this will fail */
298 RTEST(pCallBackFlags
[2] == 0);
302 pCallBackFlags
= CallBackFlags
;
303 puD3dCallbacks
= &D3dCallbacks
;
304 puD3dDriverData
= &D3dDriverData
;
305 puD3dBufferCallbacks
= &D3dBufferCallbacks
;
307 RtlZeroMemory(pHalInfo
,sizeof(DD_HALINFO
));
308 RtlZeroMemory(pCallBackFlags
,sizeof(DWORD
)*3);
309 RtlZeroMemory(puD3dCallbacks
,sizeof(D3DNTHAL_CALLBACKS
));
310 RtlZeroMemory(puD3dDriverData
,sizeof(D3DNTHAL_CALLBACKS
));
312 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
313 pCallBackFlags
, puD3dCallbacks
,
314 puD3dDriverData
, puD3dBufferCallbacks
,
315 puD3dTextureFormats
, puNumHeaps
,
316 puvmList
, puNumFourCC
,
318 RTEST(pHalInfo
!= NULL
);
319 RTEST(pCallBackFlags
!= NULL
);
321 if (pHalInfo
->ddCaps
.ddsCaps
.dwCaps
& DDSCAPS_3DDEVICE
)
323 RTEST(puD3dCallbacks
!= NULL
);
324 RTEST(puD3dDriverData
!= NULL
);
325 RTEST(puD3dBufferCallbacks
!= NULL
);
329 RTEST(puD3dTextureFormats
== NULL
);
330 RTEST(puNumFourCC
== NULL
);
331 RTEST(puFourCC
== NULL
);
332 RTEST(puNumHeaps
== NULL
);
333 RTEST(puvmList
== NULL
);
334 ASSERT(pHalInfo
!= NULL
);
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);
341 /* NT4 this will fail */
342 RTEST(pCallBackFlags
[2] == 0);
346 pCallBackFlags
= CallBackFlags
;
347 puD3dCallbacks
= &D3dCallbacks
;
348 puD3dDriverData
= &D3dDriverData
;
349 puD3dBufferCallbacks
= &D3dBufferCallbacks
;
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
));
357 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
358 pCallBackFlags
, puD3dCallbacks
,
359 puD3dDriverData
, puD3dBufferCallbacks
,
360 puD3dTextureFormats
, puNumHeaps
,
361 puvmList
, puNumFourCC
,
363 RTEST(pHalInfo
!= NULL
);
364 RTEST(pCallBackFlags
!= NULL
);
366 if (pHalInfo
->ddCaps
.ddsCaps
.dwCaps
& DDSCAPS_3DDEVICE
)
368 RTEST(puD3dCallbacks
!= NULL
);
369 RTEST(puD3dDriverData
!= NULL
);
370 RTEST(puD3dBufferCallbacks
!= NULL
);
373 RTEST(puD3dTextureFormats
== NULL
);
374 RTEST(puNumFourCC
== NULL
);
375 RTEST(puFourCC
== NULL
);
376 RTEST(puNumHeaps
== NULL
);
377 RTEST(puvmList
== NULL
);
378 ASSERT(pHalInfo
!= NULL
);
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);
385 /* NT4 this will fail */
386 RTEST(pCallBackFlags
[2] == 0);
390 pCallBackFlags
= CallBackFlags
;
391 puD3dCallbacks
= &D3dCallbacks
;
392 puD3dDriverData
= &D3dDriverData
;
393 puD3dBufferCallbacks
= &D3dBufferCallbacks
;
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
400 if (puD3dDriverData
->dwNumTextureFormats
!= 0)
402 puD3dTextureFormats
= malloc (puD3dDriverData
->dwNumTextureFormats
* sizeof(DDSURFACEDESC2
));
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
));
411 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw
, pHalInfo
,
412 pCallBackFlags
, puD3dCallbacks
,
413 puD3dDriverData
, puD3dBufferCallbacks
,
414 puD3dTextureFormats
, puNumHeaps
,
415 puvmList
, puNumFourCC
,
417 RTEST(pHalInfo
!= NULL
);
418 RTEST(pCallBackFlags
!= NULL
);
420 if (pHalInfo
->ddCaps
.ddsCaps
.dwCaps
& DDSCAPS_3DDEVICE
)
422 RTEST(puD3dCallbacks
!= NULL
);
423 RTEST(puD3dDriverData
!= NULL
);
424 RTEST(puD3dBufferCallbacks
!= NULL
);
425 if (puD3dDriverData
->dwNumTextureFormats
!= 0)
427 /* FIXME add a better test for texture */
428 RTEST(puD3dTextureFormats
!= NULL
);
432 RTEST(puNumFourCC
== NULL
);
433 RTEST(puFourCC
== NULL
);
434 RTEST(puNumHeaps
== NULL
);
435 RTEST(puvmList
== NULL
);
436 ASSERT(pHalInfo
!= NULL
);
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);
443 /* NT4 this will fail */
444 RTEST(pCallBackFlags
[2] == 0);
452 * puD3dBufferCallbacks
459 /* Cleanup ReactX setup */
461 Syscall(L
"NtGdiDdDeleteDirectDrawObject", 1, &hDirectDraw
);
463 return APISTATUS_NORMAL
;