[PATCH 2/2] wined3d: Do not use wined3d_output_get_desc() to retrieve display rotation.

Zhiyi Zhang zzhang at codeweavers.com
Fri Nov 13 01:49:40 CST 2020


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.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 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 439720032f9..e73752315ba 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1002,14 +1002,12 @@ 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));
     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;
 }
 
 unsigned int CDECL wined3d_output_get_ordinal(const struct wined3d_output *output)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index ac51fdf3528..c491e91aacb 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2156,7 +2156,6 @@ struct wined3d_output_desc
     WCHAR device_name[CCHDEVICENAME];
     RECT desktop_rect;
     BOOL attached_to_desktop;
-    enum wined3d_display_rotation rotation;
     HMONITOR monitor;
 };
 
-- 
2.27.0



More information about the wine-devel mailing list