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