Общие сведения об устройстве в Direct3D 11

Объектная модель Direct3D 11 разделяет функции создания и отрисовки ресурсов на устройство и один или несколько контекстов; Это разделение предназначено для упрощения многопоточности.

Устройство

Устройство используется для создания ресурсов и перечисления возможностей видеоадаптера. В Direct3D 11 устройство представлено интерфейсом ID3D11Device .

К каждого приложения должно быть хотя бы одно устройство; большинство приложений создают только одно устройство. Создайте устройство для одного из драйверов оборудования, установленных на компьютере, вызвав D3D11CreateDevice или D3D11CreateDeviceAndSwapChain и указав тип драйвера с флагом D3D_DRIVER_TYPE . Каждое устройство можно использовать один или несколько контекстов устройств, в зависимости от требуемой функциональности.

Контекст устройства

Контекст устройства содержит обстоятельства или параметры, в которых используется устройство. В частности, контекст устройства используется для задания состояния конвейера и создания команд отрисовки с использованием ресурсов, принадлежащих устройству. Direct3D 11 реализует два типа контекстов устройств: один для немедленной отрисовки, а другой для отложенной отрисовки; оба контекста представлены с помощью интерфейса ID3D11DeviceContext .

Непосредственный контекст

Непосредственный контекст отрисовывается непосредственно в драйвере. Каждое устройство имеет только один непосредственный контекст, который может извлекать данные из GPU. Непосредственный контекст можно использовать для немедленной отрисовки (или воспроизведения) списка команд.

Существует два способа получения немедленного контекста.

Отложенный контекст

Отложенный контекст записывает команды GPU в список команд. Отложенный контекст в основном используется для многопоточности и не требуется для однопоточного приложения. Отложенный контекст обычно используется рабочим потоком вместо потока отрисовки main. При создании отложенного контекста он не наследует состояние от непосредственного контекста.

Чтобы получить отложенный контекст, вызовите ID3D11Device::CreateDeferredContext.

Любой контекст — немедленный или отложенный — можно использовать в любом потоке, если контекст одновременно используется только в одном потоке.

Особенности работы с потоками

В этой таблице показаны отличия в модели потоков в Direct3D 11 от предыдущих версий Direct3D.

Различия между Direct3D 11 и предыдущими версиями Direct3D:
Все методы интерфейса ID3D11Device являются свободными, что означает, что несколько потоков могут вызывать функции одновременно.

  • Все интерфейсы, производные от ID3D11DeviceChild (ID3D11Buffer, ID3D11Query и т. д.), являются свободными.
  • Direct3D 11 разделяет создание и отрисовку ресурсов на два интерфейса. Map, Unmap, Begin, End и GetData реализованы в ID3D11DeviceContext , так как ID3D11Device строго определяет порядок операций. Интерфейсы ID3D11Resource и ID3D11Asynchronous также реализуют методы для операций со свободным потоком.
  • Методы ID3D11DeviceContext (за исключением тех, которые существуют в ID3D11DeviceChild) не являются свободными, то есть требуют однопотокового подключения. Только один поток может безопасно вызывать любой из его методов (Draw, Copy, Map и т. д.) за один раз.
  • Как правило, свободные потоки минимизирует количество используемых примитивов синхронизации, а также их длительность. Однако приложение, которое использует синхронизацию, удерживаемую в течение длительного времени, может напрямую повлиять на степень параллелизма, которую может ожидать приложение.
Методы интерфейса ID3D10Device не предназначены для свободного потока. ID3D10Device реализует все функции создания и отрисовки (как и ID3D9Device в Direct3D 9. Map и Unmap реализованы в интерфейсах, производных от ID3D10Resource, Begin, End и GetData реализованы в интерфейсах ID3D10Asynchronous.

Устройства