Устройство Direct3D10 и Direct3D11 - SIISII/DirectX Wiki

Original URL: https://github.com/SIISII/DirectX/wiki/Устройство-Direct3D10-и-Direct3D11

Устройство Direct3D является, по сути, программным интерфейсом, позволяющим управлять работой видеоадаптера. В Direct3D10 оно обеспечивает создание различных [ресурсов](/SIISII/DirectX/wiki/Ресурсы в Direct3D10 и Direct3D11) и выполнение собственно рендеринга. В Direct3D11 эти функции разделены: устройство Direct3D обеспечивает создание ресурсов и определение поддерживаемых оборудованием возможностей Direct3D, а собственно рендеринг выполняется с помощью так называемых [контекстов](/SIISII/DirectX/wiki/Контексты устройства Direct3D11) устройства.

Возможно создание нескольких устройств — как правило, чтобы обеспечить вывод изображения в различные окна одновременно. Объекты, созданные с помощью некоторого устройства, могут использоваться только с этим устройством. Это касается и разделяемых объектов: они позволяют разным устройствам совместно использовать некоторые данные, однако собственно разделяемые объекты, обеспечивающие доступ к этим данным, всё равно должны использоваться только со своими устройствами.

Создание устройства

Создание устройства в зависимости от используемой версии Direct3D выполняется одной из следующих функций:

В каждой из этих пар функций первая функция создаёт лишь само устройство Direct3D, а вторая функция — и устройство Direct3D, и связанную с ним [цепочку переключения буферов](/SIISII/DirectX/wiki/Цепочка переключения буферов). Последняя может быть создана отдельно с помощью соответствующей функции [фабрики DXGI](/SIISII/DirectX/wiki/Фабрика DXGI), причём обычно такой вариант является более предпочтительным (в современных программах она большинстве случаев создаётся вызовом метода IDXGIFactory2::CreateSwapChainForHwnd).

Из всех перечисленных функций наиболее полный набор параметров имеет D3D11CreateDeviceAndSwapChain, чей прототип выглядит следующим образом:

HRESULT  D3D11CreateDeviceAndSwapChain(
    IDXGIAdapter                *pAdapter,
    D3D_DRIVER_TYPE              DriverType,
    HMODULE                      Software,
    UINT                         Flags,
    const D3D_FEATURE_LEVEL     *pFeatureLevels,
    UINT                         FeatureLevels,
    UINT                         SDKVersion,
    const DXGI_SWAP_CHAIN_DESC  *pSwapChainDesc,
    IDXGISwapChain*             *ppSwapChain,
    ID3D11Device*               *ppDevice,
    D3D_FEATURE_LEVEL           *pFeatureLevel,
    ID3D11DeviceContext*        *ppImmediateContext);

Уничтожение устройства

Как и любой другой COM-интерфейс, устройство Direct3D автоматически уничтожается, когда счётчик ссылок на него снижается до нуля. Поэтому для его уничтожения необходимо сначала уничтожить все интерфейсы, порождённые через данное устройство, а потом освободить сам интерфейс устройства обычной метода IUnknown::Release.

Поддерживаемые функциональные возможности

Основной набор функциональных устройств, поддерживаемых устройством, определяется установленным уровнем функциональности, который сохраняется функциями D3D11CreateDevice и D3D11CreateDeviceAndSwapChain в переменной, адрес которой задан параметром pFeatureLevel (если программа указывала только один допустимый уровень при вызове функции создания устройства и последняя завершилась успешно, нужды сохранять уровень нет, так как будет установлен именно он).

Некоторые возможности являются необязательными. Чтобы определить, поддерживаются ли они конкретным устройством, следует использовать методы ID3D11Device::CheckFeatureSupport и ID3D11Device::CheckFormatSupport.

Direct3D10 и 10.1 не имеют средств для проверки дополнительных функциональных возможностей. В Direct3D10 можно лишь проверить поддержку тех или иных форматов данных с помощью метода ID3D10Device::CheckFormatSupport; Direct3D10.1 добавляет возможность проверки используемого уровня средств (метод ID3D10Device1::GetFeatureLevel).

Объекты-дети устройства

Ряд объектов, создаваемых методами устройства (например объекты состояний, шейдеры, контексты), называется детьми этого устройства. В случае устройства Direct3D10 или Direct3D10.1 они являются наследниками интерфейса ID3D10DeviceChild, порождённого прямо от IUnknown и определяющего следующие методы.

В случае устройства Direct3D11 дети являются наследниками интерфейса ID3D11DeviceChild, также порождённого прямо от IUnknown и определяющего аналогичные методы:

Интерфейс устройства

Для работы с устройствами Direct3D предусмотрены интерфейсы устройств [Direct3D10](/SIISII/DirectX/wiki/Интерфейсы устройства Direct3D10) и [Direct3D11](/SIISII/DirectX/wiki/Интерфейсы устройства Direct3D11).