From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/d3d8/tests/device.c | 95 +++++++++++++++++++++++++++++++--------- 1 file changed, 74 insertions(+), 21 deletions(-) diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 02383233cff..ff14cac9dec 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -9507,26 +9507,36 @@ static void test_clip_planes_limits(void) static void test_swapchain_multisample_reset(void) { D3DPRESENT_PARAMETERS present_parameters; + IDirect3DSurface8 *surface; + unsigned int i, windowed; IDirect3DDevice8 *device; + D3DLOCKED_RECT lr; IDirect3D8 *d3d; ULONG refcount; HWND window; HRESULT hr; + static const struct + { + const char *name; + D3DFORMAT format; + HRESULT expected_hr; + BOOL todo; + } + formats[] = + { + {"D3DFMT_R5G6B5", D3DFMT_R5G6B5, D3DERR_INVALIDCALL, TRUE}, + {"D3DFMT_X1R5G5B5", D3DFMT_X1R5G5B5, D3DERR_INVALIDCALL, TRUE}, + {"D3DFMT_A1R5G5B5", D3DFMT_A1R5G5B5, D3DERR_INVALIDCALL, TRUE}, + {"D3DFMT_X8R8G8B8", D3DFMT_X8R8G8B8}, + {"D3DFMT_A8R8G8B8", D3DFMT_A8R8G8B8}, + }; + window = create_window(); ok(!!window, "Failed to create a window.\n"); d3d = Direct3DCreate8(D3D_SDK_VERSION); ok(!!d3d, "Failed to create D3D object.\n"); - if (IDirect3D8_CheckDeviceMultiSampleType(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, - D3DFMT_A8R8G8B8, TRUE, D3DMULTISAMPLE_2_SAMPLES) == D3DERR_NOTAVAILABLE) - { - skip("Multisampling not supported for D3DFMT_A8R8G8B8.\n"); - IDirect3D8_Release(d3d); - DestroyWindow(window); - return; - } - if (!(device = create_device(d3d, window, NULL))) { skip("Failed to create 3D device.\n"); @@ -9538,19 +9548,62 @@ static void test_swapchain_multisample_reset(void) hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); ok(hr == D3D_OK, "Failed to clear, hr %#lx.\n", hr); - memset(&present_parameters, 0, sizeof(present_parameters)); - present_parameters.BackBufferWidth = 640; - present_parameters.BackBufferHeight = 480; - present_parameters.BackBufferFormat = D3DFMT_A8R8G8B8; - present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD; - present_parameters.hDeviceWindow = NULL; - present_parameters.Windowed = TRUE; - present_parameters.MultiSampleType = D3DMULTISAMPLE_2_SAMPLES; - hr = IDirect3DDevice8_Reset(device, &present_parameters); - ok(hr == D3D_OK, "Failed to reset device, hr %#lx.\n", hr); + for (i = 0; i < ARRAY_SIZE(formats); ++i) + { + for (windowed = 0; windowed < 2; ++windowed) + { + winetest_push_context("Test %u, format %s, windowed %u", i, formats[i].name, windowed); - hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0); - ok(hr == D3D_OK, "Failed to clear, hr %#lx.\n", hr); + if (FAILED(hr = IDirect3D8_CheckDeviceMultiSampleType(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, + formats[i].format, windowed, D3DMULTISAMPLE_2_SAMPLES))) + { + ok(hr == D3DERR_NOTAVAILABLE, "Unexpected hr %#lx.\n", hr); + skip("Multisampling not supported.\n"); + winetest_pop_context(); + continue; + } + + memset(&present_parameters, 0, sizeof(present_parameters)); + present_parameters.BackBufferWidth = 640; + present_parameters.BackBufferHeight = 480; + present_parameters.BackBufferFormat = formats[i].format; + present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD; + present_parameters.hDeviceWindow = window; + present_parameters.Windowed = windowed; + present_parameters.MultiSampleType = D3DMULTISAMPLE_2_SAMPLES; + hr = IDirect3DDevice8_Reset(device, &present_parameters); + todo_wine_if(formats[i].todo) + ok(hr == formats[i].expected_hr, "Unexpected hr %#lx.\n", hr); + + if (FAILED(hr)) + { + winetest_pop_context(); + continue; + } + + hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0); + ok(hr == D3D_OK, "Failed to clear, hr %#lx.\n", hr); + + /* Lockable back buffer flag is allowed. */ + present_parameters.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; + hr = IDirect3DDevice8_Reset(device, &present_parameters); + ok(hr == D3D_OK, "Failed to reset device, hr %#lx.\n", hr); + + hr = IDirect3DDevice8_GetBackBuffer(device, 0, D3DBACKBUFFER_TYPE_MONO, &surface); + ok(SUCCEEDED(hr), "GetBackBuffer failed, hr %#lx.\n", hr); + + /* But locking is not allowed. */ + hr = IDirect3DSurface8_LockRect(surface, &lr, NULL, 0); + todo_wine + ok(hr == D3DERR_INVALIDCALL, "Unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + IDirect3DSurface8_UnlockRect(surface); + + IDirect3DSurface8_Release(surface); + + winetest_pop_context(); + } + } refcount = IDirect3DDevice8_Release(device); ok(!refcount, "Device has %lu references left.\n", refcount); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10874