Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Этот раздел относится только к операционным системам 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 драйвера для отображения в пользовательском режиме.