DXGI 1.4 改进

Microsoft DirectX Graphics Infrastructure (DXGI) 1.4 中添加或更改了以下功能,主要支持 Direct3D 12。

更便宜的适配器枚举

对于 Direct3D 12,无法再从设备回溯到用于创建它的 IDXGIAdapter 。 也不能再向 D3D12CreateDevice 提供D3D_DRIVER_TYPE_WARP。 若要简化开发,可以使用 IDXGIFactory4 来处理这两者。 IDXGIFactory4::EnumAdapterByLuid (设计为与 ID3D12Device::GetAdapterLuid) 配对,使应用能够检索有关创建 Direct3D 12 设备的适配器的信息。 IDXGIFactory4::EnumWarpAdapter 提供了一个适配器,该适配器可提供给 D3D12CreateDevice 以使用 WARP 呈现器。

视频内存预算跟踪

建议应用程序开发人员使用视频内存预留系统,以通知 OS 应用不能缺少的物理视频内存量。

进程可用的物理内存量称为“视频内存预算”。 该预算可能会随着后台进程的唤醒和睡眠而有明显的波动;当用户切换到另一应用程序时,这种波动会很大。 应用程序在预算更改时可以收到通知,并可以轮询当前预算以及当前已消耗的内存量。 如果应用程序不在预算范围内,该进程将会间歇性地冻结以使其他应用程序能够运行,并且/或者创建 API 将返回失败。 IDXGIAdapter3 接口提供与此功能相关的方法,具体而言,是 QueryVideoMemoryInfoRegisterVideoMemoryBudgetChangeNotificationEvent

有关详细信息,请参阅有关 驻留的 Direct3D 12 主题。

Direct3D 12 交换链更改

一些现有的 Direct3D 11 交换链功能已弃用,以实现在 Direct3D 12 中减少开销。 虽然进行了其他更改,以符合 Direct3D 12 概念或提供更好的 Direct3D 12 功能支持。

固定 Backbuffer 标识

在 Direct3D 11 中,应用程序只能调用 GetBuffer ( 0...) 一次。 每次调用 Present 都会隐式更改返回接口的资源标识。 由于所需的 CPU 开销和灵活的资源描述符设计,Direct3D 12 不再支持隐式资源标识更改。 因此,应用程序必须为使用交换链创建的每个缓冲区手动调用 GetBuffer 。 调用 Present 后,应用程序必须手动呈现到序列中的下一个缓冲区。 建议应用程序为每个缓冲区创建描述符缓存,而不是重新创建每个 Present 的多个对象。

多适配器支持

在多 GPU 适配器上创建交换链时,所有反缓冲区都在节点 1 上创建,并且仅支持单个命令队列。 ResizeBuffers1 允许应用程序在不同的节点上创建后备器,从而允许对每个节点使用不同的命令队列。 这些功能使备用帧渲染 (AFR) 技术可用于交换链。 请参阅 多适配器系统

杂项

  • 命令队列对象必须传递给 CreateSwapChain 方法,而不是 Direct3D 12 设备对象。
  • 仅支持以下两种翻转模型交换效果:
    如果应用程序在呈现前完全呈现在后台缓冲区上,或者希望轻松支持多适配器方案,则应首选DXGI_SWAP_EFFECT_FLIP_DISCARD。
    DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL应由依赖于部分呈现优化或定期从以前显示的反缓冲区读取的应用程序使用。
  • SetFullscreenState 不再独占显示,因此用户启动的操作系统元素可以无缝显示在应用程序输出的前面。 卷设置就是一个示例。

Direct3D 12 硬件功能级别

DXGI 编程指南