From d4fdb1f62cf54b5f6f0e6f4b8a19605b24f1b4f1 Mon Sep 17 00:00:00 2001 From: Zhiyi Zhang Date: Fri, 4 Sep 2020 16:56:29 +0800 Subject: [PATCH] ddraw/tests: Add display mode frequency tests. Signed-off-by: Zhiyi Zhang Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/ddraw/tests/ddraw1.c | 41 +++++++++++++++++++ dlls/ddraw/tests/ddraw2.c | 85 ++++++++++++++++++++++++++++++++++++++- dlls/ddraw/tests/ddraw4.c | 85 ++++++++++++++++++++++++++++++++++++++- dlls/ddraw/tests/ddraw7.c | 85 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 293 insertions(+), 3 deletions(-) diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index 532065a4796..6f0948bbaba 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -13837,7 +13837,48 @@ static BOOL CALLBACK test_get_display_mode_cb(HMONITOR monitor, HDC hdc, RECT *m static void test_get_display_mode(void) { + static const DWORD flags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_PIXELFORMAT | DDSD_PITCH; + DDSURFACEDESC surface_desc; + IDirectDraw *ddraw; + DEVMODEW devmode; + HRESULT hr; + BOOL ret; + EnumDisplayMonitors(NULL, NULL, test_get_display_mode_cb, 0); + + ddraw = create_ddraw(); + ok(!!ddraw, "Failed to create a ddraw object.\n"); + + memset(&devmode, 0, sizeof(devmode)); + devmode.dmSize = sizeof(devmode); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError()); + + surface_desc.dwSize = sizeof(surface_desc); + hr = IDirectDraw_GetDisplayMode(ddraw, &surface_desc); + ok(hr == DD_OK, "GetDisplayMode failed, hr %#x.\n", hr); + ok(surface_desc.dwSize == sizeof(surface_desc), "Expected dwSize %u, got %u.\n", + sizeof(surface_desc), surface_desc.dwSize); + ok(surface_desc.dwFlags == flags, "Expected dwFlags %#x, got %#x.\n", flags, + surface_desc.dwFlags); + ok(surface_desc.dwWidth == devmode.dmPelsWidth, "Expected width %u, got %u.\n", + devmode.dmPelsWidth, surface_desc.dwWidth); + ok(surface_desc.dwHeight == devmode.dmPelsHeight, "Expected height %u, got %u.\n", + devmode.dmPelsHeight, surface_desc.dwHeight); + todo_wine_if(devmode.dmDisplayFrequency != 60) + ok(surface_desc.dwRefreshRate == devmode.dmDisplayFrequency, "Expected frequency %u, got %u.\n", + devmode.dmDisplayFrequency, surface_desc.dwRefreshRate); + ok(surface_desc.ddpfPixelFormat.dwSize == sizeof(surface_desc.ddpfPixelFormat), + "Expected ddpfPixelFormat.dwSize %u, got %u.\n", sizeof(surface_desc.ddpfPixelFormat), + surface_desc.ddpfPixelFormat.dwSize); + ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == devmode.dmBitsPerPel, + "Expected ddpfPixelFormat.dwRGBBitCount %u, got %u.\n", devmode.dmBitsPerPel, + surface_desc.ddpfPixelFormat.dwRGBBitCount); + ok(surface_desc.lPitch == devmode.dmPelsWidth * devmode.dmBitsPerPel / 8, + "Expected pitch %u, got %u.\n", devmode.dmPelsWidth * devmode.dmBitsPerPel / 8, + surface_desc.lPitch); + + IDirectDraw_Release(ddraw); } START_TEST(ddraw1) diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index 800dab0fe83..abcd2010b23 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -14495,8 +14495,11 @@ struct find_different_mode_param { unsigned int old_width; unsigned int old_height; + unsigned int old_frequency; unsigned int new_width; unsigned int new_height; + unsigned int new_frequency; + unsigned int new_bpp; }; static HRESULT CALLBACK find_different_mode_callback(DDSURFACEDESC *surface_desc, void *context) @@ -14506,10 +14509,13 @@ static HRESULT CALLBACK find_different_mode_callback(DDSURFACEDESC *surface_desc if (U1(U4(*surface_desc).ddpfPixelFormat).dwRGBBitCount != registry_mode.dmBitsPerPel) return DDENUMRET_OK; - if (surface_desc->dwWidth != param->old_width && surface_desc->dwHeight != param->old_height) + if (surface_desc->dwWidth != param->old_width && surface_desc->dwHeight != param->old_height && + surface_desc->dwRefreshRate != param->old_frequency) { param->new_width = surface_desc->dwWidth; param->new_height = surface_desc->dwHeight; + param->new_frequency = surface_desc->dwRefreshRate; + param->new_bpp = surface_desc->ddpfPixelFormat.dwRGBBitCount; return DDENUMRET_CANCEL; } @@ -14722,7 +14728,84 @@ static BOOL CALLBACK test_get_display_mode_cb(HMONITOR monitor, HDC hdc, RECT *m static void test_get_display_mode(void) { + static const DWORD flags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_PIXELFORMAT | DDSD_PITCH; + struct find_different_mode_param param; + DDSURFACEDESC surface_desc; + IDirectDraw2 *ddraw; + DEVMODEW devmode; + HWND window; + HRESULT hr; + BOOL ret; + EnumDisplayMonitors(NULL, NULL, test_get_display_mode_cb, 0); + + ddraw = create_ddraw(); + ok(!!ddraw, "Failed to create a ddraw object.\n"); + window = create_window(); + ok(!!window, "Failed to create a window.\n"); + + hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(hr == DD_OK, "SetCooperativeLevel failed, hr %#x.\n", hr); + + memset(&devmode, 0, sizeof(devmode)); + devmode.dmSize = sizeof(devmode); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError()); + + surface_desc.dwSize = sizeof(surface_desc); + hr = IDirectDraw2_GetDisplayMode(ddraw, &surface_desc); + ok(hr == DD_OK, "GetDisplayMode failed, hr %#x.\n", hr); + ok(surface_desc.dwSize == sizeof(surface_desc), "Expected dwSize %u, got %u.\n", + sizeof(surface_desc), surface_desc.dwSize); + ok(surface_desc.dwFlags == flags, "Expected dwFlags %#x, got %#x.\n", flags, + surface_desc.dwFlags); + ok(surface_desc.dwWidth == devmode.dmPelsWidth, "Expected width %u, got %u.\n", + devmode.dmPelsWidth, surface_desc.dwWidth); + ok(surface_desc.dwHeight == devmode.dmPelsHeight, "Expected height %u, got %u.\n", + devmode.dmPelsHeight, surface_desc.dwHeight); + todo_wine_if(devmode.dmDisplayFrequency != 60) + ok(surface_desc.dwRefreshRate == devmode.dmDisplayFrequency, "Expected frequency %u, got %u.\n", + devmode.dmDisplayFrequency, surface_desc.dwRefreshRate); + ok(surface_desc.ddpfPixelFormat.dwSize == sizeof(surface_desc.ddpfPixelFormat), + "Expected ddpfPixelFormat.dwSize %u, got %u.\n", sizeof(surface_desc.ddpfPixelFormat), + surface_desc.ddpfPixelFormat.dwSize); + ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == devmode.dmBitsPerPel, + "Expected ddpfPixelFormat.dwRGBBitCount %u, got %u.\n", devmode.dmBitsPerPel, + surface_desc.ddpfPixelFormat.dwRGBBitCount); + ok(surface_desc.lPitch == devmode.dmPelsWidth * devmode.dmBitsPerPel / 8, + "Expected pitch %u, got %u.\n", devmode.dmPelsWidth * devmode.dmBitsPerPel / 8, + surface_desc.lPitch); + + memset(¶m, 0, sizeof(param)); + param.old_frequency = surface_desc.dwRefreshRate; + hr = IDirectDraw2_EnumDisplayModes(ddraw, DDEDM_REFRESHRATES, NULL, ¶m, + find_different_mode_callback); + ok(hr == DD_OK, "EnumDisplayModes failed, hr %#x.\n", hr); + if (!param.new_frequency) + { + skip("Failed to find a display mode with a different frequency.\n"); + goto done; + } + + hr = IDirectDraw2_SetDisplayMode(ddraw, param.new_width, param.new_height, param.new_bpp, + param.new_frequency, 0); + ok(hr == DD_OK, "SetDisplayMode failed, hr %#x.\n", hr); + hr = IDirectDraw2_GetDisplayMode(ddraw, &surface_desc); + ok(hr == DD_OK, "GetDisplayMode failed, hr %#x.\n", hr); + ok(surface_desc.dwWidth == param.new_width, "Expected width %u, got %u.\n", param.new_width, + surface_desc.dwWidth); + ok(surface_desc.dwHeight == param.new_height, "Expected height %u, got %u.\n", param.new_height, + surface_desc.dwHeight); + todo_wine + ok(surface_desc.dwRefreshRate == param.new_frequency, "Expected frequency %u, got %u.\n", + param.new_frequency, surface_desc.dwRefreshRate); + ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == param.new_bpp, + "Expected ddpfPixelFormat.dwRGBBitCount %u, got %u.\n", devmode.dmBitsPerPel, + surface_desc.ddpfPixelFormat.dwRGBBitCount); + +done: + DestroyWindow(window); + IDirectDraw2_Release(ddraw); } START_TEST(ddraw2) diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index d4f4f08e396..071acbacedc 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -17556,8 +17556,11 @@ struct find_different_mode_param { unsigned int old_width; unsigned int old_height; + unsigned int old_frequency; unsigned int new_width; unsigned int new_height; + unsigned int new_frequency; + unsigned int new_bpp; }; static HRESULT CALLBACK find_different_mode_callback(DDSURFACEDESC2 *surface_desc, void *context) @@ -17567,10 +17570,13 @@ static HRESULT CALLBACK find_different_mode_callback(DDSURFACEDESC2 *surface_des if (U1(U4(*surface_desc).ddpfPixelFormat).dwRGBBitCount != registry_mode.dmBitsPerPel) return DDENUMRET_OK; - if (surface_desc->dwWidth != param->old_width && surface_desc->dwHeight != param->old_height) + if (surface_desc->dwWidth != param->old_width && surface_desc->dwHeight != param->old_height && + surface_desc->dwRefreshRate != param->old_frequency) { param->new_width = surface_desc->dwWidth; param->new_height = surface_desc->dwHeight; + param->new_frequency = surface_desc->dwRefreshRate; + param->new_bpp = surface_desc->ddpfPixelFormat.dwRGBBitCount; return DDENUMRET_CANCEL; } @@ -17783,7 +17789,84 @@ static BOOL CALLBACK test_get_display_mode_cb(HMONITOR monitor, HDC hdc, RECT *m static void test_get_display_mode(void) { + static const DWORD flags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_PIXELFORMAT | DDSD_PITCH; + struct find_different_mode_param param; + DDSURFACEDESC2 surface_desc; + IDirectDraw4 *ddraw; + DEVMODEW devmode; + HWND window; + HRESULT hr; + BOOL ret; + EnumDisplayMonitors(NULL, NULL, test_get_display_mode_cb, 0); + + ddraw = create_ddraw(); + ok(!!ddraw, "Failed to create a ddraw object.\n"); + window = create_window(); + ok(!!window, "Failed to create a window.\n"); + + hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(hr == DD_OK, "SetCooperativeLevel failed, hr %#x.\n", hr); + + memset(&devmode, 0, sizeof(devmode)); + devmode.dmSize = sizeof(devmode); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError()); + + surface_desc.dwSize = sizeof(surface_desc); + hr = IDirectDraw4_GetDisplayMode(ddraw, &surface_desc); + ok(hr == DD_OK, "GetDisplayMode failed, hr %#x.\n", hr); + ok(surface_desc.dwSize == sizeof(surface_desc), "Expected dwSize %u, got %u.\n", + sizeof(surface_desc), surface_desc.dwSize); + ok(surface_desc.dwFlags == flags, "Expected dwFlags %#x, got %#x.\n", flags, + surface_desc.dwFlags); + ok(surface_desc.dwWidth == devmode.dmPelsWidth, "Expected width %u, got %u.\n", + devmode.dmPelsWidth, surface_desc.dwWidth); + ok(surface_desc.dwHeight == devmode.dmPelsHeight, "Expected height %u, got %u.\n", + devmode.dmPelsHeight, surface_desc.dwHeight); + todo_wine_if(devmode.dmDisplayFrequency != 60) + ok(surface_desc.dwRefreshRate == devmode.dmDisplayFrequency, "Expected frequency %u, got %u.\n", + devmode.dmDisplayFrequency, surface_desc.dwRefreshRate); + ok(surface_desc.ddpfPixelFormat.dwSize == sizeof(surface_desc.ddpfPixelFormat), + "Expected ddpfPixelFormat.dwSize %u, got %u.\n", sizeof(surface_desc.ddpfPixelFormat), + surface_desc.ddpfPixelFormat.dwSize); + ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == devmode.dmBitsPerPel, + "Expected ddpfPixelFormat.dwRGBBitCount %u, got %u.\n", devmode.dmBitsPerPel, + surface_desc.ddpfPixelFormat.dwRGBBitCount); + ok(surface_desc.lPitch == devmode.dmPelsWidth * devmode.dmBitsPerPel / 8, + "Expected pitch %u, got %u.\n", devmode.dmPelsWidth * devmode.dmBitsPerPel / 8, + surface_desc.lPitch); + + memset(¶m, 0, sizeof(param)); + param.old_frequency = surface_desc.dwRefreshRate; + hr = IDirectDraw4_EnumDisplayModes(ddraw, DDEDM_REFRESHRATES, NULL, ¶m, + find_different_mode_callback); + ok(hr == DD_OK, "EnumDisplayModes failed, hr %#x.\n", hr); + if (!param.new_frequency) + { + skip("Failed to find a display mode with a different frequency.\n"); + goto done; + } + + hr = IDirectDraw4_SetDisplayMode(ddraw, param.new_width, param.new_height, param.new_bpp, + param.new_frequency, 0); + ok(hr == DD_OK, "SetDisplayMode failed, hr %#x.\n", hr); + hr = IDirectDraw4_GetDisplayMode(ddraw, &surface_desc); + ok(hr == DD_OK, "GetDisplayMode failed, hr %#x.\n", hr); + ok(surface_desc.dwWidth == param.new_width, "Expected width %u, got %u.\n", param.new_width, + surface_desc.dwWidth); + ok(surface_desc.dwHeight == param.new_height, "Expected height %u, got %u.\n", param.new_height, + surface_desc.dwHeight); + todo_wine + ok(surface_desc.dwRefreshRate == param.new_frequency, "Expected frequency %u, got %u.\n", + param.new_frequency, surface_desc.dwRefreshRate); + ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == param.new_bpp, + "Expected ddpfPixelFormat.dwRGBBitCount %u, got %u.\n", devmode.dmBitsPerPel, + surface_desc.ddpfPixelFormat.dwRGBBitCount); + +done: + DestroyWindow(window); + IDirectDraw4_Release(ddraw); } START_TEST(ddraw4) diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 5ea81903c47..0f87d46ec09 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -17818,8 +17818,11 @@ struct find_different_mode_param { unsigned int old_width; unsigned int old_height; + unsigned int old_frequency; unsigned int new_width; unsigned int new_height; + unsigned int new_frequency; + unsigned int new_bpp; }; static HRESULT CALLBACK find_different_mode_callback(DDSURFACEDESC2 *surface_desc, void *context) @@ -17829,10 +17832,13 @@ static HRESULT CALLBACK find_different_mode_callback(DDSURFACEDESC2 *surface_des if (U1(U4(*surface_desc).ddpfPixelFormat).dwRGBBitCount != registry_mode.dmBitsPerPel) return DDENUMRET_OK; - if (surface_desc->dwWidth != param->old_width && surface_desc->dwHeight != param->old_height) + if (surface_desc->dwWidth != param->old_width && surface_desc->dwHeight != param->old_height && + surface_desc->dwRefreshRate != param->old_frequency) { param->new_width = surface_desc->dwWidth; param->new_height = surface_desc->dwHeight; + param->new_frequency = surface_desc->dwRefreshRate; + param->new_bpp = surface_desc->ddpfPixelFormat.dwRGBBitCount; return DDENUMRET_CANCEL; } @@ -18045,7 +18051,84 @@ static BOOL CALLBACK test_get_display_mode_cb(HMONITOR monitor, HDC hdc, RECT *m static void test_get_display_mode(void) { + static const DWORD flags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_PIXELFORMAT | DDSD_PITCH; + struct find_different_mode_param param; + DDSURFACEDESC2 surface_desc; + IDirectDraw7 *ddraw; + DEVMODEW devmode; + HWND window; + HRESULT hr; + BOOL ret; + EnumDisplayMonitors(NULL, NULL, test_get_display_mode_cb, 0); + + ddraw = create_ddraw(); + ok(!!ddraw, "Failed to create a ddraw object.\n"); + window = create_window(); + ok(!!window, "Failed to create a window.\n"); + + hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(hr == DD_OK, "SetCooperativeLevel failed, hr %#x.\n", hr); + + memset(&devmode, 0, sizeof(devmode)); + devmode.dmSize = sizeof(devmode); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError()); + + surface_desc.dwSize = sizeof(surface_desc); + hr = IDirectDraw7_GetDisplayMode(ddraw, &surface_desc); + ok(hr == DD_OK, "GetDisplayMode failed, hr %#x.\n", hr); + ok(surface_desc.dwSize == sizeof(surface_desc), "Expected dwSize %u, got %u.\n", + sizeof(surface_desc), surface_desc.dwSize); + ok(surface_desc.dwFlags == flags, "Expected dwFlags %#x, got %#x.\n", flags, + surface_desc.dwFlags); + ok(surface_desc.dwWidth == devmode.dmPelsWidth, "Expected width %u, got %u.\n", + devmode.dmPelsWidth, surface_desc.dwWidth); + ok(surface_desc.dwHeight == devmode.dmPelsHeight, "Expected height %u, got %u.\n", + devmode.dmPelsHeight, surface_desc.dwHeight); + todo_wine_if(devmode.dmDisplayFrequency != 60) + ok(surface_desc.dwRefreshRate == devmode.dmDisplayFrequency, "Expected frequency %u, got %u.\n", + devmode.dmDisplayFrequency, surface_desc.dwRefreshRate); + ok(surface_desc.ddpfPixelFormat.dwSize == sizeof(surface_desc.ddpfPixelFormat), + "Expected ddpfPixelFormat.dwSize %u, got %u.\n", sizeof(surface_desc.ddpfPixelFormat), + surface_desc.ddpfPixelFormat.dwSize); + ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == devmode.dmBitsPerPel, + "Expected ddpfPixelFormat.dwRGBBitCount %u, got %u.\n", devmode.dmBitsPerPel, + surface_desc.ddpfPixelFormat.dwRGBBitCount); + ok(surface_desc.lPitch == devmode.dmPelsWidth * devmode.dmBitsPerPel / 8, + "Expected pitch %u, got %u.\n", devmode.dmPelsWidth * devmode.dmBitsPerPel / 8, + surface_desc.lPitch); + + memset(¶m, 0, sizeof(param)); + param.old_frequency = surface_desc.dwRefreshRate; + hr = IDirectDraw7_EnumDisplayModes(ddraw, DDEDM_REFRESHRATES, NULL, ¶m, + find_different_mode_callback); + ok(hr == DD_OK, "EnumDisplayModes failed, hr %#x.\n", hr); + if (!param.new_frequency) + { + skip("Failed to find a display mode with a different frequency.\n"); + goto done; + } + + hr = IDirectDraw7_SetDisplayMode(ddraw, param.new_width, param.new_height, param.new_bpp, + param.new_frequency, 0); + ok(hr == DD_OK, "SetDisplayMode failed, hr %#x.\n", hr); + hr = IDirectDraw7_GetDisplayMode(ddraw, &surface_desc); + ok(hr == DD_OK, "GetDisplayMode failed, hr %#x.\n", hr); + ok(surface_desc.dwWidth == param.new_width, "Expected width %u, got %u.\n", param.new_width, + surface_desc.dwWidth); + ok(surface_desc.dwHeight == param.new_height, "Expected height %u, got %u.\n", param.new_height, + surface_desc.dwHeight); + todo_wine + ok(surface_desc.dwRefreshRate == param.new_frequency, "Expected frequency %u, got %u.\n", + param.new_frequency, surface_desc.dwRefreshRate); + ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == param.new_bpp, + "Expected ddpfPixelFormat.dwRGBBitCount %u, got %u.\n", devmode.dmBitsPerPel, + surface_desc.ddpfPixelFormat.dwRGBBitCount); + +done: + DestroyWindow(window); + IDirectDraw7_Release(ddraw); } START_TEST(ddraw7)