DXGI 1.4 改进

Microsoft DirectX 图形基础结构 (DXGI) 1.4 中添加或更改了以下功能,主要支持 Direct3D 12。

更便宜的适配器枚举

对于 Direct3D 12,不再可能从设备回溯到用于创建它的 IDXGIAdapter。 也不能再将D3D_DRIVER_TYPE_WARP提供给 D3D12CreateDevice。 为了简化开发,可以使用 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 隐式更改返回接口的资源标识。 Direct3D 12 不再支持隐式资源标识更改,因为需要 CPU 开销和灵活的资源描述符设计。 因此,应用程序必须为使用交换链创建的每个缓冲区手动调用 GetBuffer。 调用 “演示”后,应用程序必须手动呈现到序列中的下一个缓冲区。 建议应用程序为每个缓冲区创建描述符的缓存,而不是为每个缓冲区重新创建许多对象,Present

多适配器支持

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

杂项

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

Direct3D 12 硬件功能级别

DXGI 编程指南