共用方式為


列舉 GPU 引擎功能

從 Windows 8.1 開始,顯示迷你埠驅動程序必須實作 DxgkDdiGetNodeMetadata 函式,用來查詢 GPU 節點的引擎功能。

這項資訊有助於評估如何排程和散發節點之間的工作負載,並改善偵錯應用程式的能力。

DDI) (引擎功能設備驅動器介面

此介面提供指定 GPU 節點的引擎功能:

DxgkDdiGetNodeMetadata 函式的指標是由 DRIVER_INITIALIZATION_DATA 結構的 DxgkDdiGetNodeMetadata 成員所提供。

GPU 節點架構

系統上的每個顯示器配接器都有數個不同的引擎可用來排程工作。 每個引擎只會指派給一個節點,但如果該節點與多個適配卡相關聯,則每個節點可能會包含一個以上的引擎,例如在連結的顯示器適配卡 (LDA) 組態中,其中多個實體 GPU 會連結成單一、更快、虛擬 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;
}