[PATCH v3 3/7] dxgi: Return device local and non-local usage from QueryVideoMemoryInfo().

Conor McCarthy cmccarthy at codeweavers.com
Mon Nov 25 08:10:57 CST 2019


Used by Hitman 2.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 dlls/dxgi/adapter.c | 36 ++++++++++++++----------------------
 1 file changed, 14 insertions(+), 22 deletions(-)

diff --git a/dlls/dxgi/adapter.c b/dlls/dxgi/adapter.c
index d2fc629c..d277dfd5 100644
--- a/dlls/dxgi/adapter.c
+++ b/dlls/dxgi/adapter.c
@@ -294,41 +294,33 @@ static HRESULT STDMETHODCALLTYPE dxgi_adapter_QueryVideoMemoryInfo(IWineDXGIAdap
         UINT node_index, DXGI_MEMORY_SEGMENT_GROUP segment_group, DXGI_QUERY_VIDEO_MEMORY_INFO *info)
 {
     struct dxgi_adapter *adapter = impl_from_IWineDXGIAdapter(iface);
-    struct wined3d_adapter_identifier adapter_id;
+    struct wined3d_adapter_memory_info memory_info;
     static unsigned int once;
     HRESULT hr;
 
     TRACE("iface %p, node_index %u, segment_group %#x, info %p.\n",
             iface, node_index, segment_group, info);
 
+    if (segment_group > DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL)
+    {
+        WARN("Invalid memory segment group 0x%x.\n", segment_group);
+        return E_INVALIDARG;
+    }
+
     if (!once++)
-        FIXME("Returning fake video memory info.\n");
+        FIXME("Returning fake or estimated video memory info.\n");
 
     if (node_index)
         FIXME("Ignoring node index %u.\n", node_index);
 
-    adapter_id.driver_size = 0;
-    adapter_id.description_size = 0;
-    adapter_id.device_name_size = 0;
-
-    if (FAILED(hr = wined3d_get_adapter_identifier(adapter->factory->wined3d, adapter->ordinal, 0, &adapter_id)))
+    if (FAILED(hr = wined3d_get_adapter_memory_info(adapter->factory->wined3d, adapter->ordinal, segment_group, &memory_info)))
         return hr;
 
-    switch (segment_group)
-    {
-        case DXGI_MEMORY_SEGMENT_GROUP_LOCAL:
-            info->Budget = adapter_id.video_memory;
-            info->CurrentUsage = 0;
-            info->AvailableForReservation = adapter_id.video_memory / 2;
-            info->CurrentReservation = 0;
-            break;
-        case DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL:
-            memset(info, 0, sizeof(*info));
-            break;
-        default:
-            WARN("Invalid memory segment group %#x.\n", segment_group);
-            return E_INVALIDARG;
-    }
+    /* Budget must leave a little extra space. In Windows this seems to always be about total/6.5 if total <= 8 Gb. */
+    info->Budget = memory_info.total - memory_info.total / 7u;
+    info->CurrentUsage = memory_info.used;
+    info->AvailableForReservation = memory_info.total / 2u;
+    info->CurrentReservation = memory_info.reserved;
 
     TRACE("Budget 0x%s, usage 0x%s, available for reservation 0x%s, reservation 0x%s.\n",
             wine_dbgstr_longlong(info->Budget), wine_dbgstr_longlong(info->CurrentUsage),
-- 
2.24.0




More information about the wine-devel mailing list