Поделиться через


Поддержка обнаружения версий

Этот раздел относится только к операционным системам Windows 7 и более поздних версий.

Драйвер отображения в пользовательском режиме, работающий в Windows Vista и более поздних версиях и Windows Server 2008 и более поздних версиях, должен завершиться сбоем при создании адаптера (т. е. сбой вызова функции OpenAdapter10 драйвера) для версий DDI, которые драйвер явно не поддерживает.

Windows 7 позволяет приложениям Direct3D обнаруживать версии DDI и аппаратные возможности, которые драйвер явно поддерживает. Это улучшает проверку версий. В Windows 7 представлены новые функции, относящиеся к адаптеру, для улучшения управления версиями и предоставления возможности оптимизации API и инициализации драйверов. Необходимо реализовать и экспортировать функцию OpenAdapter10_2 в драйвере Direct3D версии 10.1, чтобы среда выполнения Direct3D может вызывать новые функции адаптера драйвера. Если вместо этого реализовать OpenAdapter10 в драйвере Direct3D версии 10.1, драйвер может указать, поддерживает ли она версию DDI, передав или не выполнив вызов OpenAdapter10.

OpenAdapter10_2 возвращает таблицу функций, специфичных для адаптера драйвера, в члене pAdapterFuncs_2 структуры D3D10DDIARG_OPENADAPTER. pAdapterFuncs_2 указывает на структуру D3D10_2DDI_ADAPTERFUNCS . Среда выполнения Direct3D вызывает функцию GetSupportedVersions для адаптера драйвера для запроса версий DDI и аппаратных возможностей, поддерживаемых драйвером. GetSupportedVersions возвращает версии DDI и аппаратные возможности в массиве 64-разрядных значений. В следующем примере кода показана реализация GetSupportedVersions :

// Array of 64-bit values that are defined in D3d10umddi.h
const UINT64 c_aSupportedVersions[] = {
    D3D10_0_7_DDI_SUPPORTED, // 10.0 on Windows 7
    D3D10_0_DDI_SUPPORTED, // 10.0 on Windows Vista
 D3D10_1_x_DDI_SUPPORTED, // 10.1 with all extended 
                           // format support (but not
                           // Windows 7 scheduling)
};

HRESULT APIENTRY GetSupportedVersions(
                 D3D10DDI_HADAPTER hAdapter, 
                 __inout UINT32* puEntries,
 __out_ecount_opt( *puEntries ) 
 UINT64* pSupportedDDIInterfaceVersions)
)
{
    const UINT32 uEntries = ARRAYSIZE( c_aSupportedVersions );
    if (pSupportedDDIInterfaceVersions &&
        *puEntries < uEntries)
    {
        return HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER );
    }

    // Determine concise hardware support from kernel, cache with hAdapter.
    // pfnQueryAdapterInfoCb( hAdapter, ... )

    *puEntries = uEntries;
    if (pSupportedDDIInterfaceVersions)
    {
        UINT64* pCurEntry = pSupportedDDIInterfaceVersions;
        memcpy( pCurEntry, c_aSupportedVersions, sizeof( c_aSupportedVersions ) );
        pCurEntry += ARRAYSIZE( c_aSupportedVersions );
        assert( pCurEntry - pSupportedDDIInterfaceVersions == uEntries );
    }
    return S_OK;
}

Драйвер Direct3D версии 10.1 не требуется для проверки значений, передаваемых членам интерфейса и версииD3D10DDIARG_OPENADAPTER в вызове функции OpenAdapter10_2 , даже если эти значения содержат сведения о версии DDI, с помощью которых инициализировать драйвер. Драйвер может возвращать версии DDI и аппаратные возможности с помощью вызова функции GetSupportedVersions .

Среда выполнения Direct3D может передавать значения членам интерфейса и версииD3D10DDIARG_CREATEDEVICE в вызове функции драйвера CreateDevice(D3D10), которые отличаются от значений, которые среда выполнения передала в OpenAdapter10_2; среда выполнения передает значения членам интерфейса и версии D3D10DDIARG_CREATEDEVICE, которые основаны на версии DDI и возможностях оборудования, которые драйвер возвращает в среду выполнения через GetSupportedVersions. Драйвер не требует проверки значений, передаваемых членам интерфейса и версии D3D10DDIARG_CREATEDEVICE так как драйвер уже указал поддержку этих значений через функцию GetSupportedVersions .

При переносе драйвера из Direct3D версии 10.0 в Direct3D версии 10.1 необходимо преобразовать драйвер, чтобы отслеживать только элементы интерфейса и версии , передаваемые в CreateDevice(D3D10) вместо OpenAdapter10_2. Необходимо проанализировать реализации функций CalcPrivateDeviceSize и CreateDevice(D3D10) в портированном драйвере, чтобы убедиться в отсутствии предположений о значениях в членах Interface и Version для CreateDevice(D3D10), соответствующих значениям в членах Interface и Version для OpenAdapter10_2.

Обратите внимание, что OpenAdapter10_2 имеет ту же подпись функции, что и OpenAdapter10 (то есть PFND3D10DDI_OPENADAPTER, как определено в заголовке D3d10umddi.h ). Обе функции можно реализовать в одной библиотеке DLL драйвера для отображения в пользовательском режиме.