Module: wine Branch: master Commit: 1e21f3000725143ea5a9732a71cfafcf4e75820e URL: https://gitlab.winehq.org/wine/wine/-/commit/1e21f3000725143ea5a9732a71cfafc...
Author: Rémi Bernon rbernon@codeweavers.com Date: Mon Apr 22 18:28:39 2024 +0200
win32u: Query GPU memory from vulkan physical device.
---
dlls/win32u/d3dkmt.c | 11 +++++++++++ dlls/win32u/sysparams.c | 7 +++---- dlls/win32u/win32u_private.h | 1 + dlls/wineandroid.drv/init.c | 2 +- dlls/winemac.drv/display.c | 2 +- dlls/winewayland.drv/display.c | 2 +- dlls/winex11.drv/display.c | 3 +-- dlls/winex11.drv/x11drv.h | 1 - dlls/winex11.drv/xrandr.c | 12 +----------- include/wine/gdi_driver.h | 2 +- 10 files changed, 21 insertions(+), 22 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index a016c735f13..b644135bfa1 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -61,6 +61,7 @@ static struct list d3dkmt_vidpn_sources = LIST_INIT( d3dkmt_vidpn_sources ); /
static VkInstance d3dkmt_vk_instance; /* Vulkan instance for D3DKMT functions */ static PFN_vkGetPhysicalDeviceMemoryProperties2KHR pvkGetPhysicalDeviceMemoryProperties2KHR; +static PFN_vkGetPhysicalDeviceMemoryProperties pvkGetPhysicalDeviceMemoryProperties; static PFN_vkGetPhysicalDeviceProperties2KHR pvkGetPhysicalDeviceProperties2KHR; static PFN_vkEnumeratePhysicalDevices pvkEnumeratePhysicalDevices; static const struct vulkan_funcs *vulkan_funcs; @@ -107,6 +108,7 @@ static void d3dkmt_init_vulkan(void) } LOAD_VK_FUNC( vkEnumeratePhysicalDevices ) LOAD_VK_FUNC( vkGetPhysicalDeviceProperties2KHR ) + LOAD_VK_FUNC( vkGetPhysicalDeviceMemoryProperties ) LOAD_VK_FUNC( vkGetPhysicalDeviceMemoryProperties2KHR ) #undef LOAD_VK_FUNC } @@ -570,6 +572,7 @@ BOOL get_vulkan_gpus( struct list *gpus ) { VkPhysicalDeviceIDProperties id = {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES}; VkPhysicalDeviceProperties2 properties2 = {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, .pNext = &id}; + VkPhysicalDeviceMemoryProperties mem_properties; struct vulkan_gpu *gpu;
if (!(gpu = calloc( 1, sizeof(*gpu) ))) break; @@ -578,6 +581,14 @@ BOOL get_vulkan_gpus( struct list *gpus ) gpu->name = strdup( properties2.properties.deviceName ); gpu->pci_id.vendor = properties2.properties.vendorID; gpu->pci_id.device = properties2.properties.deviceID; + + pvkGetPhysicalDeviceMemoryProperties( devices[i], &mem_properties ); + for (i = 0; i < mem_properties.memoryHeapCount; i++) + { + if (mem_properties.memoryHeaps[i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) + gpu->memory += mem_properties.memoryHeaps[i].size; + } + list_add_tail( gpus, &gpu->entry ); }
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 4c122fb3bd8..07aa44e02be 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1206,8 +1206,7 @@ static struct vulkan_gpu *find_vulkan_gpu_from_pci_id( const struct device_manag return NULL; }
-static void add_gpu( const char *name, const struct pci_id *pci_id, const GUID *vulkan_uuid, - ULONGLONG memory_size, void *param ) +static void add_gpu( const char *name, const struct pci_id *pci_id, const GUID *vulkan_uuid, void *param ) { struct device_manager_ctx *ctx = param; char buffer[4096]; @@ -1294,7 +1293,7 @@ static void add_gpu( const char *name, const struct pci_id *pci_id, const GUID *
NtClose( hkey );
- if (!write_gpu_to_registry( &ctx->gpu, pci_id, memory_size )) + if (!write_gpu_to_registry( &ctx->gpu, pci_id, vulkan_gpu ? vulkan_gpu->memory : 0 )) WARN( "Failed to write gpu to registry\n" ); else ctx->gpu_count++; @@ -1799,7 +1798,7 @@ static NTSTATUS default_update_display_devices( BOOL force, struct device_manage
if (!force) return STATUS_ALREADY_COMPLETE;
- add_gpu( "Default GPU", &pci_id, NULL, 0, ctx ); + add_gpu( "Default GPU", &pci_id, NULL, ctx ); add_source( "Default", source_flags, ctx );
if (!read_source_mode( ctx->source_key, ENUM_CURRENT_SETTINGS, &mode )) diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 8bb280c4611..8c6542a06b8 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -198,6 +198,7 @@ struct vulkan_gpu struct pci_id pci_id; char *name; GUID uuid; + ULONGLONG memory; };
extern BOOL get_vulkan_gpus( struct list *gpus ); diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 9a06d8f147b..44a10b567e5 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -289,7 +289,7 @@ UINT ANDROID_UpdateDisplayDevices( const struct gdi_device_manager *device_manag }; DEVMODEW current = mode;
- device_manager->add_gpu( "Android GPU", &pci_id, NULL, 0, param ); + device_manager->add_gpu( "Android GPU", &pci_id, NULL, param ); device_manager->add_source( "Default", source_flags, param ); device_manager->add_monitor( &gdi_monitor, param );
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index cc580e155ef..57489c766f0 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -1155,7 +1155,7 @@ UINT macdrv_UpdateDisplayDevices( const struct gdi_device_manager *device_manage .subsystem = gpu->subsys_id, .revision = gpu->revision_id, }; - device_manager->add_gpu(gpu->name, &pci_id, NULL, 0, param); + device_manager->add_gpu(gpu->name, &pci_id, NULL, param);
/* Initialize adapters */ if (macdrv_get_adapters(gpu->id, &adapters, &adapter_count)) break; diff --git a/dlls/winewayland.drv/display.c b/dlls/winewayland.drv/display.c index a1dc925a183..dfe2689006c 100644 --- a/dlls/winewayland.drv/display.c +++ b/dlls/winewayland.drv/display.c @@ -206,7 +206,7 @@ static void wayland_add_device_gpu(const struct gdi_device_manager *device_manag
TRACE("\n");
- device_manager->add_gpu("Wayland GPU", &pci_id, NULL, 0, param); + device_manager->add_gpu("Wayland GPU", &pci_id, NULL, param); }
static void wayland_add_device_source(const struct gdi_device_manager *device_manager, diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c index 861146d3e90..237aa047321 100644 --- a/dlls/winex11.drv/display.c +++ b/dlls/winex11.drv/display.c @@ -517,8 +517,7 @@ UINT X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manage
for (gpu = 0; gpu < gpu_count; gpu++) { - device_manager->add_gpu( gpus[gpu].name, &gpus[gpu].pci_id, &gpus[gpu].vulkan_uuid, - gpus[gpu].memory_size, param ); + device_manager->add_gpu( gpus[gpu].name, &gpus[gpu].pci_id, &gpus[gpu].vulkan_uuid, param );
/* Initialize adapters */ if (!host_handler.get_adapters( gpus[gpu].id, &adapters, &adapter_count )) break; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 5c9592705b8..1aaba9bf24b 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -770,7 +770,6 @@ struct x11drv_gpu char *name; struct pci_id pci_id; GUID vulkan_uuid; - ULONGLONG memory_size; };
struct x11drv_adapter diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index 6cc3c277213..03b2b21a98b 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -645,11 +645,9 @@ static BOOL get_gpu_properties_from_vulkan( struct x11drv_gpu *gpu, const XRRPro VkResult (*pvkGetRandROutputDisplayEXT)( VkPhysicalDevice, Display *, RROutput, VkDisplayKHR * ); PFN_vkGetPhysicalDeviceProperties2KHR pvkGetPhysicalDeviceProperties2KHR; PFN_vkEnumeratePhysicalDevices pvkEnumeratePhysicalDevices; - PFN_vkGetPhysicalDeviceMemoryProperties pvkGetPhysicalDeviceMemoryProperties; - uint32_t device_count, device_idx, output_idx, heap_idx, i; + uint32_t device_count, device_idx, output_idx, i; VkPhysicalDevice *vk_physical_devices = NULL; VkPhysicalDeviceProperties2 properties2; - VkPhysicalDeviceMemoryProperties mem_properties; PFN_vkCreateInstance pvkCreateInstance; VkInstanceCreateInfo create_info; VkPhysicalDeviceIDProperties id; @@ -685,7 +683,6 @@ static BOOL get_gpu_properties_from_vulkan( struct x11drv_gpu *gpu, const XRRPro LOAD_VK_FUNC(vkEnumeratePhysicalDevices) LOAD_VK_FUNC(vkGetPhysicalDeviceProperties2KHR) LOAD_VK_FUNC(vkGetRandROutputDisplayEXT) - LOAD_VK_FUNC(vkGetPhysicalDeviceMemoryProperties) #undef LOAD_VK_FUNC
vr = pvkEnumeratePhysicalDevices( vk_instance, &device_count, NULL ); @@ -743,13 +740,6 @@ static BOOL get_gpu_properties_from_vulkan( struct x11drv_gpu *gpu, const XRRPro } gpu->name = strdup( properties2.properties.deviceName );
- pvkGetPhysicalDeviceMemoryProperties( vk_physical_devices[device_idx], &mem_properties ); - for (heap_idx = 0; heap_idx < mem_properties.memoryHeapCount; heap_idx++) - { - if (mem_properties.memoryHeaps[heap_idx].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) - gpu->memory_size += mem_properties.memoryHeaps[heap_idx].size; - } - ret = TRUE; goto done; } diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index c299dc2ae42..21298587267 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -255,7 +255,7 @@ struct gdi_monitor
struct gdi_device_manager { - void (*add_gpu)( const char *name, const struct pci_id *pci_id, const GUID *vulkan_uuid, ULONGLONG memory_size, void *param ); + void (*add_gpu)( const char *name, const struct pci_id *pci_id, const GUID *vulkan_uuid, void *param ); void (*add_source)( const char *name, UINT state_flags, void *param ); void (*add_monitor)( const struct gdi_monitor *monitor, void *param ); void (*add_modes)( const DEVMODEW *current, UINT modes_count, const DEVMODEW *modes, void *param );