From d8c9671d4da1a3b2ae912bec2aa5ffef37ff8410 Mon Sep 17 00:00:00 2001 From: Zhiyi Zhang Date: Mon, 23 Nov 2020 23:56:52 +0800 Subject: [PATCH] wined3d: Do not use wined3d_output_get_desc() to retrieve display rotation. Most of the time when wined3d_output_get_desc() is called, display rotation is not needed. Retrieving display rotation is quite expensive because it needs to query information from XRandR. So use wined3d_output_get_display_mode() to retrieve display rotation when needed. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50096 Signed-off-by: Zhiyi Zhang Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/dxgi/output.c | 34 ++++++++++++++++++++++++++++++---- dlls/wined3d/directx.c | 4 +--- include/wine/wined3d.h | 1 - 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/dlls/dxgi/output.c b/dlls/dxgi/output.c index 03b5384f326..3ffa5d16408 100644 --- a/dlls/dxgi/output.c +++ b/dlls/dxgi/output.c @@ -288,6 +288,8 @@ static HRESULT STDMETHODCALLTYPE dxgi_output_GetDesc(IDXGIOutput6 *iface, DXGI_O { struct dxgi_output *output = impl_from_IDXGIOutput6(iface); struct wined3d_output_desc wined3d_desc; + enum wined3d_display_rotation rotation; + struct wined3d_display_mode mode; HRESULT hr; TRACE("iface %p, desc %p.\n", iface, desc); @@ -297,18 +299,26 @@ static HRESULT STDMETHODCALLTYPE dxgi_output_GetDesc(IDXGIOutput6 *iface, DXGI_O wined3d_mutex_lock(); hr = wined3d_output_get_desc(output->wined3d_output, &wined3d_desc); - wined3d_mutex_unlock(); - if (FAILED(hr)) { WARN("Failed to get output desc, hr %#x.\n", hr); + wined3d_mutex_unlock(); return hr; } + hr = wined3d_output_get_display_mode(output->wined3d_output, &mode, &rotation); + if (FAILED(hr)) + { + WARN("Failed to get output display mode, hr %#x.\n", hr); + wined3d_mutex_unlock(); + return hr; + } + wined3d_mutex_unlock(); + memcpy(desc->DeviceName, wined3d_desc.device_name, sizeof(desc->DeviceName)); desc->DesktopCoordinates = wined3d_desc.desktop_rect; desc->AttachedToDesktop = wined3d_desc.attached_to_desktop; - desc->Rotation = wined3d_desc.rotation; + desc->Rotation = rotation; desc->Monitor = wined3d_desc.monitor; return S_OK; @@ -550,6 +560,8 @@ static HRESULT STDMETHODCALLTYPE dxgi_output_GetDesc1(IDXGIOutput6 *iface, { struct dxgi_output *output = impl_from_IDXGIOutput6(iface); struct wined3d_output_desc wined3d_desc; + enum wined3d_display_rotation rotation; + struct wined3d_display_mode mode; HRESULT hr; FIXME("iface %p, desc %p semi-stub!\n", iface, desc); @@ -559,6 +571,20 @@ static HRESULT STDMETHODCALLTYPE dxgi_output_GetDesc1(IDXGIOutput6 *iface, wined3d_mutex_lock(); hr = wined3d_output_get_desc(output->wined3d_output, &wined3d_desc); + if (FAILED(hr)) + { + WARN("Failed to get output desc, hr %#x.\n", hr); + wined3d_mutex_unlock(); + return hr; + } + + hr = wined3d_output_get_display_mode(output->wined3d_output, &mode, &rotation); + if (FAILED(hr)) + { + WARN("Failed to get output display mode, hr %#x.\n", hr); + wined3d_mutex_unlock(); + return hr; + } wined3d_mutex_unlock(); if (FAILED(hr)) @@ -570,7 +596,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_output_GetDesc1(IDXGIOutput6 *iface, memcpy(desc->DeviceName, wined3d_desc.device_name, sizeof(desc->DeviceName)); desc->DesktopCoordinates = wined3d_desc.desktop_rect; desc->AttachedToDesktop = wined3d_desc.attached_to_desktop; - desc->Rotation = wined3d_desc.rotation; + desc->Rotation = rotation; desc->Monitor = wined3d_desc.monitor; /* FIXME: fill this from monitor EDID */ diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 50b1376a75b..7164b81b8ee 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -1002,15 +1002,13 @@ static BOOL CALLBACK enum_monitor_proc(HMONITOR monitor, HDC hdc, RECT *rect, LP HRESULT CDECL wined3d_output_get_desc(const struct wined3d_output *output, struct wined3d_output_desc *desc) { - struct wined3d_display_mode mode; - TRACE("output %p, desc %p.\n", output, desc); memset(desc, 0, sizeof(*desc)); desc->ordinal = output->ordinal; lstrcpyW(desc->device_name, output->device_name); EnumDisplayMonitors(NULL, NULL, enum_monitor_proc, (LPARAM)desc); - return wined3d_output_get_display_mode(output, &mode, &desc->rotation); + return WINED3D_OK; } /* FIXME: GetAdapterModeCount and EnumAdapterModes currently only returns modes diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 4a06b511211..1f370d69a88 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2157,7 +2157,6 @@ struct wined3d_output_desc WCHAR device_name[CCHDEVICENAME]; RECT desktop_rect; BOOL attached_to_desktop; - enum wined3d_display_rotation rotation; HMONITOR monitor; };