多头 (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 多头模式下运行,否则此建议不会取代该机制。

驱动程序有足够的知识在两种作模式之间进行切换。

一个头将被称为主头,所有其他头在同一张卡上被称为从属头。 如果系统中存在多个多头适配器,则主适配器及其从属节点称为组。 组由主头的适配器序号表示。

D3DCAPS9 结构已更新,以公开以下新的硬件上限。

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • NumberOfAdaptersInGroup 是常规适配器的 1,对于多头卡的主适配器大于 1。 对于多头卡的从属适配器,该值将为 0。 每个卡最多可以有一个主控形状,但可能有许多从属。
  • MasterAdapterOrdinal 指示哪个设备是此从属服务器的主机。
  • AdapterOrdinalInGroup 指示 API 引用头的顺序。 主适配器始终具有 AdapterOrdinalInGroup 0。 这些值不对应于传递给 IDirect3D9 方法的适配器序号,但仅适用于组中的头。

此定义允许多头卡继续呈现多个适配器,就像它们是独立卡一样,就像在 DirectX 8 中一样。

若要创建多头设备,请在 IDirect3D9::CreateDevice中指定行为标志D3DCREATE_ADAPTERGROUP_DEVICE。 演示文稿参数(D3DPRESENT_PARAMETERS数组)应包含 NumberOfAdaptersInGroup 元素。 运行时会将每个元素分配给 AdapterOrdinalInGroup 数值顺序中的每个头。 设置D3DCREATE_ADAPTERGROUP_DEVICE时,每个演示文稿参数必须具有:

  • 窗口成员设置为 FALSE(换句话说,全屏)。
  • D3DPRESENT_PARAMETERSEnableAutoDepthStencil 成员的相同值。

此外,如果 EnableAutoDepthStencil TRUE,则以下每个字段必须为每个 D3DPRESENT_PARAMETERS具有相同的值:

  • AutoDepthStencilFormat
  • BackBufferWidth
  • BackBufferHeight
  • BackBufferFormat

如果设置了 DAC,则对 IDirect3DDevice9::CreateAdditionalSwapChain 的其他调用是非法的。

如果设备是使用 DAC 创建的,则 IDirect3DDevice9::Reset 需要 D3DPRESENT_PARAMETERS数组。

传递给 IDirect3DDevice9::Reset 的每个 D3DPRESENT_PARAMETERS 结构都必须全屏显示。 若要切换回窗口模式,应用程序必须销毁设备,并在窗口模式下重新创建非多头设备。

下面是基本使用方案:

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::CreateDeviceIDirect3DDevice9::GetNumberOfSwapChains

编程提示