[PATCH 3/5] ddraw/tests: Add a IDirect3DDevice2 GetCaps test (try 2)
Stefan Dösinger
stefan at codeweavers.com
Mon Dec 5 17:03:04 CST 2011
try 2: Add infrastructure to rerun every test with new d3d objects.
---
dlls/ddraw/tests/d3d.c | 211 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 211 insertions(+), 0 deletions(-)
diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c
index 5efe718..f44e31e 100644
--- a/dlls/ddraw/tests/d3d.c
+++ b/dlls/ddraw/tests/d3d.c
@@ -4995,8 +4995,207 @@ static void test_get_caps7(void)
/* There's no dwSize in D3DDEVICEDESC7 */
}
+struct d3d2_test_context
+{
+ IDirectDraw *ddraw;
+ IDirect3D2 *d3d;
+ IDirectDrawSurface *surface;
+ IDirect3DDevice2 *device;
+ IDirect3DViewport2 *viewport;
+};
+
+static void d3d2_release_objects(struct d3d2_test_context *context)
+{
+ LONG ref;
+ HRESULT hr;
+
+ if (context->viewport)
+ {
+ hr = IDirect3DDevice2_DeleteViewport(context->device, context->viewport);
+ ok(hr == D3D_OK, "DeleteViewport returned %08x.\n", hr);
+ ref = IDirect3DViewport2_Release(context->viewport);
+ ok(ref == 0, "Viewport has reference count %d, expected 0.\n", ref);
+ }
+ if (context->device)
+ {
+ ref = IDirect3DDevice2_Release(context->device);
+ ok(ref == 0, "Device has reference count %d, expected 0.\n", ref);
+ }
+ if (context->surface)
+ {
+ ref = IDirectDrawSurface_Release(context->surface);
+ ok(ref == 0, "Surface has reference count %d, expected 0.\n", ref);
+ }
+ if (context->d3d)
+ {
+ ref = IDirect3D2_Release(context->d3d);
+ ok(ref == 1, "IDirect3D2 has reference count %d, expected 1.\n", ref);
+ }
+ if (context->ddraw)
+ {
+ ref = IDirectDraw_Release(context->ddraw);
+ ok(ref == 0, "DDraw has reference count %d, expected 0.\n", ref);
+ }
+}
+
+static BOOL d3d2_create_objects(struct d3d2_test_context *context)
+{
+ HRESULT hr;
+ DDSURFACEDESC ddsd;
+ D3DVIEWPORT vp_data;
+
+ memset(context, 0, sizeof(*context));
+
+ hr = DirectDrawCreate(NULL, &context->ddraw, NULL);
+ ok(hr == DD_OK || hr == DDERR_NODIRECTDRAWSUPPORT, "DirectDrawCreate failed: %08x.\n", hr);
+ if (!context->ddraw) goto error;
+
+ hr = IDirectDraw_SetCooperativeLevel(context->ddraw, NULL, DDSCL_NORMAL);
+ ok(hr == DD_OK, "SetCooperativeLevel failed: %08x.\n", hr);
+ if (FAILED(hr)) goto error;
+
+ hr = IDirectDraw_QueryInterface(context->ddraw, &IID_IDirect3D2, (void**) &context->d3d);
+ ok(hr == DD_OK || hr == E_NOINTERFACE, "QueryInterface failed: %08x.\n", hr);
+ if (!context->d3d) goto error;
+
+ 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 = 256;
+ ddsd.dwHeight = 256;
+ IDirectDraw_CreateSurface(context->ddraw, &ddsd, &context->surface, NULL);
+ if (!context->surface)
+ {
+ skip("DDSCAPS_3DDEVICE surface not available.\n");
+ goto error;
+ }
+
+ hr = IDirect3D2_CreateDevice(context->d3d, &IID_IDirect3DHALDevice, context->surface, &context->device);
+ ok(hr == D3D_OK || hr == E_OUTOFMEMORY || hr == E_NOINTERFACE, "CreateDevice failed: %08x.\n", hr);
+ if (!context->device) goto error;
+
+ hr = IDirect3D2_CreateViewport(context->d3d, &context->viewport, NULL);
+ ok(hr == D3D_OK, "CreateViewport failed: %08x.\n", hr);
+ if (!context->viewport) goto error;
+
+ hr = IDirect3DDevice2_AddViewport(context->device, context->viewport);
+ ok(hr == D3D_OK, "AddViewport returned %08x.\n", hr);
+ vp_data.dwSize = sizeof(vp_data);
+ vp_data.dwX = 0;
+ vp_data.dwY = 0;
+ vp_data.dwWidth = 256;
+ vp_data.dwHeight = 256;
+ vp_data.dvScaleX = 1;
+ vp_data.dvScaleY = 1;
+ vp_data.dvMaxX = 256;
+ vp_data.dvMaxY = 256;
+ vp_data.dvMinZ = 0;
+ vp_data.dvMaxZ = 1;
+ hr = IDirect3DViewport2_SetViewport(context->viewport, &vp_data);
+ ok(hr == D3D_OK, "SetViewport returned %08x.\n", hr);
+
+ return TRUE;
+
+error:
+ d3d2_release_objects(context);
+ return FALSE;
+}
+
+static void test_get_caps2(const struct d3d2_test_context *context)
+{
+ D3DDEVICEDESC hw_caps, hel_caps;
+ HRESULT hr;
+ unsigned int i;
+
+ memset(&hw_caps, 0, sizeof(hw_caps));
+ hw_caps.dwSize = sizeof(hw_caps);
+ hw_caps.dwFlags = 0xdeadbeef;
+ memset(&hel_caps, 0, sizeof(hel_caps));
+ hel_caps.dwSize = sizeof(hel_caps);
+ hel_caps.dwFlags = 0xdeadc0de;
+
+ /* NULL pointers */
+ hr = IDirect3DDevice2_GetCaps(context->device, &hw_caps, NULL);
+ ok(hr == DDERR_INVALIDPARAMS, "GetCaps with NULL hel caps returned hr %#x, expected INVALIDPARAMS.\n", hr);
+ ok(hw_caps.dwFlags == 0xdeadbeef, "hw_caps.dwFlags was modified: %#x.\n", hw_caps.dwFlags);
+ hr = IDirect3DDevice2_GetCaps(context->device, NULL, &hel_caps);
+ ok(hr == DDERR_INVALIDPARAMS, "GetCaps with NULL hw caps returned hr %#x, expected INVALIDPARAMS.\n", hr);
+ ok(hel_caps.dwFlags == 0xdeadc0de, "hel_caps.dwFlags was modified: %#x.\n", hel_caps.dwFlags);
+
+ /* Successful call: Both are modified */
+ hr = IDirect3DDevice2_GetCaps(context->device, &hw_caps, &hel_caps);
+ ok(hr == D3D_OK, "GetCaps with correct size returned hr %#x, expected D3D_OK.\n", hr);
+ ok(hw_caps.dwFlags != 0xdeadbeef, "hw_caps.dwFlags was not modified: %#x.\n", hw_caps.dwFlags);
+ ok(hel_caps.dwFlags != 0xdeadc0de, "hel_caps.dwFlags was not modified: %#x.\n", hel_caps.dwFlags);
+
+ memset(&hw_caps, 0, sizeof(hw_caps));
+ hw_caps.dwSize = sizeof(hw_caps);
+ hw_caps.dwFlags = 0xdeadbeef;
+ memset(&hel_caps, 0, sizeof(hel_caps));
+ /* Keep dwSize at 0 */
+ hel_caps.dwFlags = 0xdeadc0de;
+
+ /* If one is invalid the call fails */
+ hr = IDirect3DDevice2_GetCaps(context->device, &hw_caps, &hel_caps);
+ ok(hr == DDERR_INVALIDPARAMS, "GetCaps with invalid hel_caps size returned hr %#x, expected INVALIDPARAMS.\n", hr);
+ ok(hw_caps.dwFlags == 0xdeadbeef, "hw_caps.dwFlags was modified: %#x.\n", hw_caps.dwFlags);
+ ok(hel_caps.dwFlags == 0xdeadc0de, "hel_caps.dwFlags was modified: %#x.\n", hel_caps.dwFlags);
+ hel_caps.dwSize = sizeof(hel_caps);
+ hw_caps.dwSize = sizeof(hw_caps) + 1;
+ hr = IDirect3DDevice2_GetCaps(context->device, &hw_caps, &hel_caps);
+ ok(hr == DDERR_INVALIDPARAMS, "GetCaps with invalid hw_caps size returned hr %#x, expected INVALIDPARAMS.\n", hr);
+ ok(hw_caps.dwFlags == 0xdeadbeef, "hw_caps.dwFlags was modified: %#x.\n", hw_caps.dwFlags);
+ ok(hel_caps.dwFlags == 0xdeadc0de, "hel_caps.dwFlags was modified: %#x.\n", hel_caps.dwFlags);
+
+ for (i = 0; i < 1024; i++)
+ {
+ memset(&hw_caps, 0xfe, sizeof(hw_caps));
+ memset(&hel_caps, 0xfe, sizeof(hel_caps));
+ hw_caps.dwSize = hel_caps.dwSize = i;
+ hr = IDirect3DDevice2_GetCaps(context->device, &hw_caps, &hel_caps);
+ switch (i)
+ {
+ /* D3DDEVICEDESCSIZE in old sdk versions */
+ case FIELD_OFFSET(D3DDEVICEDESC, dwMinTextureWidth): /* 172, DirectX 3, IDirect3DDevice1 */
+ ok(hw_caps.dwMinTextureWidth == 0xfefefefe, "dwMinTextureWidth was modified: %#x.\n",
+ hw_caps.dwMinTextureWidth);
+ ok(hel_caps.dwMinTextureWidth == 0xfefefefe, "dwMinTextureWidth was modified: %#x.\n",
+ hel_caps.dwMinTextureWidth);
+ /* drop through */
+ case FIELD_OFFSET(D3DDEVICEDESC, dwMaxTextureRepeat): /* 204, DirectX 5, IDirect3DDevice2 */
+ ok(hw_caps.dwMaxTextureRepeat == 0xfefefefe, "dwMaxTextureRepeat was modified: %#x.\n",
+ hw_caps.dwMaxTextureRepeat);
+ ok(hel_caps.dwMaxTextureRepeat == 0xfefefefe, "dwMaxTextureRepeat was modified: %#x.\n",
+ hel_caps.dwMaxTextureRepeat);
+ /* drop through */
+ case sizeof(D3DDEVICEDESC): /* 252, DirectX 6, IDirect3DDevice3 */
+ ok(hr == D3D_OK, "GetCaps with size %u returned hr %#x, expected D3D_OK.\n", i, hr);
+ break;
+
+ default:
+ ok(hr == DDERR_INVALIDPARAMS,
+ "GetCaps with size %u returned hr %#x, expected DDERR_INVALIDPARAMS.\n", i, hr);
+ break;
+ }
+ }
+
+ /* Different valid sizes are OK */
+ hw_caps.dwSize = 172;
+ hel_caps.dwSize = sizeof(D3DDEVICEDESC);
+ hr = IDirect3DDevice2_GetCaps(context->device, &hw_caps, &hel_caps);
+ ok(hr == D3D_OK, "GetCaps with different sizes returned hr %#x, expected D3D_OK.\n", hr);
+}
+
START_TEST(d3d)
{
+ struct d3d2_test_context d3d2_context;
+ void (* const d3d2_tests[])(const struct d3d2_test_context *) =
+ {
+ test_get_caps2
+ };
+ unsigned int i;
+
init_function_pointers();
if(!pDirectDrawCreateEx) {
win_skip("function DirectDrawCreateEx not available\n");
@@ -5026,6 +5225,18 @@ START_TEST(d3d)
ReleaseDirect3D();
}
+ for (i = 0; i < (sizeof(d3d2_tests) / sizeof(*d3d2_tests)); i++)
+ {
+ if (!d3d2_create_objects(&d3d2_context))
+ {
+ ok(!i, "Unexpected d3d2 initialization failure.\n");
+ skip("Skipping d3d2 tests.\n");
+ break;
+ }
+ d3d2_tests[i](&d3d2_context);
+ d3d2_release_objects(&d3d2_context);
+ }
+
if (!D3D1_createObjects()) {
skip("Skipping d3d1 tests\n");
} else {
--
1.7.3.4
More information about the wine-patches
mailing list