From: Conor McCarthy Subject: [PATCH v3 3/7] dxgi: Return device local and non-local usage from QueryVideoMemoryInfo(). Message-Id: <20191125141101.85701-3-cmccarthy@codeweavers.com> Date: Tue, 26 Nov 2019 00:10:57 +1000 In-Reply-To: <20191125141101.85701-1-cmccarthy@codeweavers.com> References: <20191125141101.85701-1-cmccarthy@codeweavers.com> Used by Hitman 2. Signed-off-by: Conor McCarthy --- 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