[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