[PATCH 05/10] dxgi: Return device local and non-local usage from QueryVideoMemoryInfo().
Conor McCarthy
cmccarthy at codeweavers.com
Thu Nov 7 08:54:37 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.23.0
More information about the wine-devel
mailing list