[07/11] ddraw/tests: Add infrastructure for D3D2 visual tests.

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


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

diff --git a/dlls/ddraw/tests/visual.c b/dlls/ddraw/tests/visual.c
index 6664d1e..832a9de 100644
--- a/dlls/ddraw/tests/visual.c
+++ b/dlls/ddraw/tests/visual.c
@@ -32,14 +32,18 @@ static IDirect3DDevice7    *Direct3DDevice;
 
 static IDirectDraw *DirectDraw1;
 static IDirectDraw4 *DirectDraw4;
+static IDirectDrawClipper *Clipper;
 static IDirectDrawSurface *Primary1, *Surface1;
 static IDirectDrawSurface4 *Primary4;
 static IDirect3D *Direct3D1;
+static IDirect3D2 *Direct3D2;
 static IDirect3D3 *Direct3D3;
 static IDirect3DDevice *Direct3DDevice1;
+static IDirect3DDevice2 *Direct3DDevice2;
 static IDirect3DDevice3 *Direct3DDevice3;
 static IDirect3DExecuteBuffer *ExecuteBuffer;
 static IDirect3DViewport *Viewport;
+static IDirect3DViewport2 *Viewport2;
 static IDirect3DViewport3 *Viewport3;
 
 static BOOL refdevice = FALSE;
@@ -2154,6 +2158,140 @@ static void D3D1_ViewportClearTest(void)
     if (Viewport2) IDirect3DViewport_Release(Viewport2);
 }
 
+static BOOL D3D2_createObjects(void)
+{
+    WNDCLASS wc;
+    HRESULT hr;
+    DDSURFACEDESC 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;
+
+    memset(&wc, 0, sizeof(wc));
+    wc.lpfnWndProc = DefWindowProc;
+    wc.lpszClassName = "d3d2_test_wc";
+    RegisterClass(&wc);
+    window = CreateWindow("d3d2_test_wc", "d3d2_test", WS_VISIBLE, 0, 0, 640, 480, 0, 0, 0, 0);
+
+    hr = IDirectDraw_SetCooperativeLevel(DirectDraw1, 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 = IDirectDraw_CreateSurface(DirectDraw1, &ddsd, &Primary1, NULL);
+    ok(hr == DD_OK, "CreateSurface returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirectDraw_CreateClipper(DirectDraw1, 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 = IDirectDrawSurface_SetClipper(Primary1, 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 = IDirectDraw_CreateSurface(DirectDraw1, &ddsd, &Surface1, NULL);
+    ok(hr == DD_OK, "CreateSurface returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirectDraw_QueryInterface(DirectDraw1, &IID_IDirect3D2, (void **)&Direct3D2);
+    if (hr == E_NOINTERFACE) {
+        win_skip("IID_IDirect3D2 not available, skipping tests.\n");
+        return FALSE;
+    }
+    ok(hr == DD_OK, "QueryInterface returned: %x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirect3D2_CreateDevice(Direct3D2, &IID_IDirect3DHALDevice, Surface1, &Direct3DDevice2);
+    if (FAILED(hr)) {
+        trace("Creating a HAL device failed, trying Ref.\n");
+        hr = IDirect3D2_CreateDevice(Direct3D2, &IID_IDirect3DRefDevice, Surface1, &Direct3DDevice2);
+    }
+    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 = IDirect3D2_CreateViewport(Direct3D2, &Viewport2, NULL);
+    ok(hr == D3D_OK, "CreateViewport returned: %08x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirect3DDevice2_AddViewport(Direct3DDevice2, Viewport2);
+    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 = IDirect3DViewport2_SetViewport2(Viewport2, &vp_data);
+    ok(hr == D3D_OK, "SetViewport2 returned: %08x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IDirect3DDevice2_SetCurrentViewport(Direct3DDevice2, Viewport2);
+    ok(hr == D3D_OK, "AddViewport returned: %08x\n", hr);
+    if (FAILED(hr))
+        return FALSE;
+
+    return TRUE;
+}
+
+static void D3D2_releaseObjects(void)
+{
+    if (Surface1) IDirectDrawSurface_Release(Surface1);
+    Surface1 = NULL;
+    if (Primary1) IDirectDrawSurface_Release(Primary1);
+    Primary1 = NULL;
+    if (Viewport2) IDirect3DViewport2_Release(Viewport2);
+    Viewport2 = NULL;
+    if (Direct3DDevice2) IDirect3DDevice2_Release(Direct3DDevice2);
+    Direct3DDevice2 = NULL;
+    if (Direct3D2) IDirect3D2_Release(Direct3D2);
+    Direct3D2 = NULL;
+    if (Clipper) IDirectDrawClipper_Release(Clipper);
+    Clipper = 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;
@@ -3288,6 +3426,14 @@ cleanup:
     }
     D3D1_releaseObjects();
 
+    if(!D3D2_createObjects()) {
+        skip("Cannot initialize D3D2, skipping\n");
+    }
+    else {
+        /* todo */
+    }
+    D3D2_releaseObjects();
+
     D3D3_ViewportClearTest();
     p8_primary_test();
     DX1_BackBufferFlipTest();
-- 
1.7.4.1




More information about the wine-patches mailing list