Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Начиная с Windows 8.1, драйвер мини-порта дисплея должен реализовать функцию DxgkDdiGetNodeMetadata , которая используется для запроса возможностей обработчика узла GPU.
Эта информация помогает оценить планирование и распределение рабочих нагрузок между узлами и улучшает возможность отладки приложений.
Возможности подсистемы интерфейса драйвера устройства (DDI)
Этот интерфейс предоставляет возможности подсистемы указанного узла GPU:
Указатель на функцию DxgkDdiGetNodeMetadata предоставляется членом dxgkDdiGetNodeMetadata структуры DRIVER_INITIALIZATION_DATA .
Архитектура узла GPU
Каждый адаптер дисплея в системе имеет ряд различных движков, используемых для планирования задач. Каждый модуль назначается только одному узлу, но каждый узел может содержать несколько ядр, если этот узел связан с несколькими адаптерами, например в конфигурации связанного адаптера отображения (LDA), где несколько физических GPU связаны с формой одного, более быстрого виртуального GPU.
Разные узлы представляют асимметричные ядра обработки GPU, а подсистемы в каждом узле представляют симметричные ядра обработки между адаптерами. То есть 3D-узел содержит только идентичные 3D-движки на нескольких адаптерах и никогда не другой тип движка.
Поскольку двигатели всегда группируются в узлах по типу, информацию о типе двигателя можно запросить для указанного узла. Типы движков, которые может указать минипортный драйвер отображения, указаны в перечислении DXGK_ENGINE_TYPE.
Пример реализации функции метаданных узла
В этом коде показано, как минипорт-драйвер дисплея может реализовать некоторые типы движков, которые могут быть возвращены функцией DxgkDdiGetNodeMetadata.
NTSTATUS
IHVGetNodeDescription(
IN_CONST_HANDLE hAdapter,
UINT NodeOrdinal,
OUT_PDXGKARG_GETNODEMETADATA pGetNodeMetadata
)
{
DDI_FUNCTION();
PAGED_CODE();
if(NULL == pGetNodeMetadata)
{
return STATUS_INVALID_PARAMETER;
}
CAdapter *pAdapter = GetAdapterFromHandle(hAdapter);
//Invalid handle
if(NULL == pAdapter)
{
return STATUS_INVALID_PARAMETER;
}
//Node ordinal is out of bounds. Required to return
//STATUS_INVALID_PARAMETER
if(NodeOrdinal >= pAdapter->GetNumNodes())
{
return STATUS_INVALID_PARAMETER;
}
switch(pAdapter->GetEngineType(NodeOrdinal))
{
//This is the adapter's 3-D engine. This engine handles a large number
//of different workloads, but it also handles the adapter's 3-D
//workloads. Therefore the 3-D capability is what must be exposed.
case GPU_ENGINE_3D:
{
pGetNodeMetadata->EngineType = DXGK_ENGINE_TYPE_3D;
break;
}
//This is the adapter's video decoding engine
case GPU_ENGINE_VIDEO_DECODE:
{
pGetNodeMetadata->EngineType = DXGK_ENGINE_TYPE_VIDEO_DECODE;
break;
}
//This engine is proprietary and contains no functionality that
//fits the DXGK_ENGINE_TYPE enumeration
case GPU_ENGINE_PROPRIETARY_ENGINE_1:
{
pGetNodeMetadata->EngineType = DXGK_ENGINE_TYPE_OTHER;
//Copy over friendly name associated with this engine
SetFriendlyNameForEngine(pGetNodeMetadata->FriendlyName,
DXGK_MAX_METADATA_NAME_LENGTH,
PROPRIETARY_ENGINE_1_NAME);
break;
}
}
return STATUS_SUCCESS;
}