Multihead (Direct3D 9)

Многозаголовые карточки — это карты, которые имеют общий буфер кадров и ускоритель, независимые цифровые к аналоговым преобразователям (DAC) и отслеживающие выходные данные. Такие устройства могут предложить гораздо более удобную поддержку нескольких мониторов, чем аналогичное количество разнородных видеоадаптеров.

Карты с несколькими головками предоставляются в API как единое устройство уровня API, которое может управлять несколькими полноэкранными цепочками буферов. Следовательно, все ресурсы совместно используются всеми головами, и каждая голова имеет одинаковые возможности. Для каждой головы можно задать независимые режимы отображения. Для обновления каждой головы можно использовать отдельные вызовы IDirect3DSwapChain9::P resent . Можно также использовать один вызов IDirect3DDevice9::P resent для последовательного обновления каждой головы.

Примечание

Обновление каждой головы не происходит одновременно с одним вызовом IDirect3DDevice9::P resent. При представлении статистики в Direct3D 9Ex можно использовать структуру D3DPRESENTSTATS для сохранения обновлений каждой головы рядом друг с другом, чтобы ограничить эффект разрыва между несколькими головками адаптеров. Сведения о синхронизации кадров приложений модели переворачивания Direct3D 9Ex см. в разделе Улучшения Direct3D 9Ex.

 

Каждая цепочка буферов для многоголового устройства должна быть полноэкранной. Когда устройство перешло в многозаголовок, оно должно оставаться полноэкранным. Для возврата в оконный режим требуется уничтожение устройства (за исключением обычной операции ALT+TAB для свертывание).

Старый метод разделения видеопамяти между головами и обработки каждой головы как полностью независимого ускорителя будет по-прежнему распространенным сценарием использования. Это предложение не заменяет этот механизм, если приложение не было специально закодировано для работы в режиме Direct3D 9 с несколькими головками.

Драйверы получают достаточные знания для переключения между двумя режимами работы.

Одна голова будет называться master головой, а все остальные головы на том же карта называться подчиненными. Если в системе имеется несколько адаптеров с несколькими головками, master и его подчиненные из одного адаптера с несколькими головками называются группой. Группы обозначаются порядком адаптера их master головы.

Структура D3DCAPS9 была обновлена для предоставления следующих новых аппаратных пределов.

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • NumberOfAdaptersInGroup имеет значение 1 для обычных адаптеров и больше 1 для адаптера master многозаголового карта. Значение будет равно 0 для подчиненного адаптера карта с несколькими головками. Каждый карта может иметь не более одного master, но может иметь много подчиненных.
  • MasterAdapterOrdinal указывает, какое устройство является master для этого подчиненного.
  • AdapterOrdinalInGroup указывает порядок, в котором api ссылается на головки. Адаптер master всегда содержит AdapterOrdinalInGroup 0. Эти значения не соответствуют порядковой кодировке адаптера, передаваемой методам IDirect3D9, но применяются только к головам в группе.

Это определение позволяет картам с несколькими головками по-прежнему представлять несколько адаптеров, как если бы они были независимыми картами, как это было в DirectX 8.

Чтобы создать устройство с несколькими головами, укажите флаг поведения D3DCREATE_ADAPTERGROUP_DEVICE в IDirect3D9::CreateDevice. Параметры представления (массив D3DPRESENT_PARAMETERS) должны содержать элементы NumberOfAdaptersInGroup. Среда выполнения назначит каждый элемент каждому головному элементу в числовом порядке AdapterOrdinalInGroup. Если задано D3DCREATE_ADAPTERGROUP_DEVICE, каждый параметр представления должен иметь:

  • Элемент Windowed имеет значение FALSE (другими словами, быть полноэкранным).
  • То же значение для элемента EnableAutoDepthStencil D3DPRESENT_PARAMETERS.

Кроме того, если параметр EnableAutoDepthStencil имеет значение TRUE, то каждое из следующих полей должно иметь одинаковое значение для каждого D3DPRESENT_PARAMETERS:

  • AutoDepthStencilFormat
  • BackBufferWidth
  • BackBufferHeight
  • BackBufferFormat

Если заданО приложение уровня данных, дополнительные вызовы IDirect3DDevice9::CreateAdditionalSwapChain являются недопустимыми .

Если устройство было создано с помощью приложения уровня данных, IDirect3DDevice9::Reset будет ожидать массив D3DPRESENT_PARAMETERS.

Каждая D3DPRESENT_PARAMETERS структура, передаваемая в IDirect3Device9::Reset , должна быть полноэкранной. Чтобы вернуться в оконный режим, приложение должно уничтожить устройство и повторно создать устройство без поддержки нескольких голов в оконном режиме.

Ниже приведен базовый сценарий использования.

1. Create multihead device 
2. For each swap chain of device:
   3. Call GetBackBuffer for the i-th swapchain
   4. Call SetRenderTarget 
   5. Call DrawPrimitive 
   6. Optionally call swapchain::Present (or wait until 
all swap chains are drawn and present outside of loop)
7. End the for loop
8. Optionally present all swap chains with device::Present

Дополнительные сведения см. в разделах IDirect3D9::CreateDevice и IDirect3DDevice9::GetNumberOfSwapChains.

Советы по программированию