=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: ddraw/tests: Test DDCAPS2_TEXTUREMANAGE compatibility, with other flags.
Alexandre Julliard
julliard at winehq.org
Thu Sep 5 13:28:20 CDT 2013
Module: wine
Branch: master
Commit: 8da09ba196e6e9256ae93698729aa69776ff5270
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8da09ba196e6e9256ae93698729aa69776ff5270
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Wed Sep 4 23:19:20 2013 +0200
ddraw/tests: Test DDCAPS2_TEXTUREMANAGE compatibility, with other flags.
---
dlls/ddraw/ddraw.c | 15 +++++++
dlls/ddraw/tests/ddraw4.c | 96 +++++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw7.c | 96 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 207 insertions(+), 0 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 26f1984..652d20b 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2699,6 +2699,21 @@ static HRESULT CreateSurface(struct ddraw *ddraw, DDSURFACEDESC2 *DDSD,
}
}
+ if (DDSD->ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE)
+ {
+ if (!(DDSD->ddsCaps.dwCaps & DDSCAPS_TEXTURE))
+ {
+ WARN("DDSCAPS2_TEXTUREMANAGE used without DDSCAPS_TEXTURE, returning DDERR_INVALIDCAPS.\n");
+ return DDERR_INVALIDCAPS;
+ }
+ if (DDSD->ddsCaps.dwCaps & (DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY))
+ {
+ WARN("DDSCAPS2_TEXTUREMANAGE used width DDSCAPS_VIDEOMEMORY "
+ "or DDSCAPS_SYSTEMMEMORY, returning DDERR_INVALIDCAPS.\n");
+ return DDERR_INVALIDCAPS;
+ }
+ }
+
/* According to the msdn this flag is ignored by CreateSurface */
if (DDSD->dwSize >= sizeof(DDSURFACEDESC2))
DDSD->ddsCaps.dwCaps2 &= ~DDSCAPS2_MIPMAPSUBLEVEL;
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index fbaa6ca..b0e014d 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -3819,6 +3819,101 @@ static void test_coop_level_activateapp(void)
IDirectDraw4_Release(ddraw);
}
+static void test_texturemanage(void)
+{
+ IDirectDraw4 *ddraw;
+ HRESULT hr;
+ DDSURFACEDESC2 ddsd;
+ IDirectDrawSurface4 *surface;
+ unsigned int i;
+ DDCAPS hal_caps, hel_caps;
+ DWORD needed_caps = DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY;
+ static const struct
+ {
+ DWORD caps_in, caps2_in;
+ HRESULT hr;
+ DWORD caps_out, caps2_out;
+ }
+ tests[] =
+ {
+ {DDSCAPS_SYSTEMMEMORY | DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, DDERR_INVALIDCAPS,
+ ~0U, ~0U},
+ {DDSCAPS_VIDEOMEMORY | DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, DDERR_INVALIDCAPS,
+ ~0U, ~0U},
+ {DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, DD_OK,
+ DDSCAPS_SYSTEMMEMORY | DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE},
+ {DDSCAPS_VIDEOMEMORY | DDSCAPS_TEXTURE, 0, DD_OK,
+ DDSCAPS_VIDEOMEMORY | DDSCAPS_TEXTURE | DDSCAPS_LOCALVIDMEM, 0},
+ {DDSCAPS_SYSTEMMEMORY | DDSCAPS_TEXTURE, 0, DD_OK,
+ DDSCAPS_SYSTEMMEMORY | DDSCAPS_TEXTURE, 0},
+
+ {0, DDSCAPS2_TEXTUREMANAGE, DDERR_INVALIDCAPS,
+ ~0U, ~0U},
+ {DDSCAPS_SYSTEMMEMORY, DDSCAPS2_TEXTUREMANAGE, DDERR_INVALIDCAPS,
+ ~0U, ~0U},
+ {DDSCAPS_VIDEOMEMORY, DDSCAPS2_TEXTUREMANAGE, DDERR_INVALIDCAPS,
+ ~0U, ~0U},
+ {DDSCAPS_VIDEOMEMORY, 0, DD_OK,
+ DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY, 0},
+ {DDSCAPS_SYSTEMMEMORY, 0, DD_OK,
+ DDSCAPS_SYSTEMMEMORY, 0},
+ };
+
+ if (!(ddraw = create_ddraw()))
+ {
+ skip("Failed to create IDirectDraw4 object, skipping tests.\n");
+ return;
+ }
+
+ hr = IDirectDraw4_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+ memset(&hal_caps, 0, sizeof(hal_caps));
+ hal_caps.dwSize = sizeof(hal_caps);
+ memset(&hel_caps, 0, sizeof(hel_caps));
+ hel_caps.dwSize = sizeof(hel_caps);
+ hr = IDirectDraw4_GetCaps(ddraw, &hal_caps, &hel_caps);
+ ok(SUCCEEDED(hr), "Failed to get caps, hr %#x.\n", hr);
+ if ((hal_caps.ddsCaps.dwCaps & needed_caps) != needed_caps)
+ {
+ skip("Managed textures not supported, skipping managed texture test.\n");
+ IDirectDraw4_Release(ddraw);
+ return;
+ }
+
+ for (i = 0; i < sizeof(tests) / sizeof(*tests); i++)
+ {
+ memset(&ddsd, 0, sizeof(ddsd));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
+ ddsd.ddsCaps.dwCaps = tests[i].caps_in;
+ ddsd.ddsCaps.dwCaps2 = tests[i].caps2_in;
+ ddsd.dwWidth = 4;
+ ddsd.dwHeight = 4;
+
+ hr = IDirectDraw4_CreateSurface(ddraw, &ddsd, &surface, NULL);
+ ok(hr == tests[i].hr, "Got unexpected, hr %#x, case %u.\n", hr, i);
+ if (FAILED(hr))
+ continue;
+
+ memset(&ddsd, 0, sizeof(ddsd));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface4_GetSurfaceDesc(surface, &ddsd);
+ ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr);
+
+ ok(ddsd.ddsCaps.dwCaps == tests[i].caps_out,
+ "Input caps %#x, %#x, expected output caps %#x, got %#x, case %u.\n",
+ tests[i].caps_in, tests[i].caps2_in, tests[i].caps_out, ddsd.ddsCaps.dwCaps, i);
+ ok(ddsd.ddsCaps.dwCaps2 == tests[i].caps2_out,
+ "Input caps %#x, %#x, expected output caps %#x, got %#x, case %u.\n",
+ tests[i].caps_in, tests[i].caps2_in, tests[i].caps2_out, ddsd.ddsCaps.dwCaps2, i);
+
+ IDirectDrawSurface4_Release(surface);
+ }
+
+ IDirectDraw4_Release(ddraw);
+}
+
START_TEST(ddraw4)
{
test_process_vertices();
@@ -3849,4 +3944,5 @@ START_TEST(ddraw4)
test_coop_level_versions();
test_lighting_interface_versions();
test_coop_level_activateapp();
+ test_texturemanage();
}
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 2ed1b94..5197ccea 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -3633,6 +3633,101 @@ static void test_coop_level_activateapp(void)
IDirectDraw7_Release(ddraw);
}
+static void test_texturemanage(void)
+{
+ IDirectDraw7 *ddraw;
+ HRESULT hr;
+ DDSURFACEDESC2 ddsd;
+ IDirectDrawSurface7 *surface;
+ unsigned int i;
+ DDCAPS hal_caps, hel_caps;
+ DWORD needed_caps = DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY;
+ static const struct
+ {
+ DWORD caps_in, caps2_in;
+ HRESULT hr;
+ DWORD caps_out, caps2_out;
+ }
+ tests[] =
+ {
+ {DDSCAPS_SYSTEMMEMORY | DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, DDERR_INVALIDCAPS,
+ ~0U, ~0U},
+ {DDSCAPS_VIDEOMEMORY | DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, DDERR_INVALIDCAPS,
+ ~0U, ~0U},
+ {DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, DD_OK,
+ DDSCAPS_SYSTEMMEMORY | DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE},
+ {DDSCAPS_VIDEOMEMORY | DDSCAPS_TEXTURE, 0, DD_OK,
+ DDSCAPS_VIDEOMEMORY | DDSCAPS_TEXTURE | DDSCAPS_LOCALVIDMEM, 0},
+ {DDSCAPS_SYSTEMMEMORY | DDSCAPS_TEXTURE, 0, DD_OK,
+ DDSCAPS_SYSTEMMEMORY | DDSCAPS_TEXTURE, 0},
+
+ {0, DDSCAPS2_TEXTUREMANAGE, DDERR_INVALIDCAPS,
+ ~0U, ~0U},
+ {DDSCAPS_SYSTEMMEMORY, DDSCAPS2_TEXTUREMANAGE, DDERR_INVALIDCAPS,
+ ~0U, ~0U},
+ {DDSCAPS_VIDEOMEMORY, DDSCAPS2_TEXTUREMANAGE, DDERR_INVALIDCAPS,
+ ~0U, ~0U},
+ {DDSCAPS_VIDEOMEMORY, 0, DD_OK,
+ DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY, 0},
+ {DDSCAPS_SYSTEMMEMORY, 0, DD_OK,
+ DDSCAPS_SYSTEMMEMORY, 0},
+ };
+
+ if (!(ddraw = create_ddraw()))
+ {
+ skip("Failed to create IDirectDraw7 object, skipping tests.\n");
+ return;
+ }
+
+ hr = IDirectDraw7_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+ memset(&hal_caps, 0, sizeof(hal_caps));
+ hal_caps.dwSize = sizeof(hal_caps);
+ memset(&hel_caps, 0, sizeof(hel_caps));
+ hel_caps.dwSize = sizeof(hel_caps);
+ hr = IDirectDraw7_GetCaps(ddraw, &hal_caps, &hel_caps);
+ ok(SUCCEEDED(hr), "Failed to get caps, hr %#x.\n", hr);
+ if ((hal_caps.ddsCaps.dwCaps & needed_caps) != needed_caps)
+ {
+ skip("Managed textures not supported, skipping managed texture test.\n");
+ IDirectDraw7_Release(ddraw);
+ return;
+ }
+
+ for (i = 0; i < sizeof(tests) / sizeof(*tests); i++)
+ {
+ memset(&ddsd, 0, sizeof(ddsd));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
+ ddsd.ddsCaps.dwCaps = tests[i].caps_in;
+ ddsd.ddsCaps.dwCaps2 = tests[i].caps2_in;
+ ddsd.dwWidth = 4;
+ ddsd.dwHeight = 4;
+
+ hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &surface, NULL);
+ ok(hr == tests[i].hr, "Got unexpected, hr %#x, case %u.\n", hr, i);
+ if (FAILED(hr))
+ continue;
+
+ memset(&ddsd, 0, sizeof(ddsd));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_GetSurfaceDesc(surface, &ddsd);
+ ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr);
+
+ ok(ddsd.ddsCaps.dwCaps == tests[i].caps_out,
+ "Input caps %#x, %#x, expected output caps %#x, got %#x, case %u.\n",
+ tests[i].caps_in, tests[i].caps2_in, tests[i].caps_out, ddsd.ddsCaps.dwCaps, i);
+ ok(ddsd.ddsCaps.dwCaps2 == tests[i].caps2_out,
+ "Input caps %#x, %#x, expected output caps %#x, got %#x, case %u.\n",
+ tests[i].caps_in, tests[i].caps2_in, tests[i].caps2_out, ddsd.ddsCaps.dwCaps2, i);
+
+ IDirectDrawSurface7_Release(surface);
+ }
+
+ IDirectDraw7_Release(ddraw);
+}
+
START_TEST(ddraw7)
{
HMODULE module = GetModuleHandleA("ddraw.dll");
@@ -3671,4 +3766,5 @@ START_TEST(ddraw7)
test_fog_special();
test_lighting_interface_versions();
test_coop_level_activateapp();
+ test_texturemanage();
}
More information about the wine-cvs
mailing list