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


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

Этот раздел относится только к операционным системам 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 не требуется для проверки значений, передаваемых членам Interface и VersionD3D10DDIARG_OPENADAPTER при вызове функции OpenAdapter10_2 , даже если эти значения содержат сведения о версии DDI, с помощью которой инициализируется драйвер. Драйвер может возвращать версию DDI и аппаратные возможности с помощью вызова функции GetSupportedVersions .

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

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

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