Skip to content

Commit b239fbc

Browse files
winex11.drv: Implement D3DKMTQueryAdapterInfo WDDM_2_7_CAPS
Used by applications to query support for "Hardware Scheduling" for GPU workloads. This is used as a proxy to determine scheduling guarantees between userspace command submission and GPU execution. Signed-off-by: Liam Middlebrook <lmiddlebrook@nvidia.com> Note: This commit is specifically targeted towards ValveSoftware/wine experimental_9.0 branch. Upstream wine contains commits which change how this would be implemented. Notably, the changes in `dlls/winex11.drv/x11drv_main.c` should be instead made in `dlls/win32u/d3dkmt.c`.
1 parent 23d772f commit b239fbc

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

dlls/winex11.drv/x11drv_main.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1401,19 +1401,72 @@ NTSTATUS X11DRV_D3DKMTOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc )
14011401

14021402
NTSTATUS X11DRV_D3DKMTQueryAdapterInfo( D3DKMT_QUERYADAPTERINFO *desc )
14031403
{
1404+
const struct vulkan_funcs *vulkan_funcs = get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION);
1405+
PFN_vkGetPhysicalDeviceProperties2KHR pvkGetPhysicalDeviceProperties2KHR;
1406+
VkPhysicalDeviceDriverPropertiesKHR driverProperties;
1407+
VkPhysicalDeviceProperties2KHR properties2;
14041408
NTSTATUS status = STATUS_INVALID_PARAMETER;
14051409
struct x11_d3dkmt_adapter *adapter;
14061410

1411+
if (!vulkan_funcs)
1412+
{
1413+
WARN("Vulkan is unavailable.\n");
1414+
return STATUS_UNSUCCESSFUL;
1415+
}
1416+
14071417
pthread_mutex_lock(&d3dkmt_mutex);
14081418
LIST_FOR_EACH_ENTRY(adapter, &x11_d3dkmt_adapters, struct x11_d3dkmt_adapter, entry)
14091419
{
14101420
if (adapter->handle != desc->hAdapter)
14111421
continue;
14121422

1423+
if (!(pvkGetPhysicalDeviceProperties2KHR = (void *)vulkan_funcs->p_vkGetInstanceProcAddr(d3dkmt_vk_instance, "vkGetPhysicalDeviceProperties2KHR")))
1424+
{
1425+
WARN("Failed to load vkGetPhysicalDeviceProperties2KHR.\n");
1426+
status = STATUS_UNSUCCESSFUL;
1427+
goto done;
1428+
}
1429+
1430+
memset(&driverProperties, 0, sizeof(driverProperties));
1431+
memset(&properties2, 0, sizeof(properties2));
1432+
driverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
1433+
properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR;
1434+
properties2.pNext = &driverProperties;
1435+
pvkGetPhysicalDeviceProperties2KHR(adapter->vk_device, &properties2);
1436+
1437+
if (desc->Type == KMTQAITYPE_WDDM_2_7_CAPS)
1438+
{
1439+
/*
1440+
* Advertise Hardware-Scheduling as enabled for NVIDIA Adapters. NVIDIA driver does
1441+
* userspace submission. Allow overriding this value via the
1442+
* WINE_DISABLE_HARDWARE_SCHEDULING environment variable.
1443+
*/
1444+
D3DKMT_WDDM_2_7_CAPS *data = desc->pPrivateDriverData;
1445+
const char *e = getenv("WINE_DISABLE_HARDWARE_SCHEDULING");
1446+
if ((!e || *e == '\0' || *e == '0') &&
1447+
(driverProperties.driverID == VK_DRIVER_ID_NVIDIA_PROPRIETARY))
1448+
{
1449+
data->HwSchEnabled = 1;
1450+
data->HwSchSupported = 1;
1451+
data->HwSchEnabledByDefault = 1;
1452+
status = STATUS_SUCCESS;
1453+
goto done;
1454+
}
1455+
else
1456+
{
1457+
data->HwSchEnabled = 0;
1458+
data->HwSchSupported = 0;
1459+
data->HwSchEnabledByDefault = 0;
1460+
status = STATUS_SUCCESS;
1461+
goto done;
1462+
}
1463+
}
1464+
14131465
FIXME("desc %p, type %d stub\n", desc, desc->Type);
14141466
status = STATUS_NOT_IMPLEMENTED;
14151467
break;
14161468
}
1469+
done:
14171470
pthread_mutex_unlock(&d3dkmt_mutex);
14181471
return status;
14191472
}

include/ddk/d3dkmthk.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,20 @@ typedef struct _D3DKMT_QUERYADAPTERINFO
266266
UINT PrivateDriverDataSize;
267267
} D3DKMT_QUERYADAPTERINFO;
268268

269+
typedef struct _D3DKMT_WDDM_2_7_CAPS
270+
{
271+
union {
272+
struct {
273+
UINT HwSchSupported : 1;
274+
UINT HwSchEnabled : 1;
275+
UINT HwSchEnabledByDefault : 1;
276+
UINT IndependentVidPnVSyncControl : 1;
277+
UINT Reserved : 28;
278+
};
279+
UINT Value;
280+
};
281+
} D3DKMT_WDDM_2_7_CAPS;
282+
269283
typedef enum _D3DKMT_QUERYRESULT_PREEMPTION_ATTEMPT_RESULT
270284
{
271285
D3DKMT_PreemptionAttempt = 0,

0 commit comments

Comments
 (0)