d3d9: Add refcount tests for all objects created by device.

Vitaliy Margolen wine-patch at kievinfo.com
Thu May 18 22:56:11 CDT 2006


ChangeLog:
d3d9: Add refcount tests for all objects created by device.

This time comment crashing test and use D3DDEVTYPE_NULLREF device type.
It's enough to test refcount and it allows us to create all objects regardless
if they are supported or not (like shaders).

The actual patch to d3d9 have not changed. I can resubmit if required.

 dlls/d3d9/tests/.gitignore  |    1 
 dlls/d3d9/tests/Makefile.in |    3 -
 dlls/d3d9/tests/device.c    |  200 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 203 insertions(+), 1 deletions(-)
 create mode 100644 dlls/d3d9/tests/device.c
-------------- next part --------------
3f010f972a8846a1162c95c48c35ab6fc2ba90c7
diff --git a/dlls/d3d9/tests/.gitignore b/dlls/d3d9/tests/.gitignore
index 09b33b6..7d91ed9 100644
--- a/dlls/d3d9/tests/.gitignore
+++ b/dlls/d3d9/tests/.gitignore
@@ -1,4 +1,5 @@
 Makefile
+device.ok
 shader.ok
 stateblock.ok
 testlist.c
diff --git a/dlls/d3d9/tests/Makefile.in b/dlls/d3d9/tests/Makefile.in
index d27d091..0a9c84a 100644
--- a/dlls/d3d9/tests/Makefile.in
+++ b/dlls/d3d9/tests/Makefile.in
@@ -3,9 +3,10 @@ TOPOBJDIR = ../../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 TESTDLL   = d3d9.dll
-IMPORTS   = user32 kernel32
+IMPORTS   = user32 kernel32 dxerr9
 
 CTESTS = \
+	device.c \
 	shader.c \
 	stateblock.c \
 	vertexdeclaration.c
diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c
new file mode 100644
index 0000000..326b154
--- /dev/null
+++ b/dlls/d3d9/tests/device.c
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2006 Vitaliy Margolen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#define COBJMACROS
+#include <d3d9.h>
+#include <dxerr9.h>
+#include "wine/test.h"
+
+static IDirect3D9 *(WINAPI *pDirect3DCreate9)(UINT);
+
+static int get_refcount(IUnknown *object)
+{
+    IUnknown_AddRef( object );
+    return IUnknown_Release( object );
+}
+
+#define CHECK_CALL(r,c,d,rc) \
+    if (SUCCEEDED(r)) {\
+        int tmp1 = get_refcount( (IUnknown *)d ); \
+        ok(rc == tmp1, "Invalid refcount. Expected %d got %d\n", rc, tmp1); \
+    } else {\
+        trace("%s failed: %s\n", c, DXGetErrorString9(r)); \
+    }
+
+void test_refcount(void)
+{
+    HRESULT                      hr;
+    HWND                         hwnd               = NULL;
+    IDirect3D9                  *pD3d               = NULL;
+    IDirect3DDevice9            *pDevice            = NULL;
+    IDirect3DVertexBuffer9      *pVertexBuffer      = NULL;
+    IDirect3DIndexBuffer9       *pIndexBuffer       = NULL;
+    IDirect3DVertexDeclaration9 *pVertexDeclaration = NULL;
+    IDirect3DVertexShader9      *pVertexShader      = NULL;
+    IDirect3DPixelShader9       *pPixelShader       = NULL;
+    IDirect3DCubeTexture9       *pCubeTexture       = NULL;
+    IDirect3DTexture9           *pTexture           = NULL;
+    IDirect3DVolumeTexture9     *pVolumeTexture     = NULL;
+    IDirect3DSurface9           *pStencilSurface    = NULL;
+    IDirect3DSurface9           *pOffscreenSurface  = NULL;
+    IDirect3DSurface9           *pRenderTarget      = NULL;
+    IDirect3DSurface9           *pTextureLevel      = NULL;
+    IDirect3DStateBlock9        *pStateBlock        = NULL;
+    IDirect3DSwapChain9         *pSwapChain         = NULL;
+    IDirect3DQuery9             *pQuery             = NULL;
+    D3DPRESENT_PARAMETERS        d3dpp;
+    D3DDISPLAYMODE               d3ddm;
+    int                          refcount, tmp;
+
+    D3DVERTEXELEMENT9 decl[] = 
+    {
+	D3DDECL_END()
+    };
+    static DWORD simple_vs[] = {0xFFFE0101,             /* vs_1_1               */
+        0x0000001F, 0x80000000, 0x900F0000,             /* dcl_position0 v0     */
+        0x00000009, 0xC0010000, 0x90E40000, 0xA0E40000, /* dp4 oPos.x, v0, c0   */
+        0x00000009, 0xC0020000, 0x90E40000, 0xA0E40001, /* dp4 oPos.y, v0, c1   */
+        0x00000009, 0xC0040000, 0x90E40000, 0xA0E40002, /* dp4 oPos.z, v0, c2   */
+        0x00000009, 0xC0080000, 0x90E40000, 0xA0E40003, /* dp4 oPos.w, v0, c3   */
+        0x0000FFFF};                                    /* END                  */
+    static DWORD simple_ps[] = {0xFFFF0101,                                     /* ps_1_1                       */
+        0x00000051, 0xA00F0001, 0x3F800000, 0x00000000, 0x00000000, 0x00000000, /* def c1 = 1.0, 0.0, 0.0, 0.0  */
+        0x00000042, 0xB00F0000,                                                 /* tex t0                       */
+        0x00000008, 0x800F0000, 0xA0E40001, 0xA0E40000,                         /* dp3 r0, c1, c0               */
+        0x00000005, 0x800F0000, 0x90E40000, 0x80E40000,                         /* mul r0, v0, r0               */
+        0x00000005, 0x800F0000, 0xB0E40000, 0x80E40000,                         /* mul r0, t0, r0               */
+        0x0000FFFF};                                                            /* END                          */
+
+
+    pD3d = pDirect3DCreate9( D3D_SDK_VERSION );
+    ok(pD3d != NULL, "Failed to create IDirect3D9 object\n");
+    hwnd = CreateWindow( "static", "d3d9_test", WS_OVERLAPPEDWINDOW, 100, 100, 160, 160, NULL, NULL, NULL, NULL );
+    ok(hwnd != NULL, "Failed to create window\n");
+    if (!pD3d || !hwnd) goto cleanup;
+
+    IDirect3D9_GetAdapterDisplayMode( pD3d, D3DADAPTER_DEFAULT, &d3ddm );
+    ZeroMemory( &d3dpp, sizeof(d3dpp) );
+    d3dpp.Windowed         = TRUE;
+    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
+    d3dpp.BackBufferFormat = d3ddm.Format;
+
+    hr = IDirect3D9_CreateDevice( pD3d, D3DADAPTER_DEFAULT, 4, hwnd,
+                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice );
+    ok(SUCCEEDED(hr), "Failed to create IDirect3D9Device (%s)\n", DXGetErrorString9(hr));
+    if (FAILED(hr)) goto cleanup;
+
+
+    /* Buffers */
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateIndexBuffer( pDevice, 16, 0, D3DFMT_INDEX32, D3DPOOL_DEFAULT, &pIndexBuffer, NULL );
+    CHECK_CALL( hr, "CreateIndexBuffer", pDevice, refcount+1 );
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateVertexBuffer( pDevice, 16, 0, D3DFVF_XYZ, D3DPOOL_DEFAULT, &pVertexBuffer, NULL );
+    CHECK_CALL( hr, "CreateVertexBuffer", pDevice, refcount+1 );
+    /* Shaders */
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateVertexDeclaration( pDevice, decl, &pVertexDeclaration );
+    CHECK_CALL( hr, "CreateVertexDeclaration", pDevice, refcount+1 );
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateVertexShader( pDevice, simple_vs, &pVertexShader );
+    CHECK_CALL( hr, "CreateVertexShader", pDevice, refcount+1 );
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreatePixelShader( pDevice, simple_ps, &pPixelShader );
+    CHECK_CALL( hr, "CreatePixelShader", pDevice, refcount+1 );
+    /* Textures */
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateTexture( pDevice, 32, 32, 3, 0, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pTexture, NULL );
+    CHECK_CALL( hr, "CreateTexture", pDevice, refcount+1 );
+    if (pTexture)
+    {
+        tmp = get_refcount( (IUnknown *)pTexture );
+        /* This should not increment device refcount */
+        hr = IDirect3DTexture9_GetSurfaceLevel( pTexture, 1, &pTextureLevel );
+        CHECK_CALL( hr, "GetSurfaceLevel", pDevice, refcount+1 );
+        /* But should increment texture's refcount */
+        CHECK_CALL( hr, "GetSurfaceLevel", pTexture, tmp+1 );
+    }
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateCubeTexture( pDevice, 32, 0, 0, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pCubeTexture, NULL );
+    CHECK_CALL( hr, "CreateCubeTexture", pDevice, refcount+1 );
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateVolumeTexture( pDevice, 32, 32, 2, 0, 0, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pVolumeTexture, NULL );
+    CHECK_CALL( hr, "CreateVolumeTexture", pDevice, refcount+1 );
+    /* Surfaces */
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateDepthStencilSurface( pDevice, 32, 32, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, TRUE, &pStencilSurface, NULL );
+    todo_wine {CHECK_CALL( hr, "CreateDepthStencilSurface", pDevice, refcount+1 );}
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateOffscreenPlainSurface( pDevice, 32, 32, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pOffscreenSurface, NULL );
+    todo_wine {CHECK_CALL( hr, "CreateOffscreenPlainSurface", pDevice, refcount+1 );}
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateRenderTarget( pDevice, 32, 32, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &pRenderTarget, NULL );
+    todo_wine {CHECK_CALL( hr, "CreateRenderTarget", pDevice, refcount+1 );}
+    /* Misc */
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateStateBlock( pDevice, D3DSBT_ALL, &pStateBlock );
+    CHECK_CALL( hr, "CreateStateBlock", pDevice, refcount+1 );
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateAdditionalSwapChain( pDevice, &d3dpp, &pSwapChain );
+    CHECK_CALL( hr, "CreateAdditionalSwapChain", pDevice, refcount+1 );
+    refcount = get_refcount( (IUnknown *)pDevice );
+    hr = IDirect3DDevice9_CreateQuery( pDevice, D3DQUERYTYPE_EVENT, &pQuery );
+    CHECK_CALL( hr, "CreateQuery", pDevice, refcount+1 );
+
+cleanup:
+    if (pDevice)              IUnknown_Release( pDevice );
+
+    /* Buffers */
+    if (pVertexBuffer)        IUnknown_Release( pVertexBuffer );
+    if (pIndexBuffer)         IUnknown_Release( pIndexBuffer );
+    /* Shaders */
+    if (pVertexDeclaration)   IUnknown_Release( pVertexDeclaration );
+    if (pVertexShader)        IUnknown_Release( pVertexShader );
+    if (pPixelShader)         IUnknown_Release( pPixelShader );
+    /* Textures */
+    if (pTexture)             IUnknown_Release( pTexture );
+    if (pTextureLevel)        IUnknown_Release( pTextureLevel );
+    if (pCubeTexture)         IUnknown_Release( pCubeTexture );
+    if (pVolumeTexture)       IUnknown_Release( pVolumeTexture );
+    /* Surfaces */
+    if (pStencilSurface)      IUnknown_Release( pStencilSurface );
+    if (pOffscreenSurface)    IUnknown_Release( pOffscreenSurface );
+    if (pRenderTarget)        IUnknown_Release( pRenderTarget );
+    /* Misc */
+    if (pStateBlock)          IUnknown_Release( pStateBlock );
+    /* Avoid crash for now.
+    if (pSwapChain)           IUnknown_Release( pSwapChain );
+    */
+    if (pQuery)               IUnknown_Release( pQuery );
+
+    if (pD3d)                 IUnknown_Release( pD3d );
+
+    DestroyWindow( hwnd );
+}
+
+START_TEST(device)
+{
+    HMODULE d3d9_handle = LoadLibraryA( "d3d9.dll" );
+
+    pDirect3DCreate9 = (void *)GetProcAddress( d3d9_handle, "Direct3DCreate9" );
+    if (pDirect3DCreate9)
+    {
+        test_refcount();
+    }
+}


More information about the wine-patches mailing list