2 * Copyright (C) 2006 Vitaliy Margolen
3 * Copyright (C) 2006 Stefan Dösinger(For CodeWeavers)
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "wine/test.h"
25 static IDirect3D9
*(WINAPI
*pDirect3DCreate9
)(UINT
);
27 static int get_refcount(IUnknown
*object
)
29 IUnknown_AddRef( object
);
30 return IUnknown_Release( object
);
33 #define CHECK_CALL(r,c,d,rc) \
35 int tmp1 = get_refcount( (IUnknown *)d ); \
37 ok(tmp1 == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, tmp1); \
39 trace("%s failed: %s\n", c, DXGetErrorString9(r)); \
41 #define CHECK_RELEASE(obj,d,rc) \
43 int tmp1, rc_new = rc; \
44 IUnknown_Release( obj ); \
45 tmp1 = get_refcount( (IUnknown *)d ); \
46 ok(tmp1 == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, tmp1); \
49 static void check_mipmap_levels(
50 IDirect3DDevice9
* device
,
51 int width
, int height
, int count
)
54 IDirect3DBaseTexture9
* texture
= NULL
;
55 HRESULT hr
= IDirect3DDevice9_CreateTexture( device
, width
, height
, 0, 0,
56 D3DFMT_X8R8G8B8
, D3DPOOL_DEFAULT
, (IDirect3DTexture9
**) &texture
, NULL
);
59 DWORD levels
= IDirect3DBaseTexture9_GetLevelCount(texture
);
60 ok(levels
== count
, "Invalid level count. Expected %d got %lu\n", count
, levels
);
62 trace("CreateTexture failed: %s\n", DXGetErrorString9(hr
));
64 if (texture
) IUnknown_Release( texture
);
67 static void test_mipmap_levels(void)
73 IDirect3D9
*pD3d
= NULL
;
74 IDirect3DDevice9
*pDevice
= NULL
;
75 D3DPRESENT_PARAMETERS d3dpp
;
78 pD3d
= pDirect3DCreate9( D3D_SDK_VERSION
);
79 ok(pD3d
!= NULL
, "Failed to create IDirect3D9 object\n");
80 hwnd
= CreateWindow( "static", "d3d9_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
81 ok(hwnd
!= NULL
, "Failed to create window\n");
82 if (!pD3d
|| !hwnd
) goto cleanup
;
84 IDirect3D9_GetAdapterDisplayMode( pD3d
, D3DADAPTER_DEFAULT
, &d3ddm
);
85 ZeroMemory( &d3dpp
, sizeof(d3dpp
) );
86 d3dpp
.Windowed
= TRUE
;
87 d3dpp
.SwapEffect
= D3DSWAPEFFECT_DISCARD
;
88 d3dpp
.BackBufferFormat
= d3ddm
.Format
;
90 hr
= IDirect3D9_CreateDevice( pD3d
, D3DADAPTER_DEFAULT
, D3DDEVTYPE_NULLREF
, hwnd
,
91 D3DCREATE_SOFTWARE_VERTEXPROCESSING
, &d3dpp
, &pDevice
);
92 ok(SUCCEEDED(hr
), "Failed to create IDirect3D9Device (%s)\n", DXGetErrorString9(hr
));
93 if (FAILED(hr
)) goto cleanup
;
95 check_mipmap_levels(pDevice
, 32, 32, 6);
96 check_mipmap_levels(pDevice
, 256, 1, 9);
97 check_mipmap_levels(pDevice
, 1, 256, 9);
98 check_mipmap_levels(pDevice
, 1, 1, 1);
101 if (pD3d
) IUnknown_Release( pD3d
);
102 if (pDevice
) IUnknown_Release( pDevice
);
103 DestroyWindow( hwnd
);
106 static void test_swapchain(void)
110 IDirect3D9
*pD3d
= NULL
;
111 IDirect3DDevice9
*pDevice
= NULL
;
112 IDirect3DSwapChain9
*swapchain0
= NULL
;
113 IDirect3DSwapChain9
*swapchain1
= NULL
;
114 IDirect3DSwapChain9
*swapchain2
= NULL
;
115 IDirect3DSwapChain9
*swapchain3
= NULL
;
116 IDirect3DSwapChain9
*swapchainX
= NULL
;
117 IDirect3DSurface9
*backbuffer
= NULL
;
118 D3DPRESENT_PARAMETERS d3dpp
;
119 D3DDISPLAYMODE d3ddm
;
121 pD3d
= pDirect3DCreate9( D3D_SDK_VERSION
);
122 ok(pD3d
!= NULL
, "Failed to create IDirect3D9 object\n");
123 hwnd
= CreateWindow( "static", "d3d9_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
124 ok(hwnd
!= NULL
, "Failed to create window\n");
125 if (!pD3d
|| !hwnd
) goto cleanup
;
127 IDirect3D9_GetAdapterDisplayMode( pD3d
, D3DADAPTER_DEFAULT
, &d3ddm
);
128 ZeroMemory( &d3dpp
, sizeof(d3dpp
) );
129 d3dpp
.Windowed
= TRUE
;
130 d3dpp
.SwapEffect
= D3DSWAPEFFECT_DISCARD
;
131 d3dpp
.BackBufferFormat
= d3ddm
.Format
;
132 d3dpp
.BackBufferCount
= 0;
134 hr
= IDirect3D9_CreateDevice( pD3d
, D3DADAPTER_DEFAULT
, D3DDEVTYPE_NULLREF
, hwnd
,
135 D3DCREATE_SOFTWARE_VERTEXPROCESSING
, &d3dpp
, &pDevice
);
136 ok(SUCCEEDED(hr
), "Failed to create IDirect3D9Device (%s)\n", DXGetErrorString9(hr
));
137 if (FAILED(hr
)) goto cleanup
;
139 /* Check if the back buffer count was modified */
140 ok(d3dpp
.BackBufferCount
== 1, "The back buffer count in the presentparams struct is %d\n", d3dpp
.BackBufferCount
);
142 /* Get the implicit swapchain */
143 hr
= IDirect3DDevice9_GetSwapChain(pDevice
, 0, &swapchain0
);
144 ok(SUCCEEDED(hr
), "Failed to get the impicit swapchain (%s)\n", DXGetErrorString9(hr
));
145 if(swapchain0
) IDirect3DSwapChain9_Release(swapchain0
);
147 /* Check if there is a back buffer */
148 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain0
, 0, D3DBACKBUFFER_TYPE_MONO
, &backbuffer
);
149 ok(SUCCEEDED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
150 ok(backbuffer
!= NULL
, "The back buffer is NULL\n");
151 if(backbuffer
) IDirect3DSurface9_Release(backbuffer
);
153 /* Try to get a nonexistant swapchain */
154 hr
= IDirect3DDevice9_GetSwapChain(pDevice
, 1, &swapchainX
);
155 ok(hr
== D3DERR_INVALIDCALL
, "GetSwapChain on an non-existant swapchain returned (%s)\n", DXGetErrorString9(hr
));
156 ok(swapchainX
== NULL
, "Swapchain 1 is %p\n", swapchainX
);
157 if(swapchainX
) IDirect3DSwapChain9_Release(swapchainX
);
159 /* Create a bunch of swapchains */
160 d3dpp
.BackBufferCount
= 0;
161 hr
= IDirect3DDevice9_CreateAdditionalSwapChain(pDevice
, &d3dpp
, &swapchain1
);
162 ok(SUCCEEDED(hr
), "Failed to create a swapchain (%s)\n", DXGetErrorString9(hr
));
163 ok(d3dpp
.BackBufferCount
== 1, "The back buffer count in the presentparams struct is %d\n", d3dpp
.BackBufferCount
);
165 d3dpp
.BackBufferCount
= 1;
166 hr
= IDirect3DDevice9_CreateAdditionalSwapChain(pDevice
, &d3dpp
, &swapchain2
);
167 ok(SUCCEEDED(hr
), "Failed to create a swapchain (%s)\n", DXGetErrorString9(hr
));
169 d3dpp
.BackBufferCount
= 2;
170 hr
= IDirect3DDevice9_CreateAdditionalSwapChain(pDevice
, &d3dpp
, &swapchain3
);
171 ok(SUCCEEDED(hr
), "Failed to create a swapchain (%s)\n", DXGetErrorString9(hr
));
173 /* Swapchain 3, created with backbuffercount 2 */
174 backbuffer
= (void *) 0xdeadbeef;
175 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain3
, 0, 0, &backbuffer
);
176 ok(SUCCEEDED(hr
), "Failed to get the 1st back buffer (%s)\n", DXGetErrorString9(hr
));
177 ok(backbuffer
!= NULL
&& backbuffer
!= (void *) 0xdeadbeef, "The back buffer is %p\n", backbuffer
);
178 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
180 backbuffer
= (void *) 0xdeadbeef;
181 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain3
, 1, 0, &backbuffer
);
182 ok(SUCCEEDED(hr
), "Failed to get the 2nd back buffer (%s)\n", DXGetErrorString9(hr
));
183 ok(backbuffer
!= NULL
&& backbuffer
!= (void *) 0xdeadbeef, "The back buffer is %p\n", backbuffer
);
184 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
186 backbuffer
= (void *) 0xdeadbeef;
187 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain3
, 2, 0, &backbuffer
);
188 ok(hr
== D3DERR_INVALIDCALL
, "GetBackBuffer returned %s\n", DXGetErrorString9(hr
));
189 ok(backbuffer
== (void *) 0xdeadbeef, "The back buffer pointer was modified (%p)\n", backbuffer
);
190 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
192 backbuffer
= (void *) 0xdeadbeef;
193 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain3
, 3, 0, &backbuffer
);
194 ok(FAILED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
195 ok(backbuffer
== (void *) 0xdeadbeef, "The back buffer pointer was modified (%p)\n", backbuffer
);
196 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
199 /* Check the back buffers of the swapchains */
200 /* Swapchain 1, created with backbuffercount 0 */
201 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain1
, 0, D3DBACKBUFFER_TYPE_MONO
, &backbuffer
);
202 ok(SUCCEEDED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
203 ok(backbuffer
!= NULL
, "The back buffer is NULL (%s)\n", DXGetErrorString9(hr
));
204 if(backbuffer
) IDirect3DSurface9_Release(backbuffer
);
206 backbuffer
= (void *) 0xdeadbeef;
207 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain1
, 1, 0, &backbuffer
);
208 ok(FAILED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
209 ok(backbuffer
== (void *) 0xdeadbeef, "The back buffer pointer was modified (%p)\n", backbuffer
);
210 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
212 /* Swapchain 2 - created with backbuffercount 1 */
213 backbuffer
= (void *) 0xdeadbeef;
214 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain2
, 0, 0, &backbuffer
);
215 ok(SUCCEEDED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
216 ok(backbuffer
!= NULL
&& backbuffer
!= (void *) 0xdeadbeef, "The back buffer is %p\n", backbuffer
);
217 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
219 backbuffer
= (void *) 0xdeadbeef;
220 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain2
, 1, 0, &backbuffer
);
221 ok(hr
== D3DERR_INVALIDCALL
, "GetBackBuffer returned %s\n", DXGetErrorString9(hr
));
222 ok(backbuffer
== (void *) 0xdeadbeef, "The back buffer pointer was modified (%p)\n", backbuffer
);
223 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
225 backbuffer
= (void *) 0xdeadbeef;
226 hr
= IDirect3DSwapChain9_GetBackBuffer(swapchain2
, 2, 0, &backbuffer
);
227 ok(FAILED(hr
), "Failed to get the back buffer (%s)\n", DXGetErrorString9(hr
));
228 ok(backbuffer
== (void *) 0xdeadbeef, "The back buffer pointer was modified (%p)\n", backbuffer
);
229 if(backbuffer
&& backbuffer
!= (void *) 0xdeadbeef) IDirect3DSurface9_Release(backbuffer
);
231 /* Try getSwapChain on a manually created swapchain
232 * it should fail, apparently GetSwapChain only returns implicit swapchains
234 swapchainX
= (void *) 0xdeadbeef;
235 hr
= IDirect3DDevice9_GetSwapChain(pDevice
, 1, &swapchainX
);
236 ok(hr
== D3DERR_INVALIDCALL
, "Failed to get the secound swapchain (%s)\n", DXGetErrorString9(hr
));
237 ok(swapchainX
== NULL
, "The swapchain pointer is %p\n", swapchainX
);
238 if(swapchainX
&& swapchainX
!= (void *) 0xdeadbeef ) IDirect3DSwapChain9_Release(swapchainX
);
241 if(swapchain1
) IDirect3DSwapChain9_Release(swapchain1
);
242 if(swapchain2
) IDirect3DSwapChain9_Release(swapchain2
);
243 if(swapchain3
) IDirect3DSwapChain9_Release(swapchain3
);
244 if(pDevice
) IDirect3DDevice9_Release(pDevice
);
245 if(pD3d
) IDirect3DDevice9_Release(pD3d
);
246 DestroyWindow( hwnd
);
249 static void test_refcount(void)
253 IDirect3D9
*pD3d
= NULL
;
254 IDirect3DDevice9
*pDevice
= NULL
;
255 IDirect3DVertexBuffer9
*pVertexBuffer
= NULL
;
256 IDirect3DIndexBuffer9
*pIndexBuffer
= NULL
;
257 IDirect3DVertexDeclaration9
*pVertexDeclaration
= NULL
;
258 IDirect3DVertexShader9
*pVertexShader
= NULL
;
259 IDirect3DPixelShader9
*pPixelShader
= NULL
;
260 IDirect3DCubeTexture9
*pCubeTexture
= NULL
;
261 IDirect3DTexture9
*pTexture
= NULL
;
262 IDirect3DVolumeTexture9
*pVolumeTexture
= NULL
;
263 IDirect3DSurface9
*pStencilSurface
= NULL
;
264 IDirect3DSurface9
*pOffscreenSurface
= NULL
;
265 IDirect3DSurface9
*pRenderTarget
= NULL
;
266 IDirect3DSurface9
*pTextureLevel
= NULL
;
267 IDirect3DStateBlock9
*pStateBlock
= NULL
;
268 IDirect3DStateBlock9
*pStateBlock1
= NULL
;
269 IDirect3DSwapChain9
*pSwapChain
= NULL
;
270 IDirect3DQuery9
*pQuery
= NULL
;
271 D3DPRESENT_PARAMETERS d3dpp
;
272 D3DDISPLAYMODE d3ddm
;
273 int refcount
= 0, tmp
;
275 D3DVERTEXELEMENT9 decl
[] =
279 static DWORD simple_vs
[] = {0xFFFE0101, /* vs_1_1 */
280 0x0000001F, 0x80000000, 0x900F0000, /* dcl_position0 v0 */
281 0x00000009, 0xC0010000, 0x90E40000, 0xA0E40000, /* dp4 oPos.x, v0, c0 */
282 0x00000009, 0xC0020000, 0x90E40000, 0xA0E40001, /* dp4 oPos.y, v0, c1 */
283 0x00000009, 0xC0040000, 0x90E40000, 0xA0E40002, /* dp4 oPos.z, v0, c2 */
284 0x00000009, 0xC0080000, 0x90E40000, 0xA0E40003, /* dp4 oPos.w, v0, c3 */
285 0x0000FFFF}; /* END */
286 static DWORD simple_ps
[] = {0xFFFF0101, /* ps_1_1 */
287 0x00000051, 0xA00F0001, 0x3F800000, 0x00000000, 0x00000000, 0x00000000, /* def c1 = 1.0, 0.0, 0.0, 0.0 */
288 0x00000042, 0xB00F0000, /* tex t0 */
289 0x00000008, 0x800F0000, 0xA0E40001, 0xA0E40000, /* dp3 r0, c1, c0 */
290 0x00000005, 0x800F0000, 0x90E40000, 0x80E40000, /* mul r0, v0, r0 */
291 0x00000005, 0x800F0000, 0xB0E40000, 0x80E40000, /* mul r0, t0, r0 */
292 0x0000FFFF}; /* END */
295 pD3d
= pDirect3DCreate9( D3D_SDK_VERSION
);
296 ok(pD3d
!= NULL
, "Failed to create IDirect3D9 object\n");
297 hwnd
= CreateWindow( "static", "d3d9_test", WS_OVERLAPPEDWINDOW
, 100, 100, 160, 160, NULL
, NULL
, NULL
, NULL
);
298 ok(hwnd
!= NULL
, "Failed to create window\n");
299 if (!pD3d
|| !hwnd
) goto cleanup
;
301 IDirect3D9_GetAdapterDisplayMode( pD3d
, D3DADAPTER_DEFAULT
, &d3ddm
);
302 ZeroMemory( &d3dpp
, sizeof(d3dpp
) );
303 d3dpp
.Windowed
= TRUE
;
304 d3dpp
.SwapEffect
= D3DSWAPEFFECT_DISCARD
;
305 d3dpp
.BackBufferFormat
= d3ddm
.Format
;
307 hr
= IDirect3D9_CreateDevice( pD3d
, D3DADAPTER_DEFAULT
, D3DDEVTYPE_NULLREF
, hwnd
,
308 D3DCREATE_SOFTWARE_VERTEXPROCESSING
, &d3dpp
, &pDevice
);
309 ok(SUCCEEDED(hr
), "Failed to create IDirect3D9Device (%s)\n", DXGetErrorString9(hr
));
310 if (FAILED(hr
)) goto cleanup
;
312 refcount
= get_refcount( (IUnknown
*)pDevice
);
313 ok(refcount
== 1, "Invalid device RefCount %d\n", refcount
);
316 hr
= IDirect3DDevice9_CreateIndexBuffer( pDevice
, 16, 0, D3DFMT_INDEX32
, D3DPOOL_DEFAULT
, &pIndexBuffer
, NULL
);
317 CHECK_CALL( hr
, "CreateIndexBuffer", pDevice
, ++refcount
);
318 hr
= IDirect3DDevice9_CreateVertexBuffer( pDevice
, 16, 0, D3DFVF_XYZ
, D3DPOOL_DEFAULT
, &pVertexBuffer
, NULL
);
319 CHECK_CALL( hr
, "CreateVertexBuffer", pDevice
, ++refcount
);
321 hr
= IDirect3DDevice9_CreateVertexDeclaration( pDevice
, decl
, &pVertexDeclaration
);
322 CHECK_CALL( hr
, "CreateVertexDeclaration", pDevice
, ++refcount
);
323 hr
= IDirect3DDevice9_CreateVertexShader( pDevice
, simple_vs
, &pVertexShader
);
324 CHECK_CALL( hr
, "CreateVertexShader", pDevice
, ++refcount
);
325 hr
= IDirect3DDevice9_CreatePixelShader( pDevice
, simple_ps
, &pPixelShader
);
326 CHECK_CALL( hr
, "CreatePixelShader", pDevice
, ++refcount
);
328 hr
= IDirect3DDevice9_CreateTexture( pDevice
, 32, 32, 3, 0, D3DFMT_X8R8G8B8
, D3DPOOL_DEFAULT
, &pTexture
, NULL
);
329 CHECK_CALL( hr
, "CreateTexture", pDevice
, ++refcount
);
332 tmp
= get_refcount( (IUnknown
*)pTexture
);
333 /* This should not increment device refcount */
334 hr
= IDirect3DTexture9_GetSurfaceLevel( pTexture
, 1, &pTextureLevel
);
335 CHECK_CALL( hr
, "GetSurfaceLevel", pDevice
, refcount
);
336 /* But should increment texture's refcount */
337 CHECK_CALL( hr
, "GetSurfaceLevel", pTexture
, tmp
+1 );
339 hr
= IDirect3DDevice9_CreateCubeTexture( pDevice
, 32, 0, 0, D3DFMT_X8R8G8B8
, D3DPOOL_DEFAULT
, &pCubeTexture
, NULL
);
340 CHECK_CALL( hr
, "CreateCubeTexture", pDevice
, ++refcount
);
341 hr
= IDirect3DDevice9_CreateVolumeTexture( pDevice
, 32, 32, 2, 0, 0, D3DFMT_X8R8G8B8
, D3DPOOL_DEFAULT
, &pVolumeTexture
, NULL
);
342 CHECK_CALL( hr
, "CreateVolumeTexture", pDevice
, ++refcount
);
344 hr
= IDirect3DDevice9_CreateDepthStencilSurface( pDevice
, 32, 32, D3DFMT_D24S8
, D3DMULTISAMPLE_NONE
, 0, TRUE
, &pStencilSurface
, NULL
);
345 CHECK_CALL( hr
, "CreateDepthStencilSurface", pDevice
, ++refcount
);
346 hr
= IDirect3DDevice9_CreateOffscreenPlainSurface( pDevice
, 32, 32, D3DFMT_X8R8G8B8
, D3DPOOL_DEFAULT
, &pOffscreenSurface
, NULL
);
347 CHECK_CALL( hr
, "CreateOffscreenPlainSurface", pDevice
, ++refcount
);
348 hr
= IDirect3DDevice9_CreateRenderTarget( pDevice
, 32, 32, D3DFMT_X8R8G8B8
, D3DMULTISAMPLE_NONE
, 0, TRUE
, &pRenderTarget
, NULL
);
349 CHECK_CALL( hr
, "CreateRenderTarget", pDevice
, ++refcount
);
351 hr
= IDirect3DDevice9_CreateStateBlock( pDevice
, D3DSBT_ALL
, &pStateBlock
);
352 CHECK_CALL( hr
, "CreateStateBlock", pDevice
, ++refcount
);
353 hr
= IDirect3DDevice9_CreateAdditionalSwapChain( pDevice
, &d3dpp
, &pSwapChain
);
354 CHECK_CALL( hr
, "CreateAdditionalSwapChain", pDevice
, ++refcount
);
355 hr
= IDirect3DDevice9_CreateQuery( pDevice
, D3DQUERYTYPE_EVENT
, &pQuery
);
356 CHECK_CALL( hr
, "CreateQuery", pDevice
, ++refcount
);
358 hr
= IDirect3DDevice9_BeginStateBlock( pDevice
);
359 CHECK_CALL( hr
, "BeginStateBlock", pDevice
, refcount
);
360 hr
= IDirect3DDevice9_EndStateBlock( pDevice
, &pStateBlock1
);
361 CHECK_CALL( hr
, "EndStateBlock", pDevice
, ++refcount
);
364 CHECK_RELEASE(pDevice
, pDevice
, --refcount
);
367 CHECK_RELEASE(pVertexBuffer
, pDevice
, --refcount
);
368 CHECK_RELEASE(pIndexBuffer
, pDevice
, --refcount
);
370 CHECK_RELEASE(pVertexDeclaration
, pDevice
, --refcount
);
371 CHECK_RELEASE(pVertexShader
, pDevice
, --refcount
);
372 CHECK_RELEASE(pPixelShader
, pDevice
, --refcount
);
374 /* pTextureLevel is holding a reference to the pTexture */
375 CHECK_RELEASE(pTexture
, pDevice
, refcount
);
376 CHECK_RELEASE(pTextureLevel
, pDevice
, --refcount
);
377 CHECK_RELEASE(pCubeTexture
, pDevice
, --refcount
);
378 CHECK_RELEASE(pVolumeTexture
, pDevice
, --refcount
);
380 CHECK_RELEASE(pStencilSurface
, pDevice
, --refcount
);
381 CHECK_RELEASE(pOffscreenSurface
, pDevice
, --refcount
);
382 CHECK_RELEASE(pRenderTarget
, pDevice
, --refcount
);
384 CHECK_RELEASE(pStateBlock
, pDevice
, --refcount
);
385 CHECK_RELEASE(pSwapChain
, pDevice
, --refcount
);
386 CHECK_RELEASE(pQuery
, pDevice
, --refcount
);
387 /* This will destroy device - can not check the refcount here */
388 if (pStateBlock1
) IUnknown_Release( pStateBlock1
);
390 if (pD3d
) IUnknown_Release( pD3d
);
392 DestroyWindow( hwnd
);
397 HMODULE d3d9_handle
= LoadLibraryA( "d3d9.dll" );
399 pDirect3DCreate9
= (void *)GetProcAddress( d3d9_handle
, "Direct3DCreate9" );
400 if (pDirect3DCreate9
)
404 test_mipmap_levels();