From: Riccardo Bortolato Subject: [PATCH 2/2] ddraw/tests: add test for surface preload (v3) Message-Id: <1441885713-9618-2-git-send-email-rikyz619@gmail.com> Date: Thu, 10 Sep 2015 13:48:33 +0200 --- dlls/ddraw/tests/ddraw7.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index fc119f6..af21b78 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -10157,6 +10157,165 @@ static void test_range_colorkey(void) DestroyWindow(window); } +static void test_preload(void) +{ + IDirectDraw7 *ddraw; + IDirect3D7 *d3d = NULL; + IDirectDrawSurface7 *surface; + IDirect3DDevice7 *device; + HRESULT hr; + HWND window; + unsigned int i; + DDSURFACEDESC2 ddsd; + DDPIXELFORMAT z_fmt; + D3DDEVICEDESC7 device_desc; + BOOL cubemap_supported; + static const struct + { + DWORD caps; + DWORD caps2; + const char *name; + } + tests[] = + { + { + DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, + 0, + "videomemory texture" + }, + { + DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, + DDSCAPS2_OPAQUE, + "opaque videomemory texture" + }, + { + DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, + 0, + "systemmemory texture" + }, + { + DDSCAPS_TEXTURE, + DDSCAPS2_TEXTUREMANAGE, + "managed texture" + }, + { + DDSCAPS_TEXTURE, + DDSCAPS2_D3DTEXTUREMANAGE, + "managed texture" + }, + { + DDSCAPS_TEXTURE, + DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_OPAQUE, + "opaque managed texture" + }, + { + DDSCAPS_TEXTURE, + DDSCAPS2_D3DTEXTUREMANAGE | DDSCAPS2_OPAQUE, + "opaque managed texture" + }, + { + DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY, + DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES, + "videomemory cube" + }, + { + DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY, + DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES | DDSCAPS2_OPAQUE, + "opaque videomemory cube" + }, + { + DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_SYSTEMMEMORY, + DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES, + "systemmemory cube" + }, + { + DDSCAPS_TEXTURE | DDSCAPS_COMPLEX, + DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES, + "managed cube" + }, + { + DDSCAPS_TEXTURE | DDSCAPS_COMPLEX, + DDSCAPS2_D3DTEXTUREMANAGE | DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES, + "managed cube" + }, + { + DDSCAPS_TEXTURE | DDSCAPS_COMPLEX, + DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES | DDSCAPS2_OPAQUE, + "opaque managed cube" + }, + { + DDSCAPS_TEXTURE | DDSCAPS_COMPLEX, + DDSCAPS2_D3DTEXTUREMANAGE | DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES | DDSCAPS2_OPAQUE, + "opaque managed cube" + }, + }; + + window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW, + 0, 0, 640, 480, 0, 0, 0, 0); + if (!(device = create_device(window, DDSCL_NORMAL))) + { + skip("Failed to create a 3D device, skipping test.\n"); + DestroyWindow(window); + return; + } + + hr = IDirect3DDevice7_GetDirect3D(device, &d3d); + ok(SUCCEEDED(hr), "Failed to get Direct3D7 interface, hr %#x.\n", hr); + hr = IDirect3D7_QueryInterface(d3d, &IID_IDirectDraw7, (void **)&ddraw); + ok(SUCCEEDED(hr), "Failed to get DirectDraw7 interface, hr %#x.\n", hr); + + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd.dwWidth = 64; + ddsd.dwHeight = 64; + ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE; + hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &surface, NULL); + ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); + + hr = IDirect3DDevice7_GetCaps(device, &device_desc); + ok(SUCCEEDED(hr), "Failed to get device caps, hr %#x.\n", hr); + cubemap_supported = !!(device_desc.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_CUBEMAP); + + IDirectDrawSurface7_Release(surface); + + for (i = 0; i < sizeof(tests) / sizeof(*tests); i++) + { + if (!cubemap_supported && tests[i].caps2 & DDSCAPS2_CUBEMAP) + continue; + + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS; + if (!(tests[i].caps & DDSCAPS_PRIMARYSURFACE)) + { + ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT; + ddsd.dwWidth = 64; + ddsd.dwHeight = 64; + } + if (tests[i].caps & DDSCAPS_ZBUFFER) + { + ddsd.dwFlags |= DDSD_PIXELFORMAT; + U4(ddsd).ddpfPixelFormat = z_fmt; + } + ddsd.ddsCaps.dwCaps = tests[i].caps; + ddsd.ddsCaps.dwCaps2 = tests[i].caps2; + + hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &surface, NULL); + ok(SUCCEEDED(hr), "Failed to create surface, type %s, hr %#x.\n", tests[i].name, hr); + + hr = IDirect3DDevice7_PreLoad(device, surface); + ok(SUCCEEDED(hr), "Failed to PreLoad test \"%s\", hr %#x.\n", tests[i].name, hr); + + IDirectDrawSurface7_Release(surface); + } + + IDirectDraw7_Release(ddraw); + IDirect3D7_Release(d3d); + IDirect3DDevice7_Release(device); + DestroyWindow(window); +} + START_TEST(ddraw7) { HMODULE module = GetModuleHandleA("ddraw.dll"); @@ -10253,4 +10412,5 @@ START_TEST(ddraw7) test_texcoordindex(); test_colorkey_precision(); test_range_colorkey(); + test_preload(); } -- 1.9.1