wined3d: Use valid adapter LUIDs if they are available.

Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zhiyi Zhang 2020-07-08 15:58:34 +08:00 committed by Alexandre Julliard
parent 597433ab6b
commit 122a28a313
7 changed files with 77 additions and 22 deletions

View File

@ -139,7 +139,7 @@ static void print_adapter_info(void)
hr = CreateDXGIFactory2(0, &IID_IDXGIFactory4, (void **)&factory);
ok(hr == S_OK, "Failed to create factory, hr %#x.\n", hr);
hr = IDXGIFactory4_EnumAdapterByLuid(factory, luid, &IID_IDXGIAdapter, (void **)&adapter);
todo_wine ok(hr == S_OK, "Failed to enum adapter by LUID, hr %#x.\n", hr);
ok(hr == S_OK, "Failed to enum adapter by LUID, hr %#x.\n", hr);
IDXGIFactory4_Release(factory);
if (FAILED(hr))

View File

@ -973,7 +973,7 @@ static void test_adapter_luid(void)
ok(hr == DXGI_ERROR_NOT_FOUND, "Got unexpected hr %#x.\n", hr);
/* Older versions of WARP aren't enumerated by IDXGIFactory_EnumAdapters(). */
todo_wine ok(found_adapter_count == 1 || broken(is_null_luid_adapter),
ok(found_adapter_count == 1 || broken(is_null_luid_adapter),
"Found %u adapters for LUID %08x:%08x.\n",
found_adapter_count, device_adapter_desc.AdapterLuid.HighPart,
device_adapter_desc.AdapterLuid.LowPart);
@ -996,7 +996,7 @@ static void test_adapter_luid(void)
hr = IDXGIFactory4_EnumAdapterByLuid(factory4, device_adapter_desc.AdapterLuid,
&IID_IDXGIAdapter, (void **)&adapter);
todo_wine ok(hr == S_OK, "Failed to enum adapter by LUID, hr %#x.\n", hr);
ok(hr == S_OK, "Failed to enum adapter by LUID, hr %#x.\n", hr);
if (SUCCEEDED(hr))
{
hr = IDXGIAdapter_GetDesc(adapter, &desc);

View File

@ -5136,12 +5136,16 @@ static BOOL wined3d_adapter_gl_init(struct wined3d_adapter_gl *adapter_gl,
};
struct wined3d_gl_info *gl_info = &adapter_gl->a.gl_info;
struct wined3d_caps_gl_ctx caps_gl_ctx = {0};
LUID primary_luid, *luid = NULL;
unsigned int i;
TRACE("adapter_gl %p, ordinal %u, wined3d_creation_flags %#x.\n",
adapter_gl, ordinal, wined3d_creation_flags);
if (!wined3d_adapter_init(&adapter_gl->a, ordinal, &wined3d_adapter_gl_ops))
if (ordinal == 0 && wined3d_get_primary_adapter_luid(&primary_luid))
luid = &primary_luid;
if (!wined3d_adapter_init(&adapter_gl->a, ordinal, luid, &wined3d_adapter_gl_ops))
return FALSE;
/* Dynamically load all GL core functions */

View File

@ -2166,17 +2166,15 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
struct wined3d_adapter *adapter = &adapter_vk->a;
VkPhysicalDeviceIDProperties id_properties;
VkPhysicalDeviceProperties2 properties2;
LUID *luid = NULL;
TRACE("adapter_vk %p, ordinal %u, wined3d_creation_flags %#x.\n",
adapter_vk, ordinal, wined3d_creation_flags);
if (!wined3d_adapter_init(adapter, ordinal, &wined3d_adapter_vk_ops))
return FALSE;
if (!wined3d_init_vulkan(vk_info))
{
WARN("Failed to initialize Vulkan.\n");
goto fail;
return FALSE;
}
if (!(adapter_vk->physical_device = get_vulkan_physical_device(vk_info)))
@ -2195,6 +2193,12 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
VK_CALL(vkGetPhysicalDeviceMemoryProperties(adapter_vk->physical_device, &adapter_vk->memory_properties));
if (id_properties.deviceLUIDValid)
luid = (LUID *)id_properties.deviceLUID;
if (!wined3d_adapter_init(adapter, ordinal, luid, &wined3d_adapter_vk_ops))
goto fail_vulkan;
adapter_vk_init_driver_info(adapter_vk, &properties2.properties);
adapter->vram_bytes_used = 0;
TRACE("Emulating 0x%s bytes of video ram.\n", wine_dbgstr_longlong(adapter->driver_info.vram_bytes));
@ -2203,7 +2207,7 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
memcpy(&adapter->device_uuid, id_properties.deviceUUID, sizeof(adapter->device_uuid));
if (!wined3d_adapter_vk_init_format_info(adapter_vk, vk_info))
goto fail_vulkan;
goto fail;
adapter->vertex_pipe = wined3d_spirv_vertex_pipe_init_vk();
adapter->fragment_pipe = wined3d_spirv_fragment_pipe_init_vk();
@ -2214,11 +2218,11 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
return TRUE;
fail:
wined3d_adapter_cleanup(adapter);
fail_vulkan:
VK_CALL(vkDestroyInstance(vk_info->instance, NULL));
wined3d_unload_vulkan(vk_info);
fail:
wined3d_adapter_cleanup(adapter);
return FALSE;
}

View File

@ -2903,6 +2903,7 @@ static void wined3d_adapter_no3d_init_d3d_info(struct wined3d_adapter *adapter,
static struct wined3d_adapter *wined3d_adapter_no3d_create(unsigned int ordinal, unsigned int wined3d_creation_flags)
{
struct wined3d_adapter *adapter;
LUID primary_luid, *luid = NULL;
static const struct wined3d_gpu_description gpu_description =
{
@ -2914,7 +2915,10 @@ static struct wined3d_adapter *wined3d_adapter_no3d_create(unsigned int ordinal,
if (!(adapter = heap_alloc_zero(sizeof(*adapter))))
return NULL;
if (!wined3d_adapter_init(adapter, ordinal, &wined3d_adapter_no3d_ops))
if (ordinal == 0 && wined3d_get_primary_adapter_luid(&primary_luid))
luid = &primary_luid;
if (!wined3d_adapter_init(adapter, ordinal, luid, &wined3d_adapter_no3d_ops))
{
heap_free(adapter);
return NULL;
@ -2942,7 +2946,7 @@ static struct wined3d_adapter *wined3d_adapter_no3d_create(unsigned int ordinal,
return adapter;
}
BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal,
BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal, const LUID *luid,
const struct wined3d_adapter_ops *adapter_ops)
{
DISPLAY_DEVICEW display_device;
@ -2953,6 +2957,21 @@ BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal,
adapter->ordinal = ordinal;
adapter->output_count = 0;
if (luid)
{
adapter->luid = *luid;
}
else
{
WARN("Allocating a random LUID.\n");
if (!AllocateLocallyUniqueId(&adapter->luid))
{
ERR("Failed to allocate a LUID, error %#x.\n", GetLastError());
return FALSE;
}
}
TRACE("adapter %p LUID %08x:%08x.\n", adapter, adapter->luid.HighPart, adapter->luid.LowPart);
display_device.cb = sizeof(display_device);
EnumDisplayDevicesW(NULL, ordinal, &display_device, 0);
TRACE("Display device: %s.\n", debugstr_w(display_device.DeviceName));
@ -2972,14 +2991,6 @@ BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal,
}
adapter->output_count = 1;
if (!AllocateLocallyUniqueId(&adapter->luid))
{
ERR("Failed to set adapter LUID (%#x).\n", GetLastError());
goto done;
}
TRACE("Allocated LUID %08x:%08x for adapter %p.\n",
adapter->luid.HighPart, adapter->luid.LowPart, adapter);
memset(&adapter->driver_uuid, 0, sizeof(adapter->driver_uuid));
memset(&adapter->device_uuid, 0, sizeof(adapter->device_uuid));

View File

@ -5719,6 +5719,41 @@ void get_fog_start_end(const struct wined3d_context *context, const struct wined
}
}
static BOOL wined3d_get_primary_display(WCHAR *display)
{
DISPLAY_DEVICEW display_device;
DWORD device_idx = 0;
display_device.cb = sizeof(display_device);
while (EnumDisplayDevicesW(NULL, device_idx++, &display_device, 0))
{
if (display_device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
{
lstrcpyW(display, display_device.DeviceName);
return TRUE;
}
}
return FALSE;
}
BOOL wined3d_get_primary_adapter_luid(LUID *luid)
{
D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME open_adapter_param;
D3DKMT_CLOSEADAPTER close_adapter_param;
if (!wined3d_get_primary_display(open_adapter_param.DeviceName))
return FALSE;
if (D3DKMTOpenAdapterFromGdiDisplayName(&open_adapter_param))
return FALSE;
*luid = open_adapter_param.AdapterLuid;
close_adapter_param.hAdapter = open_adapter_param.hAdapter;
D3DKMTCloseAdapter(&close_adapter_param);
return TRUE;
}
/* Note: It's the caller's responsibility to ensure values can be expressed
* in the requested format. UNORM formats for example can only express values
* in the range 0.0f -> 1.0f. */

View File

@ -3300,9 +3300,10 @@ struct wined3d_adapter
const struct wined3d_adapter_ops *adapter_ops;
};
BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal,
BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal, const LUID *luid,
const struct wined3d_adapter_ops *adapter_ops) DECLSPEC_HIDDEN;
void wined3d_adapter_cleanup(struct wined3d_adapter *adapter) DECLSPEC_HIDDEN;
BOOL wined3d_get_primary_adapter_luid(LUID *luid) DECLSPEC_HIDDEN;
struct wined3d_adapter_gl
{