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.
Связанные разделы