Инициализация обмена данными с помощью Direct3D версии 11 DDI
Этот раздел относится только к Windows 7 и более поздних версий, а также Windows Server 2008 R2 и более поздних версий операционной системы Windows.
Инициализация связи
Чтобы инициализировать взаимодействие с библиотекой DLL драйвера отображения пользовательского режима DDI версии 11, среда выполнения Direct3D версии 11 сначала загружает библиотеку DLL, если библиотека DLL еще не загружена. Затем среда выполнения Direct3D вызывает функцию OpenAdapter10_2 драйвера отображения пользовательского режима через таблицу экспорта библиотеки DLL, чтобы открыть экземпляр графического адаптера. Функция OpenAdapter10_2 является единственной экспортируемой функцией БИБЛИОТЕКи DLL.
Примечание
Функция OpenAdapter10_2 идентична функции OpenAdapter10 , за исключением того, как возвращаются таблицы функций адаптера драйвера:
- OpenAdapter10_2 возвращает таблицу в элементе pAdapterFuncs_2 структуры D3D10DDIARG_OPENADAPTER , где pAdapterFuncs_2 указывает на D3D10_2DDI_ADAPTERFUNCS структуру.
- OpenAdapter10 возвращает таблицу в элементе pAdapterFuncsD3D10DDIARG_OPENADAPTER, где pAdapterFuncs указывает на D3D10DDI_ADAPTERFUNCS структуру.
OpenAdapter10_2 была разработана для повышения эффективности инициализации драйверов. Необходимо реализовать OpenAdapter10_2 в драйверах Direct3D версии 11. Вы также можете реализовать OpenAdapter10_2 (а не OpenAdapter10) в драйверах Direct3D версии 10.1 или в дополнение к ней, чтобы повысить эффективность инициализации этих драйверов. Дополнительные сведения о реализации OpenAdapter10_2 в драйверах Direct3D версии 10.1 см. в разделе Поддержка обнаружения версий. OpenAdapter10_2 обрабатывает обмен версиями и другими сведениями между средой выполнения и драйвером.
Управление версиями
OpenAdapter10_2 и зависящие от адаптера функции драйвера изменяют способ управления версиями между API Direct3D и Direct3D DDI по принципу управления версиями в Direct3D 10 (дополнительные сведения о том, как Direct3D 10 обрабатывает управление версиями, см. в статье Initializing Communication with the Direct3D Version 10 DDI). Вместо api Direct3D, который используется при сбое функции OpenAdapter10_2 драйвера, указывающей на отсутствие поддержки определенной версии (как в случае с OpenAdapter10_2), драйвер должен явно перечислить поддерживаемые версии DDI. Среда выполнения Direct3D вызывает функцию GetSupportedVersions драйвера дисплея пользовательского режима (одну из функций, зависящих от адаптера драйвера), чтобы запросить версии DDI, поддерживаемые драйвером.
Существует по крайней мере две новые версии DDI для функций Direct3D 11 DDI. Каждая версия DDI определяет, работает ли DDI в Windows Vista или Windows 7. Однако поддержка Direct3D 11 DDI не обязательно означает полную поддержку аппаратных функций, связанных с D3D_FEATURE_LEVEL_11. Драйверы могут поддерживать новые функции потоков direct3D 11 DDI с оборудованием, которое не поддерживает другие функции, предоставляемые Direct3D 11 DDI, такие как тесселяции и т. д. В следующем коде показано, как различать каждую версию DDI:
// D3D11.0 on Vista
#define D3D11_DDI_MAJOR_VERSION 11
#define D3D11_0_DDI_MINOR_VERSION ...
#define D3D11_0_DDI_INTERFACE_VERSION \
((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_DDI_MINOR_VERSION)
#define D3D11_0_DDI_BUILD_VERSION ...
#define D3D11_0_DDI_SUPPORTED \
((((UINT64)D3D11_0_DDI_INTERFACE_VERSION) << 32) | \
(((UINT64)D3D11_0_DDI_BUILD_VERSION) << 16))
// D3D11.0 on Windows 7
#define D3D11_0_7_DDI_MINOR_VERSION ...
#define D3D11_0_7_DDI_INTERFACE_VERSION \
((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_7_DDI_MINOR_VERSION)
#define D3D11_0_7_DDI_BUILD_VERSION ...
#define D3D11_0_7_DDI_SUPPORTED \
((((UINT64)D3D11_0_7_DDI_INTERFACE_VERSION) << 32) | \
(((UINT64)D3D11_0_7_DDI_BUILD_VERSION) << 16))
#ifndef IS_D3D11_WIN7_INTERFACE_VERSION
#define IS_D3D11_WIN7_INTERFACE_VERSION( i ) (D3D11_0_7_DDI_INTERFACE_VERSION == i)
#endif
Обмен информацией
Помимо указания сведений о версии, функция OpenAdapter10_2 драйвера также обменивается другими сведениями между средой выполнения и драйвером.
При вызове функции OpenAdapter10_2 драйвера среда выполнения предоставляет функцию обратного вызова адаптера pfnQueryAdapterInfoCb в элементе pAdapterCallbacksструктуры D3D10DDIARG_OPENADAPTER . Драйвер дисплея пользовательского режима должен вызывать функцию обратного вызова адаптера pfnQueryAdapterInfoCb для запроса возможностей графического оборудования из драйвера минипорта дисплея.
Среда выполнения вызывает функцию CreateDevice(D3D10) драйвера дисплея пользовательского режима (одну из функций драйвера, относящихся к адаптеру), чтобы создать устройство отображения для обработки коллекции состояния отрисовки и завершения инициализации. После завершения инициализации среда выполнения Direct3D версии 11 может вызывать предоставленные драйвером дисплея функции Direct3D версии 11, а драйвер отображения пользовательского режима может вызывать функции, предоставляемые средой выполнения.
Функция CreateDevice(D3D10) драйвера отображения пользовательского режима вызывается с D3D10DDIARG_CREATEDEVICE структурой, члены которой настраиваются следующим образом для инициализации DDI драйвера отображения пользовательского режима:
Среда выполнения задает для interface версию интерфейса, которую среда выполнения требует от драйвера отображения пользовательского режима.
Среда выполнения задает для параметра Version номер, который драйвер может использовать для определения времени сборки среды выполнения. Например, драйвер может использовать номер версии, чтобы различать среду выполнения, выпущенную с Windows Vista, и среду выполнения, выпущенную с последующим пакетом обновления, который может содержать исправление, необходимое драйверу.
Среда выполнения задает hRTDevice , чтобы указать дескриптор, который драйвер должен использовать при обратном вызове драйвера в среду выполнения.
Среда выполнения задает hDrvDevice , чтобы указать дескриптор, который среда выполнения использует в последующих вызовах драйвера.
Среда выполнения предоставляет таблицу функций обратного вызова для конкретного устройства в структуре D3DDDI_DEVICECALLBACKS, на которую указывает pKTCallback. Драйвер отображения пользовательского режима вызывает предоставляемые средой выполнения функции обратного вызова для доступа к службам режима ядра в драйвере мини-порта дисплея.
Драйвер отображения пользовательского режима возвращает таблицу своих функций для конкретных устройств в структуре D3D11DDI_DEVICEFUNCS , на которую указывает p11DeviceFuncs .
Среда выполнения предоставляет DXGI_DDI_BASE_ARGS структуру, на которую указывает DXGIBaseDDI . Среда выполнения и драйвер отображения в пользовательском режиме предоставляют DDI инфраструктуры графики DirectX для этой структуры.
Среда выполнения задает hRTCoreLayer , чтобы указать дескриптор, который драйвер должен использовать при обратном вызове драйвера в среду выполнения для доступа к основным функциям Direct3D 10 (то есть в вызовах функций, указанных членом p11UMCallbacks ).
Среда выполнения предоставляет таблицу основных функций обратного вызова в структуре D3D11DDI_CORELAYER_DEVICECALLBACKS , на которую указывает p11UMCallback . Драйвер отображения пользовательского режима вызывает предоставленные средой выполнения основные функции обратного вызова для обновления состояния.