From: Paul Gofman <pgofman@codeweavers.com> --- dlls/ddraw/ddraw.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index c4ce81234bc..dabd9ed30d9 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -1973,9 +1973,11 @@ static HRESULT WINAPI ddraw1_GetVerticalBlankStatus(IDirectDraw *iface, BOOL *st static HRESULT WINAPI ddraw7_GetAvailableVidMem(IDirectDraw7 *iface, DDSCAPS2 *caps, DWORD *total, DWORD *free) { - unsigned int framebuffer_size, total_vidmem, free_vidmem; + unsigned int framebuffer_size, total_vidmem = 0, free_vidmem; struct ddraw *ddraw = impl_from_IDirectDraw7(iface); + struct wined3d_adapter_identifier desc = {0}; struct wined3d_display_mode mode; + SIZE_T used_vidmem = 0; HRESULT hr = DD_OK; TRACE("iface %p, caps %p, total %p, free %p.\n", iface, caps, total, free); @@ -2008,19 +2010,28 @@ static HRESULT WINAPI ddraw7_GetAvailableVidMem(IDirectDraw7 *iface, DDSCAPS2 *c mode.format_id, mode.width); framebuffer_size *= mode.height; + if (free || total) + { + if (FAILED(hr = wined3d_adapter_get_identifier(ddraw->wined3d_adapter, 0, &desc))) + { + WARN("wined3d_adapter_get_identifier failed.\n"); + wined3d_mutex_unlock(); + return hr; + } + total_vidmem = min(0x7ffff000, desc.video_memory); + } + if (free) { free_vidmem = wined3d_device_get_available_texture_mem(ddraw->wined3d_device); + used_vidmem = desc.video_memory - free_vidmem; + free_vidmem = total_vidmem > used_vidmem ? total_vidmem - used_vidmem : 0; *free = framebuffer_size > free_vidmem ? 0 : free_vidmem - framebuffer_size; TRACE("Free video memory %#lx.\n", *free); } if (total) { - struct wined3d_adapter_identifier desc = {0}; - - hr = wined3d_adapter_get_identifier(ddraw->wined3d_adapter, 0, &desc); - total_vidmem = min(UINT_MAX, desc.video_memory); *total = framebuffer_size > total_vidmem ? 0 : total_vidmem - framebuffer_size; TRACE("Total video memory %#lx.\n", *total); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11090