2 * Unit tests for (a few) ddraw surface functions
4 * Copyright (C) 2005 Antoine Chavasse (a.chavasse@gmail.com)
5 * Copyright (C) 2005 Christian Costa
6 * Copyright 2005 Ivan Leo Puoti
7 * Copyright (C) 2007 Stefan Dösinger
8 * Copyright (C) 2008 Alexander Dorofeyev
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #include "wine/test.h"
27 #include "wine/exception.h"
32 static LPDIRECTDRAW lpDD
= NULL
;
35 static BOOL
CreateDirectDraw(void)
39 rc
= DirectDrawCreate(NULL
, &lpDD
, NULL
);
40 ok(rc
==DD_OK
|| rc
==DDERR_NODIRECTDRAWSUPPORT
, "DirectDrawCreateEx returned: %x\n", rc
);
42 trace("DirectDrawCreateEx() failed with an error %x\n", rc
);
46 rc
= IDirectDraw_SetCooperativeLevel(lpDD
, NULL
, DDSCL_NORMAL
);
47 ok(rc
==DD_OK
,"SetCooperativeLevel returned: %x\n",rc
);
53 static void ReleaseDirectDraw(void)
57 IDirectDraw_Release(lpDD
);
62 static void MipMapCreationTest(void)
64 LPDIRECTDRAWSURFACE lpDDSMipMapTest
;
68 /* First mipmap creation test: create a surface with DDSCAPS_COMPLEX,
69 DDSCAPS_MIPMAP, and DDSD_MIPMAPCOUNT. This create the number of
70 requested mipmap levels. */
71 ddsd
.dwSize
= sizeof(ddsd
);
72 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_MIPMAPCOUNT
;
73 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
;
74 U2(ddsd
).dwMipMapCount
= 3;
77 rc
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpDDSMipMapTest
, NULL
);
78 ok(rc
==DD_OK
,"CreateSurface returned: %x\n",rc
);
81 skip("failed to create surface\n");
85 /* Check the number of created mipmaps */
86 memset(&ddsd
, 0, sizeof(DDSURFACEDESC
));
87 ddsd
.dwSize
= sizeof(ddsd
);
88 rc
= IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest
, &ddsd
);
89 ok(rc
==DD_OK
,"GetSurfaceDesc returned: %x\n",rc
);
90 ok(ddsd
.dwFlags
& DDSD_MIPMAPCOUNT
,
91 "GetSurfaceDesc returned no mipmapcount.\n");
92 ok(U2(ddsd
).dwMipMapCount
== 3, "Incorrect mipmap count: %d.\n",
93 U2(ddsd
).dwMipMapCount
);
95 /* Destroy the surface. */
96 IDirectDrawSurface_Release(lpDDSMipMapTest
);
99 /* Second mipmap creation test: create a surface without a mipmap
100 count, with DDSCAPS_MIPMAP and without DDSCAPS_COMPLEX.
101 This creates a single mipmap level. */
102 memset(&ddsd
, 0, sizeof(DDSURFACEDESC
));
103 ddsd
.dwSize
= sizeof(ddsd
);
104 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
105 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_MIPMAP
;
108 rc
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpDDSMipMapTest
, NULL
);
109 ok(rc
==DD_OK
,"CreateSurface returned: %x\n",rc
);
112 skip("failed to create surface\n");
115 /* Check the number of created mipmaps */
116 memset(&ddsd
, 0, sizeof(DDSURFACEDESC
));
117 ddsd
.dwSize
= sizeof(ddsd
);
118 rc
= IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest
, &ddsd
);
119 ok(rc
==DD_OK
,"GetSurfaceDesc returned: %x\n",rc
);
120 ok(ddsd
.dwFlags
& DDSD_MIPMAPCOUNT
,
121 "GetSurfaceDesc returned no mipmapcount.\n");
122 ok(U2(ddsd
).dwMipMapCount
== 1, "Incorrect mipmap count: %d.\n",
123 U2(ddsd
).dwMipMapCount
);
125 /* Destroy the surface. */
126 IDirectDrawSurface_Release(lpDDSMipMapTest
);
129 /* Third mipmap creation test: create a surface with DDSCAPS_MIPMAP,
130 DDSCAPS_COMPLEX and without DDSD_MIPMAPCOUNT.
131 It's an undocumented features where a chain of mipmaps, starting from
132 he specified size and down to the smallest size, is automatically
134 Anarchy Online needs this feature to work. */
135 memset(&ddsd
, 0, sizeof(DDSURFACEDESC
));
136 ddsd
.dwSize
= sizeof(ddsd
);
137 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
138 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
;
141 rc
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpDDSMipMapTest
, NULL
);
142 ok(rc
==DD_OK
,"CreateSurface returned: %x\n",rc
);
145 skip("failed to create surface\n");
149 /* Check the number of created mipmaps */
150 memset(&ddsd
, 0, sizeof(DDSURFACEDESC
));
151 ddsd
.dwSize
= sizeof(ddsd
);
152 rc
= IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest
, &ddsd
);
153 ok(rc
==DD_OK
,"GetSurfaceDesc returned: %x\n",rc
);
154 ok(ddsd
.dwFlags
& DDSD_MIPMAPCOUNT
,
155 "GetSurfaceDesc returned no mipmapcount.\n");
156 ok(U2(ddsd
).dwMipMapCount
== 6, "Incorrect mipmap count: %d.\n",
157 U2(ddsd
).dwMipMapCount
);
159 /* Destroy the surface. */
160 IDirectDrawSurface_Release(lpDDSMipMapTest
);
163 /* Fourth mipmap creation test: same as above with a different texture
165 The purpose is to verify that the number of generated mipmaps is
166 dependent on the smallest dimension. */
167 memset(&ddsd
, 0, sizeof(DDSURFACEDESC
));
168 ddsd
.dwSize
= sizeof(ddsd
);
169 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
170 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
;
173 rc
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpDDSMipMapTest
, NULL
);
174 ok(rc
==DD_OK
,"CreateSurface returned: %x\n",rc
);
177 skip("failed to create surface\n");
181 /* Check the number of created mipmaps */
182 memset(&ddsd
, 0, sizeof(DDSURFACEDESC
));
183 ddsd
.dwSize
= sizeof(ddsd
);
184 rc
= IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest
, &ddsd
);
185 ok(rc
==DD_OK
,"GetSurfaceDesc returned: %x\n",rc
);
186 ok(ddsd
.dwFlags
& DDSD_MIPMAPCOUNT
,
187 "GetSurfaceDesc returned no mipmapcount.\n");
188 ok(U2(ddsd
).dwMipMapCount
== 6, "Incorrect mipmap count: %d.\n",
189 U2(ddsd
).dwMipMapCount
);
191 /* Destroy the surface. */
192 IDirectDrawSurface_Release(lpDDSMipMapTest
);
195 /* Fifth mipmap creation test: try to create a surface with
196 DDSCAPS_COMPLEX, DDSCAPS_MIPMAP, DDSD_MIPMAPCOUNT,
197 where dwMipMapCount = 0. This should fail. */
199 ddsd
.dwSize
= sizeof(ddsd
);
200 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_MIPMAPCOUNT
;
201 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
;
202 U2(ddsd
).dwMipMapCount
= 0;
205 rc
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpDDSMipMapTest
, NULL
);
206 ok(rc
==DDERR_INVALIDPARAMS
,"CreateSurface returned: %x\n",rc
);
208 /* Destroy the surface. */
210 IDirectDrawSurface_Release(lpDDSMipMapTest
);
214 static void SrcColorKey32BlitTest(void)
216 LPDIRECTDRAWSURFACE lpSrc
;
217 LPDIRECTDRAWSURFACE lpDst
;
218 DDSURFACEDESC ddsd
, ddsd2
, ddsd3
;
219 DDCOLORKEY DDColorKey
;
224 ddsd2
.dwSize
= sizeof(ddsd2
);
225 ddsd2
.ddpfPixelFormat
.dwSize
= sizeof(ddsd2
.ddpfPixelFormat
);
227 ddsd
.dwSize
= sizeof(ddsd
);
228 ddsd
.ddpfPixelFormat
.dwSize
= sizeof(ddsd
.ddpfPixelFormat
);
229 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
;
230 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
233 ddsd
.ddpfPixelFormat
.dwFlags
= DDPF_RGB
;
234 U1(ddsd
.ddpfPixelFormat
).dwRGBBitCount
= 32;
235 U2(ddsd
.ddpfPixelFormat
).dwRBitMask
= 0xFF0000;
236 U3(ddsd
.ddpfPixelFormat
).dwGBitMask
= 0x00FF00;
237 U4(ddsd
.ddpfPixelFormat
).dwBBitMask
= 0x0000FF;
238 rc
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpDst
, NULL
);
239 ok(rc
==DD_OK
,"CreateSurface returned: %x\n",rc
);
242 skip("failed to create surface\n");
246 ddsd
.dwFlags
|= DDSD_CKSRCBLT
;
247 ddsd
.ddckCKSrcBlt
.dwColorSpaceLowValue
= 0xFF00FF;
248 ddsd
.ddckCKSrcBlt
.dwColorSpaceHighValue
= 0xFF00FF;
249 rc
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpSrc
, NULL
);
250 ok(rc
==DD_OK
,"CreateSurface returned: %x\n",rc
);
253 skip("failed to create surface\n");
257 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
258 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
259 lpData
= ddsd2
.lpSurface
;
260 lpData
[0] = 0xCCCCCCCC;
261 lpData
[1] = 0xCCCCCCCC;
262 lpData
[2] = 0xCCCCCCCC;
263 lpData
[3] = 0xCCCCCCCC;
265 memset(&ddsd3
, 0, sizeof(ddsd3
));
266 ddsd3
.dwSize
= sizeof(ddsd3
);
267 ddsd3
.ddpfPixelFormat
.dwSize
= sizeof(ddsd3
.ddpfPixelFormat
);
268 rc
= IDirectDrawSurface_GetSurfaceDesc(lpDst
, &ddsd3
);
269 ok(rc
== DD_OK
, "IDirectDrawSurface_GetSurfaceDesc between a lock/unlock pair returned %08x\n", rc
);
270 ok(ddsd3
.lpSurface
== ddsd3
.lpSurface
, "lpSurface from GetSurfaceDesc(%p) differs from the one returned by Lock(%p)\n", ddsd3
.lpSurface
, ddsd2
.lpSurface
);
272 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
273 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
275 memset(&ddsd3
, 0, sizeof(ddsd3
));
276 ddsd3
.dwSize
= sizeof(ddsd3
);
277 ddsd3
.ddpfPixelFormat
.dwSize
= sizeof(ddsd3
.ddpfPixelFormat
);
278 rc
= IDirectDrawSurface_GetSurfaceDesc(lpDst
, &ddsd3
);
279 ok(rc
== DD_OK
, "IDirectDrawSurface_GetSurfaceDesc between a lock/unlock pair returned %08x\n", rc
);
280 ok(ddsd3
.lpSurface
== NULL
, "lpSurface from GetSurfaceDesc(%p) is not NULL after unlock\n", ddsd3
.lpSurface
);
282 rc
= IDirectDrawSurface_Lock(lpSrc
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
283 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
284 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
285 lpData
= ddsd2
.lpSurface
;
286 lpData
[0] = 0x77010203;
287 lpData
[1] = 0x00010203;
288 lpData
[2] = 0x77FF00FF;
289 lpData
[3] = 0x00FF00FF;
290 rc
= IDirectDrawSurface_Unlock(lpSrc
, NULL
);
291 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
293 IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYSRC
, NULL
);
295 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
296 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
297 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
298 lpData
= ddsd2
.lpSurface
;
299 /* Different behavior on some drivers / windows versions. Some versions ignore the X channel when
300 * color keying, but copy it to the destination surface. Others apply it for color keying, but
301 * do not copy it into the destination surface.
303 if(lpData
[0]==0x00010203) {
304 trace("X channel was not copied into the destination surface\n");
305 ok((lpData
[0]==0x00010203)&&(lpData
[1]==0x00010203)&&(lpData
[2]==0x00FF00FF)&&(lpData
[3]==0xCCCCCCCC),
306 "Destination data after blitting is not correct\n");
308 ok((lpData
[0]==0x77010203)&&(lpData
[1]==0x00010203)&&(lpData
[2]==0xCCCCCCCC)&&(lpData
[3]==0xCCCCCCCC),
309 "Destination data after blitting is not correct\n");
311 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
312 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
314 /* Below we repeat the same test as above but now using BltFast instead of Blt. Before
315 * we can carry out the test we need to restore the color of the destination surface.
317 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
318 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
319 lpData
= ddsd2
.lpSurface
;
320 lpData
[0] = 0xCCCCCCCC;
321 lpData
[1] = 0xCCCCCCCC;
322 lpData
[2] = 0xCCCCCCCC;
323 lpData
[3] = 0xCCCCCCCC;
324 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
325 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
327 IDirectDrawSurface_BltFast(lpDst
, 0, 0, lpSrc
, NULL
, DDBLTFAST_SRCCOLORKEY
);
329 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
330 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
331 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
332 lpData
= ddsd2
.lpSurface
;
333 /* Different behavior on some drivers / windows versions. Some versions ignore the X channel when
334 * color keying, but copy it to the destination surface. Others apply it for color keying, but
335 * do not copy it into the destination surface.
337 if(lpData
[0]==0x00010203) {
338 trace("X channel was not copied into the destination surface\n");
339 ok((lpData
[0]==0x00010203)&&(lpData
[1]==0x00010203)&&(lpData
[2]==0x00FF00FF)&&(lpData
[3]==0xCCCCCCCC),
340 "Destination data after blitting is not correct\n");
342 ok((lpData
[0]==0x77010203)&&(lpData
[1]==0x00010203)&&(lpData
[2]==0xCCCCCCCC)&&(lpData
[3]==0xCCCCCCCC),
343 "Destination data after blitting is not correct\n");
345 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
346 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
348 /* Also test SetColorKey */
349 IDirectDrawSurface_GetColorKey(lpSrc
, DDCKEY_SRCBLT
, &DDColorKey
);
350 ok(DDColorKey
.dwColorSpaceLowValue
== 0xFF00FF && DDColorKey
.dwColorSpaceHighValue
== 0xFF00FF,
351 "GetColorKey does not return the colorkey used at surface creation\n");
353 DDColorKey
.dwColorSpaceLowValue
= 0x00FF00;
354 DDColorKey
.dwColorSpaceHighValue
= 0x00FF00;
355 IDirectDrawSurface_SetColorKey(lpSrc
, DDCKEY_SRCBLT
, &DDColorKey
);
357 DDColorKey
.dwColorSpaceLowValue
= 0;
358 DDColorKey
.dwColorSpaceHighValue
= 0;
359 IDirectDrawSurface_GetColorKey(lpSrc
, DDCKEY_SRCBLT
, &DDColorKey
);
360 ok(DDColorKey
.dwColorSpaceLowValue
== 0x00FF00 && DDColorKey
.dwColorSpaceHighValue
== 0x00FF00,
361 "GetColorKey does not return the colorkey set with SetColorKey\n");
363 ddsd
.ddckCKSrcBlt
.dwColorSpaceLowValue
= 0;
364 ddsd
.ddckCKSrcBlt
.dwColorSpaceHighValue
= 0;
365 IDirectDrawSurface_GetSurfaceDesc(lpSrc
, &ddsd
);
366 ok(ddsd
.ddckCKSrcBlt
.dwColorSpaceLowValue
== 0x00FF00 && ddsd
.ddckCKSrcBlt
.dwColorSpaceHighValue
== 0x00FF00,
367 "GetSurfaceDesc does not return the colorkey set with SetColorKey\n");
369 /* Test SetColorKey with dwColorSpaceHighValue < dwColorSpaceLowValue */
370 DDColorKey
.dwColorSpaceLowValue
= 0x0000FF;
371 DDColorKey
.dwColorSpaceHighValue
= 0x000000;
372 IDirectDrawSurface_SetColorKey(lpSrc
, DDCKEY_SRCBLT
, &DDColorKey
);
374 DDColorKey
.dwColorSpaceLowValue
= 0;
375 DDColorKey
.dwColorSpaceHighValue
= 0;
376 IDirectDrawSurface_GetColorKey(lpSrc
, DDCKEY_SRCBLT
, &DDColorKey
);
377 ok(DDColorKey
.dwColorSpaceLowValue
== 0x0000FF && DDColorKey
.dwColorSpaceHighValue
== 0x0000FF,
378 "GetColorKey does not return the colorkey set with SetColorKey (%x %x)\n", DDColorKey
.dwColorSpaceLowValue
, DDColorKey
.dwColorSpaceHighValue
);
380 DDColorKey
.dwColorSpaceLowValue
= 0x0000FF;
381 DDColorKey
.dwColorSpaceHighValue
= 0x000001;
382 IDirectDrawSurface_SetColorKey(lpSrc
, DDCKEY_SRCBLT
, &DDColorKey
);
384 DDColorKey
.dwColorSpaceLowValue
= 0;
385 DDColorKey
.dwColorSpaceHighValue
= 0;
386 IDirectDrawSurface_GetColorKey(lpSrc
, DDCKEY_SRCBLT
, &DDColorKey
);
387 ok(DDColorKey
.dwColorSpaceLowValue
== 0x0000FF && DDColorKey
.dwColorSpaceHighValue
== 0x0000FF,
388 "GetColorKey does not return the colorkey set with SetColorKey (%x %x)\n", DDColorKey
.dwColorSpaceLowValue
, DDColorKey
.dwColorSpaceHighValue
);
390 DDColorKey
.dwColorSpaceLowValue
= 0x0000FF;
391 DDColorKey
.dwColorSpaceHighValue
= 0x0000FE;
392 IDirectDrawSurface_SetColorKey(lpSrc
, DDCKEY_SRCBLT
, &DDColorKey
);
394 DDColorKey
.dwColorSpaceLowValue
= 0;
395 DDColorKey
.dwColorSpaceHighValue
= 0;
396 IDirectDrawSurface_GetColorKey(lpSrc
, DDCKEY_SRCBLT
, &DDColorKey
);
397 ok(DDColorKey
.dwColorSpaceLowValue
== 0x0000FF && DDColorKey
.dwColorSpaceHighValue
== 0x0000FF,
398 "GetColorKey does not return the colorkey set with SetColorKey (%x %x)\n", DDColorKey
.dwColorSpaceLowValue
, DDColorKey
.dwColorSpaceHighValue
);
400 IDirectDrawSurface_Release(lpSrc
);
401 IDirectDrawSurface_Release(lpDst
);
403 /* start with a new set of surfaces to test the color keying parameters to blit */
404 memset(&ddsd
, 0, sizeof(ddsd
));
405 ddsd
.dwSize
= sizeof(ddsd
);
406 ddsd
.ddpfPixelFormat
.dwSize
= sizeof(ddsd
.ddpfPixelFormat
);
407 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
| DDSD_CKSRCBLT
| DDSD_CKDESTBLT
;
408 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
411 ddsd
.ddpfPixelFormat
.dwFlags
= DDPF_RGB
;
412 U1(ddsd
.ddpfPixelFormat
).dwRGBBitCount
= 32;
413 U2(ddsd
.ddpfPixelFormat
).dwRBitMask
= 0xFF0000;
414 U3(ddsd
.ddpfPixelFormat
).dwGBitMask
= 0x00FF00;
415 U4(ddsd
.ddpfPixelFormat
).dwBBitMask
= 0x0000FF;
416 ddsd
.ddckCKDestBlt
.dwColorSpaceLowValue
= 0xFF0000;
417 ddsd
.ddckCKDestBlt
.dwColorSpaceHighValue
= 0xFF0000;
418 ddsd
.ddckCKSrcBlt
.dwColorSpaceLowValue
= 0x00FF00;
419 ddsd
.ddckCKSrcBlt
.dwColorSpaceHighValue
= 0x00FF00;
420 rc
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpDst
, NULL
);
421 ok(rc
==DD_OK
|| rc
== DDERR_NOCOLORKEYHW
,"CreateSurface returned: %x\n",rc
);
424 skip("Failed to create surface\n");
428 /* start with a new set of surfaces to test the color keying parameters to blit */
429 memset(&ddsd
, 0, sizeof(ddsd
));
430 ddsd
.dwSize
= sizeof(ddsd
);
431 ddsd
.ddpfPixelFormat
.dwSize
= sizeof(ddsd
.ddpfPixelFormat
);
432 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
| DDSD_CKSRCBLT
| DDSD_CKDESTBLT
;
433 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
436 ddsd
.ddpfPixelFormat
.dwFlags
= DDPF_RGB
;
437 U1(ddsd
.ddpfPixelFormat
).dwRGBBitCount
= 32;
438 U2(ddsd
.ddpfPixelFormat
).dwRBitMask
= 0xFF0000;
439 U3(ddsd
.ddpfPixelFormat
).dwGBitMask
= 0x00FF00;
440 U4(ddsd
.ddpfPixelFormat
).dwBBitMask
= 0x0000FF;
441 ddsd
.ddckCKSrcBlt
.dwColorSpaceLowValue
= 0x0000FF;
442 ddsd
.ddckCKSrcBlt
.dwColorSpaceHighValue
= 0x0000FF;
443 ddsd
.ddckCKDestBlt
.dwColorSpaceLowValue
= 0x000000;
444 ddsd
.ddckCKDestBlt
.dwColorSpaceHighValue
= 0x000000;
445 rc
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpSrc
, NULL
);
446 ok(rc
==DD_OK
|| rc
== DDERR_NOCOLORKEYHW
,"CreateSurface returned: %x\n",rc
);
449 skip("Failed to create surface\n");
450 IDirectDrawSurface_Release(lpDst
);
454 memset(&fx
, 0, sizeof(fx
));
455 fx
.dwSize
= sizeof(fx
);
456 fx
.ddckSrcColorkey
.dwColorSpaceHighValue
= 0x110000;
457 fx
.ddckSrcColorkey
.dwColorSpaceLowValue
= 0x110000;
458 fx
.ddckDestColorkey
.dwColorSpaceHighValue
= 0x001100;
459 fx
.ddckDestColorkey
.dwColorSpaceLowValue
= 0x001100;
461 rc
= IDirectDrawSurface_Lock(lpSrc
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
462 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
463 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
464 lpData
= ddsd2
.lpSurface
;
465 lpData
[0] = 0x000000FF; /* Applies to src blt key in src surface */
466 lpData
[1] = 0x00000000; /* Applies to dst blt key in src surface */
467 lpData
[2] = 0x00FF0000; /* Dst color key in dst surface */
468 lpData
[3] = 0x0000FF00; /* Src color key in dst surface */
469 lpData
[4] = 0x00001100; /* Src color key in ddbltfx */
470 lpData
[5] = 0x00110000; /* Dst color key in ddbltfx */
471 rc
= IDirectDrawSurface_Unlock(lpSrc
, NULL
);
472 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
474 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
475 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
476 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
477 lpData
= ddsd2
.lpSurface
;
478 lpData
[0] = 0x55555555;
479 lpData
[1] = 0x55555555;
480 lpData
[2] = 0x55555555;
481 lpData
[3] = 0x55555555;
482 lpData
[4] = 0x55555555;
483 lpData
[5] = 0x55555555;
484 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
485 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
487 /* Test a blit without keying */
488 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, 0, &fx
);
489 ok(rc
== DD_OK
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
491 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
492 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
493 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
494 lpData
= ddsd2
.lpSurface
;
495 /* Should have copied src data unmodified to dst */
496 ok(lpData
[0] == 0x000000FF &&
497 lpData
[1] == 0x00000000 &&
498 lpData
[2] == 0x00FF0000 &&
499 lpData
[3] == 0x0000FF00 &&
500 lpData
[4] == 0x00001100 &&
501 lpData
[5] == 0x00110000, "Surface data after unkeyed blit does not match\n");
503 lpData
[0] = 0x55555555;
504 lpData
[1] = 0x55555555;
505 lpData
[2] = 0x55555555;
506 lpData
[3] = 0x55555555;
507 lpData
[4] = 0x55555555;
508 lpData
[5] = 0x55555555;
509 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
510 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
513 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYSRC
, &fx
);
514 ok(rc
== DD_OK
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
516 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
517 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
518 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
519 lpData
= ddsd2
.lpSurface
;
521 ok(lpData
[0] == 0x55555555 && /* Here the src key applied */
522 lpData
[1] == 0x00000000 &&
523 lpData
[2] == 0x00FF0000 &&
524 lpData
[3] == 0x0000FF00 &&
525 lpData
[4] == 0x00001100 &&
526 lpData
[5] == 0x00110000, "Surface data after srckey blit does not match\n");
528 lpData
[0] = 0x55555555;
529 lpData
[1] = 0x55555555;
530 lpData
[2] = 0x55555555;
531 lpData
[3] = 0x55555555;
532 lpData
[4] = 0x55555555;
533 lpData
[5] = 0x55555555;
534 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
535 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
538 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYSRCOVERRIDE
, &fx
);
539 ok(rc
== DD_OK
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
541 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
542 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
543 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
544 lpData
= ddsd2
.lpSurface
;
546 ok(lpData
[0] == 0x000000FF &&
547 lpData
[1] == 0x00000000 &&
548 lpData
[2] == 0x00FF0000 &&
549 lpData
[3] == 0x0000FF00 &&
550 lpData
[4] == 0x00001100 &&
551 lpData
[5] == 0x55555555, /* Override key applies here */
552 "Surface data after src override key blit does not match\n");
554 lpData
[0] = 0x55555555;
555 lpData
[1] = 0x55555555;
556 lpData
[2] = 0x55555555;
557 lpData
[3] = 0x55555555;
558 lpData
[4] = 0x55555555;
559 lpData
[5] = 0x55555555;
560 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
561 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
563 /* Src override AND src key. That is not supposed to work */
564 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYSRC
| DDBLT_KEYSRCOVERRIDE
, &fx
);
565 ok(rc
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
567 /* Verify that the destination is unchanged */
568 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
569 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
570 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
571 lpData
= ddsd2
.lpSurface
;
573 ok(lpData
[0] == 0x55555555 &&
574 lpData
[1] == 0x55555555 &&
575 lpData
[2] == 0x55555555 &&
576 lpData
[3] == 0x55555555 &&
577 lpData
[4] == 0x55555555 &&
578 lpData
[5] == 0x55555555, /* Override key applies here */
579 "Surface data after src key blit with override does not match\n");
581 lpData
[0] = 0x00FF0000; /* Dest key in dst surface */
582 lpData
[1] = 0x00FF0000; /* Dest key in dst surface */
583 lpData
[2] = 0x00001100; /* Dest key in override */
584 lpData
[3] = 0x00001100; /* Dest key in override */
585 lpData
[4] = 0x00000000; /* Dest key in src surface */
586 lpData
[5] = 0x00000000; /* Dest key in src surface */
587 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
588 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
591 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYDEST
, &fx
);
592 ok(rc
== DD_OK
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
594 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
595 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
596 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
597 lpData
= ddsd2
.lpSurface
;
599 /* DirectDraw uses the dest blit key from the SOURCE surface ! */
600 ok(lpData
[0] == 0x00ff0000 &&
601 lpData
[1] == 0x00ff0000 &&
602 lpData
[2] == 0x00001100 &&
603 lpData
[3] == 0x00001100 &&
604 lpData
[4] == 0x00001100 && /* Key applies here */
605 lpData
[5] == 0x00110000, /* Key applies here */
606 "Surface data after dest key blit does not match\n");
608 lpData
[0] = 0x00FF0000; /* Dest key in dst surface */
609 lpData
[1] = 0x00FF0000; /* Dest key in dst surface */
610 lpData
[2] = 0x00001100; /* Dest key in override */
611 lpData
[3] = 0x00001100; /* Dest key in override */
612 lpData
[4] = 0x00000000; /* Dest key in src surface */
613 lpData
[5] = 0x00000000; /* Dest key in src surface */
614 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
615 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
617 /* Dest override key blit */
618 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYDESTOVERRIDE
, &fx
);
619 ok(rc
== DD_OK
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
621 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
622 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
623 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
624 lpData
= ddsd2
.lpSurface
;
626 ok(lpData
[0] == 0x00FF0000 &&
627 lpData
[1] == 0x00FF0000 &&
628 lpData
[2] == 0x00FF0000 && /* Key applies here */
629 lpData
[3] == 0x0000FF00 && /* Key applies here */
630 lpData
[4] == 0x00000000 &&
631 lpData
[5] == 0x00000000,
632 "Surface data after dest key override blit does not match\n");
634 lpData
[0] = 0x00FF0000; /* Dest key in dst surface */
635 lpData
[1] = 0x00FF0000; /* Dest key in dst surface */
636 lpData
[2] = 0x00001100; /* Dest key in override */
637 lpData
[3] = 0x00001100; /* Dest key in override */
638 lpData
[4] = 0x00000000; /* Dest key in src surface */
639 lpData
[5] = 0x00000000; /* Dest key in src surface */
640 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
641 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
643 /* Dest override key blit. Supposed to fail too */
644 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYDEST
| DDBLT_KEYDESTOVERRIDE
, &fx
);
645 ok(rc
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
647 /* Check for unchanged data */
648 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
649 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
650 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
651 lpData
= ddsd2
.lpSurface
;
653 ok(lpData
[0] == 0x00FF0000 &&
654 lpData
[1] == 0x00FF0000 &&
655 lpData
[2] == 0x00001100 && /* Key applies here */
656 lpData
[3] == 0x00001100 && /* Key applies here */
657 lpData
[4] == 0x00000000 &&
658 lpData
[5] == 0x00000000,
659 "Surface data with dest key and dest override does not match\n");
661 lpData
[0] = 0x00FF0000; /* Dest key in dst surface */
662 lpData
[1] = 0x00FF0000; /* Dest key in dst surface */
663 lpData
[2] = 0x00001100; /* Dest key in override */
664 lpData
[3] = 0x00001100; /* Dest key in override */
665 lpData
[4] = 0x00000000; /* Dest key in src surface */
666 lpData
[5] = 0x00000000; /* Dest key in src surface */
667 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
668 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
670 /* Modify the source data a bit to give some more conclusive results */
671 rc
= IDirectDrawSurface_Lock(lpSrc
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
672 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
673 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
674 lpData
= ddsd2
.lpSurface
;
675 lpData
[5] = 0x000000FF; /* Applies to src blt key in src surface */
676 rc
= IDirectDrawSurface_Unlock(lpSrc
, NULL
);
677 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
679 /* Source and destination key */
680 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYDEST
| DDBLT_KEYSRC
, &fx
);
681 ok(rc
== DD_OK
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
683 rc
= IDirectDrawSurface_Lock(lpDst
, NULL
, &ddsd2
, DDLOCK_WAIT
, NULL
);
684 ok(rc
==DD_OK
,"Lock returned: %x\n",rc
);
685 ok((ddsd2
.dwFlags
& DDSD_LPSURFACE
) == 0, "Surface desc has LPSURFACE Flags set\n");
686 lpData
= ddsd2
.lpSurface
;
688 ok(lpData
[0] == 0x00FF0000 && /* Masked by Destination key */
689 lpData
[1] == 0x00FF0000 && /* Masked by Destination key */
690 lpData
[2] == 0x00001100 && /* Masked by Destination key */
691 lpData
[3] == 0x00001100 && /* Masked by Destination key */
692 lpData
[4] == 0x00001100 && /* Allowed by destination key, not masked by source key */
693 lpData
[5] == 0x00000000, /* Allowed by dst key, but masked by source key */
694 "Surface data with src key and dest key blit does not match\n");
696 lpData
[0] = 0x00FF0000; /* Dest key in dst surface */
697 lpData
[1] = 0x00FF0000; /* Dest key in dst surface */
698 lpData
[2] = 0x00001100; /* Dest key in override */
699 lpData
[3] = 0x00001100; /* Dest key in override */
700 lpData
[4] = 0x00000000; /* Dest key in src surface */
701 lpData
[5] = 0x00000000; /* Dest key in src surface */
702 rc
= IDirectDrawSurface_Unlock(lpDst
, NULL
);
703 ok(rc
==DD_OK
,"Unlock returned: %x\n",rc
);
705 /* Override keys without ddbltfx parameter fail */
706 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYDESTOVERRIDE
, NULL
);
707 ok(rc
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
708 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYSRCOVERRIDE
, NULL
);
709 ok(rc
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
711 /* Try blitting without keys in the source surface*/
712 rc
= IDirectDrawSurface_SetColorKey(lpSrc
, DDCKEY_SRCBLT
, NULL
);
713 ok(rc
== DD_OK
, "SetColorKey returned %x\n", rc
);
714 rc
= IDirectDrawSurface_SetColorKey(lpSrc
, DDCKEY_DESTBLT
, NULL
);
715 ok(rc
== DD_OK
, "SetColorKey returned %x\n", rc
);
717 /* That fails now. Do not bother to check that the data is unmodified */
718 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYSRC
, &fx
);
719 ok(rc
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
721 /* Dest key blit still works. Which key is used this time??? */
722 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYDEST
, &fx
);
723 ok(rc
== DD_OK
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
725 /* With correctly passed override keys no key in the surface is needed.
726 * Again, the result was checked before, no need to do that again
728 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYDESTOVERRIDE
, &fx
);
729 ok(rc
== DD_OK
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
730 rc
= IDirectDrawSurface_Blt(lpDst
, NULL
, lpSrc
, NULL
, DDBLT_KEYSRCOVERRIDE
, &fx
);
731 ok(rc
== DD_OK
, "IDirectDrawSurface_Blt returned %08x\n", rc
);
733 IDirectDrawSurface_Release(lpSrc
);
734 IDirectDrawSurface_Release(lpDst
);
737 static void QueryInterface(void)
739 LPDIRECTDRAWSURFACE dsurface
;
740 DDSURFACEDESC surface
;
744 /* Create a surface */
745 ZeroMemory(&surface
, sizeof(surface
));
746 surface
.dwSize
= sizeof(surface
);
747 surface
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
;
748 surface
.dwHeight
= 10;
749 surface
.dwWidth
= 10;
750 ret
= IDirectDraw_CreateSurface(lpDD
, &surface
, &dsurface
, NULL
);
753 ok(FALSE
, "IDirectDraw::CreateSurface failed with error %x\n", ret
);
757 /* Call IUnknown::QueryInterface */
758 ret
= IDirectDrawSurface_QueryInterface(dsurface
, 0, &object
);
759 ok(ret
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface::QueryInterface returned %x\n", ret
);
761 IDirectDrawSurface_Release(dsurface
);
764 /* The following tests test which interface is returned by IDirectDrawSurfaceX::GetDDInterface.
765 * It uses refcounts to test that and compares the interface addresses. Partially fits here, and
766 * partially in the refcount test
769 static ULONG
getref(IUnknown
*iface
)
771 IUnknown_AddRef(iface
);
772 return IUnknown_Release(iface
);
775 static void GetDDInterface_1(void)
777 LPDIRECTDRAWSURFACE dsurface
;
778 LPDIRECTDRAWSURFACE2 dsurface2
;
779 DDSURFACEDESC surface
;
784 ULONG ref1
, ref2
, ref4
, ref7
;
787 /* Create a surface */
788 ZeroMemory(&surface
, sizeof(surface
));
789 surface
.dwSize
= sizeof(surface
);
790 surface
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
;
791 surface
.dwHeight
= 10;
792 surface
.dwWidth
= 10;
793 ret
= IDirectDraw_CreateSurface(lpDD
, &surface
, &dsurface
, NULL
);
796 ok(FALSE
, "IDirectDraw::CreateSurface failed with error %x\n", ret
);
799 ret
= IDirectDrawSurface_QueryInterface(dsurface
, &IID_IDirectDrawSurface2
, (void **) &dsurface2
);
800 ok(ret
== DD_OK
, "IDirectDrawSurface_QueryInterface returned %08x\n", ret
);
801 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw2
, (void **) &dd2
);
802 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
803 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw4
, (void **) &dd4
);
804 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
805 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
806 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
808 ref1
= getref((IUnknown
*) lpDD
);
809 ok(ref1
== 1, "IDirectDraw refcount is %d\n", ref1
);
810 ref2
= getref((IUnknown
*) dd2
);
811 ok(ref2
== 1, "IDirectDraw2 refcount is %d\n", ref2
);
812 ref4
= getref((IUnknown
*) dd4
);
813 ok(ref4
== 1, "IDirectDraw4 refcount is %d\n", ref4
);
814 ref7
= getref((IUnknown
*) dd7
);
815 ok(ref7
== 1, "IDirectDraw7 refcount is %d\n", ref7
);
818 ret
= IDirectDrawSurface2_GetDDInterface(dsurface2
, &dd
);
819 ok(ret
== DD_OK
, "IDirectDrawSurface7_GetDDInterface returned %08x\n", ret
);
820 ok(getref((IUnknown
*) lpDD
) == ref1
+ 1, "IDirectDraw refcount was increased by %d\n", getref((IUnknown
*) lpDD
) - ref1
);
821 ok(getref((IUnknown
*) dd2
) == ref2
+ 0, "IDirectDraw2 refcount was increased by %d\n", getref((IUnknown
*) dd2
) - ref2
);
822 ok(getref((IUnknown
*) dd4
) == ref4
+ 0, "IDirectDraw4 refcount was increased by %d\n", getref((IUnknown
*) dd4
) - ref4
);
823 ok(getref((IUnknown
*) dd7
) == ref7
+ 0, "IDirectDraw7 refcount was increased by %d\n", getref((IUnknown
*) dd7
) - ref7
);
825 ok(dd
== lpDD
, "Returned interface pointer is not equal to the creation interface\n");
826 IUnknown_Release((IUnknown
*) dd
);
828 /* try a NULL pointer */
829 ret
= IDirectDrawSurface2_GetDDInterface(dsurface2
, NULL
);
830 ok(ret
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface7_GetDDInterface returned %08x\n", ret
);
832 IDirectDraw_Release(dd2
);
833 IDirectDraw_Release(dd4
);
834 IDirectDraw_Release(dd7
);
835 IDirectDrawSurface2_Release(dsurface2
);
836 IDirectDrawSurface_Release(dsurface
);
839 static void GetDDInterface_2(void)
841 LPDIRECTDRAWSURFACE dsurface
;
842 LPDIRECTDRAWSURFACE2 dsurface2
;
843 DDSURFACEDESC surface
;
848 ULONG ref1
, ref2
, ref4
, ref7
;
851 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw2
, (void **) &dd2
);
852 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
853 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw4
, (void **) &dd4
);
854 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
855 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
856 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
858 /* Create a surface */
859 ZeroMemory(&surface
, sizeof(surface
));
860 surface
.dwSize
= sizeof(surface
);
861 surface
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
;
862 surface
.dwHeight
= 10;
863 surface
.dwWidth
= 10;
864 ret
= IDirectDraw2_CreateSurface(dd2
, &surface
, &dsurface
, NULL
);
867 ok(FALSE
, "IDirectDraw::CreateSurface failed with error %x\n", ret
);
870 ret
= IDirectDrawSurface_QueryInterface(dsurface
, &IID_IDirectDrawSurface2
, (void **) &dsurface2
);
871 ok(ret
== DD_OK
, "IDirectDrawSurface_QueryInterface returned %08x\n", ret
);
873 ref1
= getref((IUnknown
*) lpDD
);
874 ok(ref1
== 1, "IDirectDraw refcount is %d\n", ref1
);
875 ref2
= getref((IUnknown
*) dd2
);
876 ok(ref2
== 1, "IDirectDraw2 refcount is %d\n", ref2
);
877 ref4
= getref((IUnknown
*) dd4
);
878 ok(ref4
== 1, "IDirectDraw4 refcount is %d\n", ref4
);
879 ref7
= getref((IUnknown
*) dd7
);
880 ok(ref7
== 1, "IDirectDraw7 refcount is %d\n", ref7
);
883 ret
= IDirectDrawSurface2_GetDDInterface(dsurface2
, &dd
);
884 ok(ret
== DD_OK
, "IDirectDrawSurface7_GetDDInterface returned %08x\n", ret
);
885 ok(getref((IUnknown
*) lpDD
) == ref1
+ 0, "IDirectDraw refcount was increased by %d\n", getref((IUnknown
*) lpDD
) - ref1
);
886 ok(getref((IUnknown
*) dd2
) == ref2
+ 1, "IDirectDraw2 refcount was increased by %d\n", getref((IUnknown
*) dd2
) - ref2
);
887 ok(getref((IUnknown
*) dd4
) == ref4
+ 0, "IDirectDraw4 refcount was increased by %d\n", getref((IUnknown
*) dd4
) - ref4
);
888 ok(getref((IUnknown
*) dd7
) == ref7
+ 0, "IDirectDraw7 refcount was increased by %d\n", getref((IUnknown
*) dd7
) - ref7
);
890 ok(dd
== dd2
, "Returned interface pointer is not equal to the creation interface\n");
891 IUnknown_Release((IUnknown
*) dd
);
893 IDirectDraw_Release(dd2
);
894 IDirectDraw_Release(dd4
);
895 IDirectDraw_Release(dd7
);
896 IDirectDrawSurface2_Release(dsurface2
);
897 IDirectDrawSurface_Release(dsurface
);
900 static void GetDDInterface_4(void)
902 LPDIRECTDRAWSURFACE2 dsurface2
;
903 LPDIRECTDRAWSURFACE4 dsurface4
;
904 DDSURFACEDESC2 surface
;
909 ULONG ref1
, ref2
, ref4
, ref7
;
912 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw2
, (void **) &dd2
);
913 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
914 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw4
, (void **) &dd4
);
915 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
916 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
917 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
919 /* Create a surface */
920 ZeroMemory(&surface
, sizeof(surface
));
921 surface
.dwSize
= sizeof(surface
);
922 surface
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
;
923 surface
.dwHeight
= 10;
924 surface
.dwWidth
= 10;
925 ret
= IDirectDraw4_CreateSurface(dd4
, &surface
, &dsurface4
, NULL
);
928 ok(FALSE
, "IDirectDraw::CreateSurface failed with error %x\n", ret
);
931 ret
= IDirectDrawSurface4_QueryInterface(dsurface4
, &IID_IDirectDrawSurface2
, (void **) &dsurface2
);
932 ok(ret
== DD_OK
, "IDirectDrawSurface_QueryInterface returned %08x\n", ret
);
934 ref1
= getref((IUnknown
*) lpDD
);
935 ok(ref1
== 1, "IDirectDraw refcount is %d\n", ref1
);
936 ref2
= getref((IUnknown
*) dd2
);
937 ok(ref2
== 1, "IDirectDraw2 refcount is %d\n", ref2
);
938 ref4
= getref((IUnknown
*) dd4
);
939 ok(ref4
== 2, "IDirectDraw4 refcount is %d\n", ref4
);
940 ref7
= getref((IUnknown
*) dd7
);
941 ok(ref7
== 1, "IDirectDraw7 refcount is %d\n", ref7
);
943 ret
= IDirectDrawSurface4_GetDDInterface(dsurface4
, &dd
);
944 ok(ret
== DD_OK
, "IDirectDrawSurface7_GetDDInterface returned %08x\n", ret
);
945 ok(getref((IUnknown
*) lpDD
) == ref1
+ 0, "IDirectDraw refcount was increased by %d\n", getref((IUnknown
*) lpDD
) - ref1
);
946 ok(getref((IUnknown
*) dd2
) == ref2
+ 0, "IDirectDraw2 refcount was increased by %d\n", getref((IUnknown
*) dd2
) - ref2
);
947 ok(getref((IUnknown
*) dd4
) == ref4
+ 1, "IDirectDraw4 refcount was increased by %d\n", getref((IUnknown
*) dd4
) - ref4
);
948 ok(getref((IUnknown
*) dd7
) == ref7
+ 0, "IDirectDraw7 refcount was increased by %d\n", getref((IUnknown
*) dd7
) - ref7
);
950 ok(dd
== dd4
, "Returned interface pointer is not equal to the creation interface\n");
951 IUnknown_Release((IUnknown
*) dd
);
953 /* Now test what happens if we QI the surface for some other version - It should still return the creation interface */
954 ret
= IDirectDrawSurface2_GetDDInterface(dsurface2
, &dd
);
955 ok(ret
== DD_OK
, "IDirectDrawSurface7_GetDDInterface returned %08x\n", ret
);
956 ok(getref((IUnknown
*) lpDD
) == ref1
+ 0, "IDirectDraw refcount was increased by %d\n", getref((IUnknown
*) lpDD
) - ref1
);
957 ok(getref((IUnknown
*) dd2
) == ref2
+ 0, "IDirectDraw2 refcount was increased by %d\n", getref((IUnknown
*) dd2
) - ref2
);
958 ok(getref((IUnknown
*) dd4
) == ref4
+ 1, "IDirectDraw4 refcount was increased by %d\n", getref((IUnknown
*) dd4
) - ref4
);
959 ok(getref((IUnknown
*) dd7
) == ref7
+ 0, "IDirectDraw7 refcount was increased by %d\n", getref((IUnknown
*) dd7
) - ref7
);
961 ok(dd
== dd4
, "Returned interface pointer is not equal to the creation interface\n");
962 IUnknown_Release((IUnknown
*) dd
);
964 IDirectDraw_Release(dd2
);
965 IDirectDraw_Release(dd4
);
966 IDirectDraw_Release(dd7
);
967 IDirectDrawSurface4_Release(dsurface4
);
968 IDirectDrawSurface2_Release(dsurface2
);
971 static void GetDDInterface_7(void)
973 LPDIRECTDRAWSURFACE4 dsurface4
;
974 LPDIRECTDRAWSURFACE7 dsurface7
;
975 DDSURFACEDESC2 surface
;
980 ULONG ref1
, ref2
, ref4
, ref7
;
983 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw2
, (void **) &dd2
);
984 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
985 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw4
, (void **) &dd4
);
986 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
987 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
988 ok(ret
== DD_OK
, "IDirectDraw7_QueryInterface returned %08x\n", ret
);
990 /* Create a surface */
991 ZeroMemory(&surface
, sizeof(surface
));
992 surface
.dwSize
= sizeof(surface
);
993 surface
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
;
994 surface
.dwHeight
= 10;
995 surface
.dwWidth
= 10;
996 ret
= IDirectDraw7_CreateSurface(dd7
, &surface
, &dsurface7
, NULL
);
999 ok(FALSE
, "IDirectDraw::CreateSurface failed with error %x\n", ret
);
1002 ret
= IDirectDrawSurface7_QueryInterface(dsurface7
, &IID_IDirectDrawSurface4
, (void **) &dsurface4
);
1003 ok(ret
== DD_OK
, "IDirectDrawSurface_QueryInterface returned %08x\n", ret
);
1005 ref1
= getref((IUnknown
*) lpDD
);
1006 ok(ref1
== 1, "IDirectDraw refcount is %d\n", ref1
);
1007 ref2
= getref((IUnknown
*) dd2
);
1008 ok(ref2
== 1, "IDirectDraw2 refcount is %d\n", ref2
);
1009 ref4
= getref((IUnknown
*) dd4
);
1010 ok(ref4
== 1, "IDirectDraw4 refcount is %d\n", ref4
);
1011 ref7
= getref((IUnknown
*) dd7
);
1012 ok(ref7
== 2, "IDirectDraw7 refcount is %d\n", ref7
);
1014 ret
= IDirectDrawSurface7_GetDDInterface(dsurface7
, &dd
);
1015 ok(ret
== DD_OK
, "IDirectDrawSurface7_GetDDInterface returned %08x\n", ret
);
1016 ok(getref((IUnknown
*) lpDD
) == ref1
+ 0, "IDirectDraw refcount was increased by %d\n", getref((IUnknown
*) lpDD
) - ref1
);
1017 ok(getref((IUnknown
*) dd2
) == ref2
+ 0, "IDirectDraw2 refcount was increased by %d\n", getref((IUnknown
*) dd2
) - ref2
);
1018 ok(getref((IUnknown
*) dd4
) == ref4
+ 0, "IDirectDraw4 refcount was increased by %d\n", getref((IUnknown
*) dd4
) - ref4
);
1019 ok(getref((IUnknown
*) dd7
) == ref7
+ 1, "IDirectDraw7 refcount was increased by %d\n", getref((IUnknown
*) dd7
) - ref7
);
1021 ok(dd
== dd7
, "Returned interface pointer is not equal to the creation interface\n");
1022 IUnknown_Release((IUnknown
*) dd
);
1024 /* Now test what happens if we QI the surface for some other version - It should still return the creation interface */
1025 ret
= IDirectDrawSurface4_GetDDInterface(dsurface4
, &dd
);
1026 ok(ret
== DD_OK
, "IDirectDrawSurface7_GetDDInterface returned %08x\n", ret
);
1027 ok(getref((IUnknown
*) lpDD
) == ref1
+ 0, "IDirectDraw refcount was increased by %d\n", getref((IUnknown
*) lpDD
) - ref1
);
1028 ok(getref((IUnknown
*) dd2
) == ref2
+ 0, "IDirectDraw2 refcount was increased by %d\n", getref((IUnknown
*) dd2
) - ref2
);
1029 ok(getref((IUnknown
*) dd4
) == ref4
+ 0, "IDirectDraw4 refcount was increased by %d\n", getref((IUnknown
*) dd4
) - ref4
);
1030 ok(getref((IUnknown
*) dd7
) == ref7
+ 1, "IDirectDraw7 refcount was increased by %d\n", getref((IUnknown
*) dd7
) - ref7
);
1032 ok(dd
== dd7
, "Returned interface pointer is not equal to the creation interface\n");
1033 IUnknown_Release((IUnknown
*) dd
);
1035 IDirectDraw_Release(dd2
);
1036 IDirectDraw_Release(dd4
);
1037 IDirectDraw_Release(dd7
);
1038 IDirectDrawSurface4_Release(dsurface4
);
1039 IDirectDrawSurface7_Release(dsurface7
);
1042 static ULONG
getRefcount(IUnknown
*iface
)
1044 IUnknown_AddRef(iface
);
1045 return IUnknown_Release(iface
);
1048 static void IFaceRefCount(void)
1050 LPDIRECTDRAWSURFACE surf
;
1051 DDSURFACEDESC surface
;
1053 IDirectDrawSurface2
*surf2
;
1054 IDirectDrawSurface2
*surf2a
;
1055 IDirectDrawSurface3
*surf3
;
1056 IDirectDrawSurface4
*surf4
;
1057 IDirectDrawSurface7
*surf7a
;
1058 IDirectDrawSurface7
*surf7b
;
1059 IDirect3DTexture
* tex
;
1060 IDirect3DTexture2
* tex2
;
1061 IDirectDrawGammaControl
* gamma
;
1064 /* Create a surface */
1065 ZeroMemory(&surface
, sizeof(surface
));
1066 surface
.dwSize
= sizeof(surface
);
1067 surface
.dwFlags
= DDSD_CAPS
;
1068 surface
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
1069 ret
= IDirectDraw_CreateSurface(lpDD
, &surface
, &surf
, NULL
);
1073 ok(FALSE
, "Could not create surface, skipping test\n");
1077 ref
= getRefcount((IUnknown
*) surf
);
1078 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
); /* Check the ref count is one */
1080 IDirectDrawSurface_QueryInterface(surf
, &IID_IDirectDrawSurface2
, (void **) &surf2
);
1081 ref
= getRefcount((IUnknown
*) surf
);
1082 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
); /* Check the ref count is one */
1083 ref
= getRefcount((IUnknown
*) surf2
);
1084 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
); /* This should also be one */
1086 IDirectDrawSurface_QueryInterface(surf
, &IID_IDirectDrawSurface2
, (void **) &surf2a
);
1087 ref
= getRefcount((IUnknown
*) surf2
);
1088 ok(ref
== 2, "Refcount is %u, expected 2\n", ref
); /* Surf2's refcount should be 2 now, but surf should be 1 */
1089 ref
= getRefcount((IUnknown
*) surf
);
1090 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
1092 IDirectDrawSurface_QueryInterface(surf
, &IID_IDirectDrawSurface3
, (void **) &surf3
);
1093 ref
= getRefcount((IUnknown
*) surf3
);
1094 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
1096 IDirectDrawSurface_QueryInterface(surf
, &IID_IDirectDrawSurface4
, (void **) &surf4
);
1097 ref
= getRefcount((IUnknown
*) surf4
);
1098 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
1100 IDirectDrawSurface_QueryInterface(surf
, &IID_IDirectDrawSurface7
, (void **) &surf7a
);
1101 ref
= getRefcount((IUnknown
*) surf7a
);
1102 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
1104 IDirectDrawSurface_QueryInterface(surf
, &IID_IDirectDrawSurface7
, (void **) &surf7b
);
1105 ref
= getRefcount((IUnknown
*) surf7b
);
1106 ok(ref
== 2, "Refcount is %u, expected 2\n", ref
);
1108 /* IDirect3DTexture interface (unlike the others) alters the original IDirectDrawSurface ref count */
1109 ret
= IDirectDrawSurface_QueryInterface(surf
, &IID_IDirect3DTexture
, (void **) &tex
);
1112 ref
= getRefcount((IUnknown
*) tex
);
1113 ok(ref
== 2, "Refcount is %u, expected 2\n", ref
);
1114 ref
= getRefcount((IUnknown
*) surf
);
1115 ok(ref
== 2, "Refcount is %u, expected 2\n", ref
);
1117 IDirectDrawSurface_QueryInterface(surf
, &IID_IDirect3DTexture2
, (void **) &tex2
);
1118 ref
= getRefcount((IUnknown
*) tex
);
1119 ok(ref
== 3, "Refcount is %u, expected 3\n", ref
);
1120 ref
= getRefcount((IUnknown
*) tex2
);
1121 ok(ref
== 3, "Refcount is %u, expected 3\n", ref
);
1122 ref
= getRefcount((IUnknown
*) surf
);
1123 ok(ref
== 3, "Refcount is %u, expected 3\n", ref
);
1125 IDirectDrawSurface_QueryInterface(surf
, &IID_IDirectDrawGammaControl
, (void **) &gamma
);
1126 ref
= getRefcount((IUnknown
*) gamma
);
1127 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
1129 ref
= IDirect3DTexture2_Release(tex2
); /* Release the texture */
1130 ok(ref
== 2, "Refcount is %u, expected 2\n", ref
);
1131 ref
= getRefcount((IUnknown
*) surf
);
1132 ok(ref
== 2, "Refcount is %u, expected 2\n", ref
);
1134 ref
= IDirect3DTexture_Release(tex
); /* Release the texture */
1135 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
1136 ref
= getRefcount((IUnknown
*) surf
);
1137 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
1139 ref
= IDirectDrawGammaControl_Release(gamma
); /* Release the gamma control */
1140 ok(ref
== 0, "Refcount is %u, expected 0\n", ref
);
1143 ref
= IDirectDrawSurface2_Release(surf2
); /* Release one of the 2 surf2 interfaces */
1144 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
1146 ref
= IDirectDrawSurface2_Release(surf2a
); /* Release the other */
1147 ok(ref
== 0, "Refcount is %u, expected 0\n", ref
);
1149 ref
= IDirectDrawSurface3_Release(surf3
);
1150 ok(ref
== 0, "Refcount is %u, expected 0\n", ref
);
1152 ref
= IDirectDrawSurface4_Release(surf4
);
1153 ok(ref
== 0, "Refcount is %u, expected 0\n", ref
);
1155 ref
= IDirectDrawSurface7_Release(surf7a
);
1156 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
1158 ref
= IDirectDrawSurface7_Release(surf7b
);
1159 ok(ref
== 0, "Refcount is %u, expected 0\n", ref
);
1161 ref
= IDirectDrawSurface_Release(surf
);
1162 ok(ref
== 0, "Refcount is %u, expected 0\n", ref
);
1165 #define MAXEXPECTED 8 /* Can match up to 8 expected surfaces */
1168 IDirectDrawSurface
*expected
[MAXEXPECTED
];
1172 static HRESULT WINAPI
enumCB(IDirectDrawSurface
*surf
, DDSURFACEDESC
*desc
, void *ctx
)
1177 for(i
= 0; i
< MAXEXPECTED
; i
++)
1179 if(((struct enumstruct
*)ctx
)->expected
[i
] == surf
) found
= TRUE
;
1182 ok(found
, "Unexpected surface %p enumerated\n", surf
);
1183 ((struct enumstruct
*)ctx
)->count
++;
1184 IDirectDrawSurface_Release(surf
);
1185 return DDENUMRET_OK
;
1188 static void EnumTest(void)
1192 IDirectDrawSurface
*surface
;
1193 struct enumstruct ctx
;
1195 ddsd
.dwSize
= sizeof(ddsd
);
1196 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_MIPMAPCOUNT
;
1197 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
;
1198 U2(ddsd
).dwMipMapCount
= 3;
1201 rc
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface
, NULL
);
1202 ok(rc
==DD_OK
,"CreateSurface returned: %x\n",rc
);
1204 memset(&ctx
, 0, sizeof(ctx
));
1205 ctx
.expected
[0] = surface
;
1206 rc
= IDirectDrawSurface_GetAttachedSurface(ctx
.expected
[0], &ddsd
.ddsCaps
, &ctx
.expected
[1]);
1207 ok(rc
== DD_OK
, "GetAttachedSurface returned %08x\n", rc
);
1208 rc
= IDirectDrawSurface_GetAttachedSurface(ctx
.expected
[1], &ddsd
.ddsCaps
, &ctx
.expected
[2]);
1209 ok(rc
== DD_OK
, "GetAttachedSurface returned %08x\n", rc
);
1210 rc
= IDirectDrawSurface_GetAttachedSurface(ctx
.expected
[2], &ddsd
.ddsCaps
, &ctx
.expected
[3]);
1211 ok(rc
== DDERR_NOTFOUND
, "GetAttachedSurface returned %08x\n", rc
);
1212 ok(!ctx
.expected
[3], "expected NULL pointer\n");
1215 rc
= IDirectDraw_EnumSurfaces(lpDD
, DDENUMSURFACES_DOESEXIST
| DDENUMSURFACES_ALL
, &ddsd
, &ctx
, enumCB
);
1216 ok(rc
== DD_OK
, "IDirectDraw_EnumSurfaces returned %08x\n", rc
);
1217 ok(ctx
.count
== 3, "%d surfaces enumerated, expected 3\n", ctx
.count
);
1220 rc
= IDirectDraw_EnumSurfaces(lpDD
, DDENUMSURFACES_DOESEXIST
| DDENUMSURFACES_ALL
, NULL
, &ctx
, enumCB
);
1221 ok(rc
== DD_OK
, "IDirectDraw_EnumSurfaces returned %08x\n", rc
);
1222 ok(ctx
.count
== 3, "%d surfaces enumerated, expected 3\n", ctx
.count
);
1224 IDirectDrawSurface_Release(ctx
.expected
[2]);
1225 IDirectDrawSurface_Release(ctx
.expected
[1]);
1226 IDirectDrawSurface_Release(surface
);
1229 static HRESULT WINAPI
SurfaceCounter(IDirectDrawSurface7
*surface
, DDSURFACEDESC2
*desc
, void *context
)
1231 UINT
*num
= context
;
1233 IDirectDrawSurface_Release(surface
);
1234 return DDENUMRET_OK
;
1237 static void AttachmentTest7(void)
1241 IDirectDrawSurface7
*surface1
, *surface2
, *surface3
, *surface4
;
1242 IDirectDrawSurface
*surface1v1
, *surface2v1
;
1243 DDSURFACEDESC2 ddsd
, ddsd2
;
1246 DDSCAPS2 caps
= {DDSCAPS_TEXTURE
, 0, 0, 0}, caps2
= {DDSCAPS_BACKBUFFER
,0,0,0};
1247 HWND window
= CreateWindow( "static", "ddraw_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
1249 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
1250 ok(hr
== DD_OK
, "IDirectDraw_QueryInterface returned %08x\n", hr
);
1252 memset(&ddsd
, 0, sizeof(ddsd
));
1253 ddsd
.dwSize
= sizeof(ddsd
);
1254 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_MIPMAPCOUNT
;
1255 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
;
1256 U2(ddsd
).dwMipMapCount
= 3; /* Will create 128x128, 64x64, 32x32 */
1258 ddsd
.dwHeight
= 128;
1259 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface1
, NULL
);
1260 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1264 IDirectDrawSurface7_EnumAttachedSurfaces(surface1
, &num
, SurfaceCounter
);
1265 ok(num
== 1, "Mipmap root has %d surfaces attached, expected 1\n", num
);
1269 hr
= IDirectDrawSurface7_GetAttachedSurface(surface1
, &caps
, &surface2
);
1270 ok(hr
== DD_OK
, "GetAttachedSurface returned %08x\n", hr
);
1272 IDirectDrawSurface7_EnumAttachedSurfaces(surface2
, &num
, SurfaceCounter
);
1273 ok(num
== 1, "First mip level has %d surfaces attached, expected 1\n", num
);
1277 hr
= IDirectDrawSurface7_GetAttachedSurface(surface2
, &caps
, &surface3
);
1278 ok(hr
== DD_OK
, "GetAttachedSurface returned %08x\n", hr
);
1279 IDirectDrawSurface7_Release(surface2
);
1281 IDirectDrawSurface7_EnumAttachedSurfaces(surface3
, &num
, SurfaceCounter
);
1282 ok(num
== 0, "Second mip level has %d surfaces attached, expected 1\n", num
);
1284 /* Mip level 3 is still needed */
1285 hr
= IDirectDrawSurface7_GetAttachedSurface(surface3
, &caps
, &surface4
);
1286 ok(hr
== DDERR_NOTFOUND
, "GetAttachedSurface returned %08x\n", hr
);
1287 ok(!surface4
, "expected NULL pointer\n");
1289 /* Try to attach a 16x16 miplevel - Should not work as far I can see */
1290 memset(&ddsd
, 0, sizeof(ddsd
));
1291 ddsd
.dwSize
= sizeof(ddsd
);
1292 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
1293 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
;
1296 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface2
, NULL
);
1297 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1299 hr
= IDirectDrawSurface7_AddAttachedSurface(surface1
, surface2
);
1300 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 16x16 surface to a 128x128 texture root returned %08x\n", hr
);
1301 hr
= IDirectDrawSurface7_AddAttachedSurface(surface2
, surface1
);
1302 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 128x128 texture root to a 16x16 texture returned %08x\n", hr
);
1303 hr
= IDirectDrawSurface7_AddAttachedSurface(surface3
, surface2
);
1304 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 16x16 surface to a 32x32 texture mip level returned %08x\n", hr
);
1305 hr
= IDirectDrawSurface7_AddAttachedSurface(surface2
, surface3
);
1306 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 32x32 texture mip level to a 16x16 surface returned %08x\n", hr
);
1308 IDirectDrawSurface7_Release(surface2
);
1310 memset(&ddsd
, 0, sizeof(ddsd
));
1311 ddsd
.dwSize
= sizeof(ddsd
);
1312 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
1313 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_SYSTEMMEMORY
| DDSCAPS_OFFSCREENPLAIN
;
1316 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface2
, NULL
);
1317 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1319 hr
= IDirectDrawSurface7_AddAttachedSurface(surface1
, surface2
);
1320 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 16x16 offscreen plain surface to a 128x128 texture root returned %08x\n", hr
);
1321 hr
= IDirectDrawSurface7_AddAttachedSurface(surface2
, surface1
);
1322 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 128x128 texture root to a 16x16 offscreen plain surface returned %08x\n", hr
);
1323 hr
= IDirectDrawSurface7_AddAttachedSurface(surface3
, surface2
);
1324 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 16x16 offscreen plain surface to a 32x32 texture mip level returned %08x\n", hr
);
1325 hr
= IDirectDrawSurface7_AddAttachedSurface(surface2
, surface3
);
1326 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 32x32 texture mip level to a 16x16 offscreen plain surface returned %08x\n", hr
);
1328 IDirectDrawSurface7_Release(surface3
);
1329 IDirectDrawSurface7_Release(surface2
);
1330 IDirectDrawSurface7_Release(surface1
);
1332 hr
= IDirectDraw7_SetCooperativeLevel(dd7
, window
, DDSCL_EXCLUSIVE
| DDSCL_FULLSCREEN
);
1333 ok(hr
== DD_OK
, "SetCooperativeLevel returned %08x\n", hr
);
1335 memset(&ddsd
, 0, sizeof(ddsd
));
1336 ddsd
.dwSize
= sizeof(ddsd
);
1337 ddsd
.dwFlags
= DDSD_BACKBUFFERCOUNT
| DDSD_CAPS
;
1338 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
| DDSCAPS_COMPLEX
| DDSCAPS_FLIP
;
1339 ddsd
.dwBackBufferCount
= 2;
1340 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface1
, NULL
);
1341 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1343 /* backbuffer surfaces must not have dwBackBufferCount set */
1344 ddsd2
.dwSize
= sizeof(ddsd2
);
1345 hr
= IDirectDrawSurface7_GetAttachedSurface(surface1
, &caps2
, &surface2
);
1346 ok(hr
==DD_OK
,"GetAttachedSurface returned: %x\n", hr
);
1347 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface2
, &ddsd2
);
1348 ok(hr
==DD_OK
,"GetSurfaceDesc returned: %x\n", hr
);
1349 ok(ddsd2
.dwBackBufferCount
==0,"backbuffer surface has dwBackBufferCount==%u\n", ddsd2
.dwBackBufferCount
);
1352 IDirectDrawSurface7_EnumAttachedSurfaces(surface1
, &num
, SurfaceCounter
);
1353 ok(num
== 1, "Primary surface has %d surfaces attached, expected 1\n", num
);
1354 IDirectDrawSurface7_Release(surface1
);
1356 /* Those are some invalid descriptions, no need to test attachments with them */
1357 memset(&ddsd
, 0, sizeof(ddsd
));
1358 ddsd
.dwSize
= sizeof(ddsd
);
1359 ddsd
.dwFlags
= DDSD_CAPS
;
1360 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
| DDSCAPS_FRONTBUFFER
;
1361 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface1
, NULL
);
1362 ok(hr
==DDERR_INVALIDCAPS
,"CreateSurface returned: %x\n",hr
);
1363 memset(&ddsd
, 0, sizeof(ddsd
));
1364 ddsd
.dwSize
= sizeof(ddsd
);
1365 ddsd
.dwFlags
= DDSD_CAPS
;
1366 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
| DDSCAPS_BACKBUFFER
;
1367 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface2
, NULL
);
1368 ok(hr
==DDERR_INVALIDCAPS
,"CreateSurface returned: %x\n",hr
);
1370 /* Try a single primary and two offscreen plain surfaces */
1371 memset(&ddsd
, 0, sizeof(ddsd
));
1372 ddsd
.dwSize
= sizeof(ddsd
);
1373 ddsd
.dwFlags
= DDSD_CAPS
;
1374 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
1375 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface1
, NULL
);
1376 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1378 memset(&ddsd
, 0, sizeof(ddsd
));
1379 ddsd
.dwSize
= sizeof(ddsd
);
1380 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
1381 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
1382 ddsd
.dwWidth
= GetSystemMetrics(SM_CXSCREEN
);
1383 ddsd
.dwHeight
= GetSystemMetrics(SM_CYSCREEN
);
1384 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface2
, NULL
);
1385 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1387 memset(&ddsd
, 0, sizeof(ddsd
));
1388 ddsd
.dwSize
= sizeof(ddsd
);
1389 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
1390 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
1391 ddsd
.dwWidth
= GetSystemMetrics(SM_CXSCREEN
);
1392 ddsd
.dwHeight
= GetSystemMetrics(SM_CYSCREEN
);
1393 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface3
, NULL
);
1394 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1396 /* This one has a different size */
1397 memset(&ddsd
, 0, sizeof(ddsd
));
1398 ddsd
.dwSize
= sizeof(ddsd
);
1399 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
1400 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
1402 ddsd
.dwHeight
= 128;
1403 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface4
, NULL
);
1404 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1406 hr
= IDirectDrawSurface7_AddAttachedSurface(surface1
, surface2
);
1407 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching an offscreen plain surface to a front buffer returned %08x\n", hr
);
1408 hr
= IDirectDrawSurface7_AddAttachedSurface(surface2
, surface1
);
1409 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a front buffer to an offscreen plain surface returned %08x\n", hr
);
1410 hr
= IDirectDrawSurface7_AddAttachedSurface(surface2
, surface3
);
1411 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching an offscreen plain surface to another offscreen plain surface returned %08x\n", hr
);
1412 hr
= IDirectDrawSurface7_AddAttachedSurface(surface1
, surface4
);
1413 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching an offscreen plain surface to a front buffer of different size returned %08x\n", hr
);
1414 hr
= IDirectDrawSurface7_AddAttachedSurface(surface4
, surface1
);
1415 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a front buffer to an offscreen plain surface of different size returned %08x\n", hr
);
1417 IDirectDrawSurface7_Release(surface4
);
1418 IDirectDrawSurface7_Release(surface3
);
1419 IDirectDrawSurface7_Release(surface2
);
1420 IDirectDrawSurface7_Release(surface1
);
1422 /* Test DeleteAttachedSurface and automatic detachment of attached surfaces on release */
1423 memset(&ddsd
, 0, sizeof(ddsd
));
1424 ddsd
.dwSize
= sizeof(ddsd
);
1425 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
;
1428 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
| DDSCAPS_3DDEVICE
;
1429 U4(ddsd
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd
).ddpfPixelFormat
);
1430 U4(ddsd
).ddpfPixelFormat
.dwFlags
= DDPF_PALETTEINDEXED8
| DDPF_RGB
;
1431 U1(U4(ddsd
).ddpfPixelFormat
).dwRGBBitCount
= 8;
1433 memset(&ddsd2
, 0, sizeof(ddsd2
));
1434 ddsd2
.dwSize
= sizeof(ddsd2
);
1435 ddsd2
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
;
1436 ddsd2
.dwWidth
= ddsd
.dwWidth
;
1437 ddsd2
.dwHeight
= ddsd
.dwHeight
;
1438 ddsd2
.ddsCaps
.dwCaps
= DDSCAPS_3DDEVICE
| DDSCAPS_ZBUFFER
;
1439 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
1440 U4(ddsd2
).ddpfPixelFormat
.dwFlags
= DDPF_ZBUFFER
;
1441 U1(U4(ddsd2
).ddpfPixelFormat
).dwZBufferBitDepth
= 16;
1442 U3(U4(ddsd2
).ddpfPixelFormat
).dwZBitMask
= 0x0000FFFF;
1444 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface1
, NULL
);
1445 ok(hr
== DD_OK
, "CreateSurface returned %08x\n", hr
);
1448 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd2
, &surface2
, NULL
);
1449 ok(hr
== DD_OK
, "CreateSurface returned %08x\n", hr
);
1452 /* DeleteAttachedSurface */
1453 hr
= IDirectDrawSurface7_AddAttachedSurface(surface1
, surface2
);
1454 ok(hr
== DD_OK
, "AddAttachedSurface returned %08x\n", hr
);
1457 ref
= getRefcount((IUnknown
*)surface2
);
1458 ok(ref
== 2, "Got refcount %d, expected 2\n", ref
);
1459 hr
= IDirectDrawSurface7_QueryInterface(surface1
, &IID_IDirectDrawSurface
, (void **)&surface1v1
);
1460 ok(hr
== DD_OK
, "IDirectDrawSurface7_QueryInterface returned %08x\n", hr
);
1461 hr
= IDirectDrawSurface7_QueryInterface(surface2
, &IID_IDirectDrawSurface
, (void **)&surface2v1
);
1462 ok(hr
== DD_OK
, "IDirectDrawSurface7_QueryInterface returned %08x\n", hr
);
1463 hr
= IDirectDrawSurface_DeleteAttachedSurface(surface1v1
, 0, surface2v1
);
1464 ok(hr
== DDERR_SURFACENOTATTACHED
, "DeleteAttachedSurface returned %08x\n", hr
);
1465 if (surface2v1
!= NULL
) IDirectDrawSurface_Release(surface2v1
);
1466 if (surface1v1
!= NULL
) IDirectDrawSurface_Release(surface1v1
);
1467 hr
= IDirectDrawSurface7_DeleteAttachedSurface(surface1
, 0, surface2
);
1468 ok(hr
== DD_OK
, "DeleteAttachedSurface returned %08x\n", hr
);
1469 ref
= getRefcount((IUnknown
*)surface2
);
1470 ok(ref
== 1, "Got refcount %d, expected 1\n", ref
);
1473 /* Automatic detachment on release */
1474 hr
= IDirectDrawSurface7_AddAttachedSurface(surface1
, surface2
);
1475 ok(hr
== DD_OK
, "AddAttachedSurface returned %08x\n", hr
);
1476 ref
= getRefcount((IUnknown
*)surface2
);
1477 ok(ref
== 2, "Got refcount %d, expected 2\n", ref
);
1478 ref
= IDirectDrawSurface7_Release(surface1
);
1479 ok(!ref
, "Got refcount %d, expected 0\n", ref
);
1480 ref
= getRefcount((IUnknown
*)surface2
);
1481 ok(ref
== 1, "Got refcount %d, expected 1\n", ref
);
1482 ref
= IDirectDrawSurface7_Release(surface2
);
1483 ok(!ref
, "Got refcount %d, expected 0\n", ref
);
1486 IDirectDrawSurface7_Release(surface1
);
1489 hr
=IDirectDraw7_SetCooperativeLevel(dd7
, NULL
, DDSCL_NORMAL
);
1490 ok(hr
== DD_OK
, "SetCooperativeLevel returned %08x\n", hr
);
1491 IDirectDraw7_Release(dd7
);
1494 static void AttachmentTest(void)
1497 IDirectDrawSurface
*surface1
, *surface2
, *surface3
, *surface4
;
1498 DDSURFACEDESC ddsd
, ddsd2
;
1500 DDSCAPS caps
= {DDSCAPS_TEXTURE
};
1501 BOOL refrast
= FALSE
;
1502 HWND window
= CreateWindow( "static", "ddraw_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
1504 memset(&ddsd
, 0, sizeof(ddsd
));
1505 ddsd
.dwSize
= sizeof(ddsd
);
1506 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_MIPMAPCOUNT
;
1507 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
;
1508 U2(ddsd
).dwMipMapCount
= 3; /* Will create 128x128, 64x64, 32x32 */
1510 ddsd
.dwHeight
= 128;
1511 hr
= IDirectDraw7_CreateSurface(lpDD
, &ddsd
, &surface1
, NULL
);
1512 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1514 hr
= IDirectDrawSurface7_GetAttachedSurface(surface1
, &caps
, &surface2
);
1515 ok(hr
== DD_OK
, "GetAttachedSurface returned %08x\n", hr
);
1516 hr
= IDirectDrawSurface7_GetAttachedSurface(surface2
, &caps
, &surface3
);
1517 ok(hr
== DD_OK
, "GetAttachedSurface returned %08x\n", hr
);
1519 /* Try to attach a 16x16 miplevel - Should not work as far I can see */
1520 memset(&ddsd
, 0, sizeof(ddsd
));
1521 ddsd
.dwSize
= sizeof(ddsd
);
1522 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
1523 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
;
1526 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface4
, NULL
);
1527 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1529 hr
= IDirectDrawSurface7_AddAttachedSurface(surface1
, surface4
);
1530 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 16x16 surface to a 128x128 texture root returned %08x\n", hr
);
1531 hr
= IDirectDrawSurface7_AddAttachedSurface(surface4
, surface1
);
1532 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 128x128 texture root to a 16x16 texture returned %08x\n", hr
);
1533 hr
= IDirectDrawSurface7_AddAttachedSurface(surface3
, surface4
);
1534 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 16x16 surface to a 32x32 texture mip level returned %08x\n", hr
);
1535 hr
= IDirectDrawSurface7_AddAttachedSurface(surface4
, surface3
);
1536 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 32x32 texture mip level to a 16x16 surface returned %08x\n", hr
);
1537 hr
= IDirectDrawSurface7_AddAttachedSurface(surface2
, surface4
);
1538 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 16x16 surface to a 64x64 texture sublevel returned %08x\n", hr
);
1539 hr
= IDirectDrawSurface7_AddAttachedSurface(surface4
, surface2
);
1540 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 64x64 texture sublevel to a 16x16 texture returned %08x\n", hr
);
1542 IDirectDrawSurface7_Release(surface4
);
1544 memset(&ddsd
, 0, sizeof(ddsd
));
1545 ddsd
.dwSize
= sizeof(ddsd
);
1546 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
1547 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_SYSTEMMEMORY
| DDSCAPS_OFFSCREENPLAIN
;
1550 hr
= IDirectDraw7_CreateSurface(lpDD
, &ddsd
, &surface4
, NULL
);
1551 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1553 if (SUCCEEDED(IDirectDrawSurface7_AddAttachedSurface(surface1
, surface4
)))
1555 IDirectDrawSurface7_DeleteAttachedSurface(surface1
, 0, surface4
);
1559 hr
= IDirectDrawSurface7_AddAttachedSurface(surface1
, surface4
); /* Succeeds on refrast */
1561 ok(hr
== S_OK
, "Attaching a 16x16 offscreen plain surface to a 128x128 texture root returned %08x\n", hr
);
1563 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 16x16 offscreen plain surface to a 128x128 texture root returned %08x\n", hr
);
1564 if(SUCCEEDED(hr
)) IDirectDrawSurface7_DeleteAttachedSurface(surface1
, 0, surface4
);
1566 hr
= IDirectDrawSurface7_AddAttachedSurface(surface4
, surface1
); /* Succeeds on refrast */
1568 ok(hr
== S_OK
, "Attaching a 128x128 texture root to a 16x16 offscreen plain surface returned %08x\n", hr
);
1570 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 128x128 texture root to a 16x16 offscreen plain surface returned %08x\n", hr
);
1571 if(SUCCEEDED(hr
)) IDirectDrawSurface7_DeleteAttachedSurface(surface1
, 0, surface1
);
1573 hr
= IDirectDrawSurface7_AddAttachedSurface(surface3
, surface4
); /* Succeeds on refrast */
1575 ok(hr
== S_OK
, "Attaching a 16x16 offscreen plain surface to a 32x32 texture mip level returned %08x\n", hr
);
1577 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 16x16 offscreen plain surface to a 32x32 texture mip level returned %08x\n", hr
);
1578 if(SUCCEEDED(hr
)) IDirectDrawSurface7_DeleteAttachedSurface(surface3
, 0, surface4
);
1580 hr
= IDirectDrawSurface7_AddAttachedSurface(surface4
, surface3
);
1581 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 32x32 texture mip level to a 16x16 offscreen plain surface returned %08x\n", hr
);
1582 if(SUCCEEDED(hr
)) IDirectDrawSurface7_DeleteAttachedSurface(surface4
, 0, surface3
);
1584 hr
= IDirectDrawSurface7_AddAttachedSurface(surface2
, surface4
); /* Succeeds on refrast */
1586 ok(hr
== S_OK
, "Attaching a 16x16 offscreen plain surface to a 64x64 texture sublevel returned %08x\n", hr
);
1588 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 16x16 offscreen plain surface to a 64x64 texture sublevel returned %08x\n", hr
);
1589 if(SUCCEEDED(hr
)) IDirectDrawSurface7_DeleteAttachedSurface(surface2
, 0, surface4
);
1591 hr
= IDirectDrawSurface7_AddAttachedSurface(surface4
, surface2
);
1592 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a 64x64 texture sublevel to a 16x16 offscreen plain surface returned %08x\n", hr
);
1593 if(SUCCEEDED(hr
)) IDirectDrawSurface7_DeleteAttachedSurface(surface4
, 0, surface2
);
1595 IDirectDrawSurface7_Release(surface4
);
1596 IDirectDrawSurface7_Release(surface3
);
1597 IDirectDrawSurface7_Release(surface2
);
1598 IDirectDrawSurface7_Release(surface1
);
1600 hr
= IDirectDraw_SetCooperativeLevel(lpDD
, window
, DDSCL_EXCLUSIVE
| DDSCL_FULLSCREEN
);
1601 ok(hr
== DD_OK
, "SetCooperativeLevel returned %08x\n", hr
);
1603 /* Creating a back buffer as-is, is not allowed. No need to perform attachment tests */
1604 memset(&ddsd
, 0, sizeof(ddsd
));
1605 ddsd
.dwSize
= sizeof(ddsd
);
1606 ddsd
.dwFlags
= DDSD_CAPS
;
1607 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
| DDSCAPS_BACKBUFFER
;
1608 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface2
, NULL
);
1609 ok(hr
==DDERR_INVALIDCAPS
,"CreateSurface returned: %x\n",hr
);
1610 /* This old ddraw version happily creates explicit front buffers */
1611 memset(&ddsd
, 0, sizeof(ddsd
));
1612 ddsd
.dwSize
= sizeof(ddsd
);
1613 ddsd
.dwFlags
= DDSD_CAPS
;
1614 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
| DDSCAPS_FRONTBUFFER
;
1615 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface1
, NULL
);
1616 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1617 IDirectDrawSurface_Release(surface1
);
1619 /* Try a single primary and two offscreen plain surfaces */
1620 memset(&ddsd
, 0, sizeof(ddsd
));
1621 ddsd
.dwSize
= sizeof(ddsd
);
1622 ddsd
.dwFlags
= DDSD_CAPS
;
1623 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
1624 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface1
, NULL
);
1625 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1627 memset(&ddsd
, 0, sizeof(ddsd
));
1628 ddsd
.dwSize
= sizeof(ddsd
);
1629 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
1630 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
1631 ddsd
.dwWidth
= GetSystemMetrics(SM_CXSCREEN
);
1632 ddsd
.dwHeight
= GetSystemMetrics(SM_CYSCREEN
);
1633 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface2
, NULL
);
1634 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1636 memset(&ddsd
, 0, sizeof(ddsd
));
1637 ddsd
.dwSize
= sizeof(ddsd
);
1638 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
1639 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
1640 ddsd
.dwWidth
= GetSystemMetrics(SM_CXSCREEN
);
1641 ddsd
.dwHeight
= GetSystemMetrics(SM_CYSCREEN
);
1642 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface3
, NULL
);
1643 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1645 /* This one has a different size */
1646 memset(&ddsd
, 0, sizeof(ddsd
));
1647 ddsd
.dwSize
= sizeof(ddsd
);
1648 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
1649 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
1651 ddsd
.dwHeight
= 128;
1652 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface4
, NULL
);
1653 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
1655 hr
= IDirectDrawSurface_AddAttachedSurface(surface1
, surface2
);
1656 ok(hr
== DD_OK
|| broken(hr
== DDERR_CANNOTATTACHSURFACE
),
1657 "Attaching an offscreen plain surface to a front buffer returned %08x\n", hr
);
1660 /* Try the reverse without detaching first */
1661 hr
= IDirectDrawSurface_AddAttachedSurface(surface2
, surface1
);
1662 ok(hr
== DDERR_SURFACEALREADYATTACHED
, "Attaching an attached surface to its attachee returned %08x\n", hr
);
1663 hr
= IDirectDrawSurface_DeleteAttachedSurface(surface1
, 0, surface2
);
1664 ok(hr
== DD_OK
, "DeleteAttachedSurface failed with %08x\n", hr
);
1666 hr
= IDirectDrawSurface_AddAttachedSurface(surface2
, surface1
);
1667 ok(hr
== DD_OK
|| broken(hr
== DDERR_CANNOTATTACHSURFACE
),
1668 "Attaching a front buffer to an offscreen plain surface returned %08x\n", hr
);
1671 /* Try to detach reversed */
1672 hr
= IDirectDrawSurface_DeleteAttachedSurface(surface1
, 0, surface2
);
1673 ok(hr
== DDERR_CANNOTDETACHSURFACE
, "DeleteAttachedSurface returned %08x\n", hr
);
1674 /* Now the proper detach */
1675 hr
= IDirectDrawSurface_DeleteAttachedSurface(surface2
, 0, surface1
);
1676 ok(hr
== DD_OK
, "DeleteAttachedSurface failed with %08x\n", hr
);
1678 hr
= IDirectDrawSurface_AddAttachedSurface(surface2
, surface3
); /* Fails on refrast */
1679 ok(hr
== DD_OK
|| broken(hr
== DDERR_CANNOTATTACHSURFACE
),
1680 "Attaching an offscreen plain surface to another offscreen plain surface returned %08x\n", hr
);
1683 hr
= IDirectDrawSurface_DeleteAttachedSurface(surface2
, 0, surface3
);
1684 ok(hr
== DD_OK
, "DeleteAttachedSurface failed with %08x\n", hr
);
1686 hr
= IDirectDrawSurface_AddAttachedSurface(surface1
, surface4
);
1687 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching an offscreen plain surface to a front buffer of different size returned %08x\n", hr
);
1688 hr
= IDirectDrawSurface_AddAttachedSurface(surface4
, surface1
);
1689 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a front buffer to an offscreen plain surface of different size returned %08x\n", hr
);
1691 IDirectDrawSurface_Release(surface4
);
1692 IDirectDrawSurface_Release(surface3
);
1693 IDirectDrawSurface_Release(surface2
);
1694 IDirectDrawSurface_Release(surface1
);
1696 /* Test DeleteAttachedSurface and automatic detachment of attached surfaces on release */
1697 memset(&ddsd
, 0, sizeof(ddsd
));
1698 ddsd
.dwSize
= sizeof(ddsd
);
1699 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
;
1702 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
| DDSCAPS_3DDEVICE
;
1703 U4(ddsd
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd
).ddpfPixelFormat
);
1704 U4(ddsd
).ddpfPixelFormat
.dwFlags
= DDPF_PALETTEINDEXED8
| DDPF_RGB
;
1705 U1(U4(ddsd
).ddpfPixelFormat
).dwRGBBitCount
= 8;
1707 memset(&ddsd2
, 0, sizeof(ddsd2
));
1708 ddsd2
.dwSize
= sizeof(ddsd2
);
1709 ddsd2
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
;
1710 ddsd2
.dwWidth
= ddsd
.dwWidth
;
1711 ddsd2
.dwHeight
= ddsd
.dwHeight
;
1712 ddsd2
.ddsCaps
.dwCaps
= DDSCAPS_3DDEVICE
| DDSCAPS_ZBUFFER
;
1713 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
1714 U4(ddsd2
).ddpfPixelFormat
.dwFlags
= DDPF_ZBUFFER
;
1715 U1(U4(ddsd2
).ddpfPixelFormat
).dwZBufferBitDepth
= 16;
1716 U3(U4(ddsd2
).ddpfPixelFormat
).dwZBitMask
= 0x0000FFFF;
1718 hr
= IDirectDraw_CreateSurface(lpDD
, (DDSURFACEDESC
*)&ddsd
, &surface1
, NULL
);
1719 ok(hr
== DD_OK
, "CreateSurface returned %08x\n", hr
);
1722 hr
= IDirectDraw_CreateSurface(lpDD
, (DDSURFACEDESC
*)&ddsd2
, &surface2
, NULL
);
1723 ok(hr
== DD_OK
, "CreateSurface returned %08x\n", hr
);
1726 /* DeleteAttachedSurface */
1727 hr
= IDirectDrawSurface_AddAttachedSurface(surface1
, surface2
);
1728 ok(hr
== DD_OK
, "AddAttachedSurface returned %08x\n", hr
);
1731 ref
= getRefcount((IUnknown
*)surface2
);
1732 ok(ref
== 2, "Got refcount %d, expected 2\n", ref
);
1733 hr
= IDirectDrawSurface_DeleteAttachedSurface(surface1
, 0, surface2
);
1734 ok(hr
== DD_OK
, "DeleteAttachedSurface returned %08x\n", hr
);
1735 ref
= getRefcount((IUnknown
*)surface2
);
1736 ok(ref
== 1, "Got refcount %d, expected 1\n", ref
);
1739 /* Automatic detachment on release */
1740 hr
= IDirectDrawSurface_AddAttachedSurface(surface1
, surface2
);
1741 ok(hr
== DD_OK
, "AddAttachedSurface returned %08x\n", hr
);
1742 ref
= getRefcount((IUnknown
*)surface2
);
1743 ok(ref
== 2, "Got refcount %d, expected 2\n", ref
);
1744 ref
= IDirectDrawSurface_Release(surface1
);
1745 ok(!ref
, "Got refcount %d, expected 0\n", ref
);
1746 ref
= getRefcount((IUnknown
*)surface2
);
1747 ok(ref
== 1, "Got refcount %d, expected 1\n", ref
);
1748 ref
= IDirectDrawSurface_Release(surface2
);
1749 ok(!ref
, "Got refcount %d, expected 0\n", ref
);
1752 IDirectDrawSurface_Release(surface1
);
1755 hr
=IDirectDraw_SetCooperativeLevel(lpDD
, NULL
, DDSCL_NORMAL
);
1756 ok(hr
== DD_OK
, "SetCooperativeLevel returned %08x\n", hr
);
1758 DestroyWindow(window
);
1763 DWORD width
, height
;
1768 static HRESULT WINAPI
CubeTestPaletteEnum(IDirectDrawSurface7
*surface
, DDSURFACEDESC2
*desc
, void *context
)
1772 hr
= IDirectDrawSurface7_SetPalette(surface
, context
);
1773 if (desc
->dwWidth
== 64) /* This is for first mimpmap */
1774 ok(hr
== DDERR_NOTONMIPMAPSUBLEVEL
, "SetPalette returned: %x\n",hr
);
1776 ok(hr
== DD_OK
, "SetPalette returned: %x\n",hr
);
1778 IDirectDrawSurface7_Release(surface
);
1780 return DDENUMRET_OK
;
1783 static HRESULT WINAPI
CubeTestLvl2Enum(IDirectDrawSurface7
*surface
, DDSURFACEDESC2
*desc
, void *context
)
1785 UINT
*mips
= context
;
1788 IDirectDrawSurface7_EnumAttachedSurfaces(surface
,
1792 return DDENUMRET_OK
;
1795 static HRESULT WINAPI
CubeTestLvl1Enum(IDirectDrawSurface7
*surface
, DDSURFACEDESC2
*desc
, void *context
)
1798 UINT
*num
= context
;
1799 static const struct compare expected
[] =
1803 DDSCAPS_MIPMAP
| DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
| DDSCAPS_COMPLEX
,
1804 DDSCAPS2_CUBEMAP
| DDSCAPS2_CUBEMAP_NEGATIVEZ
,
1809 DDSCAPS_MIPMAP
| DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
| DDSCAPS_COMPLEX
,
1810 DDSCAPS2_CUBEMAP
| DDSCAPS2_CUBEMAP_POSITIVEZ
,
1815 DDSCAPS_MIPMAP
| DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
| DDSCAPS_COMPLEX
,
1816 DDSCAPS2_CUBEMAP
| DDSCAPS2_CUBEMAP_NEGATIVEY
,
1821 DDSCAPS_MIPMAP
| DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
| DDSCAPS_COMPLEX
,
1822 DDSCAPS2_CUBEMAP
| DDSCAPS2_CUBEMAP_POSITIVEY
,
1827 DDSCAPS_MIPMAP
| DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
| DDSCAPS_COMPLEX
,
1828 DDSCAPS2_CUBEMAP
| DDSCAPS2_CUBEMAP_NEGATIVEX
,
1832 64, 64, /* This is the first mipmap */
1833 DDSCAPS_MIPMAP
| DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
| DDSCAPS_COMPLEX
,
1834 DDSCAPS2_MIPMAPSUBLEVEL
| DDSCAPS2_CUBEMAP
| DDSCAPS2_CUBEMAP_POSITIVEX
,
1840 IDirectDrawSurface7_EnumAttachedSurfaces(surface
,
1844 ok(desc
->dwWidth
== expected
[*num
].width
, "Surface width is %d expected %d\n", desc
->dwWidth
, expected
[*num
].width
);
1845 ok(desc
->dwHeight
== expected
[*num
].height
, "Surface height is %d expected %d\n", desc
->dwHeight
, expected
[*num
].height
);
1846 ok(desc
->ddsCaps
.dwCaps
== expected
[*num
].caps
, "Surface caps are %08x expected %08x\n", desc
->ddsCaps
.dwCaps
, expected
[*num
].caps
);
1847 ok(desc
->ddsCaps
.dwCaps2
== expected
[*num
].caps2
, "Surface caps2 are %08x expected %08x\n", desc
->ddsCaps
.dwCaps2
, expected
[*num
].caps2
);
1848 ok(mips
== expected
[*num
].mips
, "Surface has %d mipmaps, expected %d\n", mips
, expected
[*num
].mips
);
1852 IDirectDrawSurface7_Release(surface
);
1854 return DDENUMRET_OK
;
1857 static void CubeMapTest(void)
1859 IDirectDraw7
*dd7
= NULL
;
1860 IDirectDrawSurface7
*cubemap
= NULL
;
1861 IDirectDrawPalette
*palette
= NULL
;
1862 DDSURFACEDESC2 ddsd
;
1864 PALETTEENTRY Table
[256];
1868 struct enumstruct ctx
;
1870 for(i
=0; i
<256; i
++)
1872 Table
[i
].peRed
= 0xff;
1873 Table
[i
].peGreen
= 0;
1874 Table
[i
].peBlue
= 0;
1875 Table
[i
].peFlags
= 0;
1878 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
1879 ok(hr
== DD_OK
, "IDirectDraw::QueryInterface returned %08x\n", hr
);
1880 if (FAILED(hr
)) goto err
;
1882 memset(&ddsd
, 0, sizeof(ddsd
));
1883 ddsd
.dwSize
= sizeof(ddsd
);
1884 U4(ddsd
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd
).ddpfPixelFormat
);
1885 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
| DDSD_CAPS
;
1887 ddsd
.dwHeight
= 128;
1888 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
| DDSCAPS_SYSTEMMEMORY
;
1889 ddsd
.ddsCaps
.dwCaps2
= DDSCAPS2_CUBEMAP
| DDSCAPS2_CUBEMAP_ALLFACES
;
1892 U4(ddsd
).ddpfPixelFormat
.dwFlags
= DDPF_RGB
;
1893 U1(U4(ddsd
).ddpfPixelFormat
).dwRGBBitCount
= 16;
1894 U2(U4(ddsd
).ddpfPixelFormat
).dwRBitMask
= 0xF800;
1895 U3(U4(ddsd
).ddpfPixelFormat
).dwGBitMask
= 0x07E0;
1896 U4(U4(ddsd
).ddpfPixelFormat
).dwBBitMask
= 0x001F;
1898 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &cubemap
, NULL
);
1901 skip("Can't create cubemap surface\n");
1905 hr
= IDirectDrawSurface7_GetSurfaceDesc(cubemap
, &ddsd
);
1906 ok(hr
== DD_OK
, "IDirectDrawSurface7_GetSurfaceDesc returned %08x\n", hr
);
1907 ok(ddsd
.ddsCaps
.dwCaps
== (DDSCAPS_MIPMAP
| DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
| DDSCAPS_COMPLEX
),
1908 "Root Caps are %08x\n", ddsd
.ddsCaps
.dwCaps
);
1909 ok(ddsd
.ddsCaps
.dwCaps2
== (DDSCAPS2_CUBEMAP_POSITIVEX
| DDSCAPS2_CUBEMAP
),
1910 "Root Caps2 are %08x\n", ddsd
.ddsCaps
.dwCaps2
);
1912 IDirectDrawSurface7_EnumAttachedSurfaces(cubemap
,
1915 ok(num
== 6, "Surface has %d attachments\n", num
);
1916 IDirectDrawSurface7_Release(cubemap
);
1918 /* What happens if I do not specify any faces? */
1919 memset(&ddsd
, 0, sizeof(ddsd
));
1920 ddsd
.dwSize
= sizeof(ddsd
);
1921 U4(ddsd
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd
).ddpfPixelFormat
);
1922 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
| DDSD_CAPS
;
1924 ddsd
.dwHeight
= 128;
1925 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
| DDSCAPS_SYSTEMMEMORY
;
1926 ddsd
.ddsCaps
.dwCaps2
= DDSCAPS2_CUBEMAP
;
1929 U4(ddsd
).ddpfPixelFormat
.dwFlags
= DDPF_RGB
;
1930 U1(U4(ddsd
).ddpfPixelFormat
).dwRGBBitCount
= 16;
1931 U2(U4(ddsd
).ddpfPixelFormat
).dwRBitMask
= 0xF800;
1932 U3(U4(ddsd
).ddpfPixelFormat
).dwGBitMask
= 0x07E0;
1933 U4(U4(ddsd
).ddpfPixelFormat
).dwBBitMask
= 0x001F;
1935 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &cubemap
, NULL
);
1936 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw7::CreateSurface asking for a cube map without faces returned %08x\n", hr
);
1938 /* Cube map faces without a cube map? */
1939 memset(&ddsd
, 0, sizeof(ddsd
));
1940 ddsd
.dwSize
= sizeof(ddsd
);
1941 U4(ddsd
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd
).ddpfPixelFormat
);
1942 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
| DDSD_CAPS
;
1944 ddsd
.dwHeight
= 128;
1945 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
| DDSCAPS_SYSTEMMEMORY
;
1946 ddsd
.ddsCaps
.dwCaps2
= DDSCAPS2_CUBEMAP_ALLFACES
;
1949 U4(ddsd
).ddpfPixelFormat
.dwFlags
= DDPF_RGB
;
1950 U1(U4(ddsd
).ddpfPixelFormat
).dwRGBBitCount
= 16;
1951 U2(U4(ddsd
).ddpfPixelFormat
).dwRBitMask
= 0xF800;
1952 U3(U4(ddsd
).ddpfPixelFormat
).dwGBitMask
= 0x07E0;
1953 U4(U4(ddsd
).ddpfPixelFormat
).dwBBitMask
= 0x001F;
1955 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &cubemap
, NULL
);
1956 ok(hr
== DDERR_INVALIDCAPS
, "IDirectDraw7::CreateSurface returned %08x\n", hr
);
1958 memset(&ddsd
, 0, sizeof(ddsd
));
1959 ddsd
.dwSize
= sizeof(ddsd
);
1960 U4(ddsd
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd
).ddpfPixelFormat
);
1961 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
| DDSD_CAPS
;
1963 ddsd
.dwHeight
= 128;
1964 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
| DDSCAPS_SYSTEMMEMORY
;
1965 ddsd
.ddsCaps
.dwCaps2
= DDSCAPS2_CUBEMAP_POSITIVEX
;
1968 U4(ddsd
).ddpfPixelFormat
.dwFlags
= DDPF_RGB
;
1969 U1(U4(ddsd
).ddpfPixelFormat
).dwRGBBitCount
= 16;
1970 U2(U4(ddsd
).ddpfPixelFormat
).dwRBitMask
= 0xF800;
1971 U3(U4(ddsd
).ddpfPixelFormat
).dwGBitMask
= 0x07E0;
1972 U4(U4(ddsd
).ddpfPixelFormat
).dwBBitMask
= 0x001F;
1974 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &cubemap
, NULL
);
1975 ok(hr
== DDERR_INVALIDCAPS
, "IDirectDraw7::CreateSurface returned %08x\n", hr
);
1977 memset(&ddsd
, 0, sizeof(ddsd
));
1978 ddsd
.dwSize
= sizeof(ddsd
);
1979 U4(ddsd
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd
).ddpfPixelFormat
);
1980 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
| DDSD_CAPS
;
1982 ddsd
.dwHeight
= 128;
1983 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_COMPLEX
| DDSCAPS_MIPMAP
| DDSCAPS_SYSTEMMEMORY
;
1984 ddsd
.ddsCaps
.dwCaps2
= DDSCAPS2_CUBEMAP
| DDSCAPS2_CUBEMAP_ALLFACES
;
1986 U4(ddsd
).ddpfPixelFormat
.dwFlags
= DDPF_RGB
| DDPF_PALETTEINDEXED8
;
1987 U1(U4(ddsd
).ddpfPixelFormat
).dwRGBBitCount
= 8;
1989 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &cubemap
, NULL
);
1992 skip("Can't create palletized cubemap surface\n");
1996 hr
= IDirectDraw7_CreatePalette(dd7
, DDPCAPS_ALLOW256
| DDPCAPS_8BIT
, Table
, &palette
, NULL
);
1997 ok(hr
== DD_OK
, "CreatePalette failed with %08x\n", hr
);
1999 hr
= IDirectDrawSurface7_EnumAttachedSurfaces(cubemap
, palette
, CubeTestPaletteEnum
);
2000 ok(hr
== DD_OK
, "EnumAttachedSurfaces failed\n");
2002 ref
= getRefcount((IUnknown
*) palette
);
2003 ok(ref
== 6, "Refcount is %u, expected 1\n", ref
);
2005 IDirectDrawSurface7_Release(cubemap
);
2007 ref
= getRefcount((IUnknown
*) palette
);
2008 todo_wine
ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
2010 IDirectDrawPalette_Release(palette
);
2012 /* Make sure everything is cleaned up properly. Use the enumSurfaces test infrastructure */
2013 memset(&ctx
, 0, sizeof(ctx
));
2014 memset(&ddsd
, 0, sizeof(ddsd
));
2015 ddsd
.dwSize
= sizeof(DDSURFACEDESC
);
2016 hr
= IDirectDraw_EnumSurfaces(lpDD
, DDENUMSURFACES_DOESEXIST
| DDENUMSURFACES_ALL
, (DDSURFACEDESC
*) &ddsd
, (void *) &ctx
, enumCB
);
2017 ok(hr
== DD_OK
, "IDirectDraw_EnumSurfaces returned %08x\n", hr
);
2018 ok(ctx
.count
== 0, "%d surfaces enumerated, expected 0\n", ctx
.count
);
2021 if (dd7
) IDirectDraw7_Release(dd7
);
2024 static void test_lockrect_invalid(void)
2037 {68, 60, 60, 68}, /* left > right */
2038 {60, 68, 68, 60}, /* top > bottom */
2039 {-8, 60, 0, 68}, /* left < surface */
2040 {60, -8, 68, 0}, /* top < surface */
2041 {-16, 60, -8, 68}, /* right < surface */
2042 {60, -16, 68, -8}, /* bottom < surface */
2043 {60, 60, 136, 68}, /* right > surface */
2044 {60, 60, 68, 136}, /* bottom > surface */
2045 {136, 60, 144, 68}, /* left > surface */
2046 {60, 136, 68, 144}, /* top > surface */
2049 const DWORD dds_caps
[] = {
2050 DDSCAPS_OFFSCREENPLAIN
2053 for (j
= 0; j
< (sizeof(dds_caps
) / sizeof(*dds_caps
)); ++j
)
2055 IDirectDrawSurface
*surface
= 0;
2056 DDSURFACEDESC surface_desc
= {0};
2057 DDSURFACEDESC locked_desc
= {0};
2060 surface_desc
.dwSize
= sizeof(surface_desc
);
2061 surface_desc
.ddpfPixelFormat
.dwSize
= sizeof(surface_desc
.ddpfPixelFormat
);
2062 surface_desc
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
;
2063 surface_desc
.ddsCaps
.dwCaps
= dds_caps
[j
];
2064 surface_desc
.dwWidth
= 128;
2065 surface_desc
.dwHeight
= 128;
2066 surface_desc
.ddpfPixelFormat
.dwFlags
= DDPF_RGB
;
2067 U1(surface_desc
.ddpfPixelFormat
).dwRGBBitCount
= 32;
2068 U2(surface_desc
.ddpfPixelFormat
).dwRBitMask
= 0xFF0000;
2069 U3(surface_desc
.ddpfPixelFormat
).dwGBitMask
= 0x00FF00;
2070 U4(surface_desc
.ddpfPixelFormat
).dwBBitMask
= 0x0000FF;
2072 hr
= IDirectDraw_CreateSurface(lpDD
, &surface_desc
, &surface
, NULL
);
2073 ok(SUCCEEDED(hr
), "CreateSurface failed (0x%08x)\n", hr
);
2076 skip("failed to create surface\n");
2080 hr
= IDirectDrawSurface_Lock(surface
, NULL
, NULL
, DDLOCK_WAIT
, NULL
);
2081 ok(hr
== DDERR_INVALIDPARAMS
, "Lock returned 0x%08x for NULL DDSURFACEDESC,"
2082 " expected DDERR_INVALIDPARAMS (0x%08x)\n", hr
, DDERR_INVALIDPARAMS
);
2084 for (i
= 0; i
< (sizeof(valid
) / sizeof(*valid
)); ++i
)
2086 RECT
*rect
= &valid
[i
];
2088 memset(&locked_desc
, 0, sizeof(locked_desc
));
2089 locked_desc
.dwSize
= sizeof(locked_desc
);
2091 hr
= IDirectDrawSurface_Lock(surface
, rect
, &locked_desc
, DDLOCK_WAIT
, NULL
);
2092 ok(SUCCEEDED(hr
), "Lock failed (0x%08x) for rect [%d, %d]->[%d, %d]\n",
2093 hr
, rect
->left
, rect
->top
, rect
->right
, rect
->bottom
);
2095 hr
= IDirectDrawSurface_Unlock(surface
, NULL
);
2096 ok(SUCCEEDED(hr
), "Unlock failed (0x%08x)\n", hr
);
2099 for (i
= 0; i
< (sizeof(invalid
) / sizeof(*invalid
)); ++i
)
2101 RECT
*rect
= &invalid
[i
];
2103 memset(&locked_desc
, 1, sizeof(locked_desc
));
2104 locked_desc
.dwSize
= sizeof(locked_desc
);
2106 hr
= IDirectDrawSurface_Lock(surface
, rect
, &locked_desc
, DDLOCK_WAIT
, NULL
);
2107 ok(hr
== DDERR_INVALIDPARAMS
, "Lock returned 0x%08x for rect [%d, %d]->[%d, %d]"
2108 ", expected DDERR_INVALIDPARAMS (0x%08x)\n", hr
, rect
->left
, rect
->top
,
2109 rect
->right
, rect
->bottom
, DDERR_INVALIDPARAMS
);
2110 ok(!locked_desc
.lpSurface
, "IDirectDrawSurface_Lock did not set lpSurface in the surface desc to zero.\n");
2113 hr
= IDirectDrawSurface_Lock(surface
, NULL
, &locked_desc
, DDLOCK_WAIT
, NULL
);
2114 ok(hr
== DD_OK
, "IDirectDrawSurface_Lock(rect = NULL) failed (0x%08x)\n", hr
);
2115 hr
= IDirectDrawSurface_Lock(surface
, NULL
, &locked_desc
, DDLOCK_WAIT
, NULL
);
2116 ok(hr
== DDERR_SURFACEBUSY
, "Double lock(rect = NULL) returned 0x%08x\n", hr
);
2118 hr
= IDirectDrawSurface_Unlock(surface
, NULL
);
2119 ok(SUCCEEDED(hr
), "Unlock failed (0x%08x)\n", hr
);
2121 hr
= IDirectDrawSurface_Unlock(surface
, NULL
);
2122 ok(SUCCEEDED(hr
), "Unlock failed (0x%08x)\n", hr
);
2124 memset(&locked_desc
, 0, sizeof(locked_desc
));
2125 locked_desc
.dwSize
= sizeof(locked_desc
);
2126 hr
= IDirectDrawSurface_Lock(surface
, &valid
[0], &locked_desc
, DDLOCK_WAIT
, NULL
);
2127 ok(hr
== DD_OK
, "IDirectDrawSurface_Lock(rect = [%d, %d]->[%d, %d]) failed (0x%08x)\n",
2128 valid
[0].left
, valid
[0].top
, valid
[0].right
, valid
[0].bottom
, hr
);
2129 hr
= IDirectDrawSurface_Lock(surface
, &valid
[0], &locked_desc
, DDLOCK_WAIT
, NULL
);
2130 ok(hr
== DDERR_SURFACEBUSY
, "Double lock(rect = [%d, %d]->[%d, %d]) failed (0x%08x)\n",
2131 valid
[0].left
, valid
[0].top
, valid
[0].right
, valid
[0].bottom
, hr
);
2133 /* Locking a different rectangle returns DD_OK, but it seems to break the surface.
2134 * Afterwards unlocking the surface fails(NULL rectangle, and both locked rectangles
2137 hr
= IDirectDrawSurface_Unlock(surface
, NULL
);
2138 ok(hr
== DD_OK
, "Unlock returned (0x%08x)\n", hr
);
2140 IDirectDrawSurface_Release(surface
);
2144 static void CompressedTest(void)
2147 IDirectDrawSurface7
*surface
;
2148 DDSURFACEDESC2 ddsd
, ddsd2
;
2149 IDirectDraw7
*dd7
= NULL
;
2150 RECT r
= { 0, 0, 128, 128 };
2151 RECT r2
= { 32, 32, 64, 64 };
2153 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
2154 ok(hr
== DD_OK
, "IDirectDraw::QueryInterface returned %08x\n", hr
);
2156 memset(&ddsd
, 0, sizeof(ddsd
));
2157 ddsd
.dwSize
= sizeof(ddsd
);
2158 U4(ddsd
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd
).ddpfPixelFormat
);
2159 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
| DDSD_CAPS
;
2161 ddsd
.dwHeight
= 128;
2162 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
;
2163 U4(ddsd
).ddpfPixelFormat
.dwFlags
= DDPF_FOURCC
;
2164 U4(ddsd
).ddpfPixelFormat
.dwFourCC
= MAKEFOURCC('D','X','T','1');
2166 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface
, NULL
);
2167 ok(hr
== DD_OK
, "CreateSurface returned %08x\n", hr
);
2170 skip("failed to create surface\n");
2174 memset(&ddsd2
, 0, sizeof(ddsd2
));
2175 ddsd2
.dwSize
= sizeof(ddsd2
);
2176 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2177 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface
, &ddsd2
);
2178 ok(hr
== DD_OK
, "GetSurfaceDesc returned %08x\n", hr
);
2180 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2181 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2182 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2183 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2184 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2185 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2186 ok(U1(ddsd2
).dwLinearSize
== 8192, "Linear size is %d\n", U1(ddsd2
).dwLinearSize
);
2187 ok(ddsd2
.ddsCaps
.dwCaps2
== 0, "Caps2: %08x\n", ddsd2
.ddsCaps
.dwCaps2
);
2188 IDirectDrawSurface7_Release(surface
);
2190 U4(ddsd
).ddpfPixelFormat
.dwFourCC
= MAKEFOURCC('D','X','T','3');
2191 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface
, NULL
);
2192 ok(hr
== DD_OK
, "CreateSurface returned %08x\n", hr
);
2195 skip("failed to create surface\n");
2199 memset(&ddsd2
, 0, sizeof(ddsd2
));
2200 ddsd2
.dwSize
= sizeof(ddsd2
);
2201 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2202 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface
, &ddsd2
);
2203 ok(hr
== DD_OK
, "GetSurfaceDesc returned %08x\n", hr
);
2205 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2206 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2207 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2208 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2209 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2210 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2211 ok(U1(ddsd2
).dwLinearSize
== 16384, "Linear size is %d\n", U1(ddsd2
).dwLinearSize
);
2212 IDirectDrawSurface7_Release(surface
);
2214 U4(ddsd
).ddpfPixelFormat
.dwFourCC
= MAKEFOURCC('D','X','T','5');
2215 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface
, NULL
);
2216 ok(hr
== DD_OK
, "CreateSurface returned %08x\n", hr
);
2219 skip("failed to create surface\n");
2223 memset(&ddsd2
, 0, sizeof(ddsd2
));
2224 ddsd2
.dwSize
= sizeof(ddsd2
);
2225 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2226 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface
, &ddsd2
);
2227 ok(hr
== DD_OK
, "GetSurfaceDesc returned %08x\n", hr
);
2229 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2230 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2231 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2232 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2233 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2234 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2235 ok(U1(ddsd2
).dwLinearSize
== 16384, "Linear size is %d\n", U1(ddsd2
).dwLinearSize
);
2236 ok(ddsd2
.lpSurface
== 0, "Surface memory is at %p, expected NULL\n", ddsd2
.lpSurface
);
2238 memset(&ddsd2
, 0, sizeof(ddsd2
));
2239 ddsd2
.dwSize
= sizeof(ddsd2
);
2240 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2242 /* Show that the description is not changed when locking the surface. What is really interesting
2243 * about this is that DDSD_LPSURFACE isn't set.
2245 hr
= IDirectDrawSurface7_Lock(surface
, NULL
, &ddsd2
, DDLOCK_READONLY
, 0);
2246 ok(hr
== DD_OK
, "Lock returned %08x\n", hr
);
2248 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2249 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2250 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2251 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2252 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2253 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2254 ok(U1(ddsd2
).dwLinearSize
== 16384, "Linear size is %d\n", U1(ddsd2
).dwLinearSize
);
2255 ok(ddsd2
.lpSurface
!= 0, "Surface memory is at NULL\n");
2257 hr
= IDirectDrawSurface7_Unlock(surface
, NULL
);
2258 ok(hr
== DD_OK
, "Unlock returned %08x\n", hr
);
2260 /* Now what about a locking rect? */
2261 hr
= IDirectDrawSurface7_Lock(surface
, &r
, &ddsd2
, DDLOCK_READONLY
, 0);
2262 ok(hr
== DD_OK
, "Lock returned %08x\n", hr
);
2264 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2265 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2266 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2267 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2268 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2269 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2270 ok(U1(ddsd2
).dwLinearSize
== 16384, "Linear size is %d\n", U1(ddsd2
).dwLinearSize
);
2271 ok(ddsd2
.lpSurface
!= 0, "Surface memory is at NULL\n");
2273 hr
= IDirectDrawSurface7_Unlock(surface
, &r
);
2274 ok(hr
== DD_OK
, "Unlock returned %08x\n", hr
);
2276 /* Now what about a different locking offset? */
2277 hr
= IDirectDrawSurface7_Lock(surface
, &r2
, &ddsd2
, DDLOCK_READONLY
, 0);
2278 ok(hr
== DD_OK
, "Lock returned %08x\n", hr
);
2280 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2281 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2282 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2283 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2284 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2285 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2286 ok(U1(ddsd2
).dwLinearSize
== 16384, "Linear size is %d\n", U1(ddsd2
).dwLinearSize
);
2287 ok(ddsd2
.lpSurface
!= 0, "Surface memory is at NULL\n");
2289 hr
= IDirectDrawSurface7_Unlock(surface
, &r2
);
2290 ok(hr
== DD_OK
, "Unlock returned %08x\n", hr
);
2291 IDirectDrawSurface7_Release(surface
);
2293 /* Try this with video memory. A kind of surprise. It still has the LINEARSIZE flag set,
2294 * but seems to have a pitch instead.
2296 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
| DDSCAPS_VIDEOMEMORY
;
2297 U4(ddsd
).ddpfPixelFormat
.dwFourCC
= MAKEFOURCC('D','X','T','1');
2299 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface
, NULL
);
2300 ok(hr
== DD_OK
|| hr
== DDERR_NOTEXTUREHW
|| hr
== DDERR_INVALIDPARAMS
||
2301 broken(hr
== DDERR_NODIRECTDRAWHW
), "CreateSurface returned %08x\n", hr
);
2303 /* Not supported everywhere */
2306 memset(&ddsd2
, 0, sizeof(ddsd2
));
2307 ddsd2
.dwSize
= sizeof(ddsd2
);
2308 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2309 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface
, &ddsd2
);
2310 ok(hr
== DD_OK
, "GetSurfaceDesc returned %08x\n", hr
);
2312 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2313 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2314 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2315 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2316 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
),
2317 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2318 /* ATI drivers report a broken linear size, thus no need to clone the exact behaviour. nvidia reports the correct size */
2319 ok(ddsd2
.ddsCaps
.dwCaps2
== 0, "Caps2: %08x\n", ddsd2
.ddsCaps
.dwCaps2
);
2320 IDirectDrawSurface7_Release(surface
);
2322 U4(ddsd
).ddpfPixelFormat
.dwFourCC
= MAKEFOURCC('D','X','T','3');
2323 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface
, NULL
);
2324 ok(hr
== DD_OK
, "CreateSurface returned %08x\n", hr
);
2326 memset(&ddsd2
, 0, sizeof(ddsd2
));
2327 ddsd2
.dwSize
= sizeof(ddsd2
);
2328 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2329 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface
, &ddsd2
);
2330 ok(hr
== DD_OK
, "GetSurfaceDesc returned %08x\n", hr
);
2332 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2333 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2334 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2335 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2336 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
),
2337 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2338 /* ATI drivers report a broken linear size, thus no need to clone the exact behaviour. nvidia reports the correct size */
2339 IDirectDrawSurface7_Release(surface
);
2341 U4(ddsd
).ddpfPixelFormat
.dwFourCC
= MAKEFOURCC('D','X','T','5');
2342 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface
, NULL
);
2343 ok(hr
== DD_OK
, "CreateSurface returned %08x\n", hr
);
2345 memset(&ddsd2
, 0, sizeof(ddsd2
));
2346 ddsd2
.dwSize
= sizeof(ddsd2
);
2347 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2348 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface
, &ddsd2
);
2349 ok(hr
== DD_OK
, "GetSurfaceDesc returned %08x\n", hr
);
2351 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2352 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2353 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2354 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2355 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
),
2356 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2357 /* ATI drivers report a broken linear size, thus no need to clone the exact behaviour. nvidia reports the correct size */
2358 ok(ddsd2
.lpSurface
== 0, "Surface memory is at %p, expected NULL\n", ddsd2
.lpSurface
);
2360 memset(&ddsd2
, 0, sizeof(ddsd2
));
2361 ddsd2
.dwSize
= sizeof(ddsd2
);
2362 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2364 /* Show that the description is not changed when locking the surface. What is really interesting
2365 * about this is that DDSD_LPSURFACE isn't set.
2367 hr
= IDirectDrawSurface7_Lock(surface
, NULL
, &ddsd2
, DDLOCK_READONLY
, 0);
2368 ok(hr
== DD_OK
, "Lock returned %08x\n", hr
);
2370 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2371 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2372 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2373 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2374 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
),
2375 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2376 /* ATI drivers report a broken linear size, thus no need to clone the exact behaviour. nvidia reports the correct size */
2377 ok(ddsd2
.lpSurface
!= 0, "Surface memory is at NULL\n");
2379 hr
= IDirectDrawSurface7_Unlock(surface
, NULL
);
2380 ok(hr
== DD_OK
, "Unlock returned %08x\n", hr
);
2382 /* Now what about a locking rect? */
2383 hr
= IDirectDrawSurface7_Lock(surface
, &r
, &ddsd2
, DDLOCK_READONLY
, 0);
2384 ok(hr
== DD_OK
, "Lock returned %08x\n", hr
);
2386 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2387 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2388 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2389 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2390 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
),
2391 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2392 /* ATI drivers report a broken linear size, thus no need to clone the exact behaviour. nvidia reports the correct size */
2393 ok(ddsd2
.lpSurface
!= 0, "Surface memory is at NULL\n");
2395 hr
= IDirectDrawSurface7_Unlock(surface
, &r
);
2396 ok(hr
== DD_OK
, "Unlock returned %08x\n", hr
);
2398 /* Now what about a different locking offset? */
2399 hr
= IDirectDrawSurface7_Lock(surface
, &r2
, &ddsd2
, DDLOCK_READONLY
, 0);
2400 ok(hr
== DD_OK
, "Lock returned %08x\n", hr
);
2402 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2403 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2404 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2405 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2406 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
),
2407 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2408 /* ATI drivers report a broken linear size, thus no need to clone the exact behaviour. nvidia reports the correct size */
2409 ok(ddsd2
.lpSurface
!= 0, "Surface memory is at NULL\n");
2411 hr
= IDirectDrawSurface7_Unlock(surface
, &r2
);
2412 ok(hr
== DD_OK
, "Unlock returned %08x\n", hr
);
2414 IDirectDrawSurface7_Release(surface
);
2418 skip("Hardware DXTN textures not supported\n");
2421 /* What happens to managed textures? Interestingly, Windows reports them as being in system
2422 * memory. The linear size fits again.
2424 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
;
2425 ddsd
.ddsCaps
.dwCaps2
= DDSCAPS2_TEXTUREMANAGE
;
2426 U4(ddsd
).ddpfPixelFormat
.dwFourCC
= MAKEFOURCC('D','X','T','1');
2428 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface
, NULL
);
2429 ok(hr
== DD_OK
|| hr
== DDERR_NOTEXTUREHW
, "CreateSurface returned %08x\n", hr
);
2431 /* Not supported everywhere */
2434 memset(&ddsd2
, 0, sizeof(ddsd2
));
2435 ddsd2
.dwSize
= sizeof(ddsd2
);
2436 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2437 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface
, &ddsd2
);
2438 ok(hr
== DD_OK
, "GetSurfaceDesc returned %08x\n", hr
);
2440 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2441 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2442 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2443 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2444 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2445 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2446 ok(U1(ddsd2
).dwLinearSize
== 8192, "Linear size is %d\n", U1(ddsd2
).dwLinearSize
);
2447 ok(ddsd2
.ddsCaps
.dwCaps2
== DDSCAPS2_TEXTUREMANAGE
, "Caps2: %08x\n", ddsd2
.ddsCaps
.dwCaps2
);
2448 IDirectDrawSurface7_Release(surface
);
2450 U4(ddsd
).ddpfPixelFormat
.dwFourCC
= MAKEFOURCC('D','X','T','3');
2451 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface
, NULL
);
2452 ok(hr
== DD_OK
, "CreateSurface returned %08x\n", hr
);
2454 memset(&ddsd2
, 0, sizeof(ddsd2
));
2455 ddsd2
.dwSize
= sizeof(ddsd2
);
2456 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2457 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface
, &ddsd2
);
2458 ok(hr
== DD_OK
, "GetSurfaceDesc returned %08x\n", hr
);
2460 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2461 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2462 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2463 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2464 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2465 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2466 ok(U1(ddsd2
).dwLinearSize
== 16384, "Linear size is %d\n", U1(ddsd2
).dwLinearSize
);
2467 IDirectDrawSurface7_Release(surface
);
2469 U4(ddsd
).ddpfPixelFormat
.dwFourCC
= MAKEFOURCC('D','X','T','5');
2470 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface
, NULL
);
2471 ok(hr
== DD_OK
, "CreateSurface returned %08x\n", hr
);
2473 memset(&ddsd2
, 0, sizeof(ddsd2
));
2474 ddsd2
.dwSize
= sizeof(ddsd2
);
2475 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2476 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface
, &ddsd2
);
2477 ok(hr
== DD_OK
, "GetSurfaceDesc returned %08x\n", hr
);
2479 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2480 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2481 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2482 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2483 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2484 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2485 ok(U1(ddsd2
).dwLinearSize
== 16384, "Linear size is %d\n", U1(ddsd2
).dwLinearSize
);
2486 ok(ddsd2
.lpSurface
== 0, "Surface memory is at %p, expected NULL\n", ddsd2
.lpSurface
);
2488 memset(&ddsd2
, 0, sizeof(ddsd2
));
2489 ddsd2
.dwSize
= sizeof(ddsd2
);
2490 U4(ddsd2
).ddpfPixelFormat
.dwSize
= sizeof(U4(ddsd2
).ddpfPixelFormat
);
2492 /* Show that the description is not changed when locking the surface. What is really interesting
2493 * about this is that DDSD_LPSURFACE isn't set.
2495 hr
= IDirectDrawSurface7_Lock(surface
, NULL
, &ddsd2
, DDLOCK_READONLY
, 0);
2496 ok(hr
== DD_OK
, "Lock returned %08x\n", hr
);
2498 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2499 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2500 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2501 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2502 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2503 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2504 ok(U1(ddsd2
).dwLinearSize
== 16384, "Linear size is %d\n", U1(ddsd2
).dwLinearSize
);
2505 ok(ddsd2
.lpSurface
!= 0, "Surface memory is at NULL\n");
2507 hr
= IDirectDrawSurface7_Unlock(surface
, NULL
);
2508 ok(hr
== DD_OK
, "Unlock returned %08x\n", hr
);
2510 /* Now what about a locking rect? */
2511 hr
= IDirectDrawSurface7_Lock(surface
, &r
, &ddsd2
, DDLOCK_READONLY
, 0);
2512 ok(hr
== DD_OK
, "Lock returned %08x\n", hr
);
2514 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2515 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2516 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2517 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2518 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2519 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2520 ok(U1(ddsd2
).dwLinearSize
== 16384, "\"Linear\" size is %d\n", U1(ddsd2
).dwLinearSize
);
2521 ok(ddsd2
.lpSurface
!= 0, "Surface memory is at NULL\n");
2523 hr
= IDirectDrawSurface7_Unlock(surface
, &r
);
2524 ok(hr
== DD_OK
, "Unlock returned %08x\n", hr
);
2526 /* Now what about a different locking offset? */
2527 hr
= IDirectDrawSurface7_Lock(surface
, &r2
, &ddsd2
, DDLOCK_READONLY
, 0);
2528 ok(hr
== DD_OK
, "Lock returned %08x\n", hr
);
2530 ok(ddsd2
.dwFlags
== (DDSD_PIXELFORMAT
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_LINEARSIZE
),
2531 "Surface desc flags: %08x\n", ddsd2
.dwFlags
);
2532 ok(U4(ddsd2
).ddpfPixelFormat
.dwFlags
== DDPF_FOURCC
, "Pixel format flags: %08x\n", U4(ddsd2
).ddpfPixelFormat
.dwFlags
);
2533 ok(U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
== 0, "RGB bitcount: %08x\n", U1(U4(ddsd2
).ddpfPixelFormat
).dwRGBBitCount
);
2534 ok(ddsd2
.ddsCaps
.dwCaps
== (DDSCAPS_TEXTURE
| DDSCAPS_SYSTEMMEMORY
),
2535 "Surface caps flags: %08x\n", ddsd2
.ddsCaps
.dwCaps
);
2536 ok(U1(ddsd2
).dwLinearSize
== 16384, "\"Linear\" size is %d\n", U1(ddsd2
).dwLinearSize
);
2537 ok(ddsd2
.lpSurface
!= 0, "Surface memory is at NULL\n");
2539 hr
= IDirectDrawSurface7_Unlock(surface
, &r2
);
2540 ok(hr
== DD_OK
, "Unlock returned %08x\n", hr
);
2542 IDirectDrawSurface7_Release(surface
);
2546 skip("Hardware DXTN textures not supported\n");
2549 IDirectDraw7_Release(dd7
);
2552 static void SizeTest(void)
2554 LPDIRECTDRAWSURFACE dsurface
= NULL
;
2557 HWND window
= CreateWindow( "static", "ddraw_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
2559 /* Create an offscreen surface surface without a size */
2560 ZeroMemory(&desc
, sizeof(desc
));
2561 desc
.dwSize
= sizeof(desc
);
2562 desc
.dwFlags
= DDSD_CAPS
;
2563 desc
.ddsCaps
.dwCaps
|= DDSCAPS_OFFSCREENPLAIN
;
2564 ret
= IDirectDraw_CreateSurface(lpDD
, &desc
, &dsurface
, NULL
);
2565 ok(ret
== DDERR_INVALIDPARAMS
, "Creating an offscreen plain surface without a size info returned %08x (dsurface=%p)\n", ret
, dsurface
);
2568 trace("Surface at %p\n", dsurface
);
2569 IDirectDrawSurface_Release(dsurface
);
2573 /* Create an offscreen surface surface with only a width parameter */
2574 ZeroMemory(&desc
, sizeof(desc
));
2575 desc
.dwSize
= sizeof(desc
);
2576 desc
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
;
2577 desc
.ddsCaps
.dwCaps
|= DDSCAPS_OFFSCREENPLAIN
;
2579 ret
= IDirectDraw_CreateSurface(lpDD
, &desc
, &dsurface
, NULL
);
2580 ok(ret
== DDERR_INVALIDPARAMS
, "Creating an offscreen plain surface without height info returned %08x\n", ret
);
2583 IDirectDrawSurface_Release(dsurface
);
2587 /* Create an offscreen surface surface with only a height parameter */
2588 ZeroMemory(&desc
, sizeof(desc
));
2589 desc
.dwSize
= sizeof(desc
);
2590 desc
.dwFlags
= DDSD_CAPS
| DDSD_HEIGHT
;
2591 desc
.ddsCaps
.dwCaps
|= DDSCAPS_OFFSCREENPLAIN
;
2592 desc
.dwHeight
= 128;
2593 ret
= IDirectDraw_CreateSurface(lpDD
, &desc
, &dsurface
, NULL
);
2594 ok(ret
== DDERR_INVALIDPARAMS
, "Creating an offscreen plain surface without width info returned %08x\n", ret
);
2597 IDirectDrawSurface_Release(dsurface
);
2601 /* Test 0 height. */
2602 memset(&desc
, 0, sizeof(desc
));
2603 desc
.dwSize
= sizeof(desc
);
2604 desc
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
2605 desc
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
2608 ret
= IDirectDraw_CreateSurface(lpDD
, &desc
, &dsurface
, NULL
);
2609 ok(ret
== DDERR_INVALIDPARAMS
, "Creating a 0 height surface returned %#x, expected DDERR_INVALIDPARAMS.\n", ret
);
2610 if (SUCCEEDED(ret
)) IDirectDrawSurface_Release(dsurface
);
2614 memset(&desc
, 0, sizeof(desc
));
2615 desc
.dwSize
= sizeof(desc
);
2616 desc
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
2617 desc
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
2620 ret
= IDirectDraw_CreateSurface(lpDD
, &desc
, &dsurface
, NULL
);
2621 ok(ret
== DDERR_INVALIDPARAMS
, "Creating a 0 width surface returned %#x, expected DDERR_INVALIDPARAMS.\n", ret
);
2622 if (SUCCEEDED(ret
)) IDirectDrawSurface_Release(dsurface
);
2626 ZeroMemory(&desc
, sizeof(desc
));
2627 desc
.dwSize
= sizeof(desc
);
2628 desc
.dwFlags
= DDSD_CAPS
| DDSD_HEIGHT
| DDSD_WIDTH
;
2629 desc
.ddsCaps
.dwCaps
|= DDSCAPS_OFFSCREENPLAIN
;
2630 desc
.dwHeight
= 128;
2632 ret
= IDirectDraw_CreateSurface(lpDD
, &desc
, &dsurface
, NULL
);
2633 ok(ret
== DD_OK
, "Creating an offscreen plain surface with width and height info returned %08x\n", ret
);
2636 IDirectDrawSurface_Release(dsurface
);
2640 /* Test a primary surface size */
2641 ret
= IDirectDraw_SetCooperativeLevel(lpDD
, window
, DDSCL_NORMAL
);
2642 ok(ret
== DD_OK
, "SetCooperativeLevel failed with %08x\n", ret
);
2644 ZeroMemory(&desc
, sizeof(desc
));
2645 desc
.dwSize
= sizeof(desc
);
2646 desc
.dwFlags
= DDSD_CAPS
;
2647 desc
.ddsCaps
.dwCaps
|= DDSCAPS_PRIMARYSURFACE
;
2648 desc
.dwHeight
= 128; /* Keep them set to check what happens */
2649 desc
.dwWidth
= 128; /* Keep them set to check what happens */
2650 ret
= IDirectDraw_CreateSurface(lpDD
, &desc
, &dsurface
, NULL
);
2651 ok(ret
== DD_OK
, "Creating a primary surface without width and height info returned %08x\n", ret
);
2654 ret
= IDirectDrawSurface_GetSurfaceDesc(dsurface
, &desc
);
2655 ok(ret
== DD_OK
, "GetSurfaceDesc returned %x\n", ret
);
2657 IDirectDrawSurface_Release(dsurface
);
2660 ok(desc
.dwFlags
& DDSD_WIDTH
, "Primary surface doesn't have width set\n");
2661 ok(desc
.dwFlags
& DDSD_HEIGHT
, "Primary surface doesn't have height set\n");
2662 ok(desc
.dwWidth
== GetSystemMetrics(SM_CXSCREEN
), "Surface width differs from screen width\n");
2663 ok(desc
.dwHeight
== GetSystemMetrics(SM_CYSCREEN
), "Surface height differs from screen height\n");
2665 ret
= IDirectDraw_SetCooperativeLevel(lpDD
, NULL
, DDSCL_NORMAL
);
2666 ok(ret
== DD_OK
, "SetCooperativeLevel failed with %08x\n", ret
);
2669 static void PrivateDataTest(void)
2672 IDirectDrawSurface7
*surface7
= NULL
;
2673 IDirectDrawSurface
*surface
= NULL
;
2677 DWORD size
= sizeof(IUnknown
*);
2679 ZeroMemory(&desc
, sizeof(desc
));
2680 desc
.dwSize
= sizeof(desc
);
2681 desc
.dwFlags
= DDSD_CAPS
| DDSD_HEIGHT
| DDSD_WIDTH
;
2682 desc
.ddsCaps
.dwCaps
|= DDSCAPS_OFFSCREENPLAIN
;
2683 desc
.dwHeight
= 128;
2685 hr
= IDirectDraw_CreateSurface(lpDD
, &desc
, &surface
, NULL
);
2686 ok(hr
== DD_OK
, "Creating an offscreen plain surface failed with %08x\n", hr
);
2691 hr
= IDirectDrawSurface_QueryInterface(surface
, &IID_IDirectDrawSurface7
, (void **) &surface7
);
2692 ok(hr
== DD_OK
, "IDirectDrawSurface_QueryInterface failed with %08x\n", hr
);
2695 IDirectDrawSurface_Release(surface
);
2700 hr
= IDirectDrawSurface7_SetPrivateData(surface7
, &IID_IDirectDrawSurface7
/* Abuse this tag */, lpDD
, 0, DDSPD_IUNKNOWNPOINTER
);
2701 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface7_SetPrivateData failed with %08x\n", hr
);
2702 hr
= IDirectDrawSurface7_SetPrivateData(surface7
, &IID_IDirectDrawSurface7
/* Abuse this tag */, lpDD
, 5, DDSPD_IUNKNOWNPOINTER
);
2703 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface7_SetPrivateData failed with %08x\n", hr
);
2704 hr
= IDirectDrawSurface7_SetPrivateData(surface7
, &IID_IDirectDrawSurface7
/* Abuse this tag */, lpDD
, sizeof(IUnknown
*) * 2, DDSPD_IUNKNOWNPOINTER
);
2705 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface7_SetPrivateData failed with %08x\n", hr
);
2707 ref
= getref((IUnknown
*) lpDD
);
2708 hr
= IDirectDrawSurface7_SetPrivateData(surface7
, &IID_IDirectDrawSurface7
/* Abuse this tag */, lpDD
, sizeof(IUnknown
*), DDSPD_IUNKNOWNPOINTER
);
2709 ok(hr
== DD_OK
, "IDirectDrawSurface7_SetPrivateData failed with %08x\n", hr
);
2710 ref2
= getref((IUnknown
*) lpDD
);
2711 ok(ref2
== ref
+ 1, "Object reference is %d, expected %d\n", ref2
, ref
+ 1);
2712 hr
= IDirectDrawSurface7_FreePrivateData(surface7
, &IID_IDirectDrawSurface7
);
2713 ok(SUCCEEDED(hr
), "IDirectDrawSurface7_FreePrivateData returned %#x.\n", hr
);
2714 ref2
= getref((IUnknown
*) lpDD
);
2715 ok(ref2
== ref
, "Object reference is %d, expected %d\n", ref2
, ref
);
2717 hr
= IDirectDrawSurface7_SetPrivateData(surface7
, &IID_IDirectDrawSurface7
, lpDD
, sizeof(IUnknown
*), DDSPD_IUNKNOWNPOINTER
);
2718 ok(hr
== DD_OK
, "IDirectDrawSurface7_SetPrivateData failed with %08x\n", hr
);
2719 hr
= IDirectDrawSurface7_SetPrivateData(surface7
, &IID_IDirectDrawSurface7
, surface7
, sizeof(IUnknown
*), DDSPD_IUNKNOWNPOINTER
);
2720 ok(hr
== DD_OK
, "IDirectDrawSurface7_SetPrivateData failed with %08x\n", hr
);
2721 ref2
= getref((IUnknown
*) lpDD
);
2722 ok(ref2
== ref
, "Object reference is %d, expected %d\n", ref2
, ref
);
2724 hr
= IDirectDrawSurface7_SetPrivateData(surface7
, &IID_IDirectDrawSurface7
, lpDD
, sizeof(IUnknown
*), DDSPD_IUNKNOWNPOINTER
);
2725 ok(hr
== DD_OK
, "IDirectDrawSurface7_SetPrivateData failed with %08x\n", hr
);
2726 hr
= IDirectDrawSurface7_GetPrivateData(surface7
, &IID_IDirectDrawSurface7
, &ptr
, &size
);
2727 ok(hr
== DD_OK
, "IDirectDrawSurface7_GetPrivateData failed with %08x\n", hr
);
2728 ref2
= getref((IUnknown
*) lpDD
);
2729 /* Object is NOT being addrefed */
2730 ok(ptr
== (IUnknown
*) lpDD
, "Returned interface pointer is %p, expected %p\n", ptr
, lpDD
);
2731 ok(ref2
== ref
+ 1, "Object reference is %d, expected %d. ptr at %p, orig at %p\n", ref2
, ref
+ 1, ptr
, lpDD
);
2733 IDirectDrawSurface_Release(surface
);
2734 IDirectDrawSurface7_Release(surface7
);
2736 /* Destroying the surface frees the held reference */
2737 ref2
= getref((IUnknown
*) lpDD
);
2738 ok(ref2
== ref
, "Object reference is %d, expected %d\n", ref2
, ref
);
2741 static void BltParamTest(void)
2743 IDirectDrawSurface
*surface1
= NULL
, *surface2
= NULL
;
2747 RECT valid
= {10, 10, 20, 20};
2748 RECT invalid1
= {20, 10, 10, 20};
2749 RECT invalid2
= {20, 20, 20, 20};
2750 RECT invalid3
= {-1, -1, 20, 20};
2751 RECT invalid4
= {60, 60, 70, 70};
2753 memset(&desc
, 0, sizeof(desc
));
2754 desc
.dwSize
= sizeof(desc
);
2755 desc
.dwFlags
= DDSD_CAPS
| DDSD_HEIGHT
| DDSD_WIDTH
;
2756 desc
.ddsCaps
.dwCaps
|= DDSCAPS_OFFSCREENPLAIN
;
2757 desc
.dwHeight
= 128;
2759 hr
= IDirectDraw_CreateSurface(lpDD
, &desc
, &surface1
, NULL
);
2760 ok(hr
== DD_OK
, "Creating an offscreen plain surface failed with %08x\n", hr
);
2764 hr
= IDirectDraw_CreateSurface(lpDD
, &desc
, &surface2
, NULL
);
2765 ok(hr
== DD_OK
, "Creating an offscreen plain surface failed with %08x\n", hr
);
2770 hr
= IDirectDrawSurface_BltFast(surface1
, 0, 0, NULL
, NULL
, 0);
2771 ok(hr
== DD_OK
, "BltFast from NULL surface returned %08x\n", hr
);
2773 hr
= IDirectDrawSurface_BltFast(surface1
, 0, 0, surface2
, NULL
, 0);
2774 ok(hr
== DD_OK
, "BltFast from smaller to bigger surface returned %08x\n", hr
);
2775 hr
= IDirectDrawSurface_BltFast(surface2
, 0, 0, surface1
, NULL
, 0);
2776 ok(hr
== DDERR_INVALIDRECT
, "BltFast from bigger to smaller surface returned %08x\n", hr
);
2777 hr
= IDirectDrawSurface_BltFast(surface2
, 0, 0, surface1
, &valid
, 0);
2778 ok(hr
== DD_OK
, "BltFast from bigger to smaller surface using a valid rectangle returned %08x\n", hr
);
2779 hr
= IDirectDrawSurface_BltFast(surface2
, 60, 60, surface1
, &valid
, 0);
2780 ok(hr
== DDERR_INVALIDRECT
, "BltFast with a rectangle resulting in an off-surface write returned %08x\n", hr
);
2781 hr
= IDirectDrawSurface_BltFast(surface1
, 90, 90, surface2
, NULL
, 0);
2782 ok(hr
== DDERR_INVALIDRECT
, "BltFast with a rectangle resulting in an off-surface write returned %08x\n", hr
);
2784 hr
= IDirectDrawSurface_BltFast(surface1
, -10, 0, surface2
, NULL
, 0);
2785 ok(hr
== DDERR_INVALIDRECT
, "BltFast with an offset resulting in an off-surface write returned %08x\n", hr
);
2786 hr
= IDirectDrawSurface_BltFast(surface1
, 0, -10, surface2
, NULL
, 0);
2787 ok(hr
== DDERR_INVALIDRECT
, "BltFast with an offset resulting in an off-surface write returned %08x\n", hr
);
2788 hr
= IDirectDrawSurface_BltFast(surface2
, 20, 20, surface1
, &valid
, 0);
2789 ok(hr
== DD_OK
, "BltFast from bigger to smaller surface using a valid rectangle and offset returned %08x\n", hr
);
2791 hr
= IDirectDrawSurface_BltFast(surface2
, 0, 0, surface1
, &invalid1
, 0);
2792 ok(hr
== DDERR_INVALIDRECT
, "BltFast with invalid rectangle 1 returned %08x\n", hr
);
2793 hr
= IDirectDrawSurface_BltFast(surface2
, 0, 0, surface1
, &invalid2
, 0);
2794 ok(hr
== DDERR_INVALIDRECT
, "BltFast with invalid rectangle 2 returned %08x\n", hr
);
2795 hr
= IDirectDrawSurface_BltFast(surface2
, 0, 0, surface1
, &invalid3
, 0);
2796 ok(hr
== DDERR_INVALIDRECT
, "BltFast with invalid rectangle 3 returned %08x\n", hr
);
2797 hr
= IDirectDrawSurface_BltFast(surface1
, 0, 0, surface2
, &invalid4
, 0);
2798 ok(hr
== DDERR_INVALIDRECT
, "BltFast with invalid rectangle 3 returned %08x\n", hr
);
2799 hr
= IDirectDrawSurface_BltFast(surface1
, 0, 0, surface1
, NULL
, 0);
2800 ok(hr
== DD_OK
, "BltFast blitting a surface onto itself returned %08x\n", hr
);
2802 /* Blt(non-fast) tests */
2803 memset(&BltFx
, 0, sizeof(BltFx
));
2804 BltFx
.dwSize
= sizeof(BltFx
);
2805 U5(BltFx
).dwFillColor
= 0xaabbccdd;
2807 hr
= IDirectDrawSurface_Blt(surface1
, &valid
, NULL
, NULL
, DDBLT_COLORFILL
, &BltFx
);
2808 ok(hr
== DD_OK
, "IDirectDrawSurface_Blt with a valid rectangle for color fill returned %08x\n", hr
);
2809 hr
= IDirectDrawSurface_Blt(surface1
, &valid
, NULL
, &invalid3
, DDBLT_COLORFILL
, &BltFx
);
2810 ok(hr
== DD_OK
, "IDirectDrawSurface_Blt with a invalid, unused rectangle returned %08x\n", hr
);
2811 hr
= IDirectDrawSurface_Blt(surface2
, &invalid1
, NULL
, NULL
, DDBLT_COLORFILL
, &BltFx
);
2812 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 1 returned %08x\n", hr
);
2813 hr
= IDirectDrawSurface_Blt(surface2
, &invalid2
, NULL
, NULL
, DDBLT_COLORFILL
, &BltFx
);
2814 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 2 returned %08x\n", hr
);
2815 hr
= IDirectDrawSurface_Blt(surface2
, &invalid3
, NULL
, NULL
, DDBLT_COLORFILL
, &BltFx
);
2816 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 3 returned %08x\n", hr
);
2817 hr
= IDirectDrawSurface_Blt(surface2
, &invalid4
, NULL
, NULL
, DDBLT_COLORFILL
, &BltFx
);
2818 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 4 returned %08x\n", hr
);
2820 /* Valid on surface 1 */
2821 hr
= IDirectDrawSurface_Blt(surface1
, &invalid4
, NULL
, NULL
, DDBLT_COLORFILL
, &BltFx
);
2822 ok(hr
== DD_OK
, "IDirectDrawSurface_Blt with a subrectangle fill returned %08x\n", hr
);
2824 /* Works - stretched blit */
2825 hr
= IDirectDrawSurface_Blt(surface1
, NULL
, surface2
, NULL
, 0, NULL
);
2826 ok(hr
== DD_OK
, "IDirectDrawSurface_Blt from a smaller to a bigger surface returned %08x\n", hr
);
2827 hr
= IDirectDrawSurface_Blt(surface2
, NULL
, surface1
, NULL
, 0, NULL
);
2828 ok(hr
== DD_OK
, "IDirectDrawSurface_Blt from a bigger to a smaller surface %08x\n", hr
);
2830 /* Invalid dest rects in sourced blits */
2831 hr
= IDirectDrawSurface_Blt(surface2
, &invalid1
, surface1
, NULL
, 0, NULL
);
2832 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 1 returned %08x\n", hr
);
2833 hr
= IDirectDrawSurface_Blt(surface2
, &invalid2
, surface1
, NULL
, 0, NULL
);
2834 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 2 returned %08x\n", hr
);
2835 hr
= IDirectDrawSurface_Blt(surface2
, &invalid3
, surface1
, NULL
, 0, NULL
);
2836 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 3 returned %08x\n", hr
);
2837 hr
= IDirectDrawSurface_Blt(surface2
, &invalid4
, surface1
, NULL
, 0, NULL
);
2838 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 4 returned %08x\n", hr
);
2840 /* Invalid src rects */
2841 hr
= IDirectDrawSurface_Blt(surface2
, NULL
, surface1
, &invalid1
, 0, NULL
);
2842 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 1 returned %08x\n", hr
);
2843 hr
= IDirectDrawSurface_Blt(surface2
, NULL
, surface1
, &invalid2
, 0, NULL
);
2844 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 2 returned %08x\n", hr
);
2845 hr
= IDirectDrawSurface_Blt(surface2
, NULL
, surface1
, &invalid3
, 0, NULL
);
2846 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 3 returned %08x\n", hr
);
2847 hr
= IDirectDrawSurface_Blt(surface1
, NULL
, surface2
, &invalid4
, 0, NULL
);
2848 ok(hr
== DDERR_INVALIDRECT
, "IDirectDrawSurface_Blt with a with invalid rectangle 4 returned %08x\n", hr
);
2850 IDirectDrawSurface_Release(surface1
);
2851 IDirectDrawSurface_Release(surface2
);
2854 static void PaletteTest(void)
2857 LPDIRECTDRAWSURFACE lpSurf
= NULL
;
2858 IDirectDrawSurface
*backbuffer
= NULL
;
2861 IDirectDrawPalette
*palette
= NULL
;
2862 PALETTEENTRY Table
[256];
2863 PALETTEENTRY palEntries
[256];
2866 for(i
=0; i
<256; i
++)
2868 Table
[i
].peRed
= 0xff;
2869 Table
[i
].peGreen
= 0;
2870 Table
[i
].peBlue
= 0;
2871 Table
[i
].peFlags
= 0;
2874 /* Create a 8bit palette without DDPCAPS_ALLOW256 set */
2875 hr
= IDirectDraw_CreatePalette(lpDD
, DDPCAPS_8BIT
, Table
, &palette
, NULL
);
2876 ok(hr
== DD_OK
, "CreatePalette failed with %08x\n", hr
);
2877 if (FAILED(hr
)) goto err
;
2878 /* Read back the palette and verify the entries. Without DDPCAPS_ALLOW256 set
2879 / entry 0 and 255 should have been overwritten with black and white */
2880 IDirectDrawPalette_GetEntries(palette
, 0, 0, 256, &palEntries
[0]);
2881 ok(hr
== DD_OK
, "GetEntries failed with %08x\n", hr
);
2884 ok((palEntries
[0].peRed
== 0) && (palEntries
[0].peGreen
== 0) && (palEntries
[0].peBlue
== 0),
2885 "Palette entry 0 of a palette without DDPCAPS_ALLOW256 set should be (0,0,0) but it is (%d,%d,%d)\n",
2886 palEntries
[0].peRed
, palEntries
[0].peGreen
, palEntries
[0].peBlue
);
2887 ok((palEntries
[255].peRed
== 255) && (palEntries
[255].peGreen
== 255) && (palEntries
[255].peBlue
== 255),
2888 "Palette entry 255 of a palette without DDPCAPS_ALLOW256 set should be (255,255,255) but it is (%d,%d,%d)\n",
2889 palEntries
[255].peRed
, palEntries
[255].peGreen
, palEntries
[255].peBlue
);
2891 /* Entry 1-254 should contain red */
2892 for(i
=1; i
<255; i
++)
2893 ok((palEntries
[i
].peRed
== 255) && (palEntries
[i
].peGreen
== 0) && (palEntries
[i
].peBlue
== 0),
2894 "Palette entry %d should have contained (255,0,0) but was set to %d,%d,%d)\n",
2895 i
, palEntries
[i
].peRed
, palEntries
[i
].peGreen
, palEntries
[i
].peBlue
);
2898 /* CreatePalette without DDPCAPS_ALLOW256 ignores entry 0 and 255,
2899 / now check we are able to update the entries afterwards. */
2900 IDirectDrawPalette_SetEntries(palette
, 0, 0, 256, &Table
[0]);
2901 ok(hr
== DD_OK
, "SetEntries failed with %08x\n", hr
);
2902 IDirectDrawPalette_GetEntries(palette
, 0, 0, 256, &palEntries
[0]);
2903 ok(hr
== DD_OK
, "GetEntries failed with %08x\n", hr
);
2906 ok((palEntries
[0].peRed
== 0) && (palEntries
[0].peGreen
== 0) && (palEntries
[0].peBlue
== 0),
2907 "Palette entry 0 should have been set to (0,0,0) but it contains (%d,%d,%d)\n",
2908 palEntries
[0].peRed
, palEntries
[0].peGreen
, palEntries
[0].peBlue
);
2909 ok((palEntries
[255].peRed
== 255) && (palEntries
[255].peGreen
== 255) && (palEntries
[255].peBlue
== 255),
2910 "Palette entry 255 should have been set to (255,255,255) but it contains (%d,%d,%d)\n",
2911 palEntries
[255].peRed
, palEntries
[255].peGreen
, palEntries
[255].peBlue
);
2913 IDirectDrawPalette_Release(palette
);
2915 /* Create a 8bit palette with DDPCAPS_ALLOW256 set */
2916 hr
= IDirectDraw_CreatePalette(lpDD
, DDPCAPS_ALLOW256
| DDPCAPS_8BIT
, Table
, &palette
, NULL
);
2917 ok(hr
== DD_OK
, "CreatePalette failed with %08x\n", hr
);
2918 if (FAILED(hr
)) goto err
;
2920 IDirectDrawPalette_GetEntries(palette
, 0, 0, 256, &palEntries
[0]);
2921 ok(hr
== DD_OK
, "GetEntries failed with %08x\n", hr
);
2924 /* All entries should contain red */
2925 for(i
=0; i
<256; i
++)
2926 ok((palEntries
[i
].peRed
== 255) && (palEntries
[i
].peGreen
== 0) && (palEntries
[i
].peBlue
== 0),
2927 "Palette entry %d should have contained (255,0,0) but was set to %d,%d,%d)\n",
2928 i
, palEntries
[i
].peRed
, palEntries
[i
].peGreen
, palEntries
[i
].peBlue
);
2931 /* Try to set palette to a non-palettized surface */
2932 ddsd
.dwSize
= sizeof(ddsd
);
2933 ddsd
.ddpfPixelFormat
.dwSize
= sizeof(ddsd
.ddpfPixelFormat
);
2934 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
;
2935 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
2937 ddsd
.dwHeight
= 600;
2938 ddsd
.ddpfPixelFormat
.dwFlags
= DDPF_RGB
;
2939 U1(ddsd
.ddpfPixelFormat
).dwRGBBitCount
= 32;
2940 U2(ddsd
.ddpfPixelFormat
).dwRBitMask
= 0xFF0000;
2941 U3(ddsd
.ddpfPixelFormat
).dwGBitMask
= 0x00FF00;
2942 U4(ddsd
.ddpfPixelFormat
).dwBBitMask
= 0x0000FF;
2943 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpSurf
, NULL
);
2944 ok(hr
==DD_OK
, "CreateSurface returned: %x\n",hr
);
2947 skip("failed to create surface\n");
2951 hr
= IDirectDrawSurface_SetPalette(lpSurf
, palette
);
2952 ok(hr
== DDERR_INVALIDPIXELFORMAT
, "CreateSurface returned: %x\n",hr
);
2954 IDirectDrawPalette_Release(palette
);
2957 hr
= IDirectDrawSurface_GetPalette(lpSurf
, &palette
);
2958 ok(hr
== DDERR_NOPALETTEATTACHED
, "CreateSurface returned: %x\n",hr
);
2962 if (lpSurf
) IDirectDrawSurface_Release(lpSurf
);
2963 if (palette
) IDirectDrawPalette_Release(palette
);
2965 hr
= IDirectDraw_CreatePalette(lpDD
, DDPCAPS_ALLOW256
| DDPCAPS_8BIT
, Table
, &palette
, NULL
);
2966 ok(hr
== DD_OK
, "CreatePalette failed with %08x\n", hr
);
2968 ddsd
.dwSize
= sizeof(ddsd
);
2969 ddsd
.ddpfPixelFormat
.dwSize
= sizeof(ddsd
.ddpfPixelFormat
);
2970 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
| DDSD_BACKBUFFERCOUNT
;
2971 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
| DDSCAPS_COMPLEX
| DDSCAPS_FLIP
;
2974 ddsd
.dwBackBufferCount
= 1;
2975 ddsd
.ddpfPixelFormat
.dwFlags
= DDPF_RGB
| DDPF_PALETTEINDEXED8
;
2976 U1(ddsd
.ddpfPixelFormat
).dwRGBBitCount
= 8;
2978 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpSurf
, NULL
);
2979 ok(hr
==DD_OK
, "CreateSurface returned: %x\n",hr
);
2982 skip("failed to create surface\n");
2986 ddscaps
.dwCaps
= DDSCAPS_BACKBUFFER
;
2987 hr
= IDirectDrawSurface_GetAttachedSurface(lpSurf
, &ddscaps
, &backbuffer
);
2988 ok(hr
== DD_OK
, "GetAttachedSurface returned: %x\n",hr
);
2990 hr
= IDirectDrawSurface_SetPalette(backbuffer
, palette
);
2991 ok(hr
== DD_OK
, "SetPalette returned: %x\n",hr
);
2993 IDirectDrawPalette_Release(palette
);
2996 hr
= IDirectDrawSurface_GetPalette(backbuffer
, &palette
);
2997 ok(hr
== DD_OK
, "CreateSurface returned: %x\n",hr
);
2999 IDirectDrawSurface_Release(backbuffer
);
3000 IDirectDrawSurface_Release(lpSurf
);
3003 static void StructSizeTest(void)
3005 IDirectDrawSurface
*surface1
;
3006 IDirectDrawSurface7
*surface7
;
3008 DDSURFACEDESC desc1
;
3009 DDSURFACEDESC2 desc2
;
3010 char blob
[1024]; /* To get a bunch of writable memory */
3012 DDSURFACEDESC create
;
3015 memset(&desc
, 0, sizeof(desc
));
3016 memset(&create
, 0, sizeof(create
));
3018 memset(&create
, 0, sizeof(create
));
3019 create
.dwSize
= sizeof(create
);
3020 create
.dwFlags
= DDSD_CAPS
| DDSD_HEIGHT
| DDSD_WIDTH
;
3021 create
.ddsCaps
.dwCaps
|= DDSCAPS_OFFSCREENPLAIN
;
3022 create
.dwHeight
= 128;
3023 create
.dwWidth
= 128;
3024 hr
= IDirectDraw_CreateSurface(lpDD
, &create
, &surface1
, NULL
);
3025 ok(hr
== DD_OK
, "Creating an offscreen plain surface failed with %08x\n", hr
);
3026 hr
= IDirectDrawSurface_QueryInterface(surface1
, &IID_IDirectDrawSurface7
, (void **) &surface7
);
3027 ok(hr
== DD_OK
, "IDirectDrawSurface_QueryInterface failed with %08x\n", hr
);
3029 desc
.desc1
.dwSize
= sizeof(DDSURFACEDESC
);
3030 hr
= IDirectDrawSurface_GetSurfaceDesc(surface1
, &desc
.desc1
);
3031 ok(hr
== DD_OK
, "IDirectDrawSurface_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC) returned %08x\n", hr
);
3032 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface7
, &desc
.desc2
);
3033 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface7_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC) returned %08x\n", hr
);
3035 desc
.desc2
.dwSize
= sizeof(DDSURFACEDESC2
);
3036 hr
= IDirectDrawSurface_GetSurfaceDesc(surface1
, &desc
.desc1
);
3037 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC2) returned %08x\n", hr
);
3038 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface7
, &desc
.desc2
);
3039 ok(hr
== DD_OK
, "IDirectDrawSurface7_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC2) returned %08x\n", hr
);
3041 desc
.desc2
.dwSize
= 0;
3042 hr
= IDirectDrawSurface_GetSurfaceDesc(surface1
, &desc
.desc1
);
3043 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_GetSurfaceDesc with desc size 0 returned %08x\n", hr
);
3044 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface7
, &desc
.desc2
);
3045 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface7_GetSurfaceDesc with desc size 0 returned %08x\n", hr
);
3047 desc
.desc1
.dwSize
= sizeof(DDSURFACEDESC
) + 1;
3048 hr
= IDirectDrawSurface_GetSurfaceDesc(surface1
, &desc
.desc1
);
3049 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC) + 1 returned %08x\n", hr
);
3050 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface7
, &desc
.desc2
);
3051 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface7_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC) + 1 returned %08x\n", hr
);
3053 desc
.desc2
.dwSize
= sizeof(DDSURFACEDESC2
) + 1;
3054 hr
= IDirectDrawSurface_GetSurfaceDesc(surface1
, &desc
.desc1
);
3055 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC2) + 1returned %08x\n", hr
);
3056 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface7
, &desc
.desc2
);
3057 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface7_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC2) + 1returned %08x\n", hr
);
3059 /* Tests for Lock() */
3061 desc
.desc1
.dwSize
= sizeof(DDSURFACEDESC
);
3062 hr
= IDirectDrawSurface_Lock(surface1
, NULL
, &desc
.desc1
, 0, 0);
3063 ok(hr
== DD_OK
, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC) returned %08x\n", hr
);
3064 if(SUCCEEDED(hr
)) IDirectDrawSurface_Unlock(surface1
, NULL
);
3065 ok(desc
.desc1
.dwSize
== sizeof(DDSURFACEDESC
), "Destination size was changed to %d\n", desc
.desc1
.dwSize
);
3066 hr
= IDirectDrawSurface7_Lock(surface7
, NULL
, &desc
.desc2
, 0, 0);
3067 ok(hr
== DD_OK
, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC) returned %08x\n", hr
);
3068 if(SUCCEEDED(hr
)) IDirectDrawSurface7_Unlock(surface7
, NULL
);
3069 ok(desc
.desc2
.dwSize
== sizeof(DDSURFACEDESC
), "Destination size was changed to %d\n", desc
.desc1
.dwSize
);
3071 desc
.desc2
.dwSize
= sizeof(DDSURFACEDESC2
);
3072 hr
= IDirectDrawSurface_Lock(surface1
, NULL
, &desc
.desc1
, 0, 0);
3073 ok(hr
== DD_OK
, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC2) returned %08x\n", hr
);
3074 ok(desc
.desc1
.dwSize
== sizeof(DDSURFACEDESC2
), "Destination size was changed to %d\n", desc
.desc1
.dwSize
);
3075 if(SUCCEEDED(hr
)) IDirectDrawSurface_Unlock(surface1
, NULL
);
3076 hr
= IDirectDrawSurface7_Lock(surface7
, NULL
, &desc
.desc2
, 0, 0);
3077 ok(hr
== DD_OK
, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC2) returned %08x\n", hr
);
3078 if(SUCCEEDED(hr
)) IDirectDrawSurface7_Unlock(surface7
, NULL
);
3079 ok(desc
.desc2
.dwSize
== sizeof(DDSURFACEDESC2
), "Destination size was changed to %d\n", desc
.desc1
.dwSize
);
3081 desc
.desc2
.dwSize
= 0;
3082 hr
= IDirectDrawSurface_Lock(surface1
, NULL
, &desc
.desc1
, 0, 0);
3083 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_Lock with desc size 0 returned %08x\n", hr
);
3084 if(SUCCEEDED(hr
)) IDirectDrawSurface_Unlock(surface1
, NULL
);
3085 hr
= IDirectDrawSurface7_Lock(surface7
, NULL
, &desc
.desc2
, 0, 0);
3086 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface7_Lock with desc size 0 returned %08x\n", hr
);
3087 if(SUCCEEDED(hr
)) IDirectDrawSurface7_Unlock(surface7
, NULL
);
3089 desc
.desc1
.dwSize
= sizeof(DDSURFACEDESC
) + 1;
3090 hr
= IDirectDrawSurface_Lock(surface1
, NULL
, &desc
.desc1
, 0, 0);
3091 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC) + 1 returned %08x\n", hr
);
3092 if(SUCCEEDED(hr
)) IDirectDrawSurface_Unlock(surface1
, NULL
);
3093 hr
= IDirectDrawSurface7_Lock(surface7
, NULL
, &desc
.desc2
, 0, 0);
3094 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC) + 1 returned %08x\n", hr
);
3095 if(SUCCEEDED(hr
)) IDirectDrawSurface7_Unlock(surface7
, NULL
);
3097 desc
.desc2
.dwSize
= sizeof(DDSURFACEDESC2
) + 1;
3098 hr
= IDirectDrawSurface_Lock(surface1
, NULL
, &desc
.desc1
, 0, 0);
3099 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC2) + 1returned %08x\n", hr
);
3100 if(SUCCEEDED(hr
)) IDirectDrawSurface_Unlock(surface1
, NULL
);
3101 hr
= IDirectDrawSurface7_Lock(surface7
, NULL
, &desc
.desc2
, 0, 0);
3102 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC2) + 1returned %08x\n", hr
);
3103 if(SUCCEEDED(hr
)) IDirectDrawSurface7_Unlock(surface7
, NULL
);
3105 IDirectDrawSurface7_Release(surface7
);
3106 IDirectDrawSurface_Release(surface1
);
3109 static void SurfaceCapsTest(void)
3111 DDSURFACEDESC create
;
3114 IDirectDrawSurface
*surface1
= NULL
;
3115 DDSURFACEDESC2 create2
, desc2
;
3116 IDirectDrawSurface7
*surface7
= NULL
;
3117 IDirectDraw7
*dd7
= NULL
;
3118 DWORD create_caps
[] = {
3119 DDSCAPS_OFFSCREENPLAIN
,
3121 DDSCAPS_TEXTURE
| DDSCAPS_ALLOCONLOAD
,
3123 DDSCAPS_TEXTURE
| DDSCAPS_ALLOCONLOAD
| DDSCAPS_SYSTEMMEMORY
,
3124 DDSCAPS_PRIMARYSURFACE
,
3125 DDSCAPS_PRIMARYSURFACE
| DDSCAPS_SYSTEMMEMORY
,
3128 DDSCAPS_3DDEVICE
| DDSCAPS_OFFSCREENPLAIN
3130 DWORD expected_caps
[] = {
3131 DDSCAPS_OFFSCREENPLAIN
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
,
3132 DDSCAPS_TEXTURE
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
,
3133 DDSCAPS_TEXTURE
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
| DDSCAPS_ALLOCONLOAD
,
3134 DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
,
3135 DDSCAPS_TEXTURE
| DDSCAPS_ALLOCONLOAD
| DDSCAPS_SYSTEMMEMORY
,
3136 DDSCAPS_PRIMARYSURFACE
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
| DDSCAPS_VISIBLE
,
3137 DDSCAPS_PRIMARYSURFACE
| DDSCAPS_SYSTEMMEMORY
| DDSCAPS_VISIBLE
,
3138 DDSCAPS_3DDEVICE
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
,
3139 DDSCAPS_ZBUFFER
| DDSCAPS_LOCALVIDMEM
| DDSCAPS_VIDEOMEMORY
,
3140 DDSCAPS_3DDEVICE
| DDSCAPS_OFFSCREENPLAIN
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
3144 /* Tests various surface flags, what changes do they undergo during surface creation. Forsaken
3145 * engine expects texture surfaces without memory flag to get a video memory flag right after
3146 * creation. Currently, Wine adds DDSCAPS_FRONTBUFFER to primary surface, but native doesn't do this
3147 * for single buffered primaries. Because of this primary surface creation tests are todo_wine. No real
3148 * app is known so far to care about this. */
3150 if (!(ddcaps
.ddsCaps
.dwCaps
& DDSCAPS_VIDEOMEMORY
))
3152 skip("DDraw reported no VIDEOMEMORY cap. Broken video driver? Skipping surface caps tests.\n");
3156 for (i
= 0; i
< sizeof(create_caps
) / sizeof(DWORD
); i
++)
3158 memset(&create
, 0, sizeof(create
));
3159 create
.dwSize
= sizeof(create
);
3160 create
.ddsCaps
.dwCaps
= create_caps
[i
];
3161 create
.dwFlags
= DDSD_CAPS
;
3163 if (!(create
.ddsCaps
.dwCaps
& DDSCAPS_PRIMARYSURFACE
))
3165 create
.dwFlags
|= DDSD_HEIGHT
| DDSD_WIDTH
;
3166 create
.dwHeight
= 128;
3167 create
.dwWidth
= 128;
3170 if (create
.ddsCaps
.dwCaps
& DDSCAPS_ZBUFFER
)
3172 create
.dwFlags
|= DDSD_PIXELFORMAT
;
3173 create
.ddpfPixelFormat
.dwSize
= sizeof(create
.ddpfPixelFormat
);
3174 create
.ddpfPixelFormat
.dwFlags
= DDPF_ZBUFFER
;
3175 U1(create
.ddpfPixelFormat
).dwZBufferBitDepth
= 16;
3176 U3(create
.ddpfPixelFormat
).dwZBitMask
= 0x0000FFFF;
3179 hr
= IDirectDraw_CreateSurface(lpDD
, &create
, &surface1
, NULL
);
3180 ok(hr
== DD_OK
, "IDirectDraw_CreateSurface failed with %08x\n", hr
);
3184 memset(&desc
, 0, sizeof(desc
));
3185 desc
.dwSize
= sizeof(DDSURFACEDESC
);
3186 hr
= IDirectDrawSurface_GetSurfaceDesc(surface1
, &desc
);
3187 ok(hr
== DD_OK
, "IDirectDrawSurface_GetSurfaceDesc failed with %08x\n", hr
);
3189 if (!(create_caps
[i
] & DDSCAPS_PRIMARYSURFACE
))
3190 ok(desc
.ddsCaps
.dwCaps
== expected_caps
[i
],
3191 "GetSurfaceDesc test %d returned caps %x, expected %x\n", i
,
3192 desc
.ddsCaps
.dwCaps
, expected_caps
[i
]);
3194 todo_wine
ok(desc
.ddsCaps
.dwCaps
== expected_caps
[i
],
3195 "GetSurfaceDesc test %d returned caps %x, expected %x\n", i
,
3196 desc
.ddsCaps
.dwCaps
, expected_caps
[i
]);
3198 IDirectDrawSurface_Release(surface1
);
3202 /* Test for differences in ddraw 7 */
3203 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
3204 ok(hr
== DD_OK
, "IDirectDraw_QueryInterface returned %08x\n", hr
);
3207 skip("Failed to get IDirectDraw7 interface, skipping tests\n");
3211 for (i
= 0; i
< sizeof(create_caps
) / sizeof(DWORD
); i
++)
3213 memset(&create2
, 0, sizeof(create2
));
3214 create2
.dwSize
= sizeof(create2
);
3215 create2
.ddsCaps
.dwCaps
= create_caps
[i
];
3216 create2
.dwFlags
= DDSD_CAPS
;
3218 if (!(create2
.ddsCaps
.dwCaps
& DDSCAPS_PRIMARYSURFACE
))
3220 create2
.dwFlags
|= DDSD_HEIGHT
| DDSD_WIDTH
;
3221 create2
.dwHeight
= 128;
3222 create2
.dwWidth
= 128;
3225 if (create2
.ddsCaps
.dwCaps
& DDSCAPS_ZBUFFER
)
3227 create2
.dwFlags
|= DDSD_PIXELFORMAT
;
3228 U4(create2
).ddpfPixelFormat
.dwSize
= sizeof(U4(create2
).ddpfPixelFormat
);
3229 U4(create2
).ddpfPixelFormat
.dwFlags
= DDPF_ZBUFFER
;
3230 U1(U4(create2
).ddpfPixelFormat
).dwZBufferBitDepth
= 16;
3231 U3(U4(create2
).ddpfPixelFormat
).dwZBitMask
= 0x0000FFFF;
3234 hr
= IDirectDraw7_CreateSurface(dd7
, &create2
, &surface7
, NULL
);
3235 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
3239 memset(&desc2
, 0, sizeof(desc2
));
3240 desc2
.dwSize
= sizeof(DDSURFACEDESC2
);
3241 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface7
, &desc2
);
3242 ok(hr
== DD_OK
, "IDirectDrawSurface_GetSurfaceDesc failed with %08x\n", hr
);
3244 if (!(create_caps
[i
] & DDSCAPS_PRIMARYSURFACE
))
3245 ok(desc2
.ddsCaps
.dwCaps
== expected_caps
[i
],
3246 "GetSurfaceDesc test %d returned caps %x, expected %x\n", i
,
3247 desc2
.ddsCaps
.dwCaps
, expected_caps
[i
]);
3249 todo_wine
ok(desc2
.ddsCaps
.dwCaps
== expected_caps
[i
],
3250 "GetSurfaceDesc test %d returned caps %x, expected %x\n", i
,
3251 desc2
.ddsCaps
.dwCaps
, expected_caps
[i
]);
3253 IDirectDrawSurface7_Release(surface7
);
3257 IDirectDraw7_Release(dd7
);
3260 memset(&create
, 0, sizeof(create
));
3261 create
.dwSize
= sizeof(create
);
3262 create
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
3263 create
.ddsCaps
.dwCaps
= DDSCAPS_SYSTEMMEMORY
| DDSCAPS_VIDEOMEMORY
;
3264 create
.dwWidth
= 64;
3265 create
.dwHeight
= 64;
3266 hr
= IDirectDraw_CreateSurface(lpDD
, &create
, &surface1
, NULL
);
3267 ok(hr
== DDERR_INVALIDCAPS
, "Creating a SYSMEM | VIDMEM surface returned 0x%08x, expected DDERR_INVALIDCAPS\n", hr
);
3268 if(surface1
) IDirectDrawSurface_Release(surface1
);
3271 static BOOL
can_create_primary_surface(void)
3274 IDirectDrawSurface
*surface
;
3277 memset(&ddsd
, 0, sizeof(ddsd
));
3278 ddsd
.dwSize
= sizeof(ddsd
);
3279 ddsd
.dwFlags
= DDSD_CAPS
;
3280 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
3281 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface
, NULL
);
3282 if(FAILED(hr
)) return FALSE
;
3283 IDirectDrawSurface_Release(surface
);
3287 static void dctest_surf(IDirectDrawSurface
*surf
, int ddsdver
) {
3289 HDC dc
, dc2
= (HDC
) 0x1234;
3291 DDSURFACEDESC2 ddsd2
;
3293 memset(&ddsd
, 0, sizeof(ddsd
));
3294 ddsd
.dwSize
= sizeof(ddsd
);
3295 memset(&ddsd2
, 0, sizeof(ddsd2
));
3296 ddsd2
.dwSize
= sizeof(ddsd2
);
3298 hr
= IDirectDrawSurface_GetDC(surf
, &dc
);
3299 ok(hr
== DD_OK
, "IDirectDrawSurface_GetDC failed: 0x%08x\n", hr
);
3301 hr
= IDirectDrawSurface_GetDC(surf
, &dc2
);
3302 ok(hr
== DDERR_DCALREADYCREATED
, "IDirectDrawSurface_GetDC failed: 0x%08x\n", hr
);
3303 ok(dc2
== (HDC
) 0x1234, "The failed GetDC call changed the dc: %p\n", dc2
);
3305 hr
= IDirectDrawSurface_Lock(surf
, NULL
, ddsdver
== 1 ? &ddsd
: ((DDSURFACEDESC
*) &ddsd2
), 0, NULL
);
3306 ok(hr
== DDERR_SURFACEBUSY
, "IDirectDrawSurface_Lock returned 0x%08x, expected DDERR_ALREADYLOCKED\n", hr
);
3308 hr
= IDirectDrawSurface_ReleaseDC(surf
, dc
);
3309 ok(hr
== DD_OK
, "IDirectDrawSurface_ReleaseDC failed: 0x%08x\n", hr
);
3310 hr
= IDirectDrawSurface_ReleaseDC(surf
, dc
);
3311 ok(hr
== DDERR_NODC
, "IDirectDrawSurface_ReleaseDC returned 0x%08x, expected DDERR_NODC\n", hr
);
3314 static void GetDCTest(void)
3317 DDSURFACEDESC2 ddsd2
;
3318 IDirectDrawSurface
*surf
;
3319 IDirectDrawSurface2
*surf2
;
3320 IDirectDrawSurface4
*surf4
;
3321 IDirectDrawSurface7
*surf7
;
3322 IDirectDrawSurface
*tmp
;
3323 IDirectDrawSurface7
*tmp7
;
3331 memset(&ddsd
, 0, sizeof(ddsd
));
3332 ddsd
.dwSize
= sizeof(ddsd
);
3333 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
3336 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
3337 memset(&ddsd2
, 0, sizeof(ddsd2
));
3338 ddsd2
.dwSize
= sizeof(ddsd2
);
3339 ddsd2
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
3341 ddsd2
.dwHeight
= 64;
3342 ddsd2
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
3344 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surf
, NULL
);
3345 ok(hr
== DD_OK
, "IDirectDraw_CreateSurface failed: 0x%08x\n", hr
);
3346 dctest_surf(surf
, 1);
3347 IDirectDrawSurface_Release(surf
);
3349 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw2
, (void **) &dd2
);
3350 ok(hr
== DD_OK
, "IDirectDraw_QueryInterface failed: 0x%08x\n", hr
);
3352 hr
= IDirectDraw2_CreateSurface(dd2
, &ddsd
, &surf
, NULL
);
3353 ok(hr
== DD_OK
, "IDirectDraw2_CreateSurface failed: 0x%08x\n", hr
);
3354 dctest_surf(surf
, 1);
3356 hr
= IDirectDrawSurface_QueryInterface(surf
, &IID_IDirectDrawSurface2
, (void **) &surf2
);
3357 ok(hr
== DD_OK
, "IDirectDrawSurface_QueryInterface failed: 0x%08x\n", hr
);
3358 dctest_surf((IDirectDrawSurface
*) surf2
, 1);
3360 IDirectDrawSurface2_Release(surf2
);
3361 IDirectDrawSurface_Release(surf
);
3362 IDirectDraw2_Release(dd2
);
3364 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw4
, (void **) &dd4
);
3365 ok(hr
== DD_OK
, "IDirectDraw_QueryInterface failed: 0x%08x\n", hr
);
3368 hr
= IDirectDraw4_CreateSurface(dd4
, &ddsd2
, &surf4
, NULL
);
3369 ok(hr
== DD_OK
, "IDirectDraw4_CreateSurface failed: 0x%08x\n", hr
);
3370 dctest_surf((IDirectDrawSurface
*) surf4
, 2);
3372 hr
= IDirectDrawSurface4_QueryInterface(surf4
, &IID_IDirectDrawSurface
, (void **)&surf
);
3373 ok(SUCCEEDED(hr
), "QueryInterface failed, hr %#x.\n", hr
);
3375 ref
= getRefcount((IUnknown
*) surf
);
3376 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
3377 ref
= getRefcount((IUnknown
*) surf4
);
3378 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
3380 hr
= IDirectDrawSurface4_GetDC(surf4
, &dc
);
3381 ok(SUCCEEDED(hr
), "GetDC failed, hr %#x.\n", hr
);
3383 hr
= IDirectDraw4_GetSurfaceFromDC(dd4
, dc
, NULL
);
3384 ok(hr
== E_INVALIDARG
, "Expected hr E_INVALIDARG, got %#x.\n", hr
);
3386 hr
= IDirectDraw4_GetSurfaceFromDC(dd4
, dc
, (IDirectDrawSurface4
**)&tmp
);
3387 ok(SUCCEEDED(hr
), "GetSurfaceFromDC failed, hr %#x.\n", hr
);
3388 ok(tmp
== surf
, "Expected surface %p, got %p.\n\n", surf
, tmp
);
3390 ref
= getRefcount((IUnknown
*) surf
);
3391 ok(ref
== 2, "Refcount is %u, expected 2\n", ref
);
3392 ref
= getRefcount((IUnknown
*) tmp
);
3393 ok(ref
== 2, "Refcount is %u, expected 2\n", ref
);
3394 ref
= getRefcount((IUnknown
*) surf4
);
3395 ok(ref
== 1, "Refcount is %u, expected 1\n", ref
);
3397 hr
= IDirectDrawSurface4_ReleaseDC(surf4
, dc
);
3398 ok(SUCCEEDED(hr
), "ReleaseDC failed, hr %#x.\n", hr
);
3400 IDirectDrawSurface_Release(tmp
);
3402 dc
= CreateCompatibleDC(NULL
);
3403 ok(!!dc
, "CreateCompatibleDC failed.\n");
3405 tmp
= (IDirectDrawSurface
*)0xdeadbeef;
3406 hr
= IDirectDraw4_GetSurfaceFromDC(dd4
, dc
, (IDirectDrawSurface4
**)&tmp
);
3407 ok(hr
== DDERR_NOTFOUND
, "GetSurfaceFromDC failed, hr %#x.\n", hr
);
3408 ok(!tmp
, "Expected surface NULL, got %p.\n", tmp
);
3410 ok(DeleteDC(dc
), "DeleteDC failed.\n");
3412 tmp
= (IDirectDrawSurface
*)0xdeadbeef;
3413 hr
= IDirectDraw4_GetSurfaceFromDC(dd4
, NULL
, (IDirectDrawSurface4
**)&tmp
);
3414 ok(hr
== DDERR_NOTFOUND
, "GetSurfaceFromDC failed, hr %#x.\n", hr
);
3415 ok(!tmp
, "Expected surface NULL, got %p.\n", tmp
);
3417 IDirectDrawSurface4_Release(surf4
);
3418 IDirectDrawSurface_Release(surf
);
3419 IDirectDraw4_Release(dd4
);
3421 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
3422 ok(hr
== DD_OK
, "IDirectDraw_QueryInterface failed: 0x%08x\n", hr
);
3424 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd2
, &surf7
, NULL
);
3425 ok(hr
== DD_OK
, "IDirectDraw7_CreateSurface failed: 0x%08x\n", hr
);
3426 dctest_surf((IDirectDrawSurface
*) surf7
, 2);
3428 hr
= IDirectDrawSurface7_GetDC(surf7
, &dc
);
3429 ok(SUCCEEDED(hr
), "GetDC failed, hr %#x.\n", hr
);
3431 hr
= IDirectDraw7_GetSurfaceFromDC(dd7
, dc
, NULL
);
3432 ok(hr
== E_INVALIDARG
, "Expected hr E_INVALIDARG, got %#x.\n", hr
);
3434 hr
= IDirectDraw7_GetSurfaceFromDC(dd7
, dc
, &tmp7
);
3435 ok(SUCCEEDED(hr
), "GetSurfaceFromDC failed, hr %#x.\n", hr
);
3436 ok(tmp7
== surf7
, "Expected surface %p, got %p.\n\n", surf7
, tmp7
);
3437 IDirectDrawSurface7_Release(tmp7
);
3439 hr
= IDirectDrawSurface7_ReleaseDC(surf7
, dc
);
3440 ok(SUCCEEDED(hr
), "ReleaseDC failed, hr %#x.\n", hr
);
3442 dc
= CreateCompatibleDC(NULL
);
3443 ok(!!dc
, "CreateCompatibleDC failed.\n");
3445 tmp7
= (IDirectDrawSurface7
*)0xdeadbeef;
3446 hr
= IDirectDraw7_GetSurfaceFromDC(dd7
, dc
, &tmp7
);
3447 ok(hr
== DDERR_NOTFOUND
, "GetSurfaceFromDC failed, hr %#x.\n", hr
);
3448 ok(!tmp7
, "Expected surface NULL, got %p.\n", tmp7
);
3450 ok(DeleteDC(dc
), "DeleteDC failed.\n");
3452 tmp7
= (IDirectDrawSurface7
*)0xdeadbeef;
3453 hr
= IDirectDraw7_GetSurfaceFromDC(dd7
, NULL
, (IDirectDrawSurface7
**)&tmp7
);
3454 ok(hr
== DDERR_NOTFOUND
, "GetSurfaceFromDC failed, hr %#x.\n", hr
);
3455 ok(!tmp7
, "Expected surface NULL, got %p.\n", tmp7
);
3457 IDirectDrawSurface7_Release(surf7
);
3458 IDirectDraw7_Release(dd7
);
3461 static void GetDCFormatTest(void)
3463 DDSURFACEDESC2 ddsd
;
3465 IDirectDrawSurface7
*surface
;
3480 sizeof(DDPIXELFORMAT
), DDPF_RGB
| DDPF_ALPHAPIXELS
, 0,
3481 {32}, {0x00ff0000}, {0x0000ff00}, {0x000000ff}, {0xff000000}
3488 sizeof(DDPIXELFORMAT
), DDPF_RGB
, 0,
3489 {32}, {0x00ff0000}, {0x0000ff00}, {0x000000ff}, {0x00000000}
3496 sizeof(DDPIXELFORMAT
), DDPF_RGB
, 0,
3497 {32}, {0x000000ff}, {0x0000ff00}, {0x00ff0000}, {0x00000000}
3500 DDERR_CANTCREATEDC
/* Vista+ */
3505 sizeof(DDPIXELFORMAT
), DDPF_RGB
| DDPF_ALPHAPIXELS
, 0,
3506 {32}, {0x000000ff}, {0x0000ff00}, {0x00ff0000}, {0xff000000}
3509 DDERR_CANTCREATEDC
/* Vista+ */
3514 sizeof(DDPIXELFORMAT
), DDPF_RGB
| DDPF_ALPHAPIXELS
, 0,
3515 {16}, {0x00000f00}, {0x000000f0}, {0x0000000f}, {0x0000f000}
3518 DDERR_CANTCREATEDC
/* Vista+ */
3523 sizeof(DDPIXELFORMAT
), DDPF_RGB
, 0,
3524 {16}, {0x00000f00}, {0x000000f0}, {0x0000000f}, {0x00000000}
3527 DDERR_CANTCREATEDC
/* Vista+ */
3532 sizeof(DDPIXELFORMAT
), DDPF_RGB
, 0,
3533 {16}, {0x0000F800}, {0x000007E0}, {0x0000001F}, {0x00000000}
3540 sizeof(DDPIXELFORMAT
), DDPF_RGB
| DDPF_ALPHAPIXELS
, 0,
3541 {16}, {0x00007C00}, {0x000003E0}, {0x0000001F}, {0x00008000}
3548 sizeof(DDPIXELFORMAT
), DDPF_RGB
, 0,
3549 {16}, {0x00007C00}, {0x000003E0}, {0x0000001F}, {0x00000000}
3556 sizeof(DDPIXELFORMAT
), DDPF_RGB
, 0,
3557 { 8}, {0x000000E0}, {0x0000001C}, {0x00000003}, {0x00000000}
3562 /* Untested, windows test machine didn't support this format */
3563 "D3DFMT_A2R10G10B10",
3565 sizeof(DDPIXELFORMAT
), DDPF_RGB
| DDPF_ALPHAPIXELS
, 0,
3566 {32}, {0xC0000000}, {0x3FF00000}, {0x000FFC00}, {0x000003FF}
3571 * GetDC on a P8 surface fails unless the display mode is 8 bpp. This is not
3572 * implemented in wine yet, so disable the test for now. Succeeding P8 getDC
3573 * calls are tested in the ddraw.visual test.
3578 sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED8 | DDPF_RGB, 0,
3579 {8 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
3587 sizeof(DDPIXELFORMAT
), DDPF_LUMINANCE
, 0,
3588 {8 }, {0x000000ff}, {0x00000000}, {0x00000000}, {0x00000000}
3595 sizeof(DDPIXELFORMAT
), DDPF_ALPHAPIXELS
| DDPF_LUMINANCE
, 0,
3596 {16}, {0x000000ff}, {0x00000000}, {0x00000000}, {0x0000ff00}
3603 sizeof(DDPIXELFORMAT
), DDPF_FOURCC
, MAKEFOURCC('D','X','T','1'),
3604 {0 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
3611 sizeof(DDPIXELFORMAT
), DDPF_FOURCC
, MAKEFOURCC('D','X','T','2'),
3612 {0 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
3619 sizeof(DDPIXELFORMAT
), DDPF_FOURCC
, MAKEFOURCC('D','X','T','3'),
3620 {0 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
3627 sizeof(DDPIXELFORMAT
), DDPF_FOURCC
, MAKEFOURCC('D','X','T','4'),
3628 {0 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
3635 sizeof(DDPIXELFORMAT
), DDPF_FOURCC
, MAKEFOURCC('D','X','T','5'),
3636 {0 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
3642 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
3643 ok(hr
== DD_OK
, "IDirectDraw_QueryInterface failed, hr = 0x%08x\n", hr
);
3645 for(i
= 0; i
< (sizeof(testdata
) / sizeof(testdata
[0])); i
++)
3647 memset(&ddsd
, 0, sizeof(ddsd
));
3648 ddsd
.dwSize
= sizeof(ddsd
);
3649 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_PIXELFORMAT
;
3652 U4(ddsd
).ddpfPixelFormat
= testdata
[i
].fmt
;
3653 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
3655 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface
, NULL
);
3658 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_TEXTURE
;
3659 ddsd
.ddsCaps
.dwCaps2
= DDSCAPS2_TEXTUREMANAGE
;
3660 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd
, &surface
, NULL
);
3663 skip("IDirectDraw7_CreateSurface failed, hr = 0x%08x, format %s\n", hr
, testdata
[i
].name
);
3668 dc
= (void *) 0x1234;
3669 hr
= IDirectDrawSurface7_GetDC(surface
, &dc
);
3670 if(testdata
[i
].getdc_capable
)
3673 (testdata
[i
].alt_result
&& hr
== testdata
[i
].alt_result
),
3674 "GetDC on a %s surface failed(0x%08x), expected it to work\n",
3675 testdata
[i
].name
, hr
);
3679 ok(FAILED(hr
), "GetDC on a %s surface succeeded(0x%08x), expected it to fail\n",
3680 testdata
[i
].name
, hr
);
3685 IDirectDrawSurface7_ReleaseDC(surface
, dc
);
3686 ok(hr
== DD_OK
, "IDirectDrawSurface7_ReleaseDC failed, hr = 0x%08x\n", hr
);
3691 ok(dc
== NULL
, "After failed GetDC dc is %p\n", dc
);
3694 IDirectDrawSurface7_Release(surface
);
3697 IDirectDraw7_Release(dd7
);
3700 static void BackBufferCreateSurfaceTest(void)
3703 DDSURFACEDESC created_ddsd
;
3704 DDSURFACEDESC2 ddsd2
;
3705 IDirectDrawSurface
*surf
;
3706 IDirectDrawSurface4
*surf4
;
3707 IDirectDrawSurface7
*surf7
;
3713 const DWORD caps
= DDSCAPS_BACKBUFFER
;
3714 const DWORD expected_caps
= DDSCAPS_BACKBUFFER
| DDSCAPS_VIDEOMEMORY
| DDSCAPS_LOCALVIDMEM
;
3716 if (!(ddcaps
.ddsCaps
.dwCaps
& DDSCAPS_VIDEOMEMORY
))
3718 skip("DDraw reported no VIDEOMEMORY cap. Broken video driver? Skipping surface caps tests.\n");
3722 memset(&ddsd
, 0, sizeof(ddsd
));
3723 ddsd
.dwSize
= sizeof(ddsd
);
3724 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
3727 ddsd
.ddsCaps
.dwCaps
= caps
;
3728 memset(&ddsd2
, 0, sizeof(ddsd2
));
3729 ddsd2
.dwSize
= sizeof(ddsd2
);
3730 ddsd2
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
3732 ddsd2
.dwHeight
= 64;
3733 ddsd2
.ddsCaps
.dwCaps
= caps
;
3734 memset(&created_ddsd
, 0, sizeof(created_ddsd
));
3735 created_ddsd
.dwSize
= sizeof(DDSURFACEDESC
);
3737 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surf
, NULL
);
3738 ok(SUCCEEDED(hr
), "IDirectDraw_CreateSurface failed: 0x%08x\n", hr
);
3741 hr
= IDirectDrawSurface_GetSurfaceDesc(surf
, &created_ddsd
);
3742 ok(SUCCEEDED(hr
), "IDirectDraw_GetSurfaceDesc failed: 0x%08x\n", hr
);
3743 ok(created_ddsd
.ddsCaps
.dwCaps
== expected_caps
,
3744 "GetSurfaceDesc returned caps %x, expected %x\n", created_ddsd
.ddsCaps
.dwCaps
,
3746 IDirectDrawSurface_Release(surf
);
3749 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw2
, (void **) &dd2
);
3750 ok(SUCCEEDED(hr
), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr
);
3752 hr
= IDirectDraw2_CreateSurface(dd2
, &ddsd
, &surf
, NULL
);
3753 ok(hr
== DDERR_INVALIDCAPS
, "IDirectDraw2_CreateSurface didn't return %x08x, but %x08x\n",
3754 DDERR_INVALIDCAPS
, hr
);
3756 IDirectDraw2_Release(dd2
);
3758 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw4
, (void **) &dd4
);
3759 ok(SUCCEEDED(hr
), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr
);
3761 hr
= IDirectDraw4_CreateSurface(dd4
, &ddsd2
, &surf4
, NULL
);
3762 ok(hr
== DDERR_INVALIDCAPS
, "IDirectDraw4_CreateSurface didn't return %x08x, but %x08x\n",
3763 DDERR_INVALIDCAPS
, hr
);
3765 IDirectDraw4_Release(dd4
);
3767 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
3768 ok(SUCCEEDED(hr
), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr
);
3770 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd2
, &surf7
, NULL
);
3771 ok(hr
== DDERR_INVALIDCAPS
, "IDirectDraw7_CreateSurface didn't return %x08x, but %x08x\n",
3772 DDERR_INVALIDCAPS
, hr
);
3774 IDirectDraw7_Release(dd7
);
3777 static void BackBufferAttachmentFlipTest(void)
3780 IDirectDrawSurface
*surface1
, *surface2
, *surface3
, *surface4
;
3782 HWND window
= CreateWindow( "static", "ddraw_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
3784 hr
= IDirectDraw_SetCooperativeLevel(lpDD
, window
, DDSCL_EXCLUSIVE
| DDSCL_FULLSCREEN
);
3785 ok(hr
== DD_OK
, "SetCooperativeLevel returned %08x\n", hr
);
3787 /* Perform attachment tests on a back-buffer */
3788 memset(&ddsd
, 0, sizeof(ddsd
));
3789 ddsd
.dwSize
= sizeof(ddsd
);
3790 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
3791 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_BACKBUFFER
;
3792 ddsd
.dwWidth
= GetSystemMetrics(SM_CXSCREEN
);
3793 ddsd
.dwHeight
= GetSystemMetrics(SM_CYSCREEN
);
3794 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface2
, NULL
);
3795 ok(SUCCEEDED(hr
), "CreateSurface returned: %x\n",hr
);
3797 if (surface2
!= NULL
)
3799 /* Try a single primary and a two back buffers */
3800 memset(&ddsd
, 0, sizeof(ddsd
));
3801 ddsd
.dwSize
= sizeof(ddsd
);
3802 ddsd
.dwFlags
= DDSD_CAPS
;
3803 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
3804 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface1
, NULL
);
3805 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
3807 memset(&ddsd
, 0, sizeof(ddsd
));
3808 ddsd
.dwSize
= sizeof(ddsd
);
3809 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
3810 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_BACKBUFFER
;
3811 ddsd
.dwWidth
= GetSystemMetrics(SM_CXSCREEN
);
3812 ddsd
.dwHeight
= GetSystemMetrics(SM_CYSCREEN
);
3813 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface3
, NULL
);
3814 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
3816 /* This one has a different size */
3817 memset(&ddsd
, 0, sizeof(ddsd
));
3818 ddsd
.dwSize
= sizeof(ddsd
);
3819 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
3820 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_BACKBUFFER
;
3822 ddsd
.dwHeight
= 128;
3823 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface4
, NULL
);
3824 ok(hr
==DD_OK
,"CreateSurface returned: %x\n",hr
);
3826 hr
= IDirectDrawSurface_AddAttachedSurface(surface1
, surface2
);
3827 todo_wine
ok(hr
== DD_OK
|| broken(hr
== DDERR_CANNOTATTACHSURFACE
),
3828 "Attaching a back buffer to a front buffer returned %08x\n", hr
);
3831 /* Try flipping the surfaces */
3832 hr
= IDirectDrawSurface_Flip(surface1
, NULL
, DDFLIP_WAIT
);
3833 todo_wine
ok(hr
== DD_OK
, "IDirectDrawSurface_Flip returned 0x%08x\n", hr
);
3834 hr
= IDirectDrawSurface_Flip(surface2
, NULL
, DDFLIP_WAIT
);
3835 todo_wine
ok(hr
== DDERR_NOTFLIPPABLE
, "IDirectDrawSurface_Flip returned 0x%08x\n", hr
);
3837 /* Try the reverse without detaching first */
3838 hr
= IDirectDrawSurface_AddAttachedSurface(surface2
, surface1
);
3839 ok(hr
== DDERR_SURFACEALREADYATTACHED
, "Attaching an attached surface to its attachee returned %08x\n", hr
);
3840 hr
= IDirectDrawSurface_DeleteAttachedSurface(surface1
, 0, surface2
);
3841 ok(hr
== DD_OK
, "DeleteAttachedSurface failed with %08x\n", hr
);
3843 hr
= IDirectDrawSurface_AddAttachedSurface(surface2
, surface1
);
3844 todo_wine
ok(hr
== DD_OK
|| broken(hr
== DDERR_CANNOTATTACHSURFACE
),
3845 "Attaching a front buffer to a back buffer returned %08x\n", hr
);
3848 /* Try flipping the surfaces */
3849 hr
= IDirectDrawSurface_Flip(surface1
, NULL
, DDFLIP_WAIT
);
3850 todo_wine
ok(hr
== DD_OK
, "IDirectDrawSurface_Flip returned 0x%08x\n", hr
);
3851 hr
= IDirectDrawSurface_Flip(surface2
, NULL
, DDFLIP_WAIT
);
3852 todo_wine
ok(hr
== DDERR_NOTFLIPPABLE
, "IDirectDrawSurface_Flip returned 0x%08x\n", hr
);
3854 /* Try to detach reversed */
3855 hr
= IDirectDrawSurface_DeleteAttachedSurface(surface1
, 0, surface2
);
3856 ok(hr
== DDERR_CANNOTDETACHSURFACE
, "DeleteAttachedSurface returned %08x\n", hr
);
3857 /* Now the proper detach */
3858 hr
= IDirectDrawSurface_DeleteAttachedSurface(surface2
, 0, surface1
);
3859 ok(hr
== DD_OK
, "DeleteAttachedSurface failed with %08x\n", hr
);
3861 hr
= IDirectDrawSurface_AddAttachedSurface(surface2
, surface3
);
3862 todo_wine
ok(hr
== DD_OK
|| broken(hr
== DDERR_CANNOTATTACHSURFACE
),
3863 "Attaching a back buffer to another back buffer returned %08x\n", hr
);
3866 /* Try flipping the surfaces */
3867 hr
= IDirectDrawSurface_Flip(surface3
, NULL
, DDFLIP_WAIT
);
3868 todo_wine
ok(hr
== DD_OK
, "IDirectDrawSurface_Flip returned 0x%08x\n", hr
);
3869 hr
= IDirectDrawSurface_Flip(surface2
, NULL
, DDFLIP_WAIT
);
3870 todo_wine
ok(hr
== DDERR_NOTFLIPPABLE
, "IDirectDrawSurface_Flip returned 0x%08x\n", hr
);
3871 hr
= IDirectDrawSurface_Flip(surface1
, NULL
, DDFLIP_WAIT
);
3872 ok(hr
== DDERR_NOTFLIPPABLE
, "IDirectDrawSurface_Flip returned 0x%08x\n", hr
);
3874 hr
= IDirectDrawSurface_DeleteAttachedSurface(surface2
, 0, surface3
);
3875 ok(hr
== DD_OK
, "DeleteAttachedSurface failed with %08x\n", hr
);
3877 hr
= IDirectDrawSurface_AddAttachedSurface(surface1
, surface4
);
3878 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a back buffer to a front buffer of different size returned %08x\n", hr
);
3879 hr
= IDirectDrawSurface_AddAttachedSurface(surface4
, surface1
);
3880 ok(hr
== DDERR_CANNOTATTACHSURFACE
, "Attaching a front buffer to a back buffer of different size returned %08x\n", hr
);
3882 IDirectDrawSurface_Release(surface4
);
3883 IDirectDrawSurface_Release(surface3
);
3884 IDirectDrawSurface_Release(surface2
);
3885 IDirectDrawSurface_Release(surface1
);
3888 hr
=IDirectDraw_SetCooperativeLevel(lpDD
, NULL
, DDSCL_NORMAL
);
3889 ok(hr
== DD_OK
, "SetCooperativeLevel returned %08x\n", hr
);
3891 DestroyWindow(window
);
3894 static void CreateSurfaceBadCapsSizeTest(void)
3896 DDSURFACEDESC ddsd_ok
;
3897 DDSURFACEDESC ddsd_bad1
;
3898 DDSURFACEDESC ddsd_bad2
;
3899 DDSURFACEDESC ddsd_bad3
;
3900 DDSURFACEDESC ddsd_bad4
;
3901 DDSURFACEDESC2 ddsd2_ok
;
3902 DDSURFACEDESC2 ddsd2_bad1
;
3903 DDSURFACEDESC2 ddsd2_bad2
;
3904 DDSURFACEDESC2 ddsd2_bad3
;
3905 DDSURFACEDESC2 ddsd2_bad4
;
3906 IDirectDrawSurface
*surf
;
3907 IDirectDrawSurface4
*surf4
;
3908 IDirectDrawSurface7
*surf7
;
3914 const DWORD caps
= DDSCAPS_OFFSCREENPLAIN
;
3916 memset(&ddsd_ok
, 0, sizeof(ddsd_ok
));
3917 ddsd_ok
.dwSize
= sizeof(ddsd_ok
);
3918 ddsd_ok
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
3919 ddsd_ok
.dwWidth
= 64;
3920 ddsd_ok
.dwHeight
= 64;
3921 ddsd_ok
.ddsCaps
.dwCaps
= caps
;
3922 memcpy(&ddsd_bad1
, &ddsd_ok
, sizeof(ddsd_bad1
));
3924 memcpy(&ddsd_bad2
, &ddsd_ok
, sizeof(ddsd_bad2
));
3926 memcpy(&ddsd_bad3
, &ddsd_ok
, sizeof(ddsd_bad3
));
3927 ddsd_bad3
.dwSize
= 0;
3928 memcpy(&ddsd_bad4
, &ddsd_ok
, sizeof(ddsd_bad4
));
3929 ddsd_bad4
.dwSize
= sizeof(DDSURFACEDESC2
);
3931 memset(&ddsd2_ok
, 0, sizeof(ddsd2_ok
));
3932 ddsd2_ok
.dwSize
= sizeof(ddsd2_ok
);
3933 ddsd2_ok
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
3934 ddsd2_ok
.dwWidth
= 64;
3935 ddsd2_ok
.dwHeight
= 64;
3936 ddsd2_ok
.ddsCaps
.dwCaps
= caps
;
3937 memcpy(&ddsd2_bad1
, &ddsd2_ok
, sizeof(ddsd2_bad1
));
3938 ddsd2_bad1
.dwSize
--;
3939 memcpy(&ddsd2_bad2
, &ddsd2_ok
, sizeof(ddsd2_bad2
));
3940 ddsd2_bad2
.dwSize
++;
3941 memcpy(&ddsd2_bad3
, &ddsd2_ok
, sizeof(ddsd2_bad3
));
3942 ddsd2_bad3
.dwSize
= 0;
3943 memcpy(&ddsd2_bad4
, &ddsd2_ok
, sizeof(ddsd2_bad4
));
3944 ddsd2_bad4
.dwSize
= sizeof(DDSURFACEDESC
);
3946 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd_ok
, &surf
, NULL
);
3947 ok(SUCCEEDED(hr
), "IDirectDraw_CreateSurface failed: 0x%08x\n", hr
);
3948 IDirectDrawSurface_Release(surf
);
3950 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd_bad1
, &surf
, NULL
);
3951 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
3952 DDERR_INVALIDPARAMS
, hr
);
3953 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd_bad2
, &surf
, NULL
);
3954 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
3955 DDERR_INVALIDPARAMS
, hr
);
3956 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd_bad3
, &surf
, NULL
);
3957 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
3958 DDERR_INVALIDPARAMS
, hr
);
3959 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd_bad4
, &surf
, NULL
);
3960 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
3961 DDERR_INVALIDPARAMS
, hr
);
3962 hr
= IDirectDraw_CreateSurface(lpDD
, NULL
, &surf
, NULL
);
3963 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
3964 DDERR_INVALIDPARAMS
, hr
);
3966 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw2
, (void **) &dd2
);
3967 ok(SUCCEEDED(hr
), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr
);
3969 hr
= IDirectDraw2_CreateSurface(dd2
, &ddsd_ok
, &surf
, NULL
);
3970 ok(SUCCEEDED(hr
), "IDirectDraw2_CreateSurface failed: 0x%08x\n", hr
);
3971 IDirectDrawSurface_Release(surf
);
3973 hr
= IDirectDraw2_CreateSurface(dd2
, &ddsd_bad1
, &surf
, NULL
);
3974 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
3975 DDERR_INVALIDPARAMS
, hr
);
3976 hr
= IDirectDraw2_CreateSurface(dd2
, &ddsd_bad2
, &surf
, NULL
);
3977 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
3978 DDERR_INVALIDPARAMS
, hr
);
3979 hr
= IDirectDraw2_CreateSurface(dd2
, &ddsd_bad3
, &surf
, NULL
);
3980 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
3981 DDERR_INVALIDPARAMS
, hr
);
3982 hr
= IDirectDraw2_CreateSurface(dd2
, &ddsd_bad4
, &surf
, NULL
);
3983 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
3984 DDERR_INVALIDPARAMS
, hr
);
3985 hr
= IDirectDraw2_CreateSurface(dd2
, NULL
, &surf
, NULL
);
3986 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
3987 DDERR_INVALIDPARAMS
, hr
);
3989 IDirectDraw2_Release(dd2
);
3991 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw4
, (void **) &dd4
);
3992 ok(SUCCEEDED(hr
), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr
);
3994 hr
= IDirectDraw4_CreateSurface(dd4
, &ddsd2_ok
, &surf4
, NULL
);
3995 ok(SUCCEEDED(hr
), "IDirectDraw4_CreateSurface failed: 0x%08x\n", hr
);
3996 IDirectDrawSurface4_Release(surf4
);
3998 hr
= IDirectDraw4_CreateSurface(dd4
, &ddsd2_bad1
, &surf4
, NULL
);
3999 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
4000 DDERR_INVALIDPARAMS
, hr
);
4001 hr
= IDirectDraw4_CreateSurface(dd4
, &ddsd2_bad2
, &surf4
, NULL
);
4002 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
4003 DDERR_INVALIDPARAMS
, hr
);
4004 hr
= IDirectDraw4_CreateSurface(dd4
, &ddsd2_bad3
, &surf4
, NULL
);
4005 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
4006 DDERR_INVALIDPARAMS
, hr
);
4007 hr
= IDirectDraw4_CreateSurface(dd4
, &ddsd2_bad4
, &surf4
, NULL
);
4008 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
4009 DDERR_INVALIDPARAMS
, hr
);
4010 hr
= IDirectDraw4_CreateSurface(dd4
, NULL
, &surf4
, NULL
);
4011 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
4012 DDERR_INVALIDPARAMS
, hr
);
4014 IDirectDraw4_Release(dd4
);
4016 hr
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw7
, (void **) &dd7
);
4017 ok(SUCCEEDED(hr
), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr
);
4019 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd2_ok
, &surf7
, NULL
);
4020 ok(SUCCEEDED(hr
), "IDirectDraw7_CreateSurface failed: 0x%08x\n", hr
);
4021 IDirectDrawSurface7_Release(surf7
);
4023 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd2_bad1
, &surf7
, NULL
);
4024 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
4025 DDERR_INVALIDPARAMS
, hr
);
4026 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd2_bad2
, &surf7
, NULL
);
4027 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
4028 DDERR_INVALIDPARAMS
, hr
);
4029 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd2_bad3
, &surf7
, NULL
);
4030 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
4031 DDERR_INVALIDPARAMS
, hr
);
4032 hr
= IDirectDraw7_CreateSurface(dd7
, &ddsd2_bad4
, &surf7
, NULL
);
4033 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
4034 DDERR_INVALIDPARAMS
, hr
);
4035 hr
= IDirectDraw7_CreateSurface(dd7
, NULL
, &surf7
, NULL
);
4036 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
4037 DDERR_INVALIDPARAMS
, hr
);
4039 IDirectDraw7_Release(dd7
);
4042 static void reset_ddsd(DDSURFACEDESC
*ddsd
)
4044 memset(ddsd
, 0, sizeof(*ddsd
));
4045 ddsd
->dwSize
= sizeof(*ddsd
);
4048 static void no_ddsd_caps_test(void)
4052 IDirectDrawSurface
*surface
;
4055 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
;
4057 ddsd
.dwHeight
= 128;
4058 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
4059 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface
, NULL
);
4060 ok(SUCCEEDED(hr
), "IDirectDraw_CreateSurface failed, hr %#x.\n", hr
);
4062 hr
= IDirectDrawSurface_GetSurfaceDesc(surface
, &ddsd
);
4063 IDirectDrawSurface_Release(surface
);
4064 ok(ddsd
.dwFlags
& DDSD_CAPS
, "DDSD_CAPS is not set\n");
4065 ok(ddsd
.ddsCaps
.dwCaps
& DDSCAPS_OFFSCREENPLAIN
, "DDSCAPS_OFFSCREENPLAIN is not set\n");
4068 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
4069 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface
, NULL
);
4070 ok(SUCCEEDED(hr
), "IDirectDraw_CreateSurface failed, hr %#x.\n", hr
);
4072 hr
= IDirectDrawSurface_GetSurfaceDesc(surface
, &ddsd
);
4073 IDirectDrawSurface_Release(surface
);
4074 ok(ddsd
.dwFlags
& DDSD_CAPS
, "DDSD_CAPS is not set\n");
4075 ok(ddsd
.ddsCaps
.dwCaps
& DDSCAPS_PRIMARYSURFACE
, "DDSCAPS_OFFSCREENPLAIN is not set\n");
4078 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
;
4080 ddsd
.dwHeight
= 128;
4081 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_VIDEOMEMORY
| DDSCAPS_SYSTEMMEMORY
;
4082 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface
, NULL
);
4083 ok(hr
== DDERR_INVALIDCAPS
, "IDirectDraw_CreateSurface returned %#x, expected DDERR_INVALIDCAPS.\n", hr
);
4086 static void dump_format(const DDPIXELFORMAT
*fmt
)
4088 trace("dwFlags %08x, FourCC %08x, dwZBufferBitDepth %u, stencil %u\n", fmt
->dwFlags
, fmt
->dwFourCC
,
4089 U1(*fmt
).dwZBufferBitDepth
, U2(*fmt
).dwStencilBitDepth
);
4090 trace("dwZBitMask %08x, dwStencilBitMask %08x, dwRGBZBitMask %08x\n", U3(*fmt
).dwZBitMask
,
4091 U4(*fmt
).dwStencilBitMask
, U5(*fmt
).dwRGBZBitMask
);
4094 static void zbufferbitdepth_test(void)
4098 ZFMT_SUPPORTED_ALWAYS
,
4099 ZFMT_SUPPORTED_NEVER
,
4100 ZFMT_SUPPORTED_HWDEPENDENT
4105 enum zfmt_succeed supported
;
4111 16, ZFMT_SUPPORTED_ALWAYS
,
4113 sizeof(DDPIXELFORMAT
), DDPF_ZBUFFER
, 0,
4114 {16}, {0}, {0x0000ffff}, {0x00000000}, {0x00000000}
4118 24, ZFMT_SUPPORTED_HWDEPENDENT
,
4120 sizeof(DDPIXELFORMAT
), DDPF_ZBUFFER
, 0,
4121 {24}, {0}, {0x00ffffff}, {0x00000000}, {0x00000000}
4125 32, ZFMT_SUPPORTED_HWDEPENDENT
,
4127 sizeof(DDPIXELFORMAT
), DDPF_ZBUFFER
, 0,
4128 {32}, {0}, {0xffffffff}, {0x00000000}, {0x00000000}
4131 /* Returns DDERR_INVALIDPARAMS instead of DDERR_INVALIDPIXELFORMAT.
4134 0, ZFMT_SUPPORTED_NEVER
4138 15, ZFMT_SUPPORTED_NEVER
4141 28, ZFMT_SUPPORTED_NEVER
4144 40, ZFMT_SUPPORTED_NEVER
4149 IDirectDrawSurface
*surface
;
4154 memset(&caps
, 0, sizeof(caps
));
4155 caps
.dwSize
= sizeof(caps
);
4156 hr
= IDirectDraw_GetCaps(lpDD
, &caps
, NULL
);
4157 ok(SUCCEEDED(hr
), "IDirectDraw_GetCaps failed, hr %#x.\n", hr
);
4158 if (!(caps
.ddsCaps
.dwCaps
& DDSCAPS_ZBUFFER
))
4160 skip("Z buffers not supported, skipping DDSD_ZBUFFERBITDEPTH test\n");
4164 for (i
= 0; i
< (sizeof(test_data
) / sizeof(*test_data
)); i
++)
4167 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_ZBUFFERBITDEPTH
;
4168 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_ZBUFFER
;
4170 ddsd
.dwHeight
= 256;
4171 U2(ddsd
).dwZBufferBitDepth
= test_data
[i
].depth
;
4173 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface
, NULL
);
4174 if (test_data
[i
].supported
== ZFMT_SUPPORTED_ALWAYS
)
4176 ok(SUCCEEDED(hr
), "IDirectDraw_CreateSurface failed, hr %#x.\n", hr
);
4178 else if (test_data
[i
].supported
== ZFMT_SUPPORTED_NEVER
)
4180 ok(hr
== DDERR_INVALIDPIXELFORMAT
, "IDirectDraw_CreateSurface returned %#x, expected %x.\n",
4181 hr
, DDERR_INVALIDPIXELFORMAT
);
4183 if (!surface
) continue;
4186 hr
= IDirectDrawSurface_GetSurfaceDesc(surface
, &ddsd
);
4187 ok(SUCCEEDED(hr
), "IDirectDrawSurface_GetSurfaceDesc failed, hr %#x.\n", hr
);
4188 IDirectDrawSurface_Release(surface
);
4190 ok(ddsd
.dwFlags
& DDSD_ZBUFFERBITDEPTH
, "DDSD_ZBUFFERBITDEPTH is not set\n");
4191 ok(!(ddsd
.dwFlags
& DDSD_PIXELFORMAT
), "DDSD_PIXELFORMAT is set\n");
4192 /* Yet the ddpfPixelFormat member contains valid data */
4193 if (memcmp(&ddsd
.ddpfPixelFormat
, &test_data
[i
].pf
, ddsd
.ddpfPixelFormat
.dwSize
))
4195 ok(0, "Unexpected format for depth %u\n", test_data
[i
].depth
);
4196 dump_format(&ddsd
.ddpfPixelFormat
);
4200 /* DDSD_ZBUFFERBITDEPTH vs DDSD_PIXELFORMAT? */
4202 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_PIXELFORMAT
| DDSD_ZBUFFERBITDEPTH
;
4203 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_ZBUFFER
;
4205 ddsd
.dwHeight
= 256;
4206 U2(ddsd
).dwZBufferBitDepth
= 24;
4207 ddsd
.ddpfPixelFormat
.dwSize
= sizeof(ddsd
.ddpfPixelFormat
);
4208 ddsd
.ddpfPixelFormat
.dwFlags
= DDPF_ZBUFFER
;
4209 U1(ddsd
.ddpfPixelFormat
).dwZBufferBitDepth
= 16;
4210 U3(ddsd
.ddpfPixelFormat
).dwZBitMask
= 0x0000ffff;
4213 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface
, NULL
);
4214 ok(SUCCEEDED(hr
), "IDirectDraw_CreateSurface failed, hr %#x.\n", hr
);
4215 if (!surface
) return;
4217 hr
= IDirectDrawSurface_GetSurfaceDesc(surface
, &ddsd
);
4218 ok(SUCCEEDED(hr
), "IDirectDrawSurface_GetSurfaceDesc failed, hr %#x.\n", hr
);
4219 IDirectDrawSurface_Release(surface
);
4220 ok(U1(ddsd
.ddpfPixelFormat
).dwZBufferBitDepth
== 16, "Expected a 16bpp depth buffer, got %ubpp\n",
4221 U1(ddsd
.ddpfPixelFormat
).dwZBufferBitDepth
);
4222 ok(ddsd
.dwFlags
& DDSD_ZBUFFERBITDEPTH
, "DDSD_ZBUFFERBITDEPTH is not set\n");
4223 ok(!(ddsd
.dwFlags
& DDSD_PIXELFORMAT
), "DDSD_PIXELFORMAT is set\n");
4224 ok(U2(ddsd
).dwZBufferBitDepth
== 16, "Expected dwZBufferBitDepth=16, got %u\n",
4225 U2(ddsd
).dwZBufferBitDepth
);
4227 /* DDSD_PIXELFORMAT vs invalid ZBUFFERBITDEPTH */
4229 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_ZBUFFERBITDEPTH
| DDSD_PIXELFORMAT
;
4230 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_ZBUFFER
;
4232 ddsd
.dwHeight
= 256;
4233 U2(ddsd
).dwZBufferBitDepth
= 40;
4234 ddsd
.ddpfPixelFormat
.dwSize
= sizeof(ddsd
.ddpfPixelFormat
);
4235 ddsd
.ddpfPixelFormat
.dwFlags
= DDPF_ZBUFFER
;
4236 U1(ddsd
.ddpfPixelFormat
).dwZBufferBitDepth
= 16;
4237 U3(ddsd
.ddpfPixelFormat
).dwZBitMask
= 0x0000ffff;
4239 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface
, NULL
);
4240 ok(SUCCEEDED(hr
), "IDirectDraw_CreateSurface failed, hr %#x.\n", hr
);
4241 if (surface
) IDirectDrawSurface_Release(surface
);
4243 /* Create a PIXELFORMAT-only surface, see if ZBUFFERBITDEPTH is set */
4245 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_PIXELFORMAT
;
4246 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_ZBUFFER
;
4248 ddsd
.dwHeight
= 256;
4249 ddsd
.ddpfPixelFormat
.dwSize
= sizeof(ddsd
.ddpfPixelFormat
);
4250 ddsd
.ddpfPixelFormat
.dwFlags
= DDPF_ZBUFFER
;
4251 U1(ddsd
.ddpfPixelFormat
).dwZBufferBitDepth
= 16;
4252 U3(ddsd
.ddpfPixelFormat
).dwZBitMask
= 0x0000ffff;
4254 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface
, NULL
);
4255 ok(SUCCEEDED(hr
), "IDirectDrawSurface_GetSurfaceDesc failed, hr %#x.\n", hr
);
4257 hr
= IDirectDrawSurface_GetSurfaceDesc(surface
, &ddsd
);
4258 ok(SUCCEEDED(hr
), "IDirectDrawSurface_GetSurfaceDesc failed, hr %#x.\n", hr
);
4259 IDirectDrawSurface_Release(surface
);
4260 ok(U1(ddsd
.ddpfPixelFormat
).dwZBufferBitDepth
== 16, "Expected a 16bpp depth buffer, got %ubpp\n",
4261 U1(ddsd
.ddpfPixelFormat
).dwZBufferBitDepth
);
4262 ok(ddsd
.dwFlags
& DDSD_ZBUFFERBITDEPTH
, "DDSD_ZBUFFERBITDEPTH is not set\n");
4263 ok(!(ddsd
.dwFlags
& DDSD_PIXELFORMAT
), "DDSD_PIXELFORMAT is set\n");
4264 ok(U2(ddsd
).dwZBufferBitDepth
== 16, "Expected dwZBufferBitDepth=16, got %u\n",
4265 U2(ddsd
).dwZBufferBitDepth
);
4268 static void test_ddsd(DDSURFACEDESC
*ddsd
, BOOL expect_pf
, BOOL expect_zd
, const char *name
, DWORD z_bit_depth
)
4270 IDirectDrawSurface
*surface
;
4271 IDirectDrawSurface7
*surface7
;
4274 DDSURFACEDESC2 out2
;
4276 hr
= IDirectDraw_CreateSurface(lpDD
, ddsd
, &surface
, NULL
);
4277 if (hr
== DDERR_NOZBUFFERHW
)
4279 skip("Z buffers not supported, skipping Z flag test\n");
4282 ok(SUCCEEDED(hr
), "IDirectDraw_CreateSurface failed, hr %#x.\n", hr
);
4283 hr
= IDirectDrawSurface_QueryInterface(surface
, &IID_IDirectDrawSurface7
, (void **) &surface7
);
4284 ok(SUCCEEDED(hr
), "IDirectDrawSurface_QueryInterface failed, hr %#x.\n", hr
);
4287 hr
= IDirectDrawSurface_GetSurfaceDesc(surface
, &out
);
4288 ok(SUCCEEDED(hr
), "IDirectDrawSurface_GetSurfaceDesc failed, hr %#x.\n", hr
);
4289 memset(&out2
, 0, sizeof(out2
));
4290 out2
.dwSize
= sizeof(out2
);
4291 hr
= IDirectDrawSurface7_GetSurfaceDesc(surface7
, &out2
);
4292 ok(SUCCEEDED(hr
), "IDirectDrawSurface_GetSurfaceDesc failed, hr %#x.\n", hr
);
4296 ok(out
.dwFlags
& DDSD_PIXELFORMAT
, "%s surface: Expected DDSD_PIXELFORMAT to be set\n", name
);
4297 ok(out2
.dwFlags
& DDSD_PIXELFORMAT
,
4298 "%s surface: Expected DDSD_PIXELFORMAT to be set in DDSURFACEDESC2\n", name
);
4302 ok(!(out
.dwFlags
& DDSD_PIXELFORMAT
), "%s surface: Expected DDSD_PIXELFORMAT not to be set\n", name
);
4303 ok(out2
.dwFlags
& DDSD_PIXELFORMAT
,
4304 "%s surface: Expected DDSD_PIXELFORMAT to be set in DDSURFACEDESC2\n", name
);
4308 ok(out
.dwFlags
& DDSD_ZBUFFERBITDEPTH
, "%s surface: Expected DDSD_ZBUFFERBITDEPTH to be set\n", name
);
4309 ok(U2(out
).dwZBufferBitDepth
== z_bit_depth
, "ZBufferBitDepth is %u, expected %u\n",
4310 U2(out
).dwZBufferBitDepth
, z_bit_depth
);
4311 ok(!(out2
.dwFlags
& DDSD_ZBUFFERBITDEPTH
),
4312 "%s surface: Did not expect DDSD_ZBUFFERBITDEPTH to be set in DDSURFACEDESC2\n", name
);
4313 /* dwMipMapCount and dwZBufferBitDepth share the same union */
4314 ok(U2(out2
).dwMipMapCount
== 0, "dwMipMapCount is %u, expected 0\n", U2(out2
).dwMipMapCount
);
4318 ok(!(out
.dwFlags
& DDSD_ZBUFFERBITDEPTH
), "%s surface: Expected DDSD_ZBUFFERBITDEPTH not to be set\n", name
);
4319 ok(U2(out
).dwZBufferBitDepth
== 0, "ZBufferBitDepth is %u, expected 0\n", U2(out
).dwZBufferBitDepth
);
4320 ok(!(out2
.dwFlags
& DDSD_ZBUFFERBITDEPTH
),
4321 "%s surface: Did not expect DDSD_ZBUFFERBITDEPTH to be set in DDSURFACEDESC2\n", name
);
4322 ok(U2(out2
).dwMipMapCount
== 0, "dwMipMapCount is %u, expected 0\n", U2(out2
).dwMipMapCount
);
4326 hr
= IDirectDrawSurface_Lock(surface
, NULL
, &out
, 0, NULL
);
4329 hr
= IDirectDrawSurface_Unlock(surface
, NULL
);
4330 ok(SUCCEEDED(hr
), "IDirectDrawSurface_GetSurfaceDesc failed, hr %#x.\n", hr
);
4332 /* DDSD_ZBUFFERBITDEPTH is never set on Nvidia, but follows GetSurfaceDesc rules on AMD */
4335 ok(!(out
.dwFlags
& DDSD_ZBUFFERBITDEPTH
),
4336 "Lock %s surface: Expected DDSD_ZBUFFERBITDEPTH not to be set\n", name
);
4339 /* DDSD_PIXELFORMAT follows GetSurfaceDesc rules */
4342 ok(out
.dwFlags
& DDSD_PIXELFORMAT
, "%s surface: Expected DDSD_PIXELFORMAT to be set\n", name
);
4346 ok(!(out
.dwFlags
& DDSD_PIXELFORMAT
),
4347 "Lock %s surface: Expected DDSD_PIXELFORMAT not to be set\n", name
);
4349 if (out
.dwFlags
& DDSD_ZBUFFERBITDEPTH
)
4350 ok(U2(out
).dwZBufferBitDepth
== z_bit_depth
, "ZBufferBitDepth is %u, expected %u\n",
4351 U2(out
).dwZBufferBitDepth
, z_bit_depth
);
4353 ok(U2(out
).dwZBufferBitDepth
== 0, "ZBufferBitDepth is %u, expected 0\n", U2(out
).dwZBufferBitDepth
);
4356 hr
= IDirectDrawSurface7_Lock(surface7
, NULL
, &out2
, 0, NULL
);
4357 ok(SUCCEEDED(hr
), "IDirectDrawSurface7_Lock failed, hr %#x.\n", hr
);
4360 hr
= IDirectDrawSurface7_Unlock(surface7
, NULL
);
4361 ok(SUCCEEDED(hr
), "IDirectDrawSurface7_Unlock failed, hr %#x.\n", hr
);
4362 /* DDSD_PIXELFORMAT is always set, DDSD_ZBUFFERBITDEPTH never */
4363 ok(out2
.dwFlags
& DDSD_PIXELFORMAT
,
4364 "Lock %s surface: Expected DDSD_PIXELFORMAT to be set in DDSURFACEDESC2\n", name
);
4365 ok(!(out2
.dwFlags
& DDSD_ZBUFFERBITDEPTH
),
4366 "Lock %s surface: Did not expect DDSD_ZBUFFERBITDEPTH to be set in DDSURFACEDESC2\n", name
);
4367 ok(U2(out2
).dwMipMapCount
== 0, "dwMipMapCount is %u, expected 0\n", U2(out2
).dwMipMapCount
);
4370 IDirectDrawSurface7_Release(surface7
);
4371 IDirectDrawSurface_Release(surface
);
4374 static void pixelformat_flag_test(void)
4380 memset(&caps
, 0, sizeof(caps
));
4381 caps
.dwSize
= sizeof(caps
);
4382 hr
= IDirectDraw_GetCaps(lpDD
, &caps
, NULL
);
4383 ok(SUCCEEDED(hr
), "IDirectDraw_GetCaps failed, hr %#x.\n", hr
);
4384 if (!(caps
.ddsCaps
.dwCaps
& DDSCAPS_ZBUFFER
))
4386 skip("Z buffers not supported, skipping DDSD_PIXELFORMAT test\n");
4391 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
;
4394 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
4395 test_ddsd(&ddsd
, TRUE
, FALSE
, "offscreen plain", ~0U);
4398 ddsd
.dwFlags
= DDSD_CAPS
;
4399 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
4400 test_ddsd(&ddsd
, TRUE
, FALSE
, "primary", ~0U);
4403 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_ZBUFFERBITDEPTH
;
4406 U2(ddsd
).dwZBufferBitDepth
= 16;
4407 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_ZBUFFER
;
4408 test_ddsd(&ddsd
, FALSE
, TRUE
, "Z buffer", 16);
4411 static void set_surface_desc_test(void)
4415 IDirectDrawSurface
*surface
;
4416 IDirectDrawSurface3
*surface3
;
4419 hr
= IDirectDraw_CreateSurface(lpDD
, NULL
, &surface
, NULL
);
4420 ok(hr
== DDERR_INVALIDPARAMS
, "CreateSurface with a NULL DDSD returned %#x,"
4421 " expected DDERR_INVALIDPARAMS(%#x)\n", hr
, DDERR_INVALIDPARAMS
);
4424 ddsd
.dwFlags
= DDSD_WIDTH
| DDSD_HEIGHT
| DDSD_CAPS
| DDSD_PIXELFORMAT
;
4427 ddsd
.ddpfPixelFormat
.dwSize
= sizeof(ddsd
.ddpfPixelFormat
);
4428 ddsd
.ddpfPixelFormat
.dwFlags
= DDPF_RGB
;
4429 U1(ddsd
.ddpfPixelFormat
).dwRGBBitCount
= 32;
4430 U2(ddsd
.ddpfPixelFormat
).dwRBitMask
= 0x00ff0000;
4431 U3(ddsd
.ddpfPixelFormat
).dwGBitMask
= 0x0000ff00;
4432 U4(ddsd
.ddpfPixelFormat
).dwBBitMask
= 0x000000ff;
4433 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_SYSTEMMEMORY
;
4435 hr
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &surface
, NULL
);
4436 ok(SUCCEEDED(hr
), "IDirectDraw_CreateSurface failed, hr %#x.\n", hr
);
4438 hr
= IDirectDrawSurface_QueryInterface(surface
, &IID_IDirectDrawSurface3
, (void **) &surface3
);
4439 ok(SUCCEEDED(hr
), "IDirectDrawSurface_QueryInterface failed, hr %#x.\n", hr
);
4440 IDirectDrawSurface_Release(surface
);
4443 ddsd
.dwFlags
= DDSD_LPSURFACE
;
4444 ddsd
.lpSurface
= data
;
4445 hr
= IDirectDrawSurface3_SetSurfaceDesc(surface3
, &ddsd
, 0);
4446 ok(SUCCEEDED(hr
), "IDirectDrawSurface3_SetSurfaceDesc failed, hr %#x.\n", hr
);
4448 /* Redundantly setting the same lpSurface is not an error */
4449 hr
= IDirectDrawSurface3_SetSurfaceDesc(surface3
, &ddsd
, 0);
4450 ok(SUCCEEDED(hr
), "IDirectDrawSurface3_SetSurfaceDesc failed, hr %#x.\n", hr
);
4452 hr
= IDirectDrawSurface3_SetSurfaceDesc(surface3
, &ddsd
, 1);
4453 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface3_SetSurfaceDesc returned %#x, expected"
4454 " DDERR_INVALIDPARAMS(%#x)\n", hr
, DDERR_INVALIDPARAMS
);
4456 hr
= IDirectDrawSurface3_SetSurfaceDesc(surface3
, NULL
, 0);
4457 ok(hr
== DDERR_INVALIDPARAMS
, "IDirectDrawSurface3_SetSurfaceDesc returned %#x, expected"
4458 " DDERR_INVALIDPARAMS(%#x)\n", hr
, DDERR_INVALIDPARAMS
);
4460 IDirectDrawSurface_Release(surface3
);
4463 START_TEST(dsurface
)
4468 if (!CreateDirectDraw())
4471 ret
= IDirectDraw_QueryInterface(lpDD
, &IID_IDirectDraw4
, (void **) &dd4
);
4472 if (ret
== E_NOINTERFACE
)
4474 win_skip("DirectDraw4 and higher are not supported\n");
4475 ReleaseDirectDraw();
4478 IDirectDraw_Release(dd4
);
4480 if(!can_create_primary_surface())
4482 skip("Unable to create primary surface\n");
4486 ddcaps
.dwSize
= sizeof(DDCAPS
);
4487 ret
= IDirectDraw_GetCaps(lpDD
, &ddcaps
, NULL
);
4490 skip("IDirectDraw_GetCaps failed with %08x\n", ret
);
4494 MipMapCreationTest();
4495 SrcColorKey32BlitTest();
4506 test_lockrect_invalid();
4516 BackBufferCreateSurfaceTest();
4517 BackBufferAttachmentFlipTest();
4518 CreateSurfaceBadCapsSizeTest();
4519 no_ddsd_caps_test();
4520 zbufferbitdepth_test();
4521 pixelformat_flag_test();
4522 set_surface_desc_test();
4523 ReleaseDirectDraw();