=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: ddraw/tests: Add a partial block lock test.
Alexandre Julliard
julliard at winehq.org
Tue Nov 8 12:23:12 CST 2011
Module: wine
Branch: master
Commit: 6a7c82186a7173d2682cad7367b1716d92338663
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6a7c82186a7173d2682cad7367b1716d92338663
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri Oct 14 13:23:59 2011 +0200
ddraw/tests: Add a partial block lock test.
---
dlls/ddraw/tests/dsurface.c | 181 ++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 180 insertions(+), 1 deletions(-)
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index 3060379..7901b6e 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -4,7 +4,7 @@
* Copyright (C) 2005 Antoine Chavasse (a.chavasse at gmail.com)
* Copyright (C) 2005 Christian Costa
* Copyright 2005 Ivan Leo Puoti
- * Copyright (C) 2007 Stefan Dösinger
+ * Copyright (C) 2007-2009, 2011 Stefan Dösinger for CodeWeavers
* Copyright (C) 2008 Alexander Dorofeyev
*
* This library is free software; you can redistribute it and/or
@@ -4528,6 +4528,184 @@ static void set_surface_desc_test(void)
IDirectDrawSurface_Release(surface3);
}
+static BOOL fourcc_supported(DWORD fourcc, DWORD caps)
+{
+ DDSURFACEDESC ddsd;
+ HRESULT hr;
+ IDirectDrawSurface *surface;
+
+ reset_ddsd(&ddsd);
+ U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
+ ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CAPS;
+ ddsd.dwWidth = 4;
+ ddsd.dwHeight = 4;
+ ddsd.ddsCaps.dwCaps = caps;
+ U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_FOURCC;
+ U4(ddsd).ddpfPixelFormat.dwFourCC = fourcc;
+ hr = IDirectDraw_CreateSurface(lpDD, &ddsd, &surface, NULL);
+ if (FAILED(hr))
+ {
+ return FALSE;
+ }
+ IDirectDrawSurface_Release(surface);
+ return TRUE;
+}
+
+static void partial_block_lock_test(void)
+{
+ IDirectDrawSurface7 *surface;
+ HRESULT hr;
+ DDSURFACEDESC2 ddsd;
+ IDirectDraw7 *dd7;
+ const struct
+ {
+ DWORD caps, caps2;
+ const char *name;
+ BOOL success;
+ }
+ pools[] =
+ {
+ {
+ DDSCAPS_VIDEOMEMORY, 0,
+ "D3DPOOL_DEFAULT", FALSE
+ },
+ {
+ DDSCAPS_SYSTEMMEMORY, 0,
+ "D3DPOOL_SYSTEMMEM", TRUE
+ },
+ {
+ 0, DDSCAPS2_TEXTUREMANAGE,
+ "D3DPOOL_MANAGED", TRUE
+ }
+ };
+ const struct
+ {
+ DWORD fourcc;
+ DWORD caps;
+ const char *name;
+ unsigned int block_width;
+ unsigned int block_height;
+ }
+ formats[] =
+ {
+ {MAKEFOURCC('D','X','T','1'), DDSCAPS_TEXTURE, "D3DFMT_DXT1", 4, 4},
+ {MAKEFOURCC('D','X','T','2'), DDSCAPS_TEXTURE, "D3DFMT_DXT2", 4, 4},
+ {MAKEFOURCC('D','X','T','3'), DDSCAPS_TEXTURE, "D3DFMT_DXT3", 4, 4},
+ {MAKEFOURCC('D','X','T','4'), DDSCAPS_TEXTURE, "D3DFMT_DXT4", 4, 4},
+ {MAKEFOURCC('D','X','T','5'), DDSCAPS_TEXTURE, "D3DFMT_DXT5", 4, 4},
+ /* ATI2N surfaces aren't available in ddraw */
+ {MAKEFOURCC('U','Y','V','Y'), DDSCAPS_OVERLAY, "D3DFMT_UYVY", 2, 1},
+ {MAKEFOURCC('Y','U','Y','2'), DDSCAPS_OVERLAY, "D3DFMT_YUY2", 2, 1},
+ };
+ unsigned int i, j;
+ RECT rect;
+
+ hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7);
+ ok(SUCCEEDED(hr), "QueryInterface failed, hr %#x.\n", hr);
+
+ for (i = 0; i < sizeof(formats) / sizeof(formats[0]); i++)
+ {
+ if (!fourcc_supported(formats[i].fourcc, formats[i].caps | DDSCAPS_VIDEOMEMORY))
+ {
+ skip("%s surfaces not supported, skipping partial block lock test\n", formats[i].name);
+ continue;
+ }
+
+ for (j = 0; j < (sizeof(pools) / sizeof(*pools)); j++)
+ {
+ if (formats[i].caps & DDSCAPS_OVERLAY && !(pools[j].caps & DDSCAPS_VIDEOMEMORY))
+ continue;
+
+ memset(&ddsd, 0, sizeof(ddsd));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CAPS;
+ ddsd.dwWidth = 128;
+ ddsd.dwHeight = 128;
+ ddsd.ddsCaps.dwCaps = pools[j].caps | formats[i].caps;
+ ddsd.ddsCaps.dwCaps2 = pools[j].caps2;
+ U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_FOURCC;
+ U4(ddsd).ddpfPixelFormat.dwFourCC = formats[i].fourcc;
+ hr = IDirectDraw7_CreateSurface(dd7, &ddsd, &surface, NULL);
+ ok(SUCCEEDED(hr), "CreateSurface failed, hr %#x, format %s, pool %s\n",
+ hr, formats[i].name, pools[j].name);
+
+ /* All Windows versions allow partial block locks with DDSCAPS_SYSTEMMEMORY and
+ * DDSCAPS2_TEXTUREMANAGE, just like in d3d8 and d3d9. Windows XP also allows those locks
+ * with DDSCAPS_VIDEOMEMORY. Windows Vista and Windows 7 disallow partial locks of vidmem
+ * surfaces, making the ddraw behavior consistent with d3d8 and 9.
+ *
+ * Mark the Windows XP behavior as broken until we find an application that needs it */
+ if (formats[i].block_width > 1)
+ {
+ SetRect(&rect, formats[i].block_width >> 1, 0, formats[i].block_width, formats[i].block_height);
+ hr = IDirectDrawSurface7_Lock(surface, &rect, &ddsd, 0, NULL);
+ ok(!SUCCEEDED(hr) == !pools[j].success || broken(SUCCEEDED(hr)),
+ "Partial block lock %s, expected %s, format %s, pool %s\n",
+ SUCCEEDED(hr) ? "succeeded" : "failed", pools[j].success ? "success" : "failure",
+ formats[i].name, pools[j].name);
+ if (SUCCEEDED(hr))
+ {
+ hr = IDirectDrawSurface7_Unlock(surface, NULL);
+ ok(SUCCEEDED(hr), "Unlock failed, hr %#x.\n", hr);
+ }
+
+ SetRect(&rect, 0, 0, formats[i].block_width >> 1, formats[i].block_height);
+ hr = IDirectDrawSurface7_Lock(surface, &rect, &ddsd, 0, NULL);
+ ok(!SUCCEEDED(hr) == !pools[j].success || broken(SUCCEEDED(hr)),
+ "Partial block lock %s, expected %s, format %s, pool %s\n",
+ SUCCEEDED(hr) ? "succeeded" : "failed", pools[j].success ? "success" : "failure",
+ formats[i].name, pools[j].name);
+ if (SUCCEEDED(hr))
+ {
+ hr = IDirectDrawSurface7_Unlock(surface, NULL);
+ ok(SUCCEEDED(hr), "Unlock failed, hr %#x.\n", hr);
+ }
+ }
+
+ if (formats[i].block_height > 1)
+ {
+ SetRect(&rect, 0, formats[i].block_height >> 1, formats[i].block_width, formats[i].block_height);
+ hr = IDirectDrawSurface7_Lock(surface, &rect, &ddsd, 0, NULL);
+ ok(!SUCCEEDED(hr) == !pools[j].success || broken(SUCCEEDED(hr)),
+ "Partial block lock %s, expected %s, format %s, pool %s\n",
+ SUCCEEDED(hr) ? "succeeded" : "failed", pools[j].success ? "success" : "failure",
+ formats[i].name, pools[j].name);
+ if (SUCCEEDED(hr))
+ {
+ hr = IDirectDrawSurface7_Unlock(surface, NULL);
+ ok(SUCCEEDED(hr), "Unlock failed, hr %#x.\n", hr);
+ }
+
+ SetRect(&rect, 0, 0, formats[i].block_width, formats[i].block_height >> 1);
+ hr = IDirectDrawSurface7_Lock(surface, &rect, &ddsd, 0, NULL);
+ ok(!SUCCEEDED(hr) == !pools[j].success || broken(SUCCEEDED(hr)),
+ "Partial block lock %s, expected %s, format %s, pool %s\n",
+ SUCCEEDED(hr) ? "succeeded" : "failed", pools[j].success ? "success" : "failure",
+ formats[i].name, pools[j].name);
+ if (SUCCEEDED(hr))
+ {
+ hr = IDirectDrawSurface7_Unlock(surface, NULL);
+ ok(SUCCEEDED(hr), "Unlock failed, hr %#x.\n", hr);
+ }
+ }
+
+ SetRect(&rect, 0, 0, formats[i].block_width, formats[i].block_height);
+ hr = IDirectDrawSurface7_Lock(surface, &rect, &ddsd, 0, NULL);
+ ok(SUCCEEDED(hr), "Full block lock returned %08x, expected %08x, format %s, pool %s\n",
+ hr, DD_OK, formats[i].name, pools[j].name);
+ if (SUCCEEDED(hr))
+ {
+ hr = IDirectDrawSurface7_Unlock(surface, NULL);
+ ok(SUCCEEDED(hr), "Unlock failed, hr %#x.\n", hr);
+ }
+
+ IDirectDrawSurface7_Release(surface);
+ }
+ }
+
+ IDirectDraw7_Release(dd7);
+}
+
START_TEST(dsurface)
{
HRESULT ret;
@@ -4588,5 +4766,6 @@ START_TEST(dsurface)
zbufferbitdepth_test();
pixelformat_flag_test();
set_surface_desc_test();
+ partial_block_lock_test();
ReleaseDirectDraw();
}
More information about the wine-cvs
mailing list