[09/11] ddraw/tests: Add infrastructure for D3D3 visual tests.

Octavian Voicu octavian.voicu at gmail.com
Mon Nov 7 16:27:12 CST 2011


---
 dlls/ddraw/tests/visual.c |  155 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 154 insertions(+), 1 deletions(-)

diff --git a/dlls/ddraw/tests/visual.c b/dlls/ddraw/tests/visual.c
index 32d7de3..8c919b2 100644
--- a/dlls/ddraw/tests/visual.c
+++ b/dlls/ddraw/tests/visual.c
@@ -34,7 +34,7 @@ static IDirectDraw *DirectDraw1;
 static IDirectDraw4 *DirectDraw4;
 static IDirectDrawClipper *Clipper;
 static IDirectDrawSurface *Primary1, *Surface1;
-static IDirectDrawSurface4 *Primary4;
+static IDirectDrawSurface4 *Primary4, *Surface4;
 static IDirect3D *Direct3D1;
 static IDirect3D2 *Direct3D2;
 static IDirect3D3 *Direct3D3;
@@ -2517,6 +2517,151 @@ static void D3D2_DrawPrimitiveTests(void)
     IDirect3DMaterial2_Release(Direct3DMaterial2);
 }
 
+static BOOL D3D3_createObjects(void)
+{
+    WNDCLASS wc;
+    HRESULT hr;
+    DDSURFACEDESC2 ddsd;
+    D3DVIEWPORT2 vp_data;
+
+    hr = DirectDrawCreate(NULL, &DirectDraw1, NULL);
+    ok(hr == DD_OK || hr == DDERR_NODIRECTDRAWSUPPORT, "DirectDrawCreate returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirectDraw_QueryInterface(DirectDraw1, &IID_IDirectDraw4, (void **)&DirectDraw4);
+    if (hr == E_NOINTERFACE) {
+        win_skip("IID_IDirectDraw4 not available, skipping tests.\n");
+        return FALSE;
+    }
+    ok(hr == DD_OK, "QueryInterface returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    memset(&wc, 0, sizeof(wc));
+    wc.lpfnWndProc = DefWindowProc;
+    wc.lpszClassName = "d3d3_test_wc";
+    RegisterClass(&wc);
+    window = CreateWindow("d3d3_test_wc", "d3d3_test", WS_VISIBLE, 0, 0, 640, 480, 0, 0, 0, 0);
+
+    hr = IDirectDraw4_SetCooperativeLevel(DirectDraw4, window, DDSCL_NORMAL);
+    ok(hr == DD_OK, "SetCooperativeLevel returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    memset(&ddsd, 0, sizeof(ddsd));
+    ddsd.dwSize = sizeof(ddsd);
+    ddsd.dwFlags = DDSD_CAPS;
+    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
+    hr = IDirectDraw4_CreateSurface(DirectDraw4, &ddsd, &Primary4, NULL);
+    ok(hr == DD_OK, "CreateSurface returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirectDraw4_CreateClipper(DirectDraw4, 0, &Clipper, NULL);
+    ok(hr == DD_OK, "CreateClipper returned: %x\n", hr);
+    if(FAILED(hr))
+        return FALSE;
+
+    hr = IDirectDrawClipper_SetHWnd(Clipper, 0, window);
+    ok(hr == DD_OK, "SetHWnd returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirectDrawSurface4_SetClipper(Primary4, Clipper);
+    ok(hr == DD_OK, "SetClipper returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    memset(&ddsd, 0, sizeof(ddsd));
+    ddsd.dwSize = sizeof(ddsd);
+    ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;
+    ddsd.dwWidth = 640;
+    ddsd.dwHeight = 480;
+    hr = IDirectDraw4_CreateSurface(DirectDraw4, &ddsd, &Surface4, NULL);
+    ok(hr == DD_OK, "CreateSurface returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirectDraw4_QueryInterface(DirectDraw4, &IID_IDirect3D3, (void **)&Direct3D3);
+    if (hr == E_NOINTERFACE) {
+        win_skip("IID_IDirect3D3 not available, skipping tests.\n");
+        return FALSE;
+    }
+    ok(hr == DD_OK, "QueryInterface returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirect3D3_CreateDevice(Direct3D3, &IID_IDirect3DHALDevice, Surface4, &Direct3DDevice3, NULL);
+    if (FAILED(hr)) {
+        trace("Creating a HAL device failed, trying Ref\n");
+        hr = IDirect3D3_CreateDevice(Direct3D3, &IID_IDirect3DRefDevice, Surface4, &Direct3DDevice3, NULL);
+    }
+    if (hr == E_NOINTERFACE) {
+        win_skip("IID_IDirect3DHALDevice/IID_IDirect3DRefDevice not available, skipping tests.\n");
+        return FALSE;
+    }
+    ok(hr == D3D_OK, "Creating 3D device returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirect3D3_CreateViewport(Direct3D3, &Viewport3, NULL);
+    ok(hr == D3D_OK, "CreateViewport returned: %08x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirect3DDevice3_AddViewport(Direct3DDevice3, Viewport3);
+    ok(hr == D3D_OK, "AddViewport returned: %08x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    vp_data.dwSize = sizeof(vp_data);
+    vp_data.dwX = 0;
+    vp_data.dwY = 0;
+    vp_data.dwWidth = 640;
+    vp_data.dwHeight = 480;
+    vp_data.dvClipX = -1.0;
+    vp_data.dvClipY = 1.0;
+    vp_data.dvClipWidth = 2.0;
+    vp_data.dvClipHeight = 2.0;
+    vp_data.dvMinZ = 0.0;
+    vp_data.dvMaxZ = 1.0;
+    hr = IDirect3DViewport3_SetViewport2(Viewport3, &vp_data);
+    ok(hr == D3D_OK, "SetViewport2 returned: %08x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirect3DDevice3_SetCurrentViewport(Direct3DDevice3, Viewport3);
+    ok(hr == D3D_OK, "AddViewport returned: %08x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    return TRUE;
+}
+
+static void D3D3_releaseObjects(void)
+{
+    if (Surface4) IDirectDrawSurface4_Release(Surface4);
+    Surface4 = NULL;
+    if (Primary4) IDirectDrawSurface4_Release(Primary4);
+    Primary4 = NULL;
+    if (Viewport3) IDirect3DViewport3_Release(Viewport3);
+    Viewport3 = NULL;
+    if (Direct3DDevice3) IDirect3DDevice3_Release(Direct3DDevice3);
+    Direct3DDevice3 = NULL;
+    if (Direct3D3) IDirect3D3_Release(Direct3D3);
+    Direct3D3 = NULL;
+    if (Clipper) IDirectDrawClipper_Release(Clipper);
+    Clipper = NULL;
+    if (DirectDraw4) IDirectDraw4_Release(DirectDraw4);
+    DirectDraw4 = NULL;
+    if (DirectDraw1) IDirectDraw_Release(DirectDraw1);
+    DirectDraw1 = NULL;
+    if (window) DestroyWindow(window);
+    window = NULL;
+}
+
 static DWORD D3D3_getPixelColor(IDirectDraw4 *DirectDraw, IDirectDrawSurface4 *Surface, UINT x, UINT y)
 {
     DWORD ret;
@@ -3659,6 +3804,14 @@ cleanup:
     }
     D3D2_releaseObjects();
 
+    if(!D3D3_createObjects()) {
+        skip("Cannot initialize D3D3, skipping\n");
+    }
+    else {
+        /* todo */
+    }
+    D3D3_releaseObjects();
+
     D3D3_ViewportClearTest();
     p8_primary_test();
     DX1_BackBufferFlipTest();
-- 
1.7.4.1




More information about the wine-patches mailing list