Markus Amsler : d3d8: Backport missing device tests.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 9 06:09:01 CST 2006


Module: wine
Branch: master
Commit: 75d6d6203bb7eb2e536bf11b1773d8b1eb819cde
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=75d6d6203bb7eb2e536bf11b1773d8b1eb819cde

Author: Markus Amsler <markus.amsler at oribi.org>
Date:   Thu Nov  9 02:38:29 2006 +0100

d3d8: Backport missing device tests.

---

 dlls/d3d8/tests/device.c |  169 +++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 168 insertions(+), 1 deletions(-)

diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c
index e735502..4fe835b 100644
--- a/dlls/d3d8/tests/device.c
+++ b/dlls/d3d8/tests/device.c
@@ -45,6 +45,63 @@ #define CHECK_RELEASE(obj,d,rc) \
         ok(tmp1 == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, tmp1); \
     }
 
+static void check_mipmap_levels(
+    IDirect3DDevice8* device, 
+    int width, int height, int count) 
+{
+
+    IDirect3DBaseTexture8* texture = NULL;
+    HRESULT hr = IDirect3DDevice8_CreateTexture( device, width, height, 0, 0, 
+        D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, (IDirect3DTexture8**) &texture );
+       
+    if (SUCCEEDED(hr)) {
+        DWORD levels = IDirect3DBaseTexture8_GetLevelCount(texture);
+        ok(levels == count, "Invalid level count. Expected %d got %u\n", count, levels);
+    } else 
+        trace("CreateTexture failed: %s\n", DXGetErrorString8(hr));
+
+    if (texture) IUnknown_Release( texture );
+}
+
+static void test_mipmap_levels(void)
+{
+
+    HRESULT               hr;
+    HWND                  hwnd = NULL;
+
+    IDirect3D8            *pD3d = NULL;
+    IDirect3DDevice8      *pDevice = NULL;
+    D3DPRESENT_PARAMETERS d3dpp;
+    D3DDISPLAYMODE        d3ddm;
+ 
+    pD3d = pDirect3DCreate8( D3D_SDK_VERSION );
+    ok(pD3d != NULL, "Failed to create IDirect3D8 object\n");
+    hwnd = CreateWindow( "static", "d3d8_test", WS_OVERLAPPEDWINDOW, 100, 100, 160, 160, NULL, NULL, NULL, NULL );
+    ok(hwnd != NULL, "Failed to create window\n");
+    if (!pD3d || !hwnd) goto cleanup;
+
+    IDirect3D8_GetAdapterDisplayMode( pD3d, D3DADAPTER_DEFAULT, &d3ddm );
+    ZeroMemory( &d3dpp, sizeof(d3dpp) );
+    d3dpp.Windowed         = TRUE;
+    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
+    d3dpp.BackBufferFormat = d3ddm.Format;
+
+    hr = IDirect3D8_CreateDevice( pD3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
+                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice );
+    ok(SUCCEEDED(hr), "Failed to create IDirect3D8Device (%s)\n", DXGetErrorString8(hr));
+    if (FAILED(hr)) goto cleanup;
+
+    check_mipmap_levels(pDevice, 32, 32, 6);
+    check_mipmap_levels(pDevice, 256, 1, 9);
+    check_mipmap_levels(pDevice, 1, 256, 9);
+    check_mipmap_levels(pDevice, 1, 1, 1);
+
+    cleanup:
+    if (pD3d)     IUnknown_Release( pD3d );
+    if (pDevice)  IUnknown_Release( pDevice );
+    DestroyWindow( hwnd );
+}
+
 static void test_swapchain(void)
 {
     HRESULT                      hr;
@@ -229,8 +286,27 @@ static void test_refcount(void)
     /* Buffers */
     hr = IDirect3DDevice8_CreateIndexBuffer( pDevice, 16, 0, D3DFMT_INDEX32, D3DPOOL_DEFAULT, &pIndexBuffer );
     CHECK_CALL( hr, "CreateIndexBuffer", pDevice, ++refcount );
+    if(pIndexBuffer)
+    {
+        tmp = get_refcount( (IUnknown *)pIndexBuffer );
+
+        hr = IDirect3DDevice8_SetIndices(pDevice, pIndexBuffer, 0);
+        CHECK_CALL( hr, "SetIndices", pIndexBuffer, tmp);
+        hr = IDirect3DDevice8_SetIndices(pDevice, NULL, 0);
+        CHECK_CALL( hr, "SetIndices", pIndexBuffer, tmp);
+    }
+
     hr = IDirect3DDevice8_CreateVertexBuffer( pDevice, 16, 0, D3DFVF_XYZ, D3DPOOL_DEFAULT, &pVertexBuffer );
     CHECK_CALL( hr, "CreateVertexBuffer", pDevice, ++refcount );
+    if(pVertexBuffer)
+    {
+        tmp = get_refcount( (IUnknown *)pVertexBuffer );
+
+        hr = IDirect3DDevice8_SetStreamSource(pDevice, 0, pVertexBuffer, 3 * sizeof(float));
+        CHECK_CALL( hr, "SetStreamSource", pVertexBuffer, tmp);
+        hr = IDirect3DDevice8_SetStreamSource(pDevice, 0, NULL, 0);
+        CHECK_CALL( hr, "SetStreamSource", pVertexBuffer, tmp);
+    }
     /* Shaders */
     hr = IDirect3DDevice8_CreateVertexShader( pDevice, decl, simple_vs, &dVertexShader, 0 );
     CHECK_CALL( hr, "CreateVertexShader", pDevice, refcount );
@@ -242,6 +318,13 @@ static void test_refcount(void)
     if (pTexture)
     {
         tmp = get_refcount( (IUnknown *)pTexture );
+
+        /* SetTexture should not increase refcounts */
+        hr = IDirect3DDevice8_SetTexture(pDevice, 0, (IDirect3DBaseTexture8 *) pTexture);
+        CHECK_CALL( hr, "SetTexture", pTexture, tmp);
+        hr = IDirect3DDevice8_SetTexture(pDevice, 0, NULL);
+        CHECK_CALL( hr, "SetTexture", pTexture, tmp);
+
         /* This should not increment device refcount */
         hr = IDirect3DTexture8_GetSurfaceLevel( pTexture, 1, &pTextureLevel );
         CHECK_CALL( hr, "GetSurfaceLevel", pDevice, refcount );
@@ -308,6 +391,88 @@ cleanup:
     DestroyWindow( hwnd );
 }
 
+static void test_cursor(void)
+{
+    HRESULT                      hr;
+    HWND                         hwnd               = NULL;
+    IDirect3D8                  *pD3d               = NULL;
+    IDirect3DDevice8            *pDevice            = NULL;
+    D3DPRESENT_PARAMETERS        d3dpp;
+    D3DDISPLAYMODE               d3ddm;
+    CURSORINFO                   info;
+    IDirect3DSurface8 *cursor = NULL;
+    HCURSOR cur;
+
+    memset(&info, 0, sizeof(info));
+    info.cbSize = sizeof(info);
+    hr = GetCursorInfo(&info);
+    cur = info.hCursor;
+
+    pD3d = pDirect3DCreate8( D3D_SDK_VERSION );
+    ok(pD3d != NULL, "Failed to create IDirect3D8 object\n");
+    hwnd = CreateWindow( "static", "d3d8_test", WS_OVERLAPPEDWINDOW, 100, 100, 160, 160, NULL, NULL, NULL, NULL );
+    ok(hwnd != NULL, "Failed to create window\n");
+    if (!pD3d || !hwnd) goto cleanup;
+
+    IDirect3D8_GetAdapterDisplayMode( pD3d, D3DADAPTER_DEFAULT, &d3ddm );
+    ZeroMemory( &d3dpp, sizeof(d3dpp) );
+    d3dpp.Windowed         = TRUE;
+    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
+    d3dpp.BackBufferFormat = d3ddm.Format;
+
+    hr = IDirect3D8_CreateDevice( pD3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
+                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice );
+    ok(SUCCEEDED(hr), "Failed to create IDirect3D8Device (%s)\n", DXGetErrorString8(hr));
+    if (FAILED(hr)) goto cleanup;
+
+    IDirect3DDevice8_CreateImageSurface(pDevice, 32, 32, D3DFMT_A8R8G8B8, &cursor);
+    ok(cursor != NULL, "IDirect3DDevice8_CreateOffscreenPlainSurface failed with %08x\n", hr);
+
+    /* Initially hidden */
+    hr = IDirect3DDevice8_ShowCursor(pDevice, TRUE);
+    ok(hr == FALSE, "IDirect3DDevice8_ShowCursor returned %08x\n", hr);
+
+    /* Not enabled without a surface*/
+    hr = IDirect3DDevice8_ShowCursor(pDevice, TRUE);
+    ok(hr == FALSE, "IDirect3DDevice8_ShowCursor returned %08x\n", hr);
+
+    /* Fails */
+    hr = IDirect3DDevice8_SetCursorProperties(pDevice, 0, 0, NULL);
+    ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice8_SetCursorProperties returned %08x\n", hr);
+
+    hr = IDirect3DDevice8_SetCursorProperties(pDevice, 0, 0, cursor);
+    ok(hr == D3D_OK, "IDirect3DDevice8_SetCursorProperties returned %08x\n", hr);
+
+    IDirect3DSurface8_Release(cursor);
+
+    memset(&info, 0, sizeof(info));
+    info.cbSize = sizeof(info);
+    hr = GetCursorInfo(&info);
+    ok(hr != 0, "GetCursorInfo returned %08x\n", hr);
+    ok(info.flags & CURSOR_SHOWING, "The gdi cursor is hidden (%08x)\n", info.flags);
+    ok(info.hCursor == cur, "The cursor handle is %p\n", info.hCursor); /* unchanged */
+
+    /* Still hidden */
+    hr = IDirect3DDevice8_ShowCursor(pDevice, TRUE);
+    ok(hr == FALSE, "IDirect3DDevice8_ShowCursor returned %08x\n", hr);
+
+    /* Enabled now*/
+    hr = IDirect3DDevice8_ShowCursor(pDevice, TRUE);
+    ok(hr == TRUE, "IDirect3DDevice8_ShowCursor returned %08x\n", hr);
+
+    /* GDI cursor unchanged */
+    memset(&info, 0, sizeof(info));
+    info.cbSize = sizeof(info);
+    hr = GetCursorInfo(&info);
+    ok(hr != 0, "GetCursorInfo returned %08x\n", hr);
+    ok(info.flags & CURSOR_SHOWING, "The gdi cursor is hidden (%08x)\n", info.flags);
+    ok(info.hCursor == cur, "The cursor handle is %p\n", info.hCursor); /* unchanged */
+
+cleanup:
+    if(pD3d) IDirect3D8_Release(pD3d);
+    if(pDevice) IDirect3D8_Release(pDevice);
+}
+
 START_TEST(device)
 {
     HMODULE d3d8_handle = LoadLibraryA( "d3d8.dll" );
@@ -315,7 +480,9 @@ START_TEST(device)
     pDirect3DCreate8 = (void *)GetProcAddress( d3d8_handle, "Direct3DCreate8" );
     if (pDirect3DCreate8)
     {
-        test_refcount();
         test_swapchain();
+        test_refcount();
+        test_mipmap_levels();
+        test_cursor();
     }
 }




More information about the wine-cvs mailing list