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.
Связанные темы