d3e074beeb4c708b4e9431db71ad0f2e9a4ad466
[reactos.git] / rostests / apitests / w32knapi / ntdd / NtGdiDdQueryDirectDrawObject.c
1 #include "../w32knapi.h"
2
3 W32KAPI
4 BOOL STDCALL
5 NtGdiDdQueryDirectDrawObject(
6 HANDLE hDirectDrawLocal,
7 DD_HALINFO *pHalInfo,
8 DWORD *pCallBackFlags,
9 LPD3DNTHAL_CALLBACKS puD3dCallbacks,
10 LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData,
11 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks,
12 LPDDSURFACEDESC puD3dTextureFormats,
13 DWORD *puNumHeaps,
14 VIDEOMEMORY *puvmList,
15 DWORD *puNumFourCC,
16 DWORD *puFourCC
17 )
18 {
19 return (BOOL)Syscall(L"NtGdiDdQueryDirectDrawObject", 11, &hDirectDrawLocal);
20 }
21
22 INT
23 Test_NtGdiDdQueryDirectDrawObject(PTESTINFO pti)
24 {
25 HANDLE hDirectDraw = NULL;
26 DD_HALINFO *pHalInfo = NULL;
27 DWORD *pCallBackFlags = NULL;
28 LPD3DNTHAL_CALLBACKS puD3dCallbacks = NULL;
29 LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData = NULL;
30 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks = NULL;
31 LPDDSURFACEDESC puD3dTextureFormats = NULL;
32 DWORD *puNumHeaps = NULL;
33 VIDEOMEMORY *puvmList = NULL;
34 DWORD *puNumFourCC = NULL;
35 DWORD *puFourCC = NULL;
36
37 DD_HALINFO HalInfo;
38 DD_HALINFO oldHalInfo;
39 DWORD CallBackFlags[4];
40 D3DNTHAL_CALLBACKS D3dCallbacks;
41 D3DNTHAL_GLOBALDRIVERDATA D3dDriverData;
42 DD_D3DBUFCALLBACKS D3dBufferCallbacks;
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
52 /* clear data */
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);
60
61
62
63 /* Get currenet display mode */
64 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode);
65
66 hdc = CreateDCW(L"DISPLAY",NULL,NULL,NULL);
67 ASSERT1(hdc != NULL);
68
69 hDirectDraw = (HANDLE) Syscall(L"NtGdiDdCreateDirectDrawObject", 1, &hdc);
70 ASSERT1(hDirectDraw != NULL);
71
72 /* Test ReactX */
73 hDirectDraw = (HANDLE) Syscall(L"NtGdiDdCreateDirectDrawObject", 1, &hdc);
74
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
91 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
92 pCallBackFlags, puD3dCallbacks,
93 puD3dDriverData, puD3dBufferCallbacks,
94 puD3dTextureFormats, puNumHeaps,
95 puvmList, puNumFourCC,
96 puFourCC) == FALSE);
97
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
107 pHalInfo = &HalInfo;
108 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
109 pCallBackFlags, puD3dCallbacks,
110 puD3dDriverData, puD3dBufferCallbacks,
111 puD3dTextureFormats, puNumHeaps,
112 puvmList, puNumFourCC,
113 puFourCC)== FALSE);
114 RTEST(pHalInfo != NULL);
115 RTEST(pCallBackFlags == NULL);
116 RTEST(puD3dCallbacks == NULL);
117 RTEST(puD3dDriverData == NULL);
118 RTEST(puD3dBufferCallbacks == NULL);
119 RTEST(puD3dTextureFormats == NULL);
120 RTEST(puNumFourCC == NULL);
121 RTEST(puFourCC == NULL);
122 ASSERT1(pHalInfo != NULL);
123
124 if ((pHalInfo->dwSize != sizeof(DD_HALINFO)) &&
125 (pHalInfo->dwSize != sizeof(DD_HALINFO_V4)))
126 {
127 RTEST(pHalInfo->dwSize != sizeof(DD_HALINFO));
128 ASSERT1(pHalInfo->dwSize != sizeof(DD_HALINFO));
129 }
130
131
132
133 if (pHalInfo->dwSize == sizeof(DD_HALINFO))
134 {
135 /*the offset, in bytes, to primary surface in the display memory */
136 RTEST(pHalInfo->vmiData.fpPrimary != 0 );
137
138 /* unsuse always 0 */
139 RTEST(pHalInfo->vmiData.dwFlags == 0 );
140
141 /* Check the res */
142 RTEST(pHalInfo->vmiData.dwDisplayWidth == devmode.dmPelsWidth );
143 RTEST(pHalInfo->vmiData.dwDisplayHeight == devmode.dmPelsHeight );
144 /* FIXME
145 RTEST(pHalInfo->vmiData.lDisplayPitch == 0x1700;
146 */
147 RTEST(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT) );
148 ASSERT1(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT));
149
150 /* Fail on 8bit screen deep */
151 RTEST(pHalInfo->vmiData.ddpfDisplay.dwFlags == DDPF_RGB);
152
153
154 /* No fourcc are use on primary screen */
155 RTEST(pHalInfo->vmiData.ddpfDisplay.dwFourCC == 0 );
156
157 /* Count RGB Bits 8/16/24/32 */
158 RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBBitCount == devmode.dmBitsPerPel );
159
160 /* FIXME RGB mask */
161 //RTEST(pHalInfo->vmiData.ddpfDisplay.dwRBitMask == 0 );
162 //RTEST(pHalInfo->vmiData.ddpfDisplay.dwGBitMask == 0 );
163 //RTEST(pHalInfo->vmiData.ddpfDisplay.dwBBitMask == 0 );
164
165 /* primary never set the alpha blend mask */
166 RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBAlphaBitMask == 0 );
167
168 /* FIXME do not known how test follow thing, for it is diffent for each drv */
169 // pHalInfo->vmiData->dwOffscreenAlign : 0x00000100
170 // pHalInfo->vmiData->dwOverlayAlign : 0x00000010
171 // pHalInfo->vmiData->dwTextureAlign : 0x00000020
172 // pHalInfo->vmiData->dwZBufferAlign : 0x00001000
173 // pHalInfo->vmiData->dwAlphaAlign : 0x00000000
174
175 /* the primary display address */
176 /* test see if it in kmode memory or not */
177 RTEST(pHalInfo->vmiData.pvPrimary != 0 );
178
179 /* Test see if we got any hardware acclartions for 2d or 3d */
180 //RTEST(pHalInfo->ddCaps.dwSize == sizeof(DDCORECAPS));
181
182 /* Testing see if we got any hw support for
183 * This test can fail on video card that does not support 2d/overlay/3d
184 */
185 RTEST( pHalInfo->ddCaps.dwCaps != 0);
186 RTEST( pHalInfo->ddCaps.ddsCaps.dwCaps != 0);
187
188 /* if this fail we do not have a dx driver install acodring ms, some version of windows it
189 * is okay this fail and drv does then only support basic dx
190 */
191 RTEST( (pHalInfo->dwFlags & (DDHALINFO_GETDRIVERINFOSET | DDHALINFO_GETDRIVERINFO2)) != 0 );
192
193 if (pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE )
194 {
195 RTEST( pHalInfo->lpD3DGlobalDriverData != 0);
196 RTEST( pHalInfo->lpD3DHALCallbacks != 0);
197 RTEST( pHalInfo->lpD3DBufCallbacks != 0);
198 }
199 }
200
201 /* FIXME DD_HALINFO_V4 test */
202
203 RtlCopyMemory(&oldHalInfo, &HalInfo, sizeof(DD_HALINFO));
204
205 pHalInfo = &HalInfo;
206 pCallBackFlags = CallBackFlags;
207 RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
208 RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
209 pCallBackFlags, puD3dCallbacks,
210 puD3dDriverData, puD3dBufferCallbacks,
211 puD3dTextureFormats, puNumHeaps,
212 puvmList, puNumFourCC,
213 puFourCC)== FALSE);
214 RTEST(pHalInfo != NULL);
215 RTEST(pCallBackFlags != NULL);
216 RTEST(puD3dCallbacks == NULL);
217 RTEST(puD3dDriverData == NULL);
218 RTEST(puD3dBufferCallbacks == NULL);
219 RTEST(puD3dTextureFormats == NULL);
220 RTEST(puNumFourCC == NULL);
221 RTEST(puFourCC == NULL);
222 ASSERT1(pHalInfo != NULL);
223
224 /* We do not retesting DD_HALINFO, instead we compare it */
225 RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
226
227
228 /* Cleanup ReactX setup */
229 DeleteDC(hdc);
230 Syscall(L"NtGdiDdDeleteDirectDrawObject", 1, &hDirectDraw);
231
232 return APISTATUS_NORMAL;
233 }