Поделиться через


Multihead (Direct3D 9)

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

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

Заметка

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

 

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

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

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

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

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

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

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

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

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

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

  • AutoDepthStencilFormat
  • BackBufferWidth
  • BackBufferHeight
  • BackBufferFormat

Если DAC задан, дополнительные вызовы IDirect3DDevice9::CreateAdditionalSwapChain являются незаконными.

Если устройство было создано с помощью DAC, 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 и IDirect3Device9::GetNumberOfSwapChains.

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