列舉 GPU 引擎功能
從 Windows 8.1 開始,顯示迷你埠驅動程序必須實作 DxgkDdiGetNodeMetadata 函式,用來查詢 GPU 節點的引擎功能。
這項資訊有助於評估如何排程和散發節點之間的工作負載,並改善偵錯應用程式的能力。
DDI) (引擎功能設備驅動器介面
此介面提供指定 GPU 節點的引擎功能:
DxgkDdiGetNodeMetadata 函式的指標是由 DRIVER_INITIALIZATION_DATA 結構的 DxgkDdiGetNodeMetadata 成員所提供。
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;
}