Skip to content

Commit d97fb4c

Browse files
zzhiyiivyl
authored andcommitted
win32u: 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. From: Liam Middlebrook <lmiddlebrook@nvidia.com> Signed-off-by: Liam Middlebrook <lmiddlebrook@nvidia.com> Link: ValveSoftware/wine#259
1 parent f1b6562 commit d97fb4c

2 files changed

Lines changed: 71 additions & 2 deletions

File tree

dlls/win32u/d3dkmt.c

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,10 +333,65 @@ NTSTATUS WINAPI NtGdiDdDDIDestroyDevice( const D3DKMT_DESTROYDEVICE *desc )
333333
*/
334334
NTSTATUS WINAPI NtGdiDdDDIQueryAdapterInfo( D3DKMT_QUERYADAPTERINFO *desc )
335335
{
336+
NTSTATUS status = STATUS_NOT_IMPLEMENTED;
337+
struct d3dkmt_adapter *adapter;
338+
336339
if (!desc) return STATUS_INVALID_PARAMETER;
337340

338-
FIXME( "desc %p, type %d stub\n", desc, desc->Type );
339-
return STATUS_NOT_IMPLEMENTED;
341+
FIXME( "desc %p, type %d semi-stub\n", desc, desc->Type );
342+
343+
if (!d3dkmt_use_vulkan())
344+
{
345+
WARN("Vulkan is unavailable.\n");
346+
return status;
347+
}
348+
349+
pthread_mutex_lock( &d3dkmt_lock );
350+
if ((adapter = find_adapter_from_handle( desc->hAdapter )) && adapter->vk_device)
351+
{
352+
if (desc->Type == KMTQAITYPE_WDDM_2_7_CAPS)
353+
{
354+
VkPhysicalDeviceDriverPropertiesKHR driverProperties;
355+
VkPhysicalDeviceProperties2KHR properties2;
356+
D3DKMT_WDDM_2_7_CAPS *data;
357+
const char *e;
358+
359+
memset( &driverProperties, 0, sizeof(driverProperties) );
360+
memset( &properties2, 0, sizeof(properties2) );
361+
driverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
362+
properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR;
363+
properties2.pNext = &driverProperties;
364+
pvkGetPhysicalDeviceProperties2KHR( adapter->vk_device, &properties2 );
365+
366+
/*
367+
* Advertise Hardware-Scheduling as enabled for NVIDIA Adapters. NVIDIA driver does
368+
* userspace submission. Allow overriding this value via the
369+
* WINE_DISABLE_HARDWARE_SCHEDULING environment variable.
370+
*/
371+
data = desc->pPrivateDriverData;
372+
e = getenv( "WINE_DISABLE_HARDWARE_SCHEDULING" );
373+
if ((!e || *e == '\0' || *e == '0') && (driverProperties.driverID == VK_DRIVER_ID_NVIDIA_PROPRIETARY))
374+
{
375+
data->HwSchEnabled = 1;
376+
data->HwSchSupported = 1;
377+
data->HwSchEnabledByDefault = 1;
378+
}
379+
else
380+
{
381+
data->HwSchEnabled = 0;
382+
data->HwSchSupported = 0;
383+
data->HwSchEnabledByDefault = 0;
384+
}
385+
386+
status = STATUS_SUCCESS;
387+
}
388+
else
389+
{
390+
FIXME("desc %p, type %d stub\n", desc, desc->Type);
391+
}
392+
}
393+
pthread_mutex_unlock( &d3dkmt_lock );
394+
return status;
340395
}
341396

342397
/******************************************************************************

include/ddk/d3dkmthk.h

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

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

0 commit comments

Comments
 (0)