2 * Copyright (C) 2006 Vitaliy Margolen
3 * Copyright (C) 2006 Stefan Dösinger(For CodeWeavers)
4 * Copyright (C) 2006 Chris Robinson
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #include "wine/test.h"
26 static IDirect3D9
*(WINAPI
*pDirect3DCreate9
)(UINT
);
28 static int get_refcount(IUnknown
*object
)
30 IUnknown_AddRef( object
);
31 return IUnknown_Release( object
);
34 #define CHECK_CALL(r,c,d,rc) \
36 int tmp1 = get_refcount( (IUnknown *)d ); \
38 ok(tmp1 == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, tmp1); \
40 trace("%s failed: %s\n", c, DXGetErrorString9(r)); \
43 #define CHECK_RELEASE(obj,d,rc) \
45 int tmp1, rc_new = rc; \
46 IUnknown_Release( obj ); \
47 tmp1 = get_refcount( (IUnknown *)d ); \
48 ok(tmp1 == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, tmp1); \
51 #define CHECK_REFCOUNT(obj,rc) \
54 int count = get_refcount( (IUnknown *)obj ); \
55 ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
58 #define CHECK_RELEASE_REFCOUNT(obj,rc) \
61 int count = IUnknown_Release( (IUnknown *)obj ); \
62 ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
65 #define CHECK_ADDREF_REFCOUNT(obj,rc) \
68 int count = IUnknown_AddRef( (IUnknown *)obj ); \
69 ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
72 #define CHECK_SURFACE_CONTAINER(obj,iid,expected) \
74 void *container_ptr = (void *)0x1337c0d3; \
75 hr = IDirect3DSurface9_GetContainer(obj, &iid, &container_ptr); \
76 ok(SUCCEEDED(hr) && container_ptr == expected, "GetContainer returned: hr %#x, container_ptr %p. " \
77 "Expected hr %#x, container_ptr %p\n", hr, container_ptr, S_OK, expected); \
78 if (container_ptr && container_ptr != (void *)0x1337c0d3) IUnknown_Release((IUnknown *)container_ptr); \
81 static void check_mipmap_levels(
82 IDirect3DDevice9
* device
,
83 int width
, int height
, int count
)
86 IDirect3DBaseTexture9
* texture
= NULL
;
87 HRESULT hr
= IDirect3DDevice9_CreateTexture( device
, width
, height
, 0, 0,
88 D3DFMT_X8R8G8B8
, D3DPOOL_DEFAULT
, (IDirect3DTexture9
**) &texture
, NULL
);
91 DWORD levels
= IDirect3DBaseTexture9_GetLevelCount(texture
);
92 ok(levels
== count
, "Invalid level count. Expected %d got %u\n", count
, levels
);
94 trace("CreateTexture failed: %s\n", DXGetErrorString9(hr
));
96 if (texture
) IUnknown_Release( texture
);
99 static void test_mipmap_levels(void)
105 IDirect3D9
*pD3d
= NULL
;
106 IDirect3DDevice9
*pDevice
= NULL
;
107 D3DPRESENT_PARAMETERS d3dpp
;
108 D3DDISPLAYMODE d3ddm
;
110 pD3d
= pDirect3DCreate9( D3D_SDK_VERSION
);
111 ok(pD3d
!= NULL
, "Failed to create IDirect3D9 object\n");
112 hwnd
= CreateWindow( "static", "d3d9_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
113 ok(hwnd
!= NULL
, "Failed to create window\n");
114 if (!pD3d
|| !hwnd
) goto cleanup
;
116 IDirect3D9_GetAdapterDisplayMode( pD3d
, D3DADAPTER_DEFAULT
, &d3ddm
);
117 ZeroMemory( &d3dpp
, sizeof(d3dpp
) );
118 d3dpp
.Windowed
= TRUE
;
119 d3dpp
.SwapEffect
= D3DSWAPEFFECT_DISCARD
;
120 d3dpp
.BackBufferFormat
= d3ddm
.Format
;
122 hr
= IDirect3D9_CreateDevice( pD3d
, D3DADAPTER_DEFAULT
, D3DDEVTYPE_NULLREF
, hwnd
,
123 D3DCREATE_SOFTWARE_VERTEXPROCESSING
, &d3dpp
, &pDevice
);
124 ok(SUCCEEDED(hr
), "Failed to create IDirect3D9Device (%s)\n", DXGetErrorString9(hr
));
125 if (FAILED(hr
)) goto cleanup
;
127 check_mipmap_levels(pDevice
, 32, 32, 6);
128 check_mipmap_levels(pDevice
, 256, 1, 9);
129 check_mipmap_levels(pDevice
, 1, 256, 9);
130 check_mipmap_levels(pDevice
, 1, 1, 1);
133 if (pD3d
) IUnknown_Release( pD3d
);
134 if (pDevice
) IUnknown_Release( pDevice
);
135 DestroyWindow( hwnd
);
138 static void test_swapchain(void)
142 IDirect3D9
*pD3d
= NULL
;
143 IDirect3DDevice9
*pDevice
= NULL
;
144 IDirect3DSwapChain9
*swapchain0
= NULL
;
145 IDirect3DSwapChain9
*swapchain1
= NULL
;
146 IDirect3DSwapChain9
*swapchain2
= NULL
;
147 IDirect3DSwapChain9
*swapchain3
= NULL
;
148 IDirect3DSwapChain9
*swapchainX
= NULL
;
149 IDirect3DSurface9
*backbuffer
= NULL
;
150 D3DPRESENT_PARAMETERS d3dpp
;
151 D3DDISPLAYMODE d3ddm
;
153 pD3d
= pDirect3DCreate9( D3D_SDK_VERSION
);
154 ok(pD3d
!= NULL
, "Failed to create IDirect3D9 object\n");
155 hwnd
= CreateWindow( "static", "d3d9_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
156 ok(hwnd
!= NULL
, "Failed to create window\n");
157 if (!pD3d
|| !hwnd
) goto cleanup
;
159 IDirect3D9_GetAdapterDisplayMode( pD3d
, D3DADAPTER_DEFAULT
, &d3ddm
);
160 ZeroMemory( &d3dpp
, sizeof(d3dpp
) );
161 d3dpp
.Windowed
= TRUE
;
162 d3dpp
.SwapEffect
= D3DSWAPEFFECT_DISCARD
;
163 d3dpp
.BackBufferFormat
= d3ddm
.Format
;
164 d3dpp
.BackBufferCount
= 0;
166 hr
= IDirect3D9_CreateDevice( pD3d
, D3DADAPTER_DEFAULT
, D3DDEVTYPE_NULLREF
, hwnd
,
167 D3DCREATE_SOFTWARE_VERTEXPROCESSING
, &d3dpp
, &pDevice
);
168 ok(SUCCEEDED(hr
), "Failed to create IDirect3D9Device (%s)\n", DXGetErrorString9(hr
));
169 if (FAILED(hr
)) goto cleanup
;
171 /* Check if the back buffer count was modified */
172 ok(d3dpp
.BackBufferCount
== 1, "The back buffer count in the presentparams struct is %d\n", d3dpp
.BackBufferCount
);
174 /* Get the implicit swapchain */
175 hr
= IDirect3DDevice9_GetSwapChain(pDevice
, 0, &swapchain0
);
176 ok(SUCCEEDED(hr
), "Failed to get the impicit swapchain (%s)\n", DXGetErrorString9(hr
));
177 if(swapchain0
) IDirect3DSwapChain9_Release(swapchain0
);
179 /* Check if there is a back buffer */
180 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain0
, 0, D3DBACKBUFFER_TYPE_MONO
, &backbuffer
);
181 ok(SUCCEEDED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
182 ok(backbuffer
!= NULL
, "The back buffer is NULL\n");
183 if(backbuffer
) IDirect3DSurface9_Release(backbuffer
);
185 /* Try to get a nonexistant swapchain */
186 hr
= IDirect3DDevice9_GetSwapChain(pDevice
, 1, &swapchainX
);
187 ok(hr
== D3DERR_INVALIDCALL
, "GetSwapChain on an nonexistent swapchain returned (%s)\n", DXGetErrorString9(hr
));
188 ok(swapchainX
== NULL
, "Swapchain 1 is %p\n", swapchainX
);
189 if(swapchainX
) IDirect3DSwapChain9_Release(swapchainX
);
191 /* Create a bunch of swapchains */
192 d3dpp
.BackBufferCount
= 0;
193 hr
= IDirect3DDevice9_CreateAdditionalSwapChain(pDevice
, &d3dpp
, &swapchain1
);
194 ok(SUCCEEDED(hr
), "Failed to create a swapchain (%s)\n", DXGetErrorString9(hr
));
195 ok(d3dpp
.BackBufferCount
== 1, "The back buffer count in the presentparams struct is %d\n", d3dpp
.BackBufferCount
);
197 d3dpp
.BackBufferCount
= 1;
198 hr
= IDirect3DDevice9_CreateAdditionalSwapChain(pDevice
, &d3dpp
, &swapchain2
);
199 ok(SUCCEEDED(hr
), "Failed to create a swapchain (%s)\n", DXGetErrorString9(hr
));
201 d3dpp
.BackBufferCount
= 2;
202 hr
= IDirect3DDevice9_CreateAdditionalSwapChain(pDevice
, &d3dpp
, &swapchain3
);
203 ok(SUCCEEDED(hr
), "Failed to create a swapchain (%s)\n", DXGetErrorString9(hr
));
205 /* Swapchain 3, created with backbuffercount 2 */
206 backbuffer
= (void *) 0xdeadbeef;
207 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain3
, 0, 0, &backbuffer
);
208 ok(SUCCEEDED(hr
), "Failed to get the 1st back buffer (%s)\n", DXGetErrorString9(hr
));
209 ok(backbuffer
!= NULL
&& backbuffer
!= (void *) 0xdeadbeef, "The back buffer is %p\n", backbuffer
);
210 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
212 backbuffer
= (void *) 0xdeadbeef;
213 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain3
, 1, 0, &backbuffer
);
214 ok(SUCCEEDED(hr
), "Failed to get the 2nd back buffer (%s)\n", DXGetErrorString9(hr
));
215 ok(backbuffer
!= NULL
&& backbuffer
!= (void *) 0xdeadbeef, "The back buffer is %p\n", backbuffer
);
216 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
218 backbuffer
= (void *) 0xdeadbeef;
219 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain3
, 2, 0, &backbuffer
);
220 ok(hr
== D3DERR_INVALIDCALL
, "GetBackBuffer returned %s\n", DXGetErrorString9(hr
));
221 ok(backbuffer
== (void *) 0xdeadbeef, "The back buffer pointer was modified (%p)\n", backbuffer
);
222 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
224 backbuffer
= (void *) 0xdeadbeef;
225 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain3
, 3, 0, &backbuffer
);
226 ok(FAILED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
227 ok(backbuffer
== (void *) 0xdeadbeef, "The back buffer pointer was modified (%p)\n", backbuffer
);
228 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
231 /* Check the back buffers of the swapchains */
232 /* Swapchain 1, created with backbuffercount 0 */
233 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain1
, 0, D3DBACKBUFFER_TYPE_MONO
, &backbuffer
);
234 ok(SUCCEEDED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
235 ok(backbuffer
!= NULL
, "The back buffer is NULL (%s)\n", DXGetErrorString9(hr
));
236 if(backbuffer
) IDirect3DSurface9_Release(backbuffer
);
238 backbuffer
= (void *) 0xdeadbeef;
239 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain1
, 1, 0, &backbuffer
);
240 ok(FAILED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
241 ok(backbuffer
== (void *) 0xdeadbeef, "The back buffer pointer was modified (%p)\n", backbuffer
);
242 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
244 /* Swapchain 2 - created with backbuffercount 1 */
245 backbuffer
= (void *) 0xdeadbeef;
246 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain2
, 0, 0, &backbuffer
);
247 ok(SUCCEEDED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
248 ok(backbuffer
!= NULL
&& backbuffer
!= (void *) 0xdeadbeef, "The back buffer is %p\n", backbuffer
);
249 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
251 backbuffer
= (void *) 0xdeadbeef;
252 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain2
, 1, 0, &backbuffer
);
253 ok(hr
== D3DERR_INVALIDCALL
, "GetBackBuffer returned %s\n", DXGetErrorString9(hr
));
254 ok(backbuffer
== (void *) 0xdeadbeef, "The back buffer pointer was modified (%p)\n", backbuffer
);
255 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
257 backbuffer
= (void *) 0xdeadbeef;
258 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain2
, 2, 0, &backbuffer
);
259 ok(FAILED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
260 ok(backbuffer
== (void *) 0xdeadbeef, "The back buffer pointer was modified (%p)\n", backbuffer
);
261 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
263 /* Try getSwapChain on a manually created swapchain
264 * it should fail, apparently GetSwapChain only returns implicit swapchains
266 swapchainX
= (void *) 0xdeadbeef;
267 hr
= IDirect3DDevice9_GetSwapChain(pDevice
, 1, &swapchainX
);
268 ok(hr
== D3DERR_INVALIDCALL
, "Failed to get the second swapchain (%s)\n", DXGetErrorString9(hr
));
269 ok(swapchainX
== NULL
, "The swapchain pointer is %p\n", swapchainX
);
270 if(swapchainX
&& swapchainX
!= (void *) 0xdeadbeef ) IDirect3DSwapChain9_Release(swapchainX
);
273 if(swapchain1
) IDirect3DSwapChain9_Release(swapchain1
);
274 if(swapchain2
) IDirect3DSwapChain9_Release(swapchain2
);
275 if(swapchain3
) IDirect3DSwapChain9_Release(swapchain3
);
276 if(pDevice
) IDirect3DDevice9_Release(pDevice
);
277 if(pD3d
) IDirect3DDevice9_Release(pD3d
);
278 DestroyWindow( hwnd
);
281 static void test_refcount(void)
285 IDirect3D9
*pD3d
= NULL
;
286 IDirect3DDevice9
*pDevice
= NULL
;
287 IDirect3DVertexBuffer9
*pVertexBuffer
= NULL
;
288 IDirect3DIndexBuffer9
*pIndexBuffer
= NULL
;
289 IDirect3DVertexDeclaration9
*pVertexDeclaration
= NULL
;
290 IDirect3DVertexShader9
*pVertexShader
= NULL
;
291 IDirect3DPixelShader9
*pPixelShader
= NULL
;
292 IDirect3DCubeTexture9
*pCubeTexture
= NULL
;
293 IDirect3DTexture9
*pTexture
= NULL
;
294 IDirect3DVolumeTexture9
*pVolumeTexture
= NULL
;
295 IDirect3DVolume9
*pVolumeLevel
= NULL
;
296 IDirect3DSurface9
*pStencilSurface
= NULL
;
297 IDirect3DSurface9
*pOffscreenSurface
= NULL
;
298 IDirect3DSurface9
*pRenderTarget
= NULL
;
299 IDirect3DSurface9
*pRenderTarget2
= NULL
;
300 IDirect3DSurface9
*pRenderTarget3
= NULL
;
301 IDirect3DSurface9
*pTextureLevel
= NULL
;
302 IDirect3DSurface9
*pBackBuffer
= NULL
;
303 IDirect3DStateBlock9
*pStateBlock
= NULL
;
304 IDirect3DStateBlock9
*pStateBlock1
= NULL
;
305 IDirect3DSwapChain9
*pSwapChain
= NULL
;
306 IDirect3DQuery9
*pQuery
= NULL
;
307 D3DPRESENT_PARAMETERS d3dpp
;
308 D3DDISPLAYMODE d3ddm
;
309 int refcount
= 0, tmp
;
311 D3DVERTEXELEMENT9 decl
[] =
315 static DWORD simple_vs
[] = {0xFFFE0101, /* vs_1_1 */
316 0x0000001F, 0x80000000, 0x900F0000, /* dcl_position0 v0 */
317 0x00000009, 0xC0010000, 0x90E40000, 0xA0E40000, /* dp4 oPos.x, v0, c0 */
318 0x00000009, 0xC0020000, 0x90E40000, 0xA0E40001, /* dp4 oPos.y, v0, c1 */
319 0x00000009, 0xC0040000, 0x90E40000, 0xA0E40002, /* dp4 oPos.z, v0, c2 */
320 0x00000009, 0xC0080000, 0x90E40000, 0xA0E40003, /* dp4 oPos.w, v0, c3 */
321 0x0000FFFF}; /* END */
322 static DWORD simple_ps
[] = {0xFFFF0101, /* ps_1_1 */
323 0x00000051, 0xA00F0001, 0x3F800000, 0x00000000, 0x00000000, 0x00000000, /* def c1 = 1.0, 0.0, 0.0, 0.0 */
324 0x00000042, 0xB00F0000, /* tex t0 */
325 0x00000008, 0x800F0000, 0xA0E40001, 0xA0E40000, /* dp3 r0, c1, c0 */
326 0x00000005, 0x800F0000, 0x90E40000, 0x80E40000, /* mul r0, v0, r0 */
327 0x00000005, 0x800F0000, 0xB0E40000, 0x80E40000, /* mul r0, t0, r0 */
328 0x0000FFFF}; /* END */
331 pD3d
= pDirect3DCreate9( D3D_SDK_VERSION
);
332 ok(pD3d
!= NULL
, "Failed to create IDirect3D9 object\n");
333 hwnd
= CreateWindow( "static", "d3d9_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
334 ok(hwnd
!= NULL
, "Failed to create window\n");
335 if (!pD3d
|| !hwnd
) goto cleanup
;
337 IDirect3D9_GetAdapterDisplayMode( pD3d
, D3DADAPTER_DEFAULT
, &d3ddm
);
338 ZeroMemory( &d3dpp
, sizeof(d3dpp
) );
339 d3dpp
.Windowed
= TRUE
;
340 d3dpp
.SwapEffect
= D3DSWAPEFFECT_DISCARD
;
341 d3dpp
.BackBufferFormat
= d3ddm
.Format
;
342 d3dpp
.EnableAutoDepthStencil
= TRUE
;
343 d3dpp
.AutoDepthStencilFormat
= D3DFMT_D16
;
345 hr
= IDirect3D9_CreateDevice( pD3d
, D3DADAPTER_DEFAULT
, D3DDEVTYPE_NULLREF
, hwnd
,
346 D3DCREATE_SOFTWARE_VERTEXPROCESSING
, &d3dpp
, &pDevice
);
347 ok(SUCCEEDED(hr
), "Failed to create IDirect3D9Device (%s)\n", DXGetErrorString9(hr
));
348 if (FAILED(hr
)) goto cleanup
;
350 refcount
= get_refcount( (IUnknown
*)pDevice
);
351 ok(refcount
== 1, "Invalid device RefCount %d\n", refcount
);
354 * Check refcount of implicit surfaces and implicit swapchain. Findings:
355 * - the container is the device OR swapchain
356 * - they hold a refernce to the device
357 * - they are created with a refcount of 0 (Get/Release returns orignial refcount)
358 * - they are not freed if refcount reaches 0.
359 * - the refcount is not forwarded to the container.
361 hr
= IDirect3DDevice9_GetSwapChain(pDevice
, 0, &pSwapChain
);
362 CHECK_CALL( hr
, "GetSwapChain", pDevice
, ++refcount
);
365 CHECK_REFCOUNT( pSwapChain
, 1);
367 hr
= IDirect3DDevice9_GetRenderTarget(pDevice
, 0, &pRenderTarget
);
368 CHECK_CALL( hr
, "GetRenderTarget", pDevice
, ++refcount
);
369 CHECK_REFCOUNT( pSwapChain
, 1);
372 CHECK_SURFACE_CONTAINER( pRenderTarget
, IID_IDirect3DSwapChain9
, pSwapChain
);
373 CHECK_REFCOUNT( pRenderTarget
, 1);
375 CHECK_ADDREF_REFCOUNT(pRenderTarget
, 2);
376 CHECK_REFCOUNT(pDevice
, refcount
);
377 CHECK_RELEASE_REFCOUNT(pRenderTarget
, 1);
378 CHECK_REFCOUNT(pDevice
, refcount
);
380 hr
= IDirect3DDevice9_GetRenderTarget(pDevice
, 0, &pRenderTarget
);
381 CHECK_CALL( hr
, "GetRenderTarget", pDevice
, refcount
);
382 CHECK_REFCOUNT( pRenderTarget
, 2);
383 CHECK_RELEASE_REFCOUNT( pRenderTarget
, 1);
384 CHECK_RELEASE_REFCOUNT( pRenderTarget
, 0);
385 CHECK_REFCOUNT( pDevice
, --refcount
);
387 /* The render target is released with the device, so AddRef with refcount=0 is fine here. */
388 CHECK_ADDREF_REFCOUNT(pRenderTarget
, 1);
389 CHECK_REFCOUNT(pDevice
, ++refcount
);
390 CHECK_RELEASE_REFCOUNT(pRenderTarget
, 0);
391 CHECK_REFCOUNT(pDevice
, --refcount
);
394 /* Render target and back buffer are identical. */
395 hr
= IDirect3DDevice9_GetBackBuffer(pDevice
, 0, 0, 0, &pBackBuffer
);
396 CHECK_CALL( hr
, "GetBackBuffer", pDevice
, ++refcount
);
399 CHECK_RELEASE_REFCOUNT(pBackBuffer
, 0);
400 ok(pRenderTarget
== pBackBuffer
, "RenderTarget=%p and BackBuffer=%p should be the same.\n",
401 pRenderTarget
, pBackBuffer
);
404 CHECK_REFCOUNT( pDevice
, --refcount
);
406 hr
= IDirect3DDevice9_GetDepthStencilSurface(pDevice
, &pStencilSurface
);
407 CHECK_CALL( hr
, "GetDepthStencilSurface", pDevice
, ++refcount
);
408 CHECK_REFCOUNT( pSwapChain
, 1);
411 CHECK_SURFACE_CONTAINER( pStencilSurface
, IID_IDirect3DDevice9
, pDevice
);
412 CHECK_REFCOUNT( pStencilSurface
, 1);
414 CHECK_ADDREF_REFCOUNT(pStencilSurface
, 2);
415 CHECK_REFCOUNT(pDevice
, refcount
);
416 CHECK_RELEASE_REFCOUNT(pStencilSurface
, 1);
417 CHECK_REFCOUNT(pDevice
, refcount
);
419 CHECK_RELEASE_REFCOUNT( pStencilSurface
, 0);
420 CHECK_REFCOUNT( pDevice
, --refcount
);
422 /* The stencil surface is released with the device, so AddRef with refcount=0 is fine here. */
423 CHECK_ADDREF_REFCOUNT(pStencilSurface
, 1);
424 CHECK_REFCOUNT(pDevice
, ++refcount
);
425 CHECK_RELEASE_REFCOUNT(pStencilSurface
, 0);
426 CHECK_REFCOUNT(pDevice
, --refcount
);
427 pStencilSurface
= NULL
;
430 CHECK_RELEASE_REFCOUNT( pSwapChain
, 0);
431 CHECK_REFCOUNT( pDevice
, --refcount
);
433 /* The implicit swapchwin is released with the device, so AddRef with refcount=0 is fine here. */
434 CHECK_ADDREF_REFCOUNT(pSwapChain
, 1);
435 CHECK_REFCOUNT(pDevice
, ++refcount
);
436 CHECK_RELEASE_REFCOUNT(pSwapChain
, 0);
437 CHECK_REFCOUNT(pDevice
, --refcount
);
442 hr
= IDirect3DDevice9_CreateIndexBuffer( pDevice
, 16, 0, D3DFMT_INDEX32
, D3DPOOL_DEFAULT
, &pIndexBuffer
, NULL
);
443 CHECK_CALL( hr
, "CreateIndexBuffer", pDevice
, ++refcount
);
446 tmp
= get_refcount( (IUnknown
*)pIndexBuffer
);
448 hr
= IDirect3DDevice9_SetIndices(pDevice
, pIndexBuffer
);
449 CHECK_CALL( hr
, "SetIndices", pIndexBuffer
, tmp
);
450 hr
= IDirect3DDevice9_SetIndices(pDevice
, NULL
);
451 CHECK_CALL( hr
, "SetIndices", pIndexBuffer
, tmp
);
454 hr
= IDirect3DDevice9_CreateVertexBuffer( pDevice
, 16, 0, D3DFVF_XYZ
, D3DPOOL_DEFAULT
, &pVertexBuffer
, NULL
);
455 CHECK_CALL( hr
, "CreateVertexBuffer", pDevice
, ++refcount
);
458 IDirect3DVertexBuffer9
*pVBuf
= (void*)~0;
462 tmp
= get_refcount( (IUnknown
*)pVertexBuffer
);
464 hr
= IDirect3DDevice9_SetStreamSource(pDevice
, 0, pVertexBuffer
, 0, 3 * sizeof(float));
465 CHECK_CALL( hr
, "SetStreamSource", pVertexBuffer
, tmp
);
466 hr
= IDirect3DDevice9_SetStreamSource(pDevice
, 0, NULL
, 0, 0);
467 CHECK_CALL( hr
, "SetStreamSource", pVertexBuffer
, tmp
);
469 hr
= IDirect3DDevice9_GetStreamSource(pDevice
, 0, &pVBuf
, &offset
, &stride
);
470 ok(SUCCEEDED(hr
), "GetStreamSource did not succeed with NULL stream!\n");
471 ok(pVBuf
==NULL
, "pVBuf not NULL (%p)!\n", pVBuf
);
472 ok(stride
==3*sizeof(float), "stride not 3 floats (got %u)!\n", stride
);
473 ok(offset
==0, "offset not 0 (got %u)!\n", offset
);
476 hr
= IDirect3DDevice9_CreateVertexDeclaration( pDevice
, decl
, &pVertexDeclaration
);
477 CHECK_CALL( hr
, "CreateVertexDeclaration", pDevice
, ++refcount
);
478 hr
= IDirect3DDevice9_CreateVertexShader( pDevice
, simple_vs
, &pVertexShader
);
479 CHECK_CALL( hr
, "CreateVertexShader", pDevice
, ++refcount
);
480 hr
= IDirect3DDevice9_CreatePixelShader( pDevice
, simple_ps
, &pPixelShader
);
481 CHECK_CALL( hr
, "CreatePixelShader", pDevice
, ++refcount
);
483 hr
= IDirect3DDevice9_CreateTexture( pDevice
, 32, 32, 3, 0, D3DFMT_X8R8G8B8
, D3DPOOL_DEFAULT
, &pTexture
, NULL
);
484 CHECK_CALL( hr
, "CreateTexture", pDevice
, ++refcount
);
487 tmp
= get_refcount( (IUnknown
*)pTexture
);
489 /* SetTexture should not increase refcounts */
490 hr
= IDirect3DDevice9_SetTexture(pDevice
, 0, (IDirect3DBaseTexture9
*) pTexture
);
491 CHECK_CALL( hr
, "SetTexture", pTexture
, tmp
);
492 hr
= IDirect3DDevice9_SetTexture(pDevice
, 0, NULL
);
493 CHECK_CALL( hr
, "SetTexture", pTexture
, tmp
);
495 /* This should not increment device refcount */
496 hr
= IDirect3DTexture9_GetSurfaceLevel( pTexture
, 1, &pTextureLevel
);
497 CHECK_CALL( hr
, "GetSurfaceLevel", pDevice
, refcount
);
498 /* But should increment texture's refcount */
499 CHECK_REFCOUNT( pTexture
, tmp
+1 );
500 /* Because the texture and surface refcount are identical */
503 CHECK_REFCOUNT ( pTextureLevel
, tmp
+1 );
504 CHECK_ADDREF_REFCOUNT ( pTextureLevel
, tmp
+2 );
505 CHECK_REFCOUNT ( pTexture
, tmp
+2 );
506 CHECK_RELEASE_REFCOUNT( pTextureLevel
, tmp
+1 );
507 CHECK_REFCOUNT ( pTexture
, tmp
+1 );
508 CHECK_RELEASE_REFCOUNT( pTexture
, tmp
);
509 CHECK_REFCOUNT ( pTextureLevel
, tmp
);
512 hr
= IDirect3DDevice9_CreateCubeTexture( pDevice
, 32, 0, 0, D3DFMT_X8R8G8B8
, D3DPOOL_DEFAULT
, &pCubeTexture
, NULL
);
513 CHECK_CALL( hr
, "CreateCubeTexture", pDevice
, ++refcount
);
514 hr
= IDirect3DDevice9_CreateVolumeTexture( pDevice
, 32, 32, 2, 0, 0, D3DFMT_X8R8G8B8
, D3DPOOL_DEFAULT
, &pVolumeTexture
, NULL
);
515 CHECK_CALL( hr
, "CreateVolumeTexture", pDevice
, ++refcount
);
518 tmp
= get_refcount( (IUnknown
*)pVolumeTexture
);
520 /* This should not increment device refcount */
521 hr
= IDirect3DVolumeTexture9_GetVolumeLevel(pVolumeTexture
, 0, &pVolumeLevel
);
522 CHECK_CALL( hr
, "GetVolumeLevel", pDevice
, refcount
);
523 /* But should increment volume texture's refcount */
524 CHECK_REFCOUNT( pVolumeTexture
, tmp
+1 );
525 /* Because the volume texture and volume refcount are identical */
528 CHECK_REFCOUNT ( pVolumeLevel
, tmp
+1 );
529 CHECK_ADDREF_REFCOUNT ( pVolumeLevel
, tmp
+2 );
530 CHECK_REFCOUNT ( pVolumeTexture
, tmp
+2 );
531 CHECK_RELEASE_REFCOUNT( pVolumeLevel
, tmp
+1 );
532 CHECK_REFCOUNT ( pVolumeTexture
, tmp
+1 );
533 CHECK_RELEASE_REFCOUNT( pVolumeTexture
, tmp
);
534 CHECK_REFCOUNT ( pVolumeLevel
, tmp
);
538 hr
= IDirect3DDevice9_CreateDepthStencilSurface( pDevice
, 32, 32, D3DFMT_D24S8
, D3DMULTISAMPLE_NONE
, 0, TRUE
, &pStencilSurface
, NULL
);
539 CHECK_CALL( hr
, "CreateDepthStencilSurface", pDevice
, ++refcount
);
540 CHECK_REFCOUNT( pStencilSurface
, 1 );
541 hr
= IDirect3DDevice9_CreateOffscreenPlainSurface( pDevice
, 32, 32, D3DFMT_X8R8G8B8
, D3DPOOL_DEFAULT
, &pOffscreenSurface
, NULL
);
542 CHECK_CALL( hr
, "CreateOffscreenPlainSurface", pDevice
, ++refcount
);
543 CHECK_REFCOUNT( pOffscreenSurface
, 1 );
544 hr
= IDirect3DDevice9_CreateRenderTarget( pDevice
, 32, 32, D3DFMT_X8R8G8B8
, D3DMULTISAMPLE_NONE
, 0, TRUE
, &pRenderTarget3
, NULL
);
545 CHECK_CALL( hr
, "CreateRenderTarget", pDevice
, ++refcount
);
546 CHECK_REFCOUNT( pRenderTarget3
, 1 );
548 hr
= IDirect3DDevice9_CreateStateBlock( pDevice
, D3DSBT_ALL
, &pStateBlock
);
549 CHECK_CALL( hr
, "CreateStateBlock", pDevice
, ++refcount
);
550 hr
= IDirect3DDevice9_CreateAdditionalSwapChain( pDevice
, &d3dpp
, &pSwapChain
);
551 CHECK_CALL( hr
, "CreateAdditionalSwapChain", pDevice
, ++refcount
);
554 /* check implicit back buffer */
555 hr
= IDirect3DSwapChain9_GetBackBuffer(pSwapChain
, 0, 0, &pBackBuffer
);
556 CHECK_CALL( hr
, "GetBackBuffer", pDevice
, ++refcount
);
557 CHECK_REFCOUNT( pSwapChain
, 1);
560 CHECK_SURFACE_CONTAINER( pBackBuffer
, IID_IDirect3DSwapChain9
, pSwapChain
);
561 CHECK_REFCOUNT( pBackBuffer
, 1);
562 CHECK_RELEASE_REFCOUNT( pBackBuffer
, 0);
563 CHECK_REFCOUNT( pDevice
, --refcount
);
565 /* The back buffer is released with the swapchain, so AddRef with refcount=0 is fine here. */
566 CHECK_ADDREF_REFCOUNT(pBackBuffer
, 1);
567 CHECK_REFCOUNT(pDevice
, ++refcount
);
568 CHECK_RELEASE_REFCOUNT(pBackBuffer
, 0);
569 CHECK_REFCOUNT(pDevice
, --refcount
);
572 CHECK_REFCOUNT( pSwapChain
, 1);
574 hr
= IDirect3DDevice9_CreateQuery( pDevice
, D3DQUERYTYPE_EVENT
, &pQuery
);
575 CHECK_CALL( hr
, "CreateQuery", pDevice
, ++refcount
);
577 hr
= IDirect3DDevice9_BeginStateBlock( pDevice
);
578 CHECK_CALL( hr
, "BeginStateBlock", pDevice
, refcount
);
579 hr
= IDirect3DDevice9_EndStateBlock( pDevice
, &pStateBlock1
);
580 CHECK_CALL( hr
, "EndStateBlock", pDevice
, ++refcount
);
582 /* The implicit render target is not freed if refcount reaches 0.
583 * Otherwise GetRenderTarget would re-allocate it and the pointer would change.*/
584 hr
= IDirect3DDevice9_GetRenderTarget(pDevice
, 0, &pRenderTarget2
);
585 CHECK_CALL( hr
, "GetRenderTarget", pDevice
, ++refcount
);
588 CHECK_RELEASE_REFCOUNT(pRenderTarget2
, 0);
589 ok(pRenderTarget
== pRenderTarget2
, "RenderTarget=%p and RenderTarget2=%p should be the same.\n",
590 pRenderTarget
, pRenderTarget2
);
591 CHECK_REFCOUNT( pDevice
, --refcount
);
592 pRenderTarget2
= NULL
;
594 pRenderTarget
= NULL
;
597 CHECK_RELEASE(pDevice
, pDevice
, --refcount
);
600 CHECK_RELEASE(pVertexBuffer
, pDevice
, --refcount
);
601 CHECK_RELEASE(pIndexBuffer
, pDevice
, --refcount
);
603 CHECK_RELEASE(pVertexDeclaration
, pDevice
, --refcount
);
604 CHECK_RELEASE(pVertexShader
, pDevice
, --refcount
);
605 CHECK_RELEASE(pPixelShader
, pDevice
, --refcount
);
607 CHECK_RELEASE(pTextureLevel
, pDevice
, --refcount
);
608 CHECK_RELEASE(pCubeTexture
, pDevice
, --refcount
);
609 CHECK_RELEASE(pVolumeTexture
, pDevice
, --refcount
);
611 CHECK_RELEASE(pStencilSurface
, pDevice
, --refcount
);
612 CHECK_RELEASE(pOffscreenSurface
, pDevice
, --refcount
);
613 CHECK_RELEASE(pRenderTarget3
, pDevice
, --refcount
);
615 CHECK_RELEASE(pStateBlock
, pDevice
, --refcount
);
616 CHECK_RELEASE(pSwapChain
, pDevice
, --refcount
);
617 CHECK_RELEASE(pQuery
, pDevice
, --refcount
);
618 /* This will destroy device - cannot check the refcount here */
619 if (pStateBlock1
) CHECK_RELEASE_REFCOUNT( pStateBlock1
, 0);
621 if (pD3d
) CHECK_RELEASE_REFCOUNT( pD3d
, 0);
623 DestroyWindow( hwnd
);
626 static void test_cursor(void)
630 IDirect3D9
*pD3d
= NULL
;
631 IDirect3DDevice9
*pDevice
= NULL
;
632 D3DPRESENT_PARAMETERS d3dpp
;
633 D3DDISPLAYMODE d3ddm
;
635 IDirect3DSurface9
*cursor
= NULL
;
638 memset(&info
, 0, sizeof(info
));
639 info
.cbSize
= sizeof(info
);
640 hr
= GetCursorInfo(&info
);
643 pD3d
= pDirect3DCreate9( D3D_SDK_VERSION
);
644 ok(pD3d
!= NULL
, "Failed to create IDirect3D9 object\n");
645 hwnd
= CreateWindow( "static", "d3d9_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
646 ok(hwnd
!= NULL
, "Failed to create window\n");
647 if (!pD3d
|| !hwnd
) goto cleanup
;
649 IDirect3D9_GetAdapterDisplayMode( pD3d
, D3DADAPTER_DEFAULT
, &d3ddm
);
650 ZeroMemory( &d3dpp
, sizeof(d3dpp
) );
651 d3dpp
.Windowed
= TRUE
;
652 d3dpp
.SwapEffect
= D3DSWAPEFFECT_DISCARD
;
653 d3dpp
.BackBufferFormat
= d3ddm
.Format
;
655 hr
= IDirect3D9_CreateDevice( pD3d
, D3DADAPTER_DEFAULT
, D3DDEVTYPE_NULLREF
, hwnd
,
656 D3DCREATE_SOFTWARE_VERTEXPROCESSING
, &d3dpp
, &pDevice
);
657 ok(SUCCEEDED(hr
), "Failed to create IDirect3D9Device (%s)\n", DXGetErrorString9(hr
));
658 if (FAILED(hr
)) goto cleanup
;
660 IDirect3DDevice9_CreateOffscreenPlainSurface(pDevice
, 32, 32, D3DFMT_A8R8G8B8
, D3DPOOL_SCRATCH
, &cursor
, 0);
661 ok(cursor
!= NULL
, "IDirect3DDevice9_CreateOffscreenPlainSurface failed with %08x\n", hr
);
663 /* Initially hidden */
664 hr
= IDirect3DDevice9_ShowCursor(pDevice
, TRUE
);
665 ok(hr
== FALSE
, "IDirect3DDevice9_ShowCursor returned %08x\n", hr
);
667 /* Not enabled without a surface*/
668 hr
= IDirect3DDevice9_ShowCursor(pDevice
, TRUE
);
669 ok(hr
== FALSE
, "IDirect3DDevice9_ShowCursor returned %08x\n", hr
);
672 hr
= IDirect3DDevice9_SetCursorProperties(pDevice
, 0, 0, NULL
);
673 ok(hr
== D3DERR_INVALIDCALL
, "IDirect3DDevice9_SetCursorProperties returned %08x\n", hr
);
675 hr
= IDirect3DDevice9_SetCursorProperties(pDevice
, 0, 0, cursor
);
676 ok(hr
== D3D_OK
, "IDirect3DDevice9_SetCursorProperties returned %08x\n", hr
);
678 IDirect3DSurface9_Release(cursor
);
680 memset(&info
, 0, sizeof(info
));
681 info
.cbSize
= sizeof(info
);
682 hr
= GetCursorInfo(&info
);
683 ok(hr
!= 0, "GetCursorInfo returned %08x\n", hr
);
684 ok(info
.flags
& CURSOR_SHOWING
, "The gdi cursor is hidden (%08x)\n", info
.flags
);
685 ok(info
.hCursor
== cur
, "The cursor handle is %p\n", info
.hCursor
); /* unchanged */
688 hr
= IDirect3DDevice9_ShowCursor(pDevice
, TRUE
);
689 ok(hr
== FALSE
, "IDirect3DDevice9_ShowCursor returned %08x\n", hr
);
692 hr
= IDirect3DDevice9_ShowCursor(pDevice
, TRUE
);
693 ok(hr
== TRUE
, "IDirect3DDevice9_ShowCursor returned %08x\n", hr
);
695 /* GDI cursor unchanged */
696 memset(&info
, 0, sizeof(info
));
697 info
.cbSize
= sizeof(info
);
698 hr
= GetCursorInfo(&info
);
699 ok(hr
!= 0, "GetCursorInfo returned %08x\n", hr
);
700 ok(info
.flags
& CURSOR_SHOWING
, "The gdi cursor is hidden (%08x)\n", info
.flags
);
701 ok(info
.hCursor
== cur
, "The cursor handle is %p\n", info
.hCursor
); /* unchanged */
704 if(pDevice
) IDirect3D9_Release(pDevice
);
705 if(pD3d
) IDirect3D9_Release(pD3d
);
706 DestroyWindow( hwnd
);
709 static void test_reset(void)
713 IDirect3D9
*pD3d
= NULL
;
714 IDirect3DDevice9
*pDevice
= NULL
;
715 D3DPRESENT_PARAMETERS d3dpp
;
716 D3DDISPLAYMODE d3ddm
;
718 DWORD width
, orig_width
= GetSystemMetrics(SM_CXSCREEN
);
719 DWORD height
, orig_height
= GetSystemMetrics(SM_CYSCREEN
);
720 IDirect3DSwapChain9
*pSwapchain
;
722 pD3d
= pDirect3DCreate9( D3D_SDK_VERSION
);
723 ok(pD3d
!= NULL
, "Failed to create IDirect3D9 object\n");
724 hwnd
= CreateWindow( "static", "d3d9_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
725 ok(hwnd
!= NULL
, "Failed to create window\n");
726 if (!pD3d
|| !hwnd
) goto cleanup
;
728 IDirect3D9_GetAdapterDisplayMode( pD3d
, D3DADAPTER_DEFAULT
, &d3ddm
);
729 ZeroMemory( &d3dpp
, sizeof(d3dpp
) );
730 d3dpp
.Windowed
= FALSE
;
731 d3dpp
.SwapEffect
= D3DSWAPEFFECT_DISCARD
;
732 d3dpp
.BackBufferWidth
= 800;
733 d3dpp
.BackBufferHeight
= 600;
734 d3dpp
.BackBufferFormat
= d3ddm
.Format
;
736 hr
= IDirect3D9_CreateDevice( pD3d
, D3DADAPTER_DEFAULT
, D3DDEVTYPE_HAL
/* no NULLREF here */, hwnd
,
737 D3DCREATE_SOFTWARE_VERTEXPROCESSING
, &d3dpp
, &pDevice
);
741 trace("could not create device, IDirect3D9_CreateDevice returned %#x\n", hr
);
745 width
= GetSystemMetrics(SM_CXSCREEN
);
746 height
= GetSystemMetrics(SM_CYSCREEN
);
747 ok(width
== 800, "Screen width is %d\n", width
);
748 ok(height
== 600, "Screen height is %d\n", height
);
750 hr
= IDirect3DDevice9_GetViewport(pDevice
, &vp
);
751 ok(hr
== D3D_OK
, "IDirect3DDevice9_GetViewport failed with %s\n", DXGetErrorString9(hr
));
754 ok(vp
.X
== 0, "D3DVIEWPORT->X = %d\n", vp
.X
);
755 ok(vp
.Y
== 0, "D3DVIEWPORT->X = %d\n", vp
.Y
);
756 ok(vp
.Width
== 800, "D3DVIEWPORT->X = %d\n", vp
.Width
);
757 ok(vp
.Height
== 600, "D3DVIEWPORT->X = %d\n", vp
.Height
);
758 ok(vp
.MinZ
== 0, "D3DVIEWPORT->X = %d\n", vp
.Height
);
759 ok(vp
.MaxZ
== 1, "D3DVIEWPORT->X = %d\n", vp
.Height
);
765 hr
= IDirect3DDevice9_SetViewport(pDevice
, &vp
);
766 ok(hr
== D3D_OK
, "IDirect3DDevice9_SetViewport failed with %s\n", DXGetErrorString9(hr
));
768 ZeroMemory( &d3dpp
, sizeof(d3dpp
) );
769 d3dpp
.SwapEffect
= D3DSWAPEFFECT_DISCARD
;
770 d3dpp
.Windowed
= FALSE
;
771 d3dpp
.BackBufferWidth
= 640;
772 d3dpp
.BackBufferHeight
= 480;
773 d3dpp
.BackBufferFormat
= d3ddm
.Format
;
774 hr
= IDirect3DDevice9_Reset(pDevice
, &d3dpp
);
775 ok(hr
== D3D_OK
, "IDirect3DDevice9_Reset failed with %s\n", DXGetErrorString9(hr
));
777 ZeroMemory(&vp
, sizeof(vp
));
778 hr
= IDirect3DDevice9_GetViewport(pDevice
, &vp
);
779 ok(hr
== D3D_OK
, "IDirect3DDevice9_GetViewport failed with %s\n", DXGetErrorString9(hr
));
782 ok(vp
.X
== 0, "D3DVIEWPORT->X = %d\n", vp
.X
);
783 ok(vp
.Y
== 0, "D3DVIEWPORT->X = %d\n", vp
.Y
);
784 ok(vp
.Width
== 640, "D3DVIEWPORT->X = %d\n", vp
.Width
);
785 ok(vp
.Height
== 480, "D3DVIEWPORT->X = %d\n", vp
.Height
);
786 ok(vp
.MinZ
== 0, "D3DVIEWPORT->X = %d\n", vp
.Height
);
787 ok(vp
.MaxZ
== 1, "D3DVIEWPORT->X = %d\n", vp
.Height
);
790 width
= GetSystemMetrics(SM_CXSCREEN
);
791 height
= GetSystemMetrics(SM_CYSCREEN
);
792 ok(width
== 640, "Screen width is %d\n", width
);
793 ok(height
== 480, "Screen height is %d\n", height
);
795 hr
= IDirect3DDevice9_GetSwapChain(pDevice
, 0, &pSwapchain
);
796 ok(hr
== D3D_OK
, "IDirect3DDevice9_GetSwapChain returned %s\n", DXGetErrorString9(hr
));
799 ZeroMemory(&d3dpp
, sizeof(d3dpp
));
800 hr
= IDirect3DSwapChain9_GetPresentParameters(pSwapchain
, &d3dpp
);
801 ok(hr
== D3D_OK
, "IDirect3DSwapChain9_GetPresentParameters returned %s\n", DXGetErrorString9(hr
));
804 ok(d3dpp
.BackBufferWidth
== 640, "Back buffer width is %d\n", d3dpp
.BackBufferWidth
);
805 ok(d3dpp
.BackBufferHeight
== 480, "Back buffer height is %d\n", d3dpp
.BackBufferHeight
);
807 IDirect3DSwapChain9_Release(pSwapchain
);
810 ZeroMemory( &d3dpp
, sizeof(d3dpp
) );
811 d3dpp
.SwapEffect
= D3DSWAPEFFECT_DISCARD
;
812 d3dpp
.Windowed
= TRUE
;
813 d3dpp
.BackBufferWidth
= 400;
814 d3dpp
.BackBufferHeight
= 300;
815 hr
= IDirect3DDevice9_Reset(pDevice
, &d3dpp
);
816 ok(hr
== D3D_OK
, "IDirect3DDevice9_Reset failed with %s\n", DXGetErrorString9(hr
));
818 width
= GetSystemMetrics(SM_CXSCREEN
);
819 height
= GetSystemMetrics(SM_CYSCREEN
);
820 ok(width
== orig_width
, "Screen width is %d\n", width
);
821 ok(height
== orig_height
, "Screen height is %d\n", height
);
823 ZeroMemory(&vp
, sizeof(vp
));
824 hr
= IDirect3DDevice9_GetViewport(pDevice
, &vp
);
825 ok(hr
== D3D_OK
, "IDirect3DDevice9_GetViewport failed with %s\n", DXGetErrorString9(hr
));
828 ok(vp
.X
== 0, "D3DVIEWPORT->X = %d\n", vp
.X
);
829 ok(vp
.Y
== 0, "D3DVIEWPORT->X = %d\n", vp
.Y
);
830 ok(vp
.Width
== 400, "D3DVIEWPORT->X = %d\n", vp
.Width
);
831 ok(vp
.Height
== 300, "D3DVIEWPORT->X = %d\n", vp
.Height
);
832 ok(vp
.MinZ
== 0, "D3DVIEWPORT->X = %d\n", vp
.Height
);
833 ok(vp
.MaxZ
== 1, "D3DVIEWPORT->X = %d\n", vp
.Height
);
836 hr
= IDirect3DDevice9_GetSwapChain(pDevice
, 0, &pSwapchain
);
837 ok(hr
== D3D_OK
, "IDirect3DDevice9_GetSwapChain returned %s\n", DXGetErrorString9(hr
));
840 ZeroMemory(&d3dpp
, sizeof(d3dpp
));
841 hr
= IDirect3DSwapChain9_GetPresentParameters(pSwapchain
, &d3dpp
);
842 ok(hr
== D3D_OK
, "IDirect3DSwapChain9_GetPresentParameters returned %s\n", DXGetErrorString9(hr
));
845 ok(d3dpp
.BackBufferWidth
== 400, "Back buffer width is %d\n", d3dpp
.BackBufferWidth
);
846 ok(d3dpp
.BackBufferHeight
== 300, "Back buffer height is %d\n", d3dpp
.BackBufferHeight
);
848 IDirect3DSwapChain9_Release(pSwapchain
);
852 if(pD3d
) IDirect3D9_Release(pD3d
);
853 if(pDevice
) IDirect3D9_Release(pDevice
);
856 /* Test adapter display modes */
857 static void test_display_modes(void)
859 D3DDISPLAYMODE dmode
;
862 pD3d
= pDirect3DCreate9( D3D_SDK_VERSION
);
863 ok(pD3d
!= NULL
, "Failed to create IDirect3D9 object\n");
866 #define TEST_FMT(x,r) do { \
867 HRESULT res = IDirect3D9_EnumAdapterModes(pD3d, 0, (x), 0, &dmode); \
868 ok(res==(r), "EnumAdapterModes("#x") did not return "#r" (got %s)!\n", DXGetErrorString9(res)); \
871 TEST_FMT(D3DFMT_X1R5G5B5
, D3DERR_INVALIDCALL
);
872 TEST_FMT(D3DFMT_R8G8B8
, D3DERR_INVALIDCALL
);
873 TEST_FMT(D3DFMT_A8R8G8B8
, D3DERR_INVALIDCALL
);
874 TEST_FMT(D3DFMT_A1R5G5B5
, D3DERR_INVALIDCALL
);
875 TEST_FMT(D3DFMT_A4R4G4B4
, D3DERR_INVALIDCALL
);
876 TEST_FMT(D3DFMT_R3G3B2
, D3DERR_INVALIDCALL
);
877 TEST_FMT(D3DFMT_A8
, D3DERR_INVALIDCALL
);
878 TEST_FMT(D3DFMT_A8R3G3B2
, D3DERR_INVALIDCALL
);
879 TEST_FMT(D3DFMT_X4R4G4B4
, D3DERR_INVALIDCALL
);
880 TEST_FMT(D3DFMT_A2B10G10R10
, D3DERR_INVALIDCALL
);
881 TEST_FMT(D3DFMT_A8B8G8R8
, D3DERR_INVALIDCALL
);
882 TEST_FMT(D3DFMT_X8B8G8R8
, D3DERR_INVALIDCALL
);
883 TEST_FMT(D3DFMT_G16R16
, D3DERR_INVALIDCALL
);
884 TEST_FMT(D3DFMT_A2R10G10B10
, D3DERR_INVALIDCALL
);
885 TEST_FMT(D3DFMT_A16B16G16R16
, D3DERR_INVALIDCALL
);
887 TEST_FMT(D3DFMT_A8P8
, D3DERR_INVALIDCALL
);
888 TEST_FMT(D3DFMT_P8
, D3DERR_INVALIDCALL
);
890 TEST_FMT(D3DFMT_L8
, D3DERR_INVALIDCALL
);
891 TEST_FMT(D3DFMT_A8L8
, D3DERR_INVALIDCALL
);
892 TEST_FMT(D3DFMT_A4L4
, D3DERR_INVALIDCALL
);
894 TEST_FMT(D3DFMT_V8U8
, D3DERR_INVALIDCALL
);
895 TEST_FMT(D3DFMT_L6V5U5
, D3DERR_INVALIDCALL
);
896 TEST_FMT(D3DFMT_X8L8V8U8
, D3DERR_INVALIDCALL
);
897 TEST_FMT(D3DFMT_Q8W8V8U8
, D3DERR_INVALIDCALL
);
898 TEST_FMT(D3DFMT_V16U16
, D3DERR_INVALIDCALL
);
899 TEST_FMT(D3DFMT_W11V11U10
, D3DERR_INVALIDCALL
);
900 TEST_FMT(D3DFMT_A2W10V10U10
, D3DERR_INVALIDCALL
);
902 TEST_FMT(D3DFMT_UYVY
, D3DERR_INVALIDCALL
);
903 TEST_FMT(D3DFMT_YUY2
, D3DERR_INVALIDCALL
);
904 TEST_FMT(D3DFMT_DXT1
, D3DERR_INVALIDCALL
);
905 TEST_FMT(D3DFMT_DXT2
, D3DERR_INVALIDCALL
);
906 TEST_FMT(D3DFMT_DXT3
, D3DERR_INVALIDCALL
);
907 TEST_FMT(D3DFMT_DXT4
, D3DERR_INVALIDCALL
);
908 TEST_FMT(D3DFMT_DXT5
, D3DERR_INVALIDCALL
);
909 TEST_FMT(D3DFMT_MULTI2_ARGB
, D3DERR_INVALIDCALL
);
910 TEST_FMT(D3DFMT_G8R8_G8B8
, D3DERR_INVALIDCALL
);
911 TEST_FMT(D3DFMT_R8G8_B8G8
, D3DERR_INVALIDCALL
);
913 TEST_FMT(D3DFMT_D16_LOCKABLE
, D3DERR_INVALIDCALL
);
914 TEST_FMT(D3DFMT_D32
, D3DERR_INVALIDCALL
);
915 TEST_FMT(D3DFMT_D15S1
, D3DERR_INVALIDCALL
);
916 TEST_FMT(D3DFMT_D24S8
, D3DERR_INVALIDCALL
);
917 TEST_FMT(D3DFMT_D24X8
, D3DERR_INVALIDCALL
);
918 TEST_FMT(D3DFMT_D24X4S4
, D3DERR_INVALIDCALL
);
919 TEST_FMT(D3DFMT_D16
, D3DERR_INVALIDCALL
);
920 TEST_FMT(D3DFMT_L16
, D3DERR_INVALIDCALL
);
921 TEST_FMT(D3DFMT_D32F_LOCKABLE
, D3DERR_INVALIDCALL
);
922 TEST_FMT(D3DFMT_D24FS8
, D3DERR_INVALIDCALL
);
924 TEST_FMT(D3DFMT_VERTEXDATA
, D3DERR_INVALIDCALL
);
925 TEST_FMT(D3DFMT_INDEX16
, D3DERR_INVALIDCALL
);
926 TEST_FMT(D3DFMT_INDEX32
, D3DERR_INVALIDCALL
);
927 TEST_FMT(D3DFMT_Q16W16V16U16
, D3DERR_INVALIDCALL
);
928 /* Flaoting point formats */
929 TEST_FMT(D3DFMT_R16F
, D3DERR_INVALIDCALL
);
930 TEST_FMT(D3DFMT_G16R16F
, D3DERR_INVALIDCALL
);
931 TEST_FMT(D3DFMT_A16B16G16R16F
, D3DERR_INVALIDCALL
);
934 TEST_FMT(D3DFMT_R32F
, D3DERR_INVALIDCALL
);
935 TEST_FMT(D3DFMT_G32R32F
, D3DERR_INVALIDCALL
);
936 TEST_FMT(D3DFMT_A32B32G32R32F
, D3DERR_INVALIDCALL
);
938 TEST_FMT(D3DFMT_CxV8U8
, D3DERR_INVALIDCALL
);
940 TEST_FMT(0, D3DERR_INVALIDCALL
);
942 IDirect3D9_Release(pD3d
);
948 HMODULE d3d9_handle
= LoadLibraryA( "d3d9.dll" );
950 pDirect3DCreate9
= (void *)GetProcAddress( d3d9_handle
, "Direct3DCreate9" );
951 if (pDirect3DCreate9
)
953 test_display_modes();
956 test_mipmap_levels();