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 <zzhang@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zhiyi Zhang 2020-11-23 23:56:52 +08:00 committed by Alexandre Julliard
parent 1fceb12139
commit d8c9671d4d
3 changed files with 31 additions and 8 deletions

View file

@ -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 */

View file

@ -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

View file

@ -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;
};