Module: wine Branch: master Commit: 964500a61a7ff036d871be942a0cd2f685b30098 URL: http://source.winehq.org/git/wine.git/?a=commit;h=964500a61a7ff036d871be942a...
Author: Oldřich Jedlička oldium.pro@seznam.cz Date: Wed Aug 25 22:07:06 2010 +0200
ddraw/tests: New visual back buffer flipping tests.
---
dlls/ddraw/tests/visual.c | 122 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 122 insertions(+), 0 deletions(-)
diff --git a/dlls/ddraw/tests/visual.c b/dlls/ddraw/tests/visual.c index 290cb76..2616a36 100644 --- a/dlls/ddraw/tests/visual.c +++ b/dlls/ddraw/tests/visual.c @@ -2920,6 +2920,127 @@ static void depth_clamp_test(IDirect3DDevice7 *device) ok(SUCCEEDED(hr), "SetViewport failed, hr %#x.\n", hr); }
+static void DX1_BackBufferFlipTest(void) +{ + HRESULT hr; + IDirectDraw *DirectDraw1 = NULL; + IDirectDrawSurface *Primary = NULL; + IDirectDrawSurface *Backbuffer = NULL; + WNDCLASS wc = {0}; + DDSURFACEDESC ddsd; + DDBLTFX ddbltfx; + COLORREF color; + const DWORD white = 0xffffff; + const DWORD red = 0xff0000; + BOOL attached = FALSE; + + wc.lpfnWndProc = DefWindowProc; + wc.lpszClassName = "DX1_BackBufferFlipTest_wc"; + RegisterClass(&wc); + window = CreateWindow("DX1_BackBufferFlipTest_wc", "DX1_BackBufferFlipTest", + WS_MAXIMIZE | WS_VISIBLE | WS_CAPTION , 0, 0, 640, 480, 0, 0, 0, 0); + + hr = DirectDrawCreate( NULL, &DirectDraw1, NULL ); + ok(hr==DD_OK || hr==DDERR_NODIRECTDRAWSUPPORT, "DirectDrawCreate returned: %x\n", hr); + if(FAILED(hr)) goto out; + + hr = IDirectDraw_SetCooperativeLevel(DirectDraw1, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(hr==DD_OK, "SetCooperativeLevel returned: %x\n", hr); + if(FAILED(hr)) goto out; + + hr = IDirectDraw_SetDisplayMode(DirectDraw1, 640, 480, 32); + if(FAILED(hr)) { + /* 24 bit is fine too */ + hr = IDirectDraw_SetDisplayMode(DirectDraw1, 640, 480, 24); + } + ok(hr==DD_OK || hr == DDERR_UNSUPPORTED, "SetDisplayMode returned: %x\n", hr); + if (FAILED(hr)) { + goto out; + } + + memset(&ddsd, 0, sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + ddsd.dwFlags = DDSD_CAPS; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + + hr = IDirectDraw_CreateSurface(DirectDraw1, &ddsd, &Primary, NULL); + ok(hr==DD_OK, "IDirectDraw_CreateSurface returned: %08x\n", hr); + + memset(&ddsd, 0, sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; + ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; + ddsd.dwWidth = 640; + ddsd.dwHeight = 480; + ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); + ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; + U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32; + U2(ddsd.ddpfPixelFormat).dwRBitMask = 0x00ff0000; + U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x0000ff00; + U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x000000ff; + + hr = IDirectDraw_CreateSurface(DirectDraw1, &ddsd, &Backbuffer, NULL); + todo_wine ok(hr==DD_OK, "IDirectDraw_CreateSurface returned: %08x\n", hr); + if(FAILED(hr)) goto out; + + hr = IDirectDrawSurface_AddAttachedSurface(Primary, Backbuffer); + todo_wine ok(hr == DD_OK || broken(hr == DDERR_CANNOTATTACHSURFACE), + "Attaching a back buffer to a front buffer returned %08x\n", hr); + if (FAILED(hr)) goto out; + + attached = TRUE; + + memset(&ddbltfx, 0, sizeof(ddbltfx)); + ddbltfx.dwSize = sizeof(ddbltfx); + U5(ddbltfx).dwFillColor = red; + hr = IDirectDrawSurface_Blt(Backbuffer, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); + ok(hr == DD_OK, "IDirectDrawSurface_Blt returned: %x\n", hr); + + U5(ddbltfx).dwFillColor = white; + hr = IDirectDrawSurface_Blt(Primary, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); + ok(hr == DD_OK, "IDirectDrawSurface_Blt returned: %x\n", hr); + + /* Check it out */ + color = getPixelColor_GDI(Primary, 5, 5); + ok(GetRValue(color) == 0xFF && GetGValue(color) == 0xFF && GetBValue(color) == 0xFF, + "got R %02X G %02X B %02X, expected R FF G FF B FF\n", + GetRValue(color), GetGValue(color), GetBValue(color)); + + color = getPixelColor_GDI(Backbuffer, 5, 5); + ok(GetRValue(color) == 0xFF && GetGValue(color) == 0 && GetBValue(color) == 0, + "got R %02X G %02X B %02X, expected R FF G 00 B 00\n", + GetRValue(color), GetGValue(color), GetBValue(color)); + + hr = IDirectDrawSurface_Flip(Primary, NULL, DDFLIP_WAIT); + todo_wine ok(hr == DD_OK, "IDirectDrawSurface_Flip returned 0x%08x\n", hr); + + if (hr == DD_OK) + { + color = getPixelColor_GDI(Primary, 5, 5); + ok(GetRValue(color) == 0xFF && GetGValue(color) == 0 && GetBValue(color) == 0, + "got R %02X G %02X B %02X, expected R FF G 00 B 00\n", + GetRValue(color), GetGValue(color), GetBValue(color)); + + color = getPixelColor_GDI(Backbuffer, 5, 5); + ok((GetRValue(color) == 0xFF && GetGValue(color) == 0xFF && GetBValue(color) == 0xFF) || + broken(GetRValue(color) == 0xFF && GetGValue(color) == 0 && GetBValue(color) == 0), /* broken driver */ + "got R %02X G %02X B %02X, expected R FF G FF B FF\n", + GetRValue(color), GetGValue(color), GetBValue(color)); + } + + out: + + if (Backbuffer) + { + if (attached) + IDirectDrawSurface_DeleteAttachedSurface(Primary, 0, Backbuffer); + IDirectDrawSurface_Release(Backbuffer); + } + if (Primary) IDirectDrawSurface_Release(Primary); + if (DirectDraw1) IDirectDraw_Release(DirectDraw1); + if (window) DestroyWindow(window); +} + START_TEST(visual) { HRESULT hr; @@ -2983,6 +3104,7 @@ START_TEST(visual)
D3D3_ViewportClearTest(); p8_primary_test(); + DX1_BackBufferFlipTest();
return ;